(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["js-bigchaindb-driver"] = factory(); else root["js-bigchaindb-driver"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 95); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = getApiUrls; function getApiUrls(API_PATH) { return { 'blocks': API_PATH + 'blocks', 'blocks_detail': API_PATH + 'blocks/%(blockId)s', 'outputs': API_PATH + 'outputs', 'statuses': API_PATH + 'statuses', 'transactions': API_PATH + 'transactions', 'transactions_detail': API_PATH + 'transactions/%(txId)s', 'votes': API_PATH + 'votes' }; } /***/ }), /* 1 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = request; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__baseRequest__ = __webpack_require__(28); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__sanitize__ = __webpack_require__(38); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var DEFAULT_REQUEST_CONFIG = { credentials: 'include', headers: { 'Accept': 'application/json' } }; /** * Small wrapper around js-utility-belt's request that provides url resolving, default settings, and * response handling. */ function request(url) { var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var onlyJsonResponse = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; // Load default fetch configuration and remove any falsy query parameters var requestConfig = _extends({}, DEFAULT_REQUEST_CONFIG, config, { query: config.query && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__sanitize__["a" /* default */])(config.query) }); var apiUrl = url; if (requestConfig.jsonBody) { requestConfig.headers = _extends({}, requestConfig.headers, { 'Content-Type': 'application/json' }); } if (!url) { return Promise.reject(new Error('Request was not given a url.')); } return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__baseRequest__["a" /* default */])(apiUrl, requestConfig).then(function (res) { return onlyJsonResponse ? res.json() : { json: res.json(), url: res.url }; }).catch(function (err) { console.error(err); throw err; }); } /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ var base64 = __webpack_require__(52) var ieee754 = __webpack_require__(83) var isArray = __webpack_require__(84) exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * Due to various browser bugs, sometimes the Object implementation will be used even * when the browser supports typed arrays. * * Note: * * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport() /* * Export kMaxLength after typed array support is determined. */ exports.kMaxLength = kMaxLength() function typedArraySupport () { try { var arr = new Uint8Array(1) arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } } function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff } function createBuffer (that, length) { if (kMaxLength() < length) { throw new RangeError('Invalid typed array length') } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(length) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class if (that === null) { that = new Buffer(length) } that.length = length } return that } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer (arg, encodingOrOffset, length) { if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { return new Buffer(arg, encodingOrOffset, length) } // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { throw new Error( 'If encoding is specified then the first argument must be a string' ) } return allocUnsafe(this, arg) } return from(this, arg, encodingOrOffset, length) } Buffer.poolSize = 8192 // not used by this implementation // TODO: Legacy, not needed anymore. Remove in next major version. Buffer._augment = function (arr) { arr.__proto__ = Buffer.prototype return arr } function from (that, value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number') } if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { return fromArrayBuffer(that, value, encodingOrOffset, length) } if (typeof value === 'string') { return fromString(that, value, encodingOrOffset) } return fromObject(that, value) } /** * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError * if value is a number. * Buffer.from(str[, encoding]) * Buffer.from(array) * Buffer.from(buffer) * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { return from(null, value, encodingOrOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) { // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true }) } } function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be a number') } else if (size < 0) { throw new RangeError('"size" argument must not be negative') } } function alloc (that, size, fill, encoding) { assertSize(size) if (size <= 0) { return createBuffer(that, size) } if (fill !== undefined) { // Only pay attention to encoding if it's a string. This // prevents accidentally sending in a number that would // be interpretted as a start offset. return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill) } return createBuffer(that, size) } /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { return alloc(null, size, fill, encoding) } function allocUnsafe (that, size) { assertSize(size) that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) if (!Buffer.TYPED_ARRAY_SUPPORT) { for (var i = 0; i < size; ++i) { that[i] = 0 } } return that } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { return allocUnsafe(null, size) } /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { return allocUnsafe(null, size) } function fromString (that, string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8' } if (!Buffer.isEncoding(encoding)) { throw new TypeError('"encoding" must be a valid string encoding') } var length = byteLength(string, encoding) | 0 that = createBuffer(that, length) var actual = that.write(string, encoding) if (actual !== length) { // Writing a hex string, for example, that contains invalid characters will // cause everything after the first invalid character to be ignored. (e.g. // 'abxxcd' will be treated as 'ab') that = that.slice(0, actual) } return that } function fromArrayLike (that, array) { var length = array.length < 0 ? 0 : checked(array.length) | 0 that = createBuffer(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } function fromArrayBuffer (that, array, byteOffset, length) { array.byteLength // this throws if `array` is not a valid ArrayBuffer if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('\'offset\' is out of bounds') } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('\'length\' is out of bounds') } if (byteOffset === undefined && length === undefined) { array = new Uint8Array(array) } else if (length === undefined) { array = new Uint8Array(array, byteOffset) } else { array = new Uint8Array(array, byteOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = array that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that = fromArrayLike(that, array) } return that } function fromObject (that, obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0 that = createBuffer(that, len) if (that.length === 0) { return that } obj.copy(that, 0, 0, len) return that } if (obj) { if ((typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer) || 'length' in obj) { if (typeof obj.length !== 'number' || isnan(obj.length)) { return createBuffer(that, 0) } return fromArrayLike(that, obj) } if (obj.type === 'Buffer' && isArray(obj.data)) { return fromArrayLike(that, obj.data) } } throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } function checked (length) { // Note: cannot use `length < kMaxLength()` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes') } return length | 0 } function SlowBuffer (length) { if (+length != length) { // eslint-disable-line eqeqeq length = 0 } return Buffer.alloc(+length) } Buffer.isBuffer = function isBuffer (b) { return !!(b != null && b._isBuffer) } Buffer.compare = function compare (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers') } if (a === b) return 0 var x = a.length var y = b.length for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i] y = b[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function isEncoding (encoding) { switch (String(encoding).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 true default: return false } } Buffer.concat = function concat (list, length) { if (!isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers') } if (list.length === 0) { return Buffer.alloc(0) } var i if (length === undefined) { length = 0 for (i = 0; i < list.length; ++i) { length += list[i].length } } var buffer = Buffer.allocUnsafe(length) var pos = 0 for (i = 0; i < list.length; ++i) { var buf = list[i] if (!Buffer.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers') } buf.copy(buffer, pos) pos += buf.length } return buffer } function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { string = '' + string } var len = string.length if (len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false for (;;) { switch (encoding) { case 'ascii': case 'latin1': case 'binary': return len case 'utf8': case 'utf-8': case undefined: return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2 case 'hex': return len >>> 1 case 'base64': return base64ToBytes(string).length default: if (loweredCase) return utf8ToBytes(string).length // assume utf8 encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.byteLength = byteLength function slowToString (encoding, start, end) { var loweredCase = false // No need to verify that "this.length <= MAX_UINT32" since it's a read-only // property of a typed array. // This behaves neither like String nor Uint8Array in that we set start/end // to their upper/lower bounds if the value passed is out of range. // undefined is handled specially as per ECMA-262 6th Edition, // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. if (start === undefined || start < 0) { start = 0 } // Return early if start > this.length. Done here to prevent potential uint32 // coercion fail below. if (start > this.length) { return '' } if (end === undefined || end > this.length) { end = this.length } if (end <= 0) { return '' } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. end >>>= 0 start >>>= 0 if (end <= start) { return '' } if (!encoding) encoding = 'utf8' while (true) { switch (encoding) { case 'hex': return hexSlice(this, start, end) case 'utf8': case 'utf-8': return utf8Slice(this, start, end) case 'ascii': return asciiSlice(this, start, end) case 'latin1': case 'binary': return latin1Slice(this, start, end) case 'base64': return base64Slice(this, start, end) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return utf16leSlice(this, start, end) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = (encoding + '').toLowerCase() loweredCase = true } } } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect // Buffer instances. Buffer.prototype._isBuffer = true function swap (b, n, m) { var i = b[n] b[n] = b[m] b[m] = i } Buffer.prototype.swap16 = function swap16 () { var len = this.length if (len % 2 !== 0) { throw new RangeError('Buffer size must be a multiple of 16-bits') } for (var i = 0; i < len; i += 2) { swap(this, i, i + 1) } return this } Buffer.prototype.swap32 = function swap32 () { var len = this.length if (len % 4 !== 0) { throw new RangeError('Buffer size must be a multiple of 32-bits') } for (var i = 0; i < len; i += 4) { swap(this, i, i + 3) swap(this, i + 1, i + 2) } return this } Buffer.prototype.swap64 = function swap64 () { var len = this.length if (len % 8 !== 0) { throw new RangeError('Buffer size must be a multiple of 64-bits') } for (var i = 0; i < len; i += 8) { swap(this, i, i + 7) swap(this, i + 1, i + 6) swap(this, i + 2, i + 5) swap(this, i + 3, i + 4) } return this } Buffer.prototype.toString = function toString () { var length = this.length | 0 if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) } Buffer.prototype.equals = function equals (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') if (this === b) return true return Buffer.compare(this, b) === 0 } Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES if (this.length > 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') if (this.length > max) str += ' ... ' } return '' } Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { if (!Buffer.isBuffer(target)) { throw new TypeError('Argument must be a Buffer') } if (start === undefined) { start = 0 } if (end === undefined) { end = target ? target.length : 0 } if (thisStart === undefined) { thisStart = 0 } if (thisEnd === undefined) { thisEnd = this.length } if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { throw new RangeError('out of range index') } if (thisStart >= thisEnd && start >= end) { return 0 } if (thisStart >= thisEnd) { return -1 } if (start >= end) { return 1 } start >>>= 0 end >>>= 0 thisStart >>>= 0 thisEnd >>>= 0 if (this === target) return 0 var x = thisEnd - thisStart var y = end - start var len = Math.min(x, y) var thisCopy = this.slice(thisStart, thisEnd) var targetCopy = target.slice(start, end) for (var i = 0; i < len; ++i) { if (thisCopy[i] !== targetCopy[i]) { x = thisCopy[i] y = targetCopy[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, // OR the last index of `val` in `buffer` at offset <= `byteOffset`. // // Arguments: // - buffer - a Buffer to search // - val - a string, Buffer, or number // - byteOffset - an index into `buffer`; will be clamped to an int32 // - encoding - an optional encoding, relevant is val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { // Empty buffer means no match if (buffer.length === 0) return -1 // Normalize byteOffset if (typeof byteOffset === 'string') { encoding = byteOffset byteOffset = 0 } else if (byteOffset > 0x7fffffff) { byteOffset = 0x7fffffff } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000 } byteOffset = +byteOffset // Coerce to Number. if (isNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) } // Normalize byteOffset: negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = buffer.length + byteOffset if (byteOffset >= buffer.length) { if (dir) return -1 else byteOffset = buffer.length - 1 } else if (byteOffset < 0) { if (dir) byteOffset = 0 else return -1 } // Normalize val if (typeof val === 'string') { val = Buffer.from(val, encoding) } // Finally, search either indexOf (if dir is true) or lastIndexOf if (Buffer.isBuffer(val)) { // Special case: looking for empty string/buffer always fails if (val.length === 0) { return -1 } return arrayIndexOf(buffer, val, byteOffset, encoding, dir) } else if (typeof val === 'number') { val = val & 0xFF // Search for a byte value [0-255] if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) } else { return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) } } return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) } throw new TypeError('val must be string, number or Buffer') } function arrayIndexOf (arr, val, byteOffset, encoding, dir) { var indexSize = 1 var arrLength = arr.length var valLength = val.length if (encoding !== undefined) { encoding = String(encoding).toLowerCase() if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { if (arr.length < 2 || val.length < 2) { return -1 } indexSize = 2 arrLength /= 2 valLength /= 2 byteOffset /= 2 } } function read (buf, i) { if (indexSize === 1) { return buf[i] } else { return buf.readUInt16BE(i * indexSize) } } var i if (dir) { var foundIndex = -1 for (i = byteOffset; i < arrLength; i++) { if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i if (i - foundIndex + 1 === valLength) return foundIndex * indexSize } else { if (foundIndex !== -1) i -= i - foundIndex foundIndex = -1 } } } else { if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength for (i = byteOffset; i >= 0; i--) { var found = true for (var j = 0; j < valLength; j++) { if (read(arr, i + j) !== read(val, j)) { found = false break } } if (found) return i } } return -1 } Buffer.prototype.includes = function includes (val, byteOffset, encoding) { return this.indexOf(val, byteOffset, encoding) !== -1 } Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, true) } Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, false) } function hexWrite (buf, string, offset, length) { offset = Number(offset) || 0 var remaining = buf.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } // must be an even number of digits var strLen = string.length if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (isNaN(parsed)) return i buf[offset + i] = parsed } return i } function utf8Write (buf, string, offset, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite (buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } function latin1Write (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write (buf, string, offset, length) { return blitBuffer(base64ToBytes(string), buf, offset, length) } function ucs2Write (buf, string, offset, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } Buffer.prototype.write = function write (string, offset, length, encoding) { // Buffer#write(string) if (offset === undefined) { encoding = 'utf8' length = this.length offset = 0 // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { encoding = offset length = this.length offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { offset = offset | 0 if (isFinite(length)) { length = length | 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } // legacy write(string, encoding, offset, length) - remove in v0.13 } else { throw new Error( 'Buffer.write(string, encoding, offset[, length]) is no longer supported' ) } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { throw new RangeError('Attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' var loweredCase = false for (;;) { switch (encoding) { case 'hex': return hexWrite(this, string, offset, length) case 'utf8': case 'utf-8': return utf8Write(this, string, offset, length) case 'ascii': return asciiWrite(this, string, offset, length) case 'latin1': case 'binary': return latin1Write(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write return base64Write(this, string, offset, length) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return ucs2Write(this, string, offset, length) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.prototype.toJSON = function toJSON () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } function base64Slice (buf, start, end) { if (start === 0 && end === buf.length) { return base64.fromByteArray(buf) } else { return base64.fromByteArray(buf.slice(start, end)) } } function utf8Slice (buf, start, end) { end = Math.min(buf.length, end) var res = [] var i = start while (i < end) { var firstByte = buf[i] var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint switch (bytesPerSequence) { case 1: if (firstByte < 0x80) { codePoint = firstByte } break case 2: secondByte = buf[i + 1] if ((secondByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) if (tempCodePoint > 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = buf[i + 1] thirdByte = buf[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = buf[i + 1] thirdByte = buf[i + 2] fourthByte = buf[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety var MAX_ARGUMENTS_LENGTH = 0x1000 function decodeCodePointsArray (codePoints) { var len = codePoints.length if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints) // avoid extra slice() } // Decode in chunks to avoid "call stack size exceeded". var res = '' var i = 0 while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ) } return res } function asciiSlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret } function latin1Slice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i]) } return ret } function hexSlice (buf, start, end) { var len = buf.length if (!start || start < 0) start = 0 if (!end || end < 0 || end > len) end = len var out = '' for (var i = start; i < end; ++i) { out += toHex(buf[i]) } return out } function utf16leSlice (buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) } return res } Buffer.prototype.slice = function slice (start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { start += len if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len if (end < 0) end = 0 } else if (end > len) { end = len } if (end < start) end = start var newBuf if (Buffer.TYPED_ARRAY_SUPPORT) { newBuf = this.subarray(start, end) newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) for (var i = 0; i < sliceLen; ++i) { newBuf[i] = this[i + start] } } return newBuf } /* * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset (offset, ext, length) { if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } return val } Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } var val = this[offset + --byteLength] var mul = 1 while (byteLength > 0 && (mul *= 0x100)) { val += this[offset + --byteLength] * mul } return val } Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16)) + (this[offset + 3] * 0x1000000) } Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + ((this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3]) } Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24) } Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | (this[offset + 3]) } Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt (buf, value, offset, ext, max, min) { if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') if (offset + ext > buf.length) throw new RangeError('Index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var mul = 1 var i = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) this[offset] = (value & 0xff) return offset + 1 } function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } } Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 var sub = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 var sub = 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } function checkIEEE754 (buf, value, offset, ext, max, min) { if (offset + ext > buf.length) throw new RangeError('Index out of range') if (offset < 0) throw new RangeError('Index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (!start) start = 0 if (!end && end !== 0) end = this.length if (targetStart >= target.length) targetStart = target.length if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (targetStart < 0) { throw new RangeError('targetStart out of bounds') } if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? if (end > this.length) end = this.length if (target.length - targetStart < end - start) { end = target.length - targetStart + start } var len = end - start var i if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { // ascending copy from start for (i = 0; i < len; ++i) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, start + len), targetStart ) } return len } // Usage: // buffer.fill(number[, offset[, end]]) // buffer.fill(buffer[, offset[, end]]) // buffer.fill(string[, offset[, end]][, encoding]) Buffer.prototype.fill = function fill (val, start, end, encoding) { // Handle string cases: if (typeof val === 'string') { if (typeof start === 'string') { encoding = start start = 0 end = this.length } else if (typeof end === 'string') { encoding = end end = this.length } if (val.length === 1) { var code = val.charCodeAt(0) if (code < 256) { val = code } } if (encoding !== undefined && typeof encoding !== 'string') { throw new TypeError('encoding must be a string') } if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { throw new TypeError('Unknown encoding: ' + encoding) } } else if (typeof val === 'number') { val = val & 255 } // Invalid ranges are not set to a default, so can range check early. if (start < 0 || this.length < start || this.length < end) { throw new RangeError('Out of range index') } if (end <= start) { return this } start = start >>> 0 end = end === undefined ? this.length : end >>> 0 if (!val) val = 0 var i if (typeof val === 'number') { for (i = start; i < end; ++i) { this[i] = val } } else { var bytes = Buffer.isBuffer(val) ? val : utf8ToBytes(new Buffer(val, encoding).toString()) var len = bytes.length for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] } } return this } // HELPER FUNCTIONS // ================ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not str = stringtrim(str).replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not while (str.length % 4 !== 0) { str = str + '=' } return str } function stringtrim (str) { if (str.trim) return str.trim() return str.replace(/^\s+|\s+$/g, '') } function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } function utf8ToBytes (string, units) { units = units || Infinity var codePoint var length = string.length var leadSurrogate = null var bytes = [] for (var i = 0; i < length; ++i) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } function asciiToBytes (str) { var byteArray = [] for (var i = 0; i < str.length; ++i) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } return byteArray } function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break c = str.charCodeAt(i) hi = c >> 8 lo = c % 256 byteArray.push(lo) byteArray.push(hi) } return byteArray } function base64ToBytes (str) { return base64.toByteArray(base64clean(str)) } function blitBuffer (src, dst, offset, length) { for (var i = 0; i < length; ++i) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } function isnan (val) { return val !== val // eslint-disable-line no-self-compare } /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(14))) /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { var basex = __webpack_require__(51) var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' module.exports = basex(ALPHABET) /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { !function(t,e){ true?module.exports=e():"function"==typeof define&&define.amd?define("FiveBellsCondition",[],e):"object"==typeof exports?exports.FiveBellsCondition=e():t.FiveBellsCondition=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var r={};return e.m=t,e.c=r,e.i=function(t){return t},e.d=function(t,e,r){Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=613)}([function(t,e,r){var n=r(4),i=r(32),o=r(14),a=r(15),f=r(33),s="prototype",u=function(t,e,r){var h,c,d,l,p=t&u.F,b=t&u.G,v=t&u.S,y=t&u.P,m=t&u.B,g=b?n:v?n[e]||(n[e]={}):(n[e]||{})[s],w=b?i:i[e]||(i[e]={}),_=w[s]||(w[s]={});b&&(r=e);for(h in r)c=!p&&g&&void 0!==g[h],d=(c?g:r)[h],l=m&&c?f(d,n):y&&"function"==typeof d?f(Function.call,d):d,g&&a(g,h,d,t&u.U),w[h]!=d&&o(w,h,l),y&&_[h]!=d&&(_[h]=d)};n.core=i,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},function(t,e,r){"use strict";(function(t,n){function i(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}function o(){return t.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,r){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|t}function v(e){return+e!=e&&(e=0),t.alloc(+e)}function y(e,r){if(t.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 n=e.length;if(0===n)return 0;for(var i=!1;;)switch(r){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return V(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return Y(e).length;default:if(i)return V(e).length;r=(""+r).toLowerCase(),i=!0}}function m(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if(r>>>=0,e>>>=0,r<=e)return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return B(this,e,r);case"ascii":return R(this,e,r);case"latin1":case"binary":return P(this,e,r);case"base64":return I(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return j(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function g(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function w(e,r,n,i,o){if(0===e.length)return-1;if("string"==typeof n?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof r&&(r=t.from(r,i)),t.isBuffer(r))return 0===r.length?-1:_(e,r,n,i,o);if("number"==typeof r)return r&=255,t.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,r,n):Uint8Array.prototype.lastIndexOf.call(e,r,n):_(e,[r],n,i,o);throw new TypeError("val must be string, number or Buffer")}function _(t,e,r,n,i){function o(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}var a=1,f=t.length,s=e.length;if(void 0!==n&&(n=String(n).toLowerCase(),"ucs2"===n||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;a=2,f/=2,s/=2,r/=2}var u;if(i){var h=-1;for(u=r;uf&&(r=f-s),u=r;u>=0;u--){for(var c=!0,d=0;di&&(n=i)):n=i;var o=e.length;if(o%2!==0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var a=0;a239?4:o>223?3:o>191?2:1;if(i+f<=r){var s,u,h,c;switch(f){case 1:o<128&&(a=o);break;case 2:s=t[i+1],128===(192&s)&&(c=(31&o)<<6|63&s,c>127&&(a=c));break;case 3:s=t[i+1],u=t[i+2],128===(192&s)&&128===(192&u)&&(c=(15&o)<<12|(63&s)<<6|63&u,c>2047&&(c<55296||c>57343)&&(a=c));break;case 4:s=t[i+1],u=t[i+2],h=t[i+3],128===(192&s)&&128===(192&u)&&128===(192&h)&&(c=(15&o)<<18|(63&s)<<12|(63&u)<<6|63&h,c>65535&&c<1114112&&(a=c))}}null===a?(a=65533,f=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|1023&a),n.push(a),i+=f}return O(n)}function O(t){var e=t.length;if(e<=tt)return String.fromCharCode.apply(String,t);for(var r="",n=0;nn)&&(r=n);for(var i="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function N(e,r,n,i,o,a){if(!t.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>o||re.length)throw new RangeError("Index out of range")}function L(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function U(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function z(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function D(t,e,r,n,i){return i||z(t,e,r,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(t,e,r,n,23,4),r+4}function q(t,e,r,n,i){return i||z(t,e,r,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(t,e,r,n,52,8),r+8}function F(t){if(t=K(t).replace(et,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function K(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function G(t){return t<16?"0"+t.toString(16):t.toString(16)}function V(t,e){e=e||1/0;for(var r,n=t.length,i=null,o=[],a=0;a55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=(i-55296<<10|r-56320)+65536}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function H(t){for(var e=[],r=0;r>8,i=r%256,o.push(i),o.push(n);return o}function Y(t){return J.toByteArray(F(t))}function W(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function Z(t){return t!==t}var J=r(490),$=r(491),Q=r(492);e.Buffer=t,e.SlowBuffer=v,e.INSPECT_MAX_BYTES=50,t.TYPED_ARRAY_SUPPORT=void 0!==n.TYPED_ARRAY_SUPPORT?n.TYPED_ARRAY_SUPPORT:i(),e.kMaxLength=o(),t.poolSize=8192,t._augment=function(e){return e.__proto__=t.prototype,e},t.from=function(t,e,r){return f(null,t,e,r)},t.TYPED_ARRAY_SUPPORT&&(t.prototype.__proto__=Uint8Array.prototype,t.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&t[Symbol.species]===t&&Object.defineProperty(t,Symbol.species,{value:null,configurable:!0})),t.alloc=function(t,e,r){return u(null,t,e,r)},t.allocUnsafe=function(t){return h(null,t)},t.allocUnsafeSlow=function(t){return h(null,t)},t.isBuffer=function(t){return!(null==t||!t._isBuffer)},t.compare=function(e,r){if(!t.isBuffer(e)||!t.isBuffer(r))throw new TypeError("Arguments must be Buffers");if(e===r)return 0;for(var n=e.length,i=r.length,o=0,a=Math.min(n,i);o0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},t.prototype.compare=function(e,r,n,i,o){if(!t.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===r&&(r=0),void 0===n&&(n=e?e.length:0),void 0===i&&(i=0),void 0===o&&(o=this.length),r<0||n>e.length||i<0||o>this.length)throw new RangeError("out of range index");if(i>=o&&r>=n)return 0;if(i>=o)return-1;if(r>=n)return 1;if(r>>>=0,n>>>=0,i>>>=0,o>>>=0,this===e)return 0;for(var a=o-i,f=n-r,s=Math.min(a,f),u=this.slice(i,o),h=e.slice(r,n),c=0;ci)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return M(this,t,e,r);case"utf8":case"utf-8":return S(this,t,e,r);case"ascii":return E(this,t,e,r);case"latin1":case"binary":return A(this,t,e,r);case"base64":return k(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return x(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},t.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var tt=4096;t.prototype.slice=function(e,r){var n=this.length;e=~~e,r=void 0===r?n:~~r,e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),r<0?(r+=n,r<0&&(r=0)):r>n&&(r=n),r0&&(i*=256);)n+=this[t+--e]*i;return n},t.prototype.readUInt8=function(t,e){return e||C(t,1,this.length),this[t]},t.prototype.readUInt16LE=function(t,e){return e||C(t,2,this.length),this[t]|this[t+1]<<8},t.prototype.readUInt16BE=function(t,e){return e||C(t,2,this.length),this[t]<<8|this[t+1]},t.prototype.readUInt32LE=function(t,e){return e||C(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},t.prototype.readUInt32BE=function(t,e){return e||C(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},t.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||C(t,e,this.length);for(var n=this[t],i=1,o=0;++o=i&&(n-=Math.pow(2,8*e)),n},t.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||C(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*e)),o},t.prototype.readInt8=function(t,e){return e||C(t,1,this.length),128&this[t]?(255-this[t]+1)*-1:this[t]},t.prototype.readInt16LE=function(t,e){e||C(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},t.prototype.readInt16BE=function(t,e){e||C(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},t.prototype.readInt32LE=function(t,e){return e||C(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},t.prototype.readInt32BE=function(t,e){return e||C(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},t.prototype.readFloatLE=function(t,e){return e||C(t,4,this.length),$.read(this,t,!0,23,4)},t.prototype.readFloatBE=function(t,e){return e||C(t,4,this.length),$.read(this,t,!1,23,4)},t.prototype.readDoubleLE=function(t,e){return e||C(t,8,this.length),$.read(this,t,!0,52,8)},t.prototype.readDoubleBE=function(t,e){return e||C(t,8,this.length),$.read(this,t,!1,52,8)},t.prototype.writeUIntLE=function(t,e,r,n){if(t=+t,e|=0,r|=0,!n){var i=Math.pow(2,8*r)-1;N(this,t,e,r,i,0)}var o=1,a=0;for(this[e]=255&t;++a=0&&(a*=256);)this[e+o]=t/a&255;return e+r},t.prototype.writeUInt8=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,1,255,0),t.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[r]=255&e,r+1},t.prototype.writeUInt16LE=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,2,65535,0),t.TYPED_ARRAY_SUPPORT?(this[r]=255&e,this[r+1]=e>>>8):L(this,e,r,!0),r+2},t.prototype.writeUInt16BE=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,2,65535,0),t.TYPED_ARRAY_SUPPORT?(this[r]=e>>>8,this[r+1]=255&e):L(this,e,r,!1),r+2},t.prototype.writeUInt32LE=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,4,4294967295,0),t.TYPED_ARRAY_SUPPORT?(this[r+3]=e>>>24,this[r+2]=e>>>16,this[r+1]=e>>>8,this[r]=255&e):U(this,e,r,!0),r+4},t.prototype.writeUInt32BE=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,4,4294967295,0),t.TYPED_ARRAY_SUPPORT?(this[r]=e>>>24,this[r+1]=e>>>16,this[r+2]=e>>>8,this[r+3]=255&e):U(this,e,r,!1),r+4},t.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);N(this,t,e,r,i-1,-i)}var o=0,a=1,f=0;for(this[e]=255&t;++o>0)-f&255;return e+r},t.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);N(this,t,e,r,i-1,-i)}var o=r-1,a=1,f=0;for(this[e+o]=255&t;--o>=0&&(a*=256);)t<0&&0===f&&0!==this[e+o+1]&&(f=1),this[e+o]=(t/a>>0)-f&255;return e+r},t.prototype.writeInt8=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,1,127,-128),t.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[r]=255&e,r+1},t.prototype.writeInt16LE=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,2,32767,-32768),t.TYPED_ARRAY_SUPPORT?(this[r]=255&e,this[r+1]=e>>>8):L(this,e,r,!0),r+2},t.prototype.writeInt16BE=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,2,32767,-32768),t.TYPED_ARRAY_SUPPORT?(this[r]=e>>>8,this[r+1]=255&e):L(this,e,r,!1),r+2},t.prototype.writeInt32LE=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,4,2147483647,-2147483648),t.TYPED_ARRAY_SUPPORT?(this[r]=255&e,this[r+1]=e>>>8,this[r+2]=e>>>16,this[r+3]=e>>>24):U(this,e,r,!0),r+4},t.prototype.writeInt32BE=function(e,r,n){return e=+e,r|=0,n||N(this,e,r,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),t.TYPED_ARRAY_SUPPORT?(this[r]=e>>>24,this[r+1]=e>>>16,this[r+2]=e>>>8,this[r+3]=255&e):U(this,e,r,!1),r+4},t.prototype.writeFloatLE=function(t,e,r){return D(this,t,e,!0,r)},t.prototype.writeFloatBE=function(t,e,r){return D(this,t,e,!1,r)},t.prototype.writeDoubleLE=function(t,e,r){return q(this,t,e,!0,r)},t.prototype.writeDoubleBE=function(t,e,r){return q(this,t,e,!1,r)},t.prototype.copy=function(e,r,n,i){if(n||(n=0),i||0===i||(i=this.length),r>=e.length&&(r=e.length),r||(r=0),i>0&&i=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-r=0;--o)e[o+r]=this[o+n];else if(a<1e3||!t.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0);var a;if("number"==typeof e)for(a=r;a0?i(n(t),9007199254740991):0}},function(t,e,r){var n=r(24);t.exports=function(t){return Object(n(t))}},function(t,e){var r={}.hasOwnProperty;t.exports=function(t,e){return r.call(t,e)}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,r){var n=r(9),i=r(37);t.exports=r(8)?function(t,e,r){return n.f(t,e,i(1,r))}:function(t,e,r){return t[e]=r,t}},function(t,e,r){var n=r(4),i=r(14),o=r(12),a=r(48)("src"),f="toString",s=Function[f],u=(""+s).split(f);r(32).inspectSource=function(t){return s.call(t)},(t.exports=function(t,e,r,f){var s="function"==typeof r;s&&(o(r,"name")||i(r,"name",e)),t[e]!==r&&(s&&(o(r,a)||i(r,a,t[e]?""+t[e]:u.join(String(e)))),t===n?t[e]=r:f?t[e]?t[e]=r:i(t,e,r):(delete t[e],i(t,e,r)))})(Function.prototype,f,function(){return"function"==typeof this&&this[a]||s.call(this)})},function(t,e,r){var n=r(0),i=r(5),o=r(24),a=/"/g,f=function(t,e,r,n){var i=String(o(t)),f="<"+e;return""!==r&&(f+=" "+r+'="'+String(n).replace(a,""")+'"'),f+">"+i+""};t.exports=function(t,e){var r={};r[t]=e(f),n(n.P+n.F*i(function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}),"String",r)}},function(t,e,r){var n=r(65),i=r(24);t.exports=function(t){return n(i(t))}},function(t,e,r){(function(t){!function(t,e){"use strict";function n(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function o(t,e,r){return o.isBN(t)?t:(this.negative=0,this.words=null,this.length=0,this.red=null,void(null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))))}function a(t,e,r){for(var n=0,i=Math.min(t.length,r),o=e;o=49&&a<=54?a-49+10:a>=17&&a<=22?a-17+10:15&a}return n}function f(t,e,r,n){for(var i=0,o=Math.min(t.length,r),a=e;a=49?f-49+10:f>=17?f-17+10:f}return i}function s(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}function u(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],o=0|e.words[0],a=i*o,f=67108863&a,s=a/67108864|0;r.words[0]=f;for(var u=1;u>>26,c=67108863&s,d=Math.min(u,e.length-1),l=Math.max(0,u-t.length+1);l<=d;l++){var p=u-l|0;i=0|t.words[p],o=0|e.words[l],a=i*o+c,h+=a/67108864|0,c=67108863&a}r.words[u]=0|c,s=0|h}return 0!==s?r.words[u]=0|s:r.length--,r.strip()}function h(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,o=0;o>>26)|0,i+=a>>>26,a&=67108863}r.words[o]=f,n=a,a=i}return 0!==n?r.words[o]=n:r.length--,r.strip()}function c(t,e,r){var n=new d;return n.mulp(t,e,r)}function d(t,e){this.x=t,this.y=e}function l(t,e){this.name=t,this.p=new o(e,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function p(){l.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function b(){l.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function v(){l.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function y(){l.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function m(t){if("string"==typeof t){var e=o._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function g(t){m.call(this,t),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}"object"==typeof t?t.exports=o:e.BN=o,o.BN=o,o.wordSize=26;var w;try{w=r(1).Buffer}catch(t){}o.isBN=function(t){return t instanceof o||null!==t&&"object"==typeof t&&t.constructor.wordSize===o.wordSize&&Array.isArray(t.words)},o.max=function(t,e){return t.cmp(e)>0?t:e},o.min=function(t,e){return t.cmp(e)<0?t:e},o.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36),t=t.toString().replace(/\s+/g,"");var i=0;"-"===t[0]&&i++,16===e?this._parseHex(t,i):this._parseBase(t,e,i),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(n(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initArray=function(t,e,r){if(n("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)a=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[o]|=a<>>26-f&67108863,f+=24,f>=26&&(f-=26,o++);else if("le"===r)for(i=0,o=0;i>>26-f&67108863,f+=24,f>=26&&(f-=26,o++);return this.strip()},o.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var r=0;r=e;r-=6)i=a(t,r,r+6),this.words[n]|=i<>>26-o&4194303,o+=24,o>=26&&(o-=26,n++);r+6!==e&&(i=a(t,e,r+6),this.words[n]|=i<>>26-o&4194303),this.strip()},o.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var o=t.length-r,a=o%n,s=Math.min(o,o-a)+r,u=0,h=r;h1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},o.prototype.inspect=function(){return(this.red?""};var _=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],M=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],S=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];o.prototype.toString=function(t,e){t=t||10,e=0|e||1;var r;if(16===t||"hex"===t){r="";for(var i=0,o=0,a=0;a>>24-i&16777215,r=0!==o||a!==this.length-1?_[6-s.length]+s+r:s+r,i+=2,i>=26&&(i-=26,a--)}for(0!==o&&(r=o.toString(16)+r);r.length%e!==0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var u=M[t],h=S[t];r="";var c=this.clone();for(c.negative=0;!c.isZero();){var d=c.modn(h).toString(t);c=c.idivn(h),r=c.isZero()?d+r:_[u-d.length]+d+r}for(this.isZero()&&(r="0"+r);r.length%e!==0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},o.prototype.toJSON=function(){return this.toString(16)},o.prototype.toBuffer=function(t,e){return n("undefined"!=typeof w),this.toArrayLike(w,t,e)},o.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},o.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),o=r||Math.max(1,i);n(i<=o,"byte array longer than desired length"),n(o>0,"Requested array length <= 0"),this.strip();var a,f,s="le"===e,u=new t(o),h=this.clone();if(s){for(f=0;!h.isZero();f++)a=h.andln(255),h.iushrn(8),u[f]=a;for(;f=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},o.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0===(8191&e)&&(r+=13,e>>>=13),0===(127&e)&&(r+=7,e>>>=7),0===(15&e)&&(r+=4,e>>>=4),0===(3&e)&&(r+=2,e>>>=2),0===(1&e)&&r++,r},o.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},o.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},o.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},o.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},o.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},o.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},o.prototype.inotn=function(t){n("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},o.prototype.notn=function(t){return this.clone().inotn(t)},o.prototype.setn=function(t,e){n("number"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),e?this.words[r]=this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},o.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r=this.cmp(t);if(0===r)return this.negative=0,this.length=1,this.words[0]=0,this;var n,i;r>0?(n=this,i=t):(n=t,i=this);for(var o=0,a=0;a>26,this.words[a]=67108863&e;for(;0!==o&&a>26,this.words[a]=67108863&e;if(0===o&&a>>13,l=0|a[1],p=8191&l,b=l>>>13,v=0|a[2],y=8191&v,m=v>>>13,g=0|a[3],w=8191&g,_=g>>>13,M=0|a[4],S=8191&M,E=M>>>13,A=0|a[5],k=8191&A,x=A>>>13,I=0|a[6],B=8191&I,O=I>>>13,R=0|a[7],P=8191&R,T=R>>>13,j=0|a[8],C=8191&j,N=j>>>13,L=0|a[9],U=8191&L,z=L>>>13,D=0|f[0],q=8191&D,F=D>>>13,K=0|f[1],G=8191&K,V=K>>>13,H=0|f[2],X=8191&H,Y=H>>>13,W=0|f[3],Z=8191&W,J=W>>>13,$=0|f[4],Q=8191&$,tt=$>>>13,et=0|f[5],rt=8191&et,nt=et>>>13,it=0|f[6],ot=8191&it,at=it>>>13,ft=0|f[7],st=8191&ft,ut=ft>>>13,ht=0|f[8],ct=8191&ht,dt=ht>>>13,lt=0|f[9],pt=8191<,bt=lt>>>13;r.negative=t.negative^e.negative,r.length=19,n=Math.imul(c,q),i=Math.imul(c,F),i=i+Math.imul(d,q)|0,o=Math.imul(d,F);var vt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(p,q),i=Math.imul(p,F),i=i+Math.imul(b,q)|0,o=Math.imul(b,F),n=n+Math.imul(c,G)|0,i=i+Math.imul(c,V)|0,i=i+Math.imul(d,G)|0,o=o+Math.imul(d,V)|0;var yt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,q),i=Math.imul(y,F),i=i+Math.imul(m,q)|0,o=Math.imul(m,F),n=n+Math.imul(p,G)|0,i=i+Math.imul(p,V)|0,i=i+Math.imul(b,G)|0,o=o+Math.imul(b,V)|0,n=n+Math.imul(c,X)|0,i=i+Math.imul(c,Y)|0,i=i+Math.imul(d,X)|0,o=o+Math.imul(d,Y)|0;var mt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(w,q),i=Math.imul(w,F),i=i+Math.imul(_,q)|0,o=Math.imul(_,F),n=n+Math.imul(y,G)|0,i=i+Math.imul(y,V)|0,i=i+Math.imul(m,G)|0,o=o+Math.imul(m,V)|0,n=n+Math.imul(p,X)|0,i=i+Math.imul(p,Y)|0,i=i+Math.imul(b,X)|0,o=o+Math.imul(b,Y)|0,n=n+Math.imul(c,Z)|0,i=i+Math.imul(c,J)|0,i=i+Math.imul(d,Z)|0,o=o+Math.imul(d,J)|0;var gt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(S,q),i=Math.imul(S,F),i=i+Math.imul(E,q)|0,o=Math.imul(E,F),n=n+Math.imul(w,G)|0,i=i+Math.imul(w,V)|0,i=i+Math.imul(_,G)|0,o=o+Math.imul(_,V)|0,n=n+Math.imul(y,X)|0,i=i+Math.imul(y,Y)|0,i=i+Math.imul(m,X)|0,o=o+Math.imul(m,Y)|0,n=n+Math.imul(p,Z)|0,i=i+Math.imul(p,J)|0,i=i+Math.imul(b,Z)|0,o=o+Math.imul(b,J)|0,n=n+Math.imul(c,Q)|0,i=i+Math.imul(c,tt)|0,i=i+Math.imul(d,Q)|0,o=o+Math.imul(d,tt)|0;var wt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(k,q),i=Math.imul(k,F),i=i+Math.imul(x,q)|0,o=Math.imul(x,F),n=n+Math.imul(S,G)|0,i=i+Math.imul(S,V)|0,i=i+Math.imul(E,G)|0,o=o+Math.imul(E,V)|0,n=n+Math.imul(w,X)|0,i=i+Math.imul(w,Y)|0,i=i+Math.imul(_,X)|0,o=o+Math.imul(_,Y)|0,n=n+Math.imul(y,Z)|0,i=i+Math.imul(y,J)|0,i=i+Math.imul(m,Z)|0,o=o+Math.imul(m,J)|0,n=n+Math.imul(p,Q)|0,i=i+Math.imul(p,tt)|0,i=i+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,n=n+Math.imul(c,rt)|0,i=i+Math.imul(c,nt)|0,i=i+Math.imul(d,rt)|0,o=o+Math.imul(d,nt)|0;var _t=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(B,q),i=Math.imul(B,F),i=i+Math.imul(O,q)|0,o=Math.imul(O,F),n=n+Math.imul(k,G)|0,i=i+Math.imul(k,V)|0,i=i+Math.imul(x,G)|0,o=o+Math.imul(x,V)|0,n=n+Math.imul(S,X)|0,i=i+Math.imul(S,Y)|0,i=i+Math.imul(E,X)|0,o=o+Math.imul(E,Y)|0,n=n+Math.imul(w,Z)|0,i=i+Math.imul(w,J)|0,i=i+Math.imul(_,Z)|0,o=o+Math.imul(_,J)|0,n=n+Math.imul(y,Q)|0,i=i+Math.imul(y,tt)|0,i=i+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0,n=n+Math.imul(p,rt)|0,i=i+Math.imul(p,nt)|0,i=i+Math.imul(b,rt)|0,o=o+Math.imul(b,nt)|0,n=n+Math.imul(c,ot)|0,i=i+Math.imul(c,at)|0,i=i+Math.imul(d,ot)|0,o=o+Math.imul(d,at)|0;var Mt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(P,q),i=Math.imul(P,F),i=i+Math.imul(T,q)|0,o=Math.imul(T,F),n=n+Math.imul(B,G)|0,i=i+Math.imul(B,V)|0,i=i+Math.imul(O,G)|0,o=o+Math.imul(O,V)|0,n=n+Math.imul(k,X)|0,i=i+Math.imul(k,Y)|0,i=i+Math.imul(x,X)|0,o=o+Math.imul(x,Y)|0,n=n+Math.imul(S,Z)|0,i=i+Math.imul(S,J)|0,i=i+Math.imul(E,Z)|0,o=o+Math.imul(E,J)|0,n=n+Math.imul(w,Q)|0,i=i+Math.imul(w,tt)|0,i=i+Math.imul(_,Q)|0,o=o+Math.imul(_,tt)|0,n=n+Math.imul(y,rt)|0,i=i+Math.imul(y,nt)|0,i=i+Math.imul(m,rt)|0,o=o+Math.imul(m,nt)|0,n=n+Math.imul(p,ot)|0,i=i+Math.imul(p,at)|0,i=i+Math.imul(b,ot)|0,o=o+Math.imul(b,at)|0,n=n+Math.imul(c,st)|0,i=i+Math.imul(c,ut)|0,i=i+Math.imul(d,st)|0,o=o+Math.imul(d,ut)|0;var St=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(C,q),i=Math.imul(C,F),i=i+Math.imul(N,q)|0,o=Math.imul(N,F),n=n+Math.imul(P,G)|0,i=i+Math.imul(P,V)|0,i=i+Math.imul(T,G)|0,o=o+Math.imul(T,V)|0,n=n+Math.imul(B,X)|0,i=i+Math.imul(B,Y)|0,i=i+Math.imul(O,X)|0,o=o+Math.imul(O,Y)|0,n=n+Math.imul(k,Z)|0,i=i+Math.imul(k,J)|0,i=i+Math.imul(x,Z)|0,o=o+Math.imul(x,J)|0,n=n+Math.imul(S,Q)|0,i=i+Math.imul(S,tt)|0,i=i+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,n=n+Math.imul(w,rt)|0,i=i+Math.imul(w,nt)|0,i=i+Math.imul(_,rt)|0,o=o+Math.imul(_,nt)|0,n=n+Math.imul(y,ot)|0,i=i+Math.imul(y,at)|0,i=i+Math.imul(m,ot)|0,o=o+Math.imul(m,at)|0,n=n+Math.imul(p,st)|0,i=i+Math.imul(p,ut)|0,i=i+Math.imul(b,st)|0,o=o+Math.imul(b,ut)|0,n=n+Math.imul(c,ct)|0,i=i+Math.imul(c,dt)|0,i=i+Math.imul(d,ct)|0,o=o+Math.imul(d,dt)|0;var Et=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(U,q),i=Math.imul(U,F),i=i+Math.imul(z,q)|0,o=Math.imul(z,F),n=n+Math.imul(C,G)|0,i=i+Math.imul(C,V)|0,i=i+Math.imul(N,G)|0,o=o+Math.imul(N,V)|0,n=n+Math.imul(P,X)|0,i=i+Math.imul(P,Y)|0,i=i+Math.imul(T,X)|0,o=o+Math.imul(T,Y)|0,n=n+Math.imul(B,Z)|0,i=i+Math.imul(B,J)|0,i=i+Math.imul(O,Z)|0,o=o+Math.imul(O,J)|0,n=n+Math.imul(k,Q)|0,i=i+Math.imul(k,tt)|0,i=i+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,n=n+Math.imul(S,rt)|0,i=i+Math.imul(S,nt)|0,i=i+Math.imul(E,rt)|0,o=o+Math.imul(E,nt)|0,n=n+Math.imul(w,ot)|0,i=i+Math.imul(w,at)|0,i=i+Math.imul(_,ot)|0,o=o+Math.imul(_,at)|0,n=n+Math.imul(y,st)|0,i=i+Math.imul(y,ut)|0,i=i+Math.imul(m,st)|0,o=o+Math.imul(m,ut)|0,n=n+Math.imul(p,ct)|0,i=i+Math.imul(p,dt)|0,i=i+Math.imul(b,ct)|0,o=o+Math.imul(b,dt)|0,n=n+Math.imul(c,pt)|0,i=i+Math.imul(c,bt)|0,i=i+Math.imul(d,pt)|0,o=o+Math.imul(d,bt)|0;var At=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(U,G),i=Math.imul(U,V),i=i+Math.imul(z,G)|0,o=Math.imul(z,V),n=n+Math.imul(C,X)|0,i=i+Math.imul(C,Y)|0,i=i+Math.imul(N,X)|0,o=o+Math.imul(N,Y)|0,n=n+Math.imul(P,Z)|0,i=i+Math.imul(P,J)|0,i=i+Math.imul(T,Z)|0,o=o+Math.imul(T,J)|0,n=n+Math.imul(B,Q)|0,i=i+Math.imul(B,tt)|0,i=i+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,n=n+Math.imul(k,rt)|0,i=i+Math.imul(k,nt)|0,i=i+Math.imul(x,rt)|0,o=o+Math.imul(x,nt)|0,n=n+Math.imul(S,ot)|0,i=i+Math.imul(S,at)|0,i=i+Math.imul(E,ot)|0,o=o+Math.imul(E,at)|0,n=n+Math.imul(w,st)|0,i=i+Math.imul(w,ut)|0,i=i+Math.imul(_,st)|0,o=o+Math.imul(_,ut)|0,n=n+Math.imul(y,ct)|0,i=i+Math.imul(y,dt)|0,i=i+Math.imul(m,ct)|0,o=o+Math.imul(m,dt)|0,n=n+Math.imul(p,pt)|0,i=i+Math.imul(p,bt)|0,i=i+Math.imul(b,pt)|0,o=o+Math.imul(b,bt)|0;var kt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(U,X),i=Math.imul(U,Y),i=i+Math.imul(z,X)|0,o=Math.imul(z,Y),n=n+Math.imul(C,Z)|0,i=i+Math.imul(C,J)|0,i=i+Math.imul(N,Z)|0,o=o+Math.imul(N,J)|0,n=n+Math.imul(P,Q)|0,i=i+Math.imul(P,tt)|0,i=i+Math.imul(T,Q)|0,o=o+Math.imul(T,tt)|0,n=n+Math.imul(B,rt)|0,i=i+Math.imul(B,nt)|0,i=i+Math.imul(O,rt)|0,o=o+Math.imul(O,nt)|0,n=n+Math.imul(k,ot)|0,i=i+Math.imul(k,at)|0,i=i+Math.imul(x,ot)|0,o=o+Math.imul(x,at)|0,n=n+Math.imul(S,st)|0,i=i+Math.imul(S,ut)|0,i=i+Math.imul(E,st)|0,o=o+Math.imul(E,ut)|0,n=n+Math.imul(w,ct)|0,i=i+Math.imul(w,dt)|0,i=i+Math.imul(_,ct)|0,o=o+Math.imul(_,dt)|0,n=n+Math.imul(y,pt)|0,i=i+Math.imul(y,bt)|0,i=i+Math.imul(m,pt)|0,o=o+Math.imul(m,bt)|0;var xt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(U,Z),i=Math.imul(U,J),i=i+Math.imul(z,Z)|0,o=Math.imul(z,J),n=n+Math.imul(C,Q)|0,i=i+Math.imul(C,tt)|0,i=i+Math.imul(N,Q)|0,o=o+Math.imul(N,tt)|0,n=n+Math.imul(P,rt)|0,i=i+Math.imul(P,nt)|0,i=i+Math.imul(T,rt)|0,o=o+Math.imul(T,nt)|0,n=n+Math.imul(B,ot)|0,i=i+Math.imul(B,at)|0,i=i+Math.imul(O,ot)|0,o=o+Math.imul(O,at)|0,n=n+Math.imul(k,st)|0,i=i+Math.imul(k,ut)|0,i=i+Math.imul(x,st)|0,o=o+Math.imul(x,ut)|0,n=n+Math.imul(S,ct)|0,i=i+Math.imul(S,dt)|0,i=i+Math.imul(E,ct)|0,o=o+Math.imul(E,dt)|0,n=n+Math.imul(w,pt)|0,i=i+Math.imul(w,bt)|0,i=i+Math.imul(_,pt)|0,o=o+Math.imul(_,bt)|0;var It=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(It>>>26)|0,It&=67108863,n=Math.imul(U,Q),i=Math.imul(U,tt),i=i+Math.imul(z,Q)|0,o=Math.imul(z,tt),n=n+Math.imul(C,rt)|0,i=i+Math.imul(C,nt)|0,i=i+Math.imul(N,rt)|0,o=o+Math.imul(N,nt)|0,n=n+Math.imul(P,ot)|0,i=i+Math.imul(P,at)|0,i=i+Math.imul(T,ot)|0,o=o+Math.imul(T,at)|0,n=n+Math.imul(B,st)|0,i=i+Math.imul(B,ut)|0,i=i+Math.imul(O,st)|0,o=o+Math.imul(O,ut)|0,n=n+Math.imul(k,ct)|0,i=i+Math.imul(k,dt)|0,i=i+Math.imul(x,ct)|0,o=o+Math.imul(x,dt)|0,n=n+Math.imul(S,pt)|0,i=i+Math.imul(S,bt)|0,i=i+Math.imul(E,pt)|0,o=o+Math.imul(E,bt)|0;var Bt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,n=Math.imul(U,rt),i=Math.imul(U,nt),i=i+Math.imul(z,rt)|0,o=Math.imul(z,nt),n=n+Math.imul(C,ot)|0,i=i+Math.imul(C,at)|0,i=i+Math.imul(N,ot)|0,o=o+Math.imul(N,at)|0,n=n+Math.imul(P,st)|0,i=i+Math.imul(P,ut)|0,i=i+Math.imul(T,st)|0,o=o+Math.imul(T,ut)|0,n=n+Math.imul(B,ct)|0,i=i+Math.imul(B,dt)|0,i=i+Math.imul(O,ct)|0,o=o+Math.imul(O,dt)|0,n=n+Math.imul(k,pt)|0,i=i+Math.imul(k,bt)|0,i=i+Math.imul(x,pt)|0,o=o+Math.imul(x,bt)|0;var Ot=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,n=Math.imul(U,ot),i=Math.imul(U,at),i=i+Math.imul(z,ot)|0,o=Math.imul(z,at),n=n+Math.imul(C,st)|0,i=i+Math.imul(C,ut)|0,i=i+Math.imul(N,st)|0,o=o+Math.imul(N,ut)|0,n=n+Math.imul(P,ct)|0,i=i+Math.imul(P,dt)|0,i=i+Math.imul(T,ct)|0,o=o+Math.imul(T,dt)|0,n=n+Math.imul(B,pt)|0,i=i+Math.imul(B,bt)|0,i=i+Math.imul(O,pt)|0,o=o+Math.imul(O,bt)|0;var Rt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,n=Math.imul(U,st),i=Math.imul(U,ut),i=i+Math.imul(z,st)|0,o=Math.imul(z,ut),n=n+Math.imul(C,ct)|0,i=i+Math.imul(C,dt)|0,i=i+Math.imul(N,ct)|0,o=o+Math.imul(N,dt)|0,n=n+Math.imul(P,pt)|0,i=i+Math.imul(P,bt)|0,i=i+Math.imul(T,pt)|0,o=o+Math.imul(T,bt)|0;var Pt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,n=Math.imul(U,ct),i=Math.imul(U,dt),i=i+Math.imul(z,ct)|0,o=Math.imul(z,dt),n=n+Math.imul(C,pt)|0,i=i+Math.imul(C,bt)|0,i=i+Math.imul(N,pt)|0,o=o+Math.imul(N,bt)|0;var Tt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(U,pt),i=Math.imul(U,bt),i=i+Math.imul(z,pt)|0,o=Math.imul(z,bt);var jt=(u+n|0)+((8191&i)<<13)|0;return u=(o+(i>>>13)|0)+(jt>>>26)|0,jt&=67108863,s[0]=vt,s[1]=yt,s[2]=mt,s[3]=gt,s[4]=wt,s[5]=_t,s[6]=Mt,s[7]=St,s[8]=Et,s[9]=At,s[10]=kt,s[11]=xt,s[12]=It,s[13]=Bt,s[14]=Ot,s[15]=Rt,s[16]=Pt,s[17]=Tt,s[18]=jt,0!==u&&(s[19]=u,r.length++),r};Math.imul||(E=u),o.prototype.mulTo=function(t,e){var r,n=this.length+t.length;return r=10===this.length&&10===t.length?E(this,t,e):n<63?u(this,t,e):n<1024?h(this,t,e):c(this,t,e)},d.prototype.makeRBT=function(t){for(var e=new Array(t),r=o.prototype._countBits(t)-1,n=0;n>=1;return n},d.prototype.permute=function(t,e,r,n,i,o){for(var a=0;a>>=1)i++;return 1<>>=13,r[2*a+1]=8191&o,o>>>=13;for(a=2*e;a>=26,e+=i/67108864|0,e+=o>>>26,this.words[r]=67108863&o}return 0!==e&&(this.words[r]=e,this.length++),this},o.prototype.muln=function(t){return this.clone().imuln(t)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(t){var e=s(t);if(0===e.length)return new o(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,o=67108863>>>26-r<<26-r;if(0!==r){var a=0;for(e=0;e>>26-r}a&&(this.words[e]=a,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0);var i;i=e?(e-e%26)/26:0;var o=t%26,a=Math.min((t-o)/26,this.length),f=67108863^67108863>>>o<a)for(this.length-=a,u=0;u=0&&(0!==h||u>=i);u--){var c=0|this.words[u];this.words[u]=h<<26-o|c>>>o,h=c&f}return s&&0!==h&&(s.words[s.length++]=h),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},o.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},o.prototype.shln=function(t){return this.clone().ishln(t)},o.prototype.ushln=function(t){return this.clone().iushln(t)},o.prototype.shrn=function(t){return this.clone().ishrn(t)},o.prototype.ushrn=function(t){return this.clone().iushrn(t)},o.prototype.testn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},o.prototype.isubn=function(t){if(n("number"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(s/67108864|0),this.words[i+r]=67108863&a}for(;i>26,this.words[i+r]=67108863&a;if(0===f)return this.strip();for(n(f===-1),f=0,i=0;i>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},o.prototype._wordDiv=function(t,e){var r=this.length-t.length,n=this.clone(),i=t,a=0|i.words[i.length-1],f=this._countBits(a);r=26-f,0!==r&&(i=i.ushln(r),n.iushln(r),a=0|i.words[i.length-1]);var s,u=n.length-i.length;if("mod"!==e){s=new o(null),s.length=u+1,s.words=new Array(s.length);for(var h=0;h=0;d--){var l=67108864*(0|n.words[i.length+d])+(0|n.words[i.length+d-1]);for(l=Math.min(l/a|0,67108863),n._ishlnsubmul(i,l,d);0!==n.negative;)l--,n.negative=0,n._ishlnsubmul(i,1,d),n.isZero()||(n.negative^=1);s&&(s.words[d]=l)}return s&&s.strip(),n.strip(),"div"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},o.prototype.divmod=function(t,e,r){if(n(!t.isZero()),this.isZero())return{div:new o(0),mod:new o(0)};var i,a,f;return 0!==this.negative&&0===t.negative?(f=this.neg().divmod(t,e),"mod"!==e&&(i=f.div.neg()),"div"!==e&&(a=f.mod.neg(),r&&0!==a.negative&&a.iadd(t)),{div:i,mod:a}):0===this.negative&&0!==t.negative?(f=this.divmod(t.neg(),e),"mod"!==e&&(i=f.div.neg()),{div:i,mod:f.mod}):0!==(this.negative&t.negative)?(f=this.neg().divmod(t.neg(),e),"div"!==e&&(a=f.mod.neg(),r&&0!==a.negative&&a.isub(t)),{div:f.div,mod:a}):t.length>this.length||this.cmp(t)<0?{div:new o(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new o(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new o(this.modn(t.words[0]))}:this._wordDiv(t,e)},o.prototype.div=function(t){return this.divmod(t,"div",!1).div},o.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},o.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},o.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),o=r.cmp(n);return o<0||1===i&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},o.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},o.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},o.prototype.divn=function(t){return this.clone().idivn(t)},o.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),f=new o(0),s=new o(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var h=r.clone(),c=e.clone();!e.isZero();){for(var d=0,l=1;0===(e.words[0]&l)&&d<26;++d,l<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(i.isOdd()||a.isOdd())&&(i.iadd(h),a.isub(c)),i.iushrn(1),a.iushrn(1);for(var p=0,b=1;0===(r.words[0]&b)&&p<26;++p,b<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(f.isOdd()||s.isOdd())&&(f.iadd(h),s.isub(c)),f.iushrn(1),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(f),a.isub(s)):(r.isub(e),f.isub(i),s.isub(a))}return{a:f,b:s,gcd:r.iushln(u)}},o.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),f=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var s=0,u=1;0===(e.words[0]&u)&&s<26;++s,u<<=1);if(s>0)for(e.iushrn(s);s-- >0;)i.isOdd()&&i.iadd(f),i.iushrn(1);for(var h=0,c=1;0===(r.words[0]&c)&&h<26;++h,c<<=1);if(h>0)for(r.iushrn(h);h-- >0;)a.isOdd()&&a.iadd(f),a.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(a)):(r.isub(e),a.isub(i))}var d;return d=0===e.cmpn(1)?i:a,d.cmpn(0)<0&&d.iadd(t),d},o.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var o=e;e=r,r=o}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},o.prototype.invm=function(t){return this.egcd(t).a.umod(t)},o.prototype.isEven=function(){return 0===(1&this.words[0])},o.prototype.isOdd=function(){return 1===(1&this.words[0])},o.prototype.andln=function(t){return this.words[0]&t},o.prototype.bincn=function(t){n("number"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,f&=67108863,this.words[a]=f}return 0!==o&&(this.words[a]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(t){var e=t<0;if(0!==this.negative&&!e)return-1;if(0===this.negative&&e)return 1;this.strip();var r;if(this.length>1)r=1;else{e&&(t=-t),n(t<=67108863,"Number is too big");var i=0|this.words[0];r=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},o.prototype.gtn=function(t){return 1===this.cmpn(t)},o.prototype.gt=function(t){return 1===this.cmp(t)},o.prototype.gten=function(t){return this.cmpn(t)>=0},o.prototype.gte=function(t){return this.cmp(t)>=0},o.prototype.ltn=function(t){return this.cmpn(t)===-1},o.prototype.lt=function(t){return this.cmp(t)===-1},o.prototype.lten=function(t){return this.cmpn(t)<=0},o.prototype.lte=function(t){return this.cmp(t)<=0},o.prototype.eqn=function(t){return 0===this.cmpn(t)},o.prototype.eq=function(t){return 0===this.cmp(t)},o.red=function(t){return new m(t)},o.prototype.toRed=function(t){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},o.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(t){return this.red=t,this},o.prototype.forceRed=function(t){return n(!this.red,"Already a number in reduction context"),this._forceRed(t)},o.prototype.redAdd=function(t){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},o.prototype.redIAdd=function(t){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},o.prototype.redSub=function(t){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},o.prototype.redISub=function(t){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},o.prototype.redShl=function(t){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},o.prototype.redMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},o.prototype.redIMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},o.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(t){return n(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var A={k256:null,p224:null,p192:null,p25519:null};l.prototype._tmp=function(){var t=new o(null);return t.words=new Array(Math.ceil(this.n/13)),t},l.prototype.ireduce=function(t){var e,r=t;do this.split(r,this.tmp),r=this.imulK(r),r=r.iadd(this.tmp),e=r.bitLength();while(e>this.n);var n=e0?r.isub(this.p):r.strip(),r},l.prototype.split=function(t,e){t.iushrn(this.n,0,e)},l.prototype.imulK=function(t){return t.imul(this.k)},i(p,l),p.prototype.split=function(t,e){for(var r=4194303,n=Math.min(t.length,9),i=0;i>>22,o=a}o>>>=22,t.words[i-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},p.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},o._prime=function t(e){if(A[e])return A[e];var t;if("k256"===e)t=new p;else if("p224"===e)t=new b;else if("p192"===e)t=new v;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new y}return A[e]=t,t},m.prototype._verify1=function(t){n(0===t.negative,"red works only with positives"),n(t.red,"red works only with red numbers")},m.prototype._verify2=function(t,e){n(0===(t.negative|e.negative),"red works only with positives"),n(t.red&&t.red===e.red,"red works only with red numbers")},m.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},m.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},m.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},m.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e); return r.cmp(this.m)>=0&&r.isub(this.m),r},m.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},m.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},m.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},m.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},m.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},m.prototype.isqr=function(t){return this.imul(t,t.clone())},m.prototype.sqr=function(t){return this.mul(t,t)},m.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2===1),3===e){var r=this.m.add(new o(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),a=0;!i.isZero()&&0===i.andln(1);)a++,i.iushrn(1);n(!i.isZero());var f=new o(1).toRed(this),s=f.redNeg(),u=this.m.subn(1).iushrn(1),h=this.m.bitLength();for(h=new o(2*h*h).toRed(this);0!==this.pow(h,u).cmp(s);)h.redIAdd(s);for(var c=this.pow(h,i),d=this.pow(t,i.addn(1).iushrn(1)),l=this.pow(t,i),p=a;0!==l.cmp(f);){for(var b=l,v=0;0!==b.cmp(f);v++)b=b.redSqr();n(v=0;i--){for(var h=e.words[i],c=u-1;c>=0;c--){var d=h>>c&1;a!==n[0]&&(a=this.sqr(a)),0!==d||0!==f?(f<<=1,f|=d,s++,(s===r||0===i&&0===c)&&(a=this.mul(a,n[f]),s=0,f=0)):s=0}u=26}return a},m.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},m.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},o.mont=function(t){return new g(t)},i(g,m),g.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},g.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},g.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},g.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new o(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},g.prototype.invm=function(t){var e=this.imod(t._invmp(this.m).mul(this.r2));return e._forceRed(this)}}("undefined"==typeof t||t,this)}).call(e,r(92)(t))},function(t,e,r){"use strict";var n=e;n.version=r(465).version,n.utils=r(521),n.rand=r(522),n.hmacDRBG=r(519),n.curve=r(99),n.curves=r(512),n.ec=r(513),n.eddsa=r(516)},function(t,e,r){var n=r(66),i=r(37),o=r(17),a=r(29),f=r(12),s=r(174),u=Object.getOwnPropertyDescriptor;e.f=r(8)?u:function(t,e){if(t=o(t),e=a(e,!0),s)try{return u(t,e)}catch(t){}if(f(t,e))return i(!n.f.call(t,e),t[e])}},function(t,e,r){var n=r(12),i=r(11),o=r(133)("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),n(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},function(t,e,r){"use strict";var n=e;n.version=r(467).version,n.utils=r(558),n.rand=r(559),n.hmacDRBG=r(556),n.curve=r(104),n.curves=r(549),n.ec=r(550),n.eddsa=r(553)},function(t,e){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,r){var n=r(5);t.exports=function(t,e){return!!t&&n(function(){e?t.call(null,function(){},1):t.call(null)})}},function(t,e){function r(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function i(t){if(h===setTimeout)return setTimeout(t,0);if((h===r||!h)&&setTimeout)return h=setTimeout,setTimeout(t,0);try{return h(t,0)}catch(e){try{return h.call(null,t,0)}catch(e){return h.call(this,t,0)}}}function o(t){if(c===clearTimeout)return clearTimeout(t);if((c===n||!c)&&clearTimeout)return c=clearTimeout,clearTimeout(t);try{return c(t)}catch(e){try{return c.call(null,t)}catch(e){return c.call(this,t)}}}function a(){b&&l&&(b=!1,l.length?p=l.concat(p):v=-1,p.length&&f())}function f(){if(!b){var t=i(a);b=!0;for(var e=p.length;e;){for(l=p,p=[];++v1)for(var r=1;r_;_++)if((d||_ in m)&&(b=m[_],v=g(b,_,y),t))if(r)M[_]=v;else if(v)switch(t){case 3:return!0;case 5:return b;case 6:return _;case 2:M.push(b)}else if(h)return!1;return c?-1:u||h?h:M}}},function(t,e,r){var n=r(0),i=r(32),o=r(5);t.exports=function(t,e){var r=(i.Object||{})[t]||Object[t],a={};a[t]=e(r),n(n.S+n.F*o(function(){r(1)}),"Object",a)}},function(t,e,r){var n=r(6);t.exports=function(t,e){if(!n(t))return t;var r,i;if(e&&"function"==typeof(r=t.toString)&&!n(i=r.call(t)))return i;if("function"==typeof(r=t.valueOf)&&!n(i=r.call(t)))return i;if(!e&&"function"==typeof(r=t.toString)&&!n(i=r.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,e,r){(function(t){!function(t,e){"use strict";function n(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function o(t,e,r){return o.isBN(t)?t:(this.negative=0,this.words=null,this.length=0,this.red=null,void(null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))))}function a(t,e,r){for(var n=0,i=Math.min(t.length,r),o=e;o=49&&a<=54?a-49+10:a>=17&&a<=22?a-17+10:15&a}return n}function f(t,e,r,n){for(var i=0,o=Math.min(t.length,r),a=e;a=49?f-49+10:f>=17?f-17+10:f}return i}function s(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}function u(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],o=0|e.words[0],a=i*o,f=67108863&a,s=a/67108864|0;r.words[0]=f;for(var u=1;u>>26,c=67108863&s,d=Math.min(u,e.length-1),l=Math.max(0,u-t.length+1);l<=d;l++){var p=u-l|0;i=0|t.words[p],o=0|e.words[l],a=i*o+c,h+=a/67108864|0,c=67108863&a}r.words[u]=0|c,s=0|h}return 0!==s?r.words[u]=0|s:r.length--,r.strip()}function h(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,o=0;o>>26)|0,i+=a>>>26,a&=67108863}r.words[o]=f,n=a,a=i}return 0!==n?r.words[o]=n:r.length--,r.strip()}function c(t,e,r){var n=new d;return n.mulp(t,e,r)}function d(t,e){this.x=t,this.y=e}function l(t,e){this.name=t,this.p=new o(e,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function p(){l.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function b(){l.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function v(){l.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function y(){l.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function m(t){if("string"==typeof t){var e=o._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function g(t){m.call(this,t),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}"object"==typeof t?t.exports=o:e.BN=o,o.BN=o,o.wordSize=26;var w;try{w=r(1).Buffer}catch(t){}o.isBN=function(t){return t instanceof o||null!==t&&"object"==typeof t&&t.constructor.wordSize===o.wordSize&&Array.isArray(t.words)},o.max=function(t,e){return t.cmp(e)>0?t:e},o.min=function(t,e){return t.cmp(e)<0?t:e},o.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36),t=t.toString().replace(/\s+/g,"");var i=0;"-"===t[0]&&i++,16===e?this._parseHex(t,i):this._parseBase(t,e,i),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(n(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initArray=function(t,e,r){if(n("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)a=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[o]|=a<>>26-f&67108863,f+=24,f>=26&&(f-=26,o++);else if("le"===r)for(i=0,o=0;i>>26-f&67108863,f+=24,f>=26&&(f-=26,o++);return this.strip()},o.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var r=0;r=e;r-=6)i=a(t,r,r+6),this.words[n]|=i<>>26-o&4194303,o+=24,o>=26&&(o-=26,n++);r+6!==e&&(i=a(t,e,r+6),this.words[n]|=i<>>26-o&4194303),this.strip()},o.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var o=t.length-r,a=o%n,s=Math.min(o,o-a)+r,u=0,h=r;h1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},o.prototype.inspect=function(){return(this.red?""};var _=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],M=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],S=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];o.prototype.toString=function(t,e){t=t||10,e=0|e||1;var r;if(16===t||"hex"===t){r="";for(var i=0,o=0,a=0;a>>24-i&16777215,r=0!==o||a!==this.length-1?_[6-s.length]+s+r:s+r,i+=2,i>=26&&(i-=26,a--)}for(0!==o&&(r=o.toString(16)+r);r.length%e!==0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var u=M[t],h=S[t];r="";var c=this.clone();for(c.negative=0;!c.isZero();){var d=c.modn(h).toString(t);c=c.idivn(h),r=c.isZero()?d+r:_[u-d.length]+d+r}for(this.isZero()&&(r="0"+r);r.length%e!==0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},o.prototype.toJSON=function(){return this.toString(16)},o.prototype.toBuffer=function(t,e){return n("undefined"!=typeof w),this.toArrayLike(w,t,e)},o.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},o.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),o=r||Math.max(1,i);n(i<=o,"byte array longer than desired length"),n(o>0,"Requested array length <= 0"),this.strip();var a,f,s="le"===e,u=new t(o),h=this.clone();if(s){for(f=0;!h.isZero();f++)a=h.andln(255),h.iushrn(8),u[f]=a;for(;f=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},o.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0===(8191&e)&&(r+=13,e>>>=13),0===(127&e)&&(r+=7,e>>>=7),0===(15&e)&&(r+=4,e>>>=4),0===(3&e)&&(r+=2,e>>>=2),0===(1&e)&&r++,r},o.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},o.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},o.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},o.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},o.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},o.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},o.prototype.inotn=function(t){n("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},o.prototype.notn=function(t){return this.clone().inotn(t)},o.prototype.setn=function(t,e){n("number"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),e?this.words[r]=this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},o.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r=this.cmp(t);if(0===r)return this.negative=0,this.length=1,this.words[0]=0,this;var n,i;r>0?(n=this,i=t):(n=t,i=this);for(var o=0,a=0;a>26,this.words[a]=67108863&e;for(;0!==o&&a>26,this.words[a]=67108863&e;if(0===o&&a>>13,l=0|a[1],p=8191&l,b=l>>>13,v=0|a[2],y=8191&v,m=v>>>13,g=0|a[3],w=8191&g,_=g>>>13,M=0|a[4],S=8191&M,E=M>>>13,A=0|a[5],k=8191&A,x=A>>>13,I=0|a[6],B=8191&I,O=I>>>13,R=0|a[7],P=8191&R,T=R>>>13,j=0|a[8],C=8191&j,N=j>>>13,L=0|a[9],U=8191&L,z=L>>>13,D=0|f[0],q=8191&D,F=D>>>13,K=0|f[1],G=8191&K,V=K>>>13,H=0|f[2],X=8191&H,Y=H>>>13,W=0|f[3],Z=8191&W,J=W>>>13,$=0|f[4],Q=8191&$,tt=$>>>13,et=0|f[5],rt=8191&et,nt=et>>>13,it=0|f[6],ot=8191&it,at=it>>>13,ft=0|f[7],st=8191&ft,ut=ft>>>13,ht=0|f[8],ct=8191&ht,dt=ht>>>13,lt=0|f[9],pt=8191<,bt=lt>>>13;r.negative=t.negative^e.negative,r.length=19,n=Math.imul(c,q),i=Math.imul(c,F),i=i+Math.imul(d,q)|0,o=Math.imul(d,F);var vt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(p,q),i=Math.imul(p,F),i=i+Math.imul(b,q)|0,o=Math.imul(b,F),n=n+Math.imul(c,G)|0,i=i+Math.imul(c,V)|0,i=i+Math.imul(d,G)|0,o=o+Math.imul(d,V)|0;var yt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,q),i=Math.imul(y,F),i=i+Math.imul(m,q)|0,o=Math.imul(m,F),n=n+Math.imul(p,G)|0,i=i+Math.imul(p,V)|0,i=i+Math.imul(b,G)|0,o=o+Math.imul(b,V)|0,n=n+Math.imul(c,X)|0,i=i+Math.imul(c,Y)|0,i=i+Math.imul(d,X)|0,o=o+Math.imul(d,Y)|0;var mt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(w,q),i=Math.imul(w,F),i=i+Math.imul(_,q)|0,o=Math.imul(_,F),n=n+Math.imul(y,G)|0,i=i+Math.imul(y,V)|0,i=i+Math.imul(m,G)|0,o=o+Math.imul(m,V)|0,n=n+Math.imul(p,X)|0,i=i+Math.imul(p,Y)|0,i=i+Math.imul(b,X)|0,o=o+Math.imul(b,Y)|0,n=n+Math.imul(c,Z)|0,i=i+Math.imul(c,J)|0,i=i+Math.imul(d,Z)|0,o=o+Math.imul(d,J)|0;var gt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(S,q),i=Math.imul(S,F),i=i+Math.imul(E,q)|0,o=Math.imul(E,F),n=n+Math.imul(w,G)|0,i=i+Math.imul(w,V)|0,i=i+Math.imul(_,G)|0,o=o+Math.imul(_,V)|0,n=n+Math.imul(y,X)|0,i=i+Math.imul(y,Y)|0,i=i+Math.imul(m,X)|0,o=o+Math.imul(m,Y)|0,n=n+Math.imul(p,Z)|0,i=i+Math.imul(p,J)|0,i=i+Math.imul(b,Z)|0,o=o+Math.imul(b,J)|0,n=n+Math.imul(c,Q)|0,i=i+Math.imul(c,tt)|0,i=i+Math.imul(d,Q)|0,o=o+Math.imul(d,tt)|0;var wt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(k,q),i=Math.imul(k,F),i=i+Math.imul(x,q)|0,o=Math.imul(x,F),n=n+Math.imul(S,G)|0,i=i+Math.imul(S,V)|0,i=i+Math.imul(E,G)|0,o=o+Math.imul(E,V)|0,n=n+Math.imul(w,X)|0,i=i+Math.imul(w,Y)|0,i=i+Math.imul(_,X)|0,o=o+Math.imul(_,Y)|0,n=n+Math.imul(y,Z)|0,i=i+Math.imul(y,J)|0,i=i+Math.imul(m,Z)|0,o=o+Math.imul(m,J)|0,n=n+Math.imul(p,Q)|0,i=i+Math.imul(p,tt)|0,i=i+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,n=n+Math.imul(c,rt)|0,i=i+Math.imul(c,nt)|0,i=i+Math.imul(d,rt)|0,o=o+Math.imul(d,nt)|0;var _t=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(B,q),i=Math.imul(B,F),i=i+Math.imul(O,q)|0,o=Math.imul(O,F),n=n+Math.imul(k,G)|0,i=i+Math.imul(k,V)|0,i=i+Math.imul(x,G)|0,o=o+Math.imul(x,V)|0,n=n+Math.imul(S,X)|0,i=i+Math.imul(S,Y)|0,i=i+Math.imul(E,X)|0,o=o+Math.imul(E,Y)|0,n=n+Math.imul(w,Z)|0,i=i+Math.imul(w,J)|0,i=i+Math.imul(_,Z)|0,o=o+Math.imul(_,J)|0,n=n+Math.imul(y,Q)|0,i=i+Math.imul(y,tt)|0,i=i+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0,n=n+Math.imul(p,rt)|0,i=i+Math.imul(p,nt)|0,i=i+Math.imul(b,rt)|0,o=o+Math.imul(b,nt)|0,n=n+Math.imul(c,ot)|0,i=i+Math.imul(c,at)|0,i=i+Math.imul(d,ot)|0,o=o+Math.imul(d,at)|0;var Mt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(P,q),i=Math.imul(P,F),i=i+Math.imul(T,q)|0,o=Math.imul(T,F),n=n+Math.imul(B,G)|0,i=i+Math.imul(B,V)|0,i=i+Math.imul(O,G)|0,o=o+Math.imul(O,V)|0,n=n+Math.imul(k,X)|0,i=i+Math.imul(k,Y)|0,i=i+Math.imul(x,X)|0,o=o+Math.imul(x,Y)|0,n=n+Math.imul(S,Z)|0,i=i+Math.imul(S,J)|0,i=i+Math.imul(E,Z)|0,o=o+Math.imul(E,J)|0,n=n+Math.imul(w,Q)|0,i=i+Math.imul(w,tt)|0,i=i+Math.imul(_,Q)|0,o=o+Math.imul(_,tt)|0,n=n+Math.imul(y,rt)|0,i=i+Math.imul(y,nt)|0,i=i+Math.imul(m,rt)|0,o=o+Math.imul(m,nt)|0,n=n+Math.imul(p,ot)|0,i=i+Math.imul(p,at)|0,i=i+Math.imul(b,ot)|0,o=o+Math.imul(b,at)|0,n=n+Math.imul(c,st)|0,i=i+Math.imul(c,ut)|0,i=i+Math.imul(d,st)|0,o=o+Math.imul(d,ut)|0;var St=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(C,q),i=Math.imul(C,F),i=i+Math.imul(N,q)|0,o=Math.imul(N,F),n=n+Math.imul(P,G)|0,i=i+Math.imul(P,V)|0,i=i+Math.imul(T,G)|0,o=o+Math.imul(T,V)|0,n=n+Math.imul(B,X)|0,i=i+Math.imul(B,Y)|0,i=i+Math.imul(O,X)|0,o=o+Math.imul(O,Y)|0,n=n+Math.imul(k,Z)|0,i=i+Math.imul(k,J)|0,i=i+Math.imul(x,Z)|0,o=o+Math.imul(x,J)|0,n=n+Math.imul(S,Q)|0,i=i+Math.imul(S,tt)|0,i=i+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,n=n+Math.imul(w,rt)|0,i=i+Math.imul(w,nt)|0,i=i+Math.imul(_,rt)|0,o=o+Math.imul(_,nt)|0,n=n+Math.imul(y,ot)|0,i=i+Math.imul(y,at)|0,i=i+Math.imul(m,ot)|0,o=o+Math.imul(m,at)|0,n=n+Math.imul(p,st)|0,i=i+Math.imul(p,ut)|0,i=i+Math.imul(b,st)|0,o=o+Math.imul(b,ut)|0,n=n+Math.imul(c,ct)|0,i=i+Math.imul(c,dt)|0,i=i+Math.imul(d,ct)|0,o=o+Math.imul(d,dt)|0;var Et=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(U,q),i=Math.imul(U,F),i=i+Math.imul(z,q)|0,o=Math.imul(z,F),n=n+Math.imul(C,G)|0,i=i+Math.imul(C,V)|0,i=i+Math.imul(N,G)|0,o=o+Math.imul(N,V)|0,n=n+Math.imul(P,X)|0,i=i+Math.imul(P,Y)|0,i=i+Math.imul(T,X)|0,o=o+Math.imul(T,Y)|0,n=n+Math.imul(B,Z)|0,i=i+Math.imul(B,J)|0,i=i+Math.imul(O,Z)|0,o=o+Math.imul(O,J)|0,n=n+Math.imul(k,Q)|0,i=i+Math.imul(k,tt)|0,i=i+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,n=n+Math.imul(S,rt)|0,i=i+Math.imul(S,nt)|0,i=i+Math.imul(E,rt)|0,o=o+Math.imul(E,nt)|0,n=n+Math.imul(w,ot)|0,i=i+Math.imul(w,at)|0,i=i+Math.imul(_,ot)|0,o=o+Math.imul(_,at)|0,n=n+Math.imul(y,st)|0,i=i+Math.imul(y,ut)|0,i=i+Math.imul(m,st)|0,o=o+Math.imul(m,ut)|0,n=n+Math.imul(p,ct)|0,i=i+Math.imul(p,dt)|0,i=i+Math.imul(b,ct)|0,o=o+Math.imul(b,dt)|0,n=n+Math.imul(c,pt)|0,i=i+Math.imul(c,bt)|0,i=i+Math.imul(d,pt)|0,o=o+Math.imul(d,bt)|0;var At=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(U,G),i=Math.imul(U,V),i=i+Math.imul(z,G)|0,o=Math.imul(z,V),n=n+Math.imul(C,X)|0,i=i+Math.imul(C,Y)|0,i=i+Math.imul(N,X)|0,o=o+Math.imul(N,Y)|0,n=n+Math.imul(P,Z)|0,i=i+Math.imul(P,J)|0,i=i+Math.imul(T,Z)|0,o=o+Math.imul(T,J)|0,n=n+Math.imul(B,Q)|0,i=i+Math.imul(B,tt)|0,i=i+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,n=n+Math.imul(k,rt)|0,i=i+Math.imul(k,nt)|0,i=i+Math.imul(x,rt)|0,o=o+Math.imul(x,nt)|0,n=n+Math.imul(S,ot)|0,i=i+Math.imul(S,at)|0,i=i+Math.imul(E,ot)|0,o=o+Math.imul(E,at)|0,n=n+Math.imul(w,st)|0,i=i+Math.imul(w,ut)|0,i=i+Math.imul(_,st)|0,o=o+Math.imul(_,ut)|0,n=n+Math.imul(y,ct)|0,i=i+Math.imul(y,dt)|0,i=i+Math.imul(m,ct)|0,o=o+Math.imul(m,dt)|0,n=n+Math.imul(p,pt)|0,i=i+Math.imul(p,bt)|0,i=i+Math.imul(b,pt)|0,o=o+Math.imul(b,bt)|0;var kt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(U,X),i=Math.imul(U,Y),i=i+Math.imul(z,X)|0,o=Math.imul(z,Y),n=n+Math.imul(C,Z)|0,i=i+Math.imul(C,J)|0,i=i+Math.imul(N,Z)|0,o=o+Math.imul(N,J)|0,n=n+Math.imul(P,Q)|0,i=i+Math.imul(P,tt)|0,i=i+Math.imul(T,Q)|0,o=o+Math.imul(T,tt)|0,n=n+Math.imul(B,rt)|0,i=i+Math.imul(B,nt)|0,i=i+Math.imul(O,rt)|0,o=o+Math.imul(O,nt)|0,n=n+Math.imul(k,ot)|0,i=i+Math.imul(k,at)|0,i=i+Math.imul(x,ot)|0,o=o+Math.imul(x,at)|0,n=n+Math.imul(S,st)|0,i=i+Math.imul(S,ut)|0,i=i+Math.imul(E,st)|0,o=o+Math.imul(E,ut)|0,n=n+Math.imul(w,ct)|0,i=i+Math.imul(w,dt)|0,i=i+Math.imul(_,ct)|0,o=o+Math.imul(_,dt)|0,n=n+Math.imul(y,pt)|0,i=i+Math.imul(y,bt)|0,i=i+Math.imul(m,pt)|0,o=o+Math.imul(m,bt)|0;var xt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(U,Z),i=Math.imul(U,J),i=i+Math.imul(z,Z)|0,o=Math.imul(z,J),n=n+Math.imul(C,Q)|0,i=i+Math.imul(C,tt)|0,i=i+Math.imul(N,Q)|0,o=o+Math.imul(N,tt)|0,n=n+Math.imul(P,rt)|0,i=i+Math.imul(P,nt)|0,i=i+Math.imul(T,rt)|0,o=o+Math.imul(T,nt)|0,n=n+Math.imul(B,ot)|0,i=i+Math.imul(B,at)|0,i=i+Math.imul(O,ot)|0,o=o+Math.imul(O,at)|0,n=n+Math.imul(k,st)|0,i=i+Math.imul(k,ut)|0,i=i+Math.imul(x,st)|0,o=o+Math.imul(x,ut)|0,n=n+Math.imul(S,ct)|0,i=i+Math.imul(S,dt)|0,i=i+Math.imul(E,ct)|0,o=o+Math.imul(E,dt)|0,n=n+Math.imul(w,pt)|0,i=i+Math.imul(w,bt)|0,i=i+Math.imul(_,pt)|0,o=o+Math.imul(_,bt)|0;var It=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(It>>>26)|0,It&=67108863,n=Math.imul(U,Q),i=Math.imul(U,tt),i=i+Math.imul(z,Q)|0,o=Math.imul(z,tt),n=n+Math.imul(C,rt)|0,i=i+Math.imul(C,nt)|0,i=i+Math.imul(N,rt)|0,o=o+Math.imul(N,nt)|0,n=n+Math.imul(P,ot)|0,i=i+Math.imul(P,at)|0,i=i+Math.imul(T,ot)|0,o=o+Math.imul(T,at)|0,n=n+Math.imul(B,st)|0,i=i+Math.imul(B,ut)|0,i=i+Math.imul(O,st)|0,o=o+Math.imul(O,ut)|0,n=n+Math.imul(k,ct)|0,i=i+Math.imul(k,dt)|0,i=i+Math.imul(x,ct)|0,o=o+Math.imul(x,dt)|0,n=n+Math.imul(S,pt)|0,i=i+Math.imul(S,bt)|0,i=i+Math.imul(E,pt)|0,o=o+Math.imul(E,bt)|0;var Bt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,n=Math.imul(U,rt),i=Math.imul(U,nt),i=i+Math.imul(z,rt)|0,o=Math.imul(z,nt),n=n+Math.imul(C,ot)|0,i=i+Math.imul(C,at)|0,i=i+Math.imul(N,ot)|0,o=o+Math.imul(N,at)|0,n=n+Math.imul(P,st)|0,i=i+Math.imul(P,ut)|0,i=i+Math.imul(T,st)|0,o=o+Math.imul(T,ut)|0,n=n+Math.imul(B,ct)|0,i=i+Math.imul(B,dt)|0,i=i+Math.imul(O,ct)|0,o=o+Math.imul(O,dt)|0,n=n+Math.imul(k,pt)|0,i=i+Math.imul(k,bt)|0,i=i+Math.imul(x,pt)|0,o=o+Math.imul(x,bt)|0;var Ot=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,n=Math.imul(U,ot),i=Math.imul(U,at),i=i+Math.imul(z,ot)|0,o=Math.imul(z,at),n=n+Math.imul(C,st)|0,i=i+Math.imul(C,ut)|0,i=i+Math.imul(N,st)|0,o=o+Math.imul(N,ut)|0,n=n+Math.imul(P,ct)|0,i=i+Math.imul(P,dt)|0,i=i+Math.imul(T,ct)|0,o=o+Math.imul(T,dt)|0,n=n+Math.imul(B,pt)|0,i=i+Math.imul(B,bt)|0,i=i+Math.imul(O,pt)|0,o=o+Math.imul(O,bt)|0;var Rt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,n=Math.imul(U,st),i=Math.imul(U,ut),i=i+Math.imul(z,st)|0,o=Math.imul(z,ut),n=n+Math.imul(C,ct)|0,i=i+Math.imul(C,dt)|0,i=i+Math.imul(N,ct)|0,o=o+Math.imul(N,dt)|0,n=n+Math.imul(P,pt)|0,i=i+Math.imul(P,bt)|0,i=i+Math.imul(T,pt)|0,o=o+Math.imul(T,bt)|0;var Pt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,n=Math.imul(U,ct),i=Math.imul(U,dt),i=i+Math.imul(z,ct)|0,o=Math.imul(z,dt),n=n+Math.imul(C,pt)|0,i=i+Math.imul(C,bt)|0,i=i+Math.imul(N,pt)|0,o=o+Math.imul(N,bt)|0;var Tt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(U,pt),i=Math.imul(U,bt),i=i+Math.imul(z,pt)|0,o=Math.imul(z,bt);var jt=(u+n|0)+((8191&i)<<13)|0;return u=(o+(i>>>13)|0)+(jt>>>26)|0,jt&=67108863,s[0]=vt,s[1]=yt,s[2]=mt,s[3]=gt,s[4]=wt,s[5]=_t,s[6]=Mt,s[7]=St,s[8]=Et,s[9]=At,s[10]=kt,s[11]=xt,s[12]=It,s[13]=Bt,s[14]=Ot,s[15]=Rt,s[16]=Pt,s[17]=Tt,s[18]=jt,0!==u&&(s[19]=u,r.length++),r};Math.imul||(E=u),o.prototype.mulTo=function(t,e){var r,n=this.length+t.length;return r=10===this.length&&10===t.length?E(this,t,e):n<63?u(this,t,e):n<1024?h(this,t,e):c(this,t,e)},d.prototype.makeRBT=function(t){for(var e=new Array(t),r=o.prototype._countBits(t)-1,n=0;n>=1;return n},d.prototype.permute=function(t,e,r,n,i,o){for(var a=0;a>>=1)i++;return 1<>>=13,r[2*a+1]=8191&o,o>>>=13;for(a=2*e;a>=26,e+=i/67108864|0,e+=o>>>26,this.words[r]=67108863&o}return 0!==e&&(this.words[r]=e,this.length++),this},o.prototype.muln=function(t){return this.clone().imuln(t)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(t){var e=s(t);if(0===e.length)return new o(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,o=67108863>>>26-r<<26-r;if(0!==r){var a=0;for(e=0;e>>26-r}a&&(this.words[e]=a,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0);var i;i=e?(e-e%26)/26:0;var o=t%26,a=Math.min((t-o)/26,this.length),f=67108863^67108863>>>o<a)for(this.length-=a,u=0;u=0&&(0!==h||u>=i);u--){var c=0|this.words[u];this.words[u]=h<<26-o|c>>>o,h=c&f}return s&&0!==h&&(s.words[s.length++]=h),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},o.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},o.prototype.shln=function(t){return this.clone().ishln(t)},o.prototype.ushln=function(t){return this.clone().iushln(t)},o.prototype.shrn=function(t){return this.clone().ishrn(t)},o.prototype.ushrn=function(t){return this.clone().iushrn(t)},o.prototype.testn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},o.prototype.isubn=function(t){if(n("number"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(s/67108864|0),this.words[i+r]=67108863&a}for(;i>26,this.words[i+r]=67108863&a;if(0===f)return this.strip();for(n(f===-1),f=0,i=0;i>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},o.prototype._wordDiv=function(t,e){var r=this.length-t.length,n=this.clone(),i=t,a=0|i.words[i.length-1],f=this._countBits(a);r=26-f,0!==r&&(i=i.ushln(r),n.iushln(r),a=0|i.words[i.length-1]);var s,u=n.length-i.length;if("mod"!==e){s=new o(null),s.length=u+1,s.words=new Array(s.length);for(var h=0;h=0;d--){var l=67108864*(0|n.words[i.length+d])+(0|n.words[i.length+d-1]);for(l=Math.min(l/a|0,67108863),n._ishlnsubmul(i,l,d);0!==n.negative;)l--,n.negative=0,n._ishlnsubmul(i,1,d),n.isZero()||(n.negative^=1);s&&(s.words[d]=l)}return s&&s.strip(),n.strip(),"div"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},o.prototype.divmod=function(t,e,r){if(n(!t.isZero()),this.isZero())return{div:new o(0),mod:new o(0)};var i,a,f;return 0!==this.negative&&0===t.negative?(f=this.neg().divmod(t,e),"mod"!==e&&(i=f.div.neg()),"div"!==e&&(a=f.mod.neg(),r&&0!==a.negative&&a.iadd(t)),{div:i,mod:a}):0===this.negative&&0!==t.negative?(f=this.divmod(t.neg(),e),"mod"!==e&&(i=f.div.neg()),{div:i,mod:f.mod}):0!==(this.negative&t.negative)?(f=this.neg().divmod(t.neg(),e),"div"!==e&&(a=f.mod.neg(),r&&0!==a.negative&&a.isub(t)),{div:f.div,mod:a}):t.length>this.length||this.cmp(t)<0?{div:new o(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new o(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new o(this.modn(t.words[0]))}:this._wordDiv(t,e)},o.prototype.div=function(t){return this.divmod(t,"div",!1).div},o.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},o.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},o.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),o=r.cmp(n);return o<0||1===i&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},o.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},o.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},o.prototype.divn=function(t){return this.clone().idivn(t)},o.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),f=new o(0),s=new o(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var h=r.clone(),c=e.clone();!e.isZero();){for(var d=0,l=1;0===(e.words[0]&l)&&d<26;++d,l<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(i.isOdd()||a.isOdd())&&(i.iadd(h),a.isub(c)),i.iushrn(1),a.iushrn(1);for(var p=0,b=1;0===(r.words[0]&b)&&p<26;++p,b<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(f.isOdd()||s.isOdd())&&(f.iadd(h),s.isub(c)),f.iushrn(1),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(f),a.isub(s)):(r.isub(e),f.isub(i),s.isub(a))}return{a:f,b:s,gcd:r.iushln(u)}},o.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),f=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var s=0,u=1;0===(e.words[0]&u)&&s<26;++s,u<<=1);if(s>0)for(e.iushrn(s);s-- >0;)i.isOdd()&&i.iadd(f),i.iushrn(1);for(var h=0,c=1;0===(r.words[0]&c)&&h<26;++h,c<<=1);if(h>0)for(r.iushrn(h);h-- >0;)a.isOdd()&&a.iadd(f),a.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(a)):(r.isub(e),a.isub(i))}var d;return d=0===e.cmpn(1)?i:a,d.cmpn(0)<0&&d.iadd(t),d},o.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var o=e;e=r,r=o}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},o.prototype.invm=function(t){return this.egcd(t).a.umod(t)},o.prototype.isEven=function(){return 0===(1&this.words[0])},o.prototype.isOdd=function(){return 1===(1&this.words[0])},o.prototype.andln=function(t){return this.words[0]&t},o.prototype.bincn=function(t){n("number"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,f&=67108863,this.words[a]=f}return 0!==o&&(this.words[a]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(t){var e=t<0;if(0!==this.negative&&!e)return-1;if(0===this.negative&&e)return 1;this.strip();var r;if(this.length>1)r=1;else{e&&(t=-t),n(t<=67108863,"Number is too big");var i=0|this.words[0];r=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},o.prototype.gtn=function(t){return 1===this.cmpn(t)},o.prototype.gt=function(t){return 1===this.cmp(t)},o.prototype.gten=function(t){return this.cmpn(t)>=0},o.prototype.gte=function(t){return this.cmp(t)>=0},o.prototype.ltn=function(t){return this.cmpn(t)===-1},o.prototype.lt=function(t){return this.cmp(t)===-1},o.prototype.lten=function(t){return this.cmpn(t)<=0},o.prototype.lte=function(t){return this.cmp(t)<=0},o.prototype.eqn=function(t){return 0===this.cmpn(t)},o.prototype.eq=function(t){return 0===this.cmp(t)},o.red=function(t){return new m(t)},o.prototype.toRed=function(t){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},o.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(t){return this.red=t,this},o.prototype.forceRed=function(t){return n(!this.red,"Already a number in reduction context"),this._forceRed(t)},o.prototype.redAdd=function(t){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},o.prototype.redIAdd=function(t){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},o.prototype.redSub=function(t){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},o.prototype.redISub=function(t){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},o.prototype.redShl=function(t){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},o.prototype.redMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},o.prototype.redIMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},o.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(t){return n(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var A={k256:null,p224:null,p192:null,p25519:null};l.prototype._tmp=function(){var t=new o(null);return t.words=new Array(Math.ceil(this.n/13)),t},l.prototype.ireduce=function(t){var e,r=t;do this.split(r,this.tmp),r=this.imulK(r),r=r.iadd(this.tmp),e=r.bitLength();while(e>this.n);var n=e0?r.isub(this.p):r.strip(),r},l.prototype.split=function(t,e){t.iushrn(this.n,0,e)},l.prototype.imulK=function(t){return t.imul(this.k)},i(p,l),p.prototype.split=function(t,e){for(var r=4194303,n=Math.min(t.length,9),i=0;i>>22,o=a}o>>>=22,t.words[i-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},p.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},o._prime=function t(e){if(A[e])return A[e];var t;if("k256"===e)t=new p;else if("p224"===e)t=new b;else if("p192"===e)t=new v;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new y}return A[e]=t,t},m.prototype._verify1=function(t){n(0===t.negative,"red works only with positives"),n(t.red,"red works only with red numbers")},m.prototype._verify2=function(t,e){n(0===(t.negative|e.negative),"red works only with positives"),n(t.red&&t.red===e.red,"red works only with red numbers")},m.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},m.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},m.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},m.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},m.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},m.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},m.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},m.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},m.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},m.prototype.isqr=function(t){return this.imul(t,t.clone())},m.prototype.sqr=function(t){return this.mul(t,t)},m.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2===1),3===e){var r=this.m.add(new o(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),a=0;!i.isZero()&&0===i.andln(1);)a++,i.iushrn(1);n(!i.isZero());var f=new o(1).toRed(this),s=f.redNeg(),u=this.m.subn(1).iushrn(1),h=this.m.bitLength();for(h=new o(2*h*h).toRed(this);0!==this.pow(h,u).cmp(s);)h.redIAdd(s);for(var c=this.pow(h,i),d=this.pow(t,i.addn(1).iushrn(1)),l=this.pow(t,i),p=a;0!==l.cmp(f);){for(var b=l,v=0;0!==b.cmp(f);v++)b=b.redSqr();n(v=0;i--){for(var h=e.words[i],c=u-1;c>=0;c--){var d=h>>c&1;a!==n[0]&&(a=this.sqr(a)),0!==d||0!==f?(f<<=1,f|=d,s++,(s===r||0===i&&0===c)&&(a=this.mul(a,n[f]),s=0,f=0)):s=0}u=26}return a},m.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},m.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},o.mont=function(t){return new g(t)},i(g,m),g.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},g.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},g.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},g.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new o(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},g.prototype.invm=function(t){var e=this.imod(t._invmp(this.m).mul(this.r2));return e._forceRed(this)}}("undefined"==typeof t||t,this)}).call(e,r(92)(t))},function(t,e,r){function n(){i.call(this)}t.exports=n;var i=r(110).EventEmitter,o=r(603);o(n,i),n.Readable=r(600),n.Writable=r(602),n.Duplex=r(595),n.Transform=r(601),n.PassThrough=r(599),n.Stream=n,n.prototype.pipe=function(t,e){function r(e){t.writable&&!1===t.write(e)&&u.pause&&u.pause()}function n(){u.readable&&u.resume&&u.resume()}function o(){h||(h=!0,t.end())}function a(){h||(h=!0,"function"==typeof t.destroy&&t.destroy())}function f(t){if(s(),0===i.listenerCount(this,"error"))throw t}function s(){u.removeListener("data",r),t.removeListener("drain",n),u.removeListener("end",o),u.removeListener("close",a),u.removeListener("error",f),t.removeListener("error",f),u.removeListener("end",s),u.removeListener("close",s),t.removeListener("close",s)}var u=this;u.on("data",r),t.on("drain",n),t._isStdio||e&&e.end===!1||(u.on("end",o),u.on("close",a));var h=!1;return u.on("error",f),t.on("error",f),u.on("end",s),u.on("close",s),t.on("close",s),t.emit("pipe",u),t}},function(t,e){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},function(t,e,r){var n=r(13);t.exports=function(t,e,r){if(n(t),void 0===e)return t;switch(r){case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)}}return function(){return t.apply(e,arguments)}}},function(t,e,r){var n=r(190),i=r(0),o=r(87)("metadata"),a=o.store||(o.store=new(r(193))),f=function(t,e,r){var i=a.get(t);if(!i){if(!r)return;a.set(t,i=new n)}var o=i.get(e);if(!o){if(!r)return;i.set(e,o=new n)}return o},s=function(t,e,r){var n=f(e,r,!1);return void 0!==n&&n.has(t)},u=function(t,e,r){var n=f(e,r,!1);return void 0===n?void 0:n.get(t)},h=function(t,e,r,n){f(r,n,!0).set(t,e)},c=function(t,e){var r=f(t,e,!1),n=[];return r&&r.forEach(function(t,e){n.push(e)}),n},d=function(t){return void 0===t||"symbol"==typeof t?t:String(t)},l=function(t){i(i.S,"Reflect",t)};t.exports={store:a,map:f,has:s,get:u,set:h,keys:c,key:d,exp:l}},function(t,e,r){"use strict";if(r(8)){var n=r(41),i=r(4),o=r(5),a=r(0),f=r(88),s=r(140),u=r(33),h=r(40),c=r(37),d=r(14),l=r(45),p=r(38),b=r(10),v=r(47),y=r(29),m=r(12),g=r(187),w=r(64),_=r(6),M=r(11),S=r(125),E=r(42),A=r(21),k=r(43).f,x=r(142),I=r(48),B=r(7),O=r(27),R=r(78),P=r(134),T=r(143),j=r(56),C=r(84),N=r(46),L=r(118),U=r(167),z=r(9),D=r(20),q=z.f,F=D.f,K=i.RangeError,G=i.TypeError,V=i.Uint8Array,H="ArrayBuffer",X="Shared"+H,Y="BYTES_PER_ELEMENT",W="prototype",Z=Array[W],J=s.ArrayBuffer,$=s.DataView,Q=O(0),tt=O(2),et=O(3),rt=O(4),nt=O(5),it=O(6),ot=R(!0),at=R(!1),ft=T.values,st=T.keys,ut=T.entries,ht=Z.lastIndexOf,ct=Z.reduce,dt=Z.reduceRight,lt=Z.join,pt=Z.sort,bt=Z.slice,vt=Z.toString,yt=Z.toLocaleString,mt=B("iterator"),gt=B("toStringTag"),wt=I("typed_constructor"),_t=I("def_constructor"),Mt=f.CONSTR,St=f.TYPED,Et=f.VIEW,At="Wrong length!",kt=O(1,function(t,e){return Pt(P(t,t[_t]),e)}),xt=o(function(){return 1===new V(new Uint16Array([1]).buffer)[0]}),It=!!V&&!!V[W].set&&o(function(){new V(1).set({})}),Bt=function(t,e){if(void 0===t)throw G(At);var r=+t,n=b(t);if(e&&!g(r,n))throw K(At);return n},Ot=function(t,e){var r=p(t);if(r<0||r%e)throw K("Wrong offset!");return r},Rt=function(t){if(_(t)&&St in t)return t;throw G(t+" is not a typed array!")},Pt=function(t,e){if(!(_(t)&&wt in t))throw G("It is not a typed array constructor!");return new t(e)},Tt=function(t,e){return jt(P(t,t[_t]),e)},jt=function(t,e){for(var r=0,n=e.length,i=Pt(t,n);n>r;)i[r]=e[r++];return i},Ct=function(t,e,r){q(t,e,{get:function(){return this._d[r]}})},Nt=function(t){var e,r,n,i,o,a,f=M(t),s=arguments.length,h=s>1?arguments[1]:void 0,c=void 0!==h,d=x(f);if(void 0!=d&&!S(d)){for(a=d.call(f),n=[],e=0;!(o=a.next()).done;e++)n.push(o.value);f=n}for(c&&s>2&&(h=u(h,arguments[2],2)),e=0,r=b(f.length),i=Pt(this,r);r>e;e++)i[e]=c?h(f[e],e):f[e];return i},Lt=function(){for(var t=0,e=arguments.length,r=Pt(this,e);e>t;)r[t]=arguments[t++];return r},Ut=!!V&&o(function(){yt.call(new V(1))}),zt=function(){return yt.apply(Ut?bt.call(Rt(this)):Rt(this),arguments)},Dt={copyWithin:function(t,e){return U.call(Rt(this),t,e,arguments.length>2?arguments[2]:void 0)},every:function(t){return rt(Rt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return L.apply(Rt(this),arguments)},filter:function(t){return Tt(this,tt(Rt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return nt(Rt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return it(Rt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){Q(Rt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return at(Rt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return ot(Rt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return lt.apply(Rt(this),arguments)},lastIndexOf:function(t){return ht.apply(Rt(this),arguments)},map:function(t){return kt(Rt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return ct.apply(Rt(this),arguments)},reduceRight:function(t){return dt.apply(Rt(this),arguments)},reverse:function(){for(var t,e=this,r=Rt(e).length,n=Math.floor(r/2),i=0;i1?arguments[1]:void 0)},sort:function(t){return pt.call(Rt(this),t)},subarray:function(t,e){var r=Rt(this),n=r.length,i=v(t,n);return new(P(r,r[_t]))(r.buffer,r.byteOffset+i*r.BYTES_PER_ELEMENT,b((void 0===e?n:v(e,n))-i))}},qt=function(t,e){return Tt(this,bt.call(Rt(this),t,e))},Ft=function(t){Rt(this);var e=Ot(arguments[1],1),r=this.length,n=M(t),i=b(n.length),o=0;if(i+e>r)throw K(At);for(;o255?255:255&n),i.v[p](r*e+i.o,n,xt)},B=function(t,e){q(t,e,{get:function(){return x(this,e)},set:function(t){return I(this,e,t)},enumerable:!0})};g?(v=r(function(t,r,n,i){h(t,v,u,"_d");var o,a,f,s,c=0,l=0;if(_(r)){if(!(r instanceof J||(s=w(r))==H||s==X))return St in r?jt(v,r):Nt.call(v,r);o=r,l=Ot(n,e);var p=r.byteLength;if(void 0===i){if(p%e)throw K(At);if(a=p-l,a<0)throw K(At)}else if(a=b(i)*e,a+l>p)throw K(At);f=a/e}else f=Bt(r,!0),a=f*e,o=new J(a);for(d(t,"_d",{b:o,o:l,l:a,e:f,v:new $(o)});c0?n:r)(t)}},function(t,e){var r;r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e){t.exports=function(t,e,r,n){if(!(t instanceof e)||void 0!==n&&n in t)throw TypeError(r+": incorrect invocation!");return t}},function(t,e){t.exports=!1},function(t,e,r){var n=r(3),i=r(180),o=r(121),a=r(133)("IE_PROTO"),f=function(){},s="prototype",u=function(){var t,e=r(120)("iframe"),n=o.length,i="<",a=">";for(e.style.display="none",r(123).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(i+"script"+a+"document.F=Object"+i+"/script"+a),t.close(),u=t.F;n--;)delete u[s][o[n]];return u()};t.exports=Object.create||function(t,e){var r;return null!==t?(f[s]=n(t),r=new f,f[s]=null,r[a]=t):r=u(),void 0===e?r:i(r,e)}},function(t,e,r){var n=r(182),i=r(121).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return n(t,i)}},function(t,e,r){var n=r(182),i=r(121);t.exports=Object.keys||function(t){return n(t,i)}},function(t,e,r){var n=r(15);t.exports=function(t,e,r){for(var i in e)n(t,i,e[i],r);return t}},function(t,e,r){"use strict";var n=r(4),i=r(9),o=r(8),a=r(7)("species");t.exports=function(t){var e=n[t];o&&e&&!e[a]&&i.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,r){var n=r(38),i=Math.max,o=Math.min;t.exports=function(t,e){return t=n(t),t<0?i(t+e,0):o(t,e)}},function(t,e){var r=0,n=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+n).toString(36))}},function(t,e,r){var n=e;n.utils=r(527),n.common=r(523),n.sha=r(526),n.ripemd=r(525),n.hmac=r(524),n.sha1=n.sha.sha1,n.sha256=n.sha.sha256,n.sha224=n.sha.sha224,n.sha384=n.sha.sha384,n.sha512=n.sha.sha512,n.ripemd160=n.ripemd.ripemd160},function(t,e,r){var n=e;n.utils=r(564),n.common=r(560),n.sha=r(563),n.ripemd=r(562),n.hmac=r(561),n.sha1=n.sha.sha1,n.sha256=n.sha.sha256,n.sha224=n.sha.sha224,n.sha384=n.sha.sha384,n.sha512=n.sha.sha512,n.ripemd160=n.ripemd.ripemd160},function(t,e,r){"use strict";function n(t){return this instanceof n?(u.call(this,t),h.call(this,t),t&&t.readable===!1&&(this.readable=!1),t&&t.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,t&&t.allowHalfOpen===!1&&(this.allowHalfOpen=!1),void this.once("end",i)):new n(t)}function i(){this.allowHalfOpen||this._writableState.ended||f(o,this)}function o(t){t.end()}var a=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};t.exports=n;var f=r(157),s=r(73);s.inherits=r(74);var u=r(250),h=r(155);s.inherits(n,u);for(var c=a(h.prototype),d=0;d=this.charLength-this.charReceived?this.charLength-this.charReceived:t.length;if(t.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&n<=56319)){if(this.charReceived=this.charLength=0,0===t.length)return e;break}this.charLength+=this.surrogateSize,e=""}this.detectIncompleteChar(t);var i=t.length;this.charLength&&(t.copy(this.charBuffer,0,t.length-this.charReceived,i),i-=this.charReceived),e+=t.toString(this.encoding,0,i);var i=e.length-1,n=e.charCodeAt(i);if(n>=55296&&n<=56319){var o=this.surrogateSize;return this.charLength+=o,this.charReceived+=o,this.charBuffer.copy(this.charBuffer,o,0,o),t.copy(this.charBuffer,0,0,o),e.substring(0,i)}return e},u.prototype.detectIncompleteChar=function(t){for(var e=t.length>=3?3:t.length;e>0;e--){var r=t[t.length-e];if(1==e&&r>>5==6){this.charLength=2;break}if(e<=2&&r>>4==14){this.charLength=3;break}if(e<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=e},u.prototype.end=function(t){var e="";if(t&&t.length&&(e=this.write(t)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;e+=n.slice(0,r).toString(i)}return e}},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=r(62),f=function(t){function e(){return n(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),e}(a);t.exports=f},function(t,e,r){var n=r(7)("unscopables"),i=Array.prototype;void 0==i[n]&&r(14)(i,n,{}),t.exports=function(t){i[n][t]=!0}},function(t,e,r){var n=r(33),i=r(176),o=r(125),a=r(3),f=r(10),s=r(142),u={},h={},e=t.exports=function(t,e,r,c,d){var l,p,b,v,y=d?function(){return t}:s(t),m=n(r,c,e?2:1),g=0;if("function"!=typeof y)throw TypeError(t+" is not iterable!");if(o(y)){for(l=f(t.length);l>g;g++)if(v=e?m(a(p=t[g])[0],p[1]):m(t[g]),v===u||v===h)return v}else for(b=y.call(t);!(p=b.next()).done;)if(v=i(b,m,p.value,e),v===u||v===h)return v};e.BREAK=u,e.RETURN=h},function(t,e){t.exports={}},function(t,e,r){var n=r(9).f,i=r(12),o=r(7)("toStringTag");t.exports=function(t,e,r){t&&!i(t=r?t:t.prototype,o)&&n(t,o,{configurable:!0,value:e})}},function(t,e,r){var n=r(0),i=r(24),o=r(5),a=r(138),f="["+a+"]",s="​…",u=RegExp("^"+f+f+"*"),h=RegExp(f+f+"*$"),c=function(t,e,r){var i={},f=o(function(){return!!a[t]()||s[t]()!=s}),u=i[t]=f?e(d):a[t];r&&(i[r]=u),n(n.P+n.F*f,"String",i)},d=c.trim=function(t,e){return t=String(i(t)),1&e&&(t=t.replace(u,"")),2&e&&(t=t.replace(h,"")),t};t.exports=c},function(t,e,r){"use strict";(function(e){function n(t){u.call(this,"digest"),this._hash=t,this.buffers=[]}function i(t){u.call(this,"digest"),this._hash=t}var o=r(2),a=r(105),f=r(567),s=r(568),u=r(566);o(n,u),n.prototype._update=function(t){this.buffers.push(t)},n.prototype._final=function(){var t=e.concat(this.buffers),r=this._hash(t);return this.buffers=null,r},o(i,u),i.prototype._update=function(t){this._hash.update(t)},i.prototype._final=function(){return this._hash.digest()},t.exports=function(t){return t=t.toLowerCase(),"md5"===t?new n(a):"rmd160"===t||"ripemd160"===t?new n(f):new i(s(t))}}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function r(t,r){this._block=new e(t),this._finalSize=r,this._blockSize=t,this._len=0,this._s=0}r.prototype.update=function(t,r){"string"==typeof t&&(r=r||"utf8",t=new e(t,r));for(var n=this._len+=t.length,i=this._s||0,o=0,a=this._block;i=8*this._finalSize&&(this._update(this._block),this._block.fill(0)),this._block.writeInt32BE(e,this._blockSize-4);var r=this._update(this._block)||this._hash();return t?r.toString(t):r},r.prototype._update=function(){throw new Error("_update must be implemented by subclass")},t.exports=r}).call(e,r(1).Buffer)},function(t,e,r){"use strict";(function(e,r,n){function i(){throw new Error("secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11")}function o(t,i){if(t>65536)throw new Error("requested too many random bytes");var o=new e.Uint8Array(t);t>0&&a.getRandomValues(o);var f=new r(o.buffer);return"function"==typeof i?n.nextTick(function(){i(null,f)}):f}var a=e.crypto||e.msCrypto;a&&a.getRandomValues?t.exports=o:t.exports=i}).call(e,r(39),r(1).Buffer,r(26))},function(t,e){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var o=function(t){function e(t){r(this,e);var i=n(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return Object.defineProperty(i,"message",{configurable:!0,enumerable:!1,value:void 0!==t?String(t):""}),Object.defineProperty(i,"name",{configurable:!0,enumerable:!1,value:i.constructor.name}),Error.captureStackTrace&&Error.captureStackTrace(i,i.constructor),i}return i(e,t),e}(Error);t.exports=o},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=function(){function t(t,e){for(var r=0;r=49&&a<=54?a-49+10:a>=17&&a<=22?a-17+10:15&a}return n}function f(t,e,r,n){for(var i=0,o=Math.min(t.length,r),a=e;a=49?f-49+10:f>=17?f-17+10:f}return i}function s(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}function u(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],o=0|e.words[0],a=i*o,f=67108863&a,s=a/67108864|0;r.words[0]=f;for(var u=1;u>>26,c=67108863&s,d=Math.min(u,e.length-1),l=Math.max(0,u-t.length+1);l<=d;l++){var p=u-l|0;i=0|t.words[p],o=0|e.words[l],a=i*o+c,h+=a/67108864|0,c=67108863&a}r.words[u]=0|c,s=0|h}return 0!==s?r.words[u]=0|s:r.length--,r.strip()}function h(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,o=0;o>>26)|0,i+=a>>>26,a&=67108863}r.words[o]=f,n=a,a=i}return 0!==n?r.words[o]=n:r.length--,r.strip()}function c(t,e,r){var n=new d;return n.mulp(t,e,r)}function d(t,e){this.x=t,this.y=e}function l(t,e){this.name=t,this.p=new o(e,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function p(){l.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function b(){l.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function v(){l.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function y(){l.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function m(t){if("string"==typeof t){var e=o._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function g(t){m.call(this,t),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}"object"==typeof t?t.exports=o:e.BN=o,o.BN=o,o.wordSize=26;var w;try{w=r(1).Buffer}catch(t){}o.isBN=function(t){return t instanceof o||null!==t&&"object"==typeof t&&t.constructor.wordSize===o.wordSize&&Array.isArray(t.words)},o.max=function(t,e){return t.cmp(e)>0?t:e},o.min=function(t,e){return t.cmp(e)<0?t:e},o.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36),t=t.toString().replace(/\s+/g,"");var i=0;"-"===t[0]&&i++,16===e?this._parseHex(t,i):this._parseBase(t,e,i),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(n(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initArray=function(t,e,r){if(n("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)a=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[o]|=a<>>26-f&67108863,f+=24,f>=26&&(f-=26,o++);else if("le"===r)for(i=0,o=0;i>>26-f&67108863,f+=24,f>=26&&(f-=26,o++);return this.strip()},o.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var r=0;r=e;r-=6)i=a(t,r,r+6),this.words[n]|=i<>>26-o&4194303,o+=24,o>=26&&(o-=26,n++);r+6!==e&&(i=a(t,e,r+6),this.words[n]|=i<>>26-o&4194303),this.strip()},o.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var o=t.length-r,a=o%n,s=Math.min(o,o-a)+r,u=0,h=r;h1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},o.prototype.inspect=function(){return(this.red?""};var _=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],M=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],S=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];o.prototype.toString=function(t,e){t=t||10,e=0|e||1;var r;if(16===t||"hex"===t){r="";for(var i=0,o=0,a=0;a>>24-i&16777215,r=0!==o||a!==this.length-1?_[6-s.length]+s+r:s+r,i+=2,i>=26&&(i-=26,a--)}for(0!==o&&(r=o.toString(16)+r);r.length%e!==0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var u=M[t],h=S[t];r="";var c=this.clone();for(c.negative=0;!c.isZero();){var d=c.modn(h).toString(t);c=c.idivn(h),r=c.isZero()?d+r:_[u-d.length]+d+r}for(this.isZero()&&(r="0"+r);r.length%e!==0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},o.prototype.toJSON=function(){return this.toString(16)},o.prototype.toBuffer=function(t,e){return n("undefined"!=typeof w),this.toArrayLike(w,t,e)},o.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},o.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),o=r||Math.max(1,i);n(i<=o,"byte array longer than desired length"),n(o>0,"Requested array length <= 0"),this.strip();var a,f,s="le"===e,u=new t(o),h=this.clone();if(s){for(f=0;!h.isZero();f++)a=h.andln(255),h.iushrn(8),u[f]=a;for(;f=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},o.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0===(8191&e)&&(r+=13,e>>>=13),0===(127&e)&&(r+=7,e>>>=7),0===(15&e)&&(r+=4,e>>>=4),0===(3&e)&&(r+=2,e>>>=2),0===(1&e)&&r++,r},o.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},o.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},o.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},o.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},o.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},o.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},o.prototype.inotn=function(t){n("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},o.prototype.notn=function(t){return this.clone().inotn(t)},o.prototype.setn=function(t,e){n("number"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),e?this.words[r]=this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},o.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r=this.cmp(t);if(0===r)return this.negative=0,this.length=1,this.words[0]=0,this;var n,i;r>0?(n=this,i=t):(n=t,i=this);for(var o=0,a=0;a>26,this.words[a]=67108863&e;for(;0!==o&&a>26,this.words[a]=67108863&e;if(0===o&&a>>13,l=0|a[1],p=8191&l,b=l>>>13,v=0|a[2],y=8191&v,m=v>>>13,g=0|a[3],w=8191&g,_=g>>>13,M=0|a[4],S=8191&M,E=M>>>13,A=0|a[5],k=8191&A,x=A>>>13,I=0|a[6],B=8191&I,O=I>>>13,R=0|a[7],P=8191&R,T=R>>>13,j=0|a[8],C=8191&j,N=j>>>13,L=0|a[9],U=8191&L,z=L>>>13,D=0|f[0],q=8191&D,F=D>>>13,K=0|f[1],G=8191&K,V=K>>>13,H=0|f[2],X=8191&H,Y=H>>>13,W=0|f[3],Z=8191&W,J=W>>>13,$=0|f[4],Q=8191&$,tt=$>>>13,et=0|f[5],rt=8191&et,nt=et>>>13,it=0|f[6],ot=8191&it,at=it>>>13,ft=0|f[7],st=8191&ft,ut=ft>>>13,ht=0|f[8],ct=8191&ht,dt=ht>>>13,lt=0|f[9],pt=8191<,bt=lt>>>13;r.negative=t.negative^e.negative,r.length=19,n=Math.imul(c,q),i=Math.imul(c,F),i=i+Math.imul(d,q)|0,o=Math.imul(d,F);var vt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(p,q),i=Math.imul(p,F),i=i+Math.imul(b,q)|0,o=Math.imul(b,F),n=n+Math.imul(c,G)|0,i=i+Math.imul(c,V)|0,i=i+Math.imul(d,G)|0,o=o+Math.imul(d,V)|0;var yt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,q),i=Math.imul(y,F),i=i+Math.imul(m,q)|0,o=Math.imul(m,F),n=n+Math.imul(p,G)|0,i=i+Math.imul(p,V)|0,i=i+Math.imul(b,G)|0,o=o+Math.imul(b,V)|0,n=n+Math.imul(c,X)|0,i=i+Math.imul(c,Y)|0,i=i+Math.imul(d,X)|0,o=o+Math.imul(d,Y)|0;var mt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(w,q),i=Math.imul(w,F),i=i+Math.imul(_,q)|0,o=Math.imul(_,F),n=n+Math.imul(y,G)|0,i=i+Math.imul(y,V)|0,i=i+Math.imul(m,G)|0,o=o+Math.imul(m,V)|0,n=n+Math.imul(p,X)|0,i=i+Math.imul(p,Y)|0,i=i+Math.imul(b,X)|0,o=o+Math.imul(b,Y)|0,n=n+Math.imul(c,Z)|0,i=i+Math.imul(c,J)|0,i=i+Math.imul(d,Z)|0,o=o+Math.imul(d,J)|0;var gt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(S,q),i=Math.imul(S,F),i=i+Math.imul(E,q)|0,o=Math.imul(E,F),n=n+Math.imul(w,G)|0,i=i+Math.imul(w,V)|0,i=i+Math.imul(_,G)|0,o=o+Math.imul(_,V)|0,n=n+Math.imul(y,X)|0,i=i+Math.imul(y,Y)|0,i=i+Math.imul(m,X)|0,o=o+Math.imul(m,Y)|0,n=n+Math.imul(p,Z)|0,i=i+Math.imul(p,J)|0,i=i+Math.imul(b,Z)|0,o=o+Math.imul(b,J)|0,n=n+Math.imul(c,Q)|0,i=i+Math.imul(c,tt)|0,i=i+Math.imul(d,Q)|0,o=o+Math.imul(d,tt)|0;var wt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(k,q),i=Math.imul(k,F),i=i+Math.imul(x,q)|0,o=Math.imul(x,F),n=n+Math.imul(S,G)|0,i=i+Math.imul(S,V)|0,i=i+Math.imul(E,G)|0,o=o+Math.imul(E,V)|0,n=n+Math.imul(w,X)|0,i=i+Math.imul(w,Y)|0,i=i+Math.imul(_,X)|0,o=o+Math.imul(_,Y)|0,n=n+Math.imul(y,Z)|0,i=i+Math.imul(y,J)|0,i=i+Math.imul(m,Z)|0,o=o+Math.imul(m,J)|0,n=n+Math.imul(p,Q)|0,i=i+Math.imul(p,tt)|0,i=i+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,n=n+Math.imul(c,rt)|0,i=i+Math.imul(c,nt)|0,i=i+Math.imul(d,rt)|0,o=o+Math.imul(d,nt)|0;var _t=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(B,q),i=Math.imul(B,F),i=i+Math.imul(O,q)|0,o=Math.imul(O,F),n=n+Math.imul(k,G)|0,i=i+Math.imul(k,V)|0,i=i+Math.imul(x,G)|0,o=o+Math.imul(x,V)|0,n=n+Math.imul(S,X)|0,i=i+Math.imul(S,Y)|0,i=i+Math.imul(E,X)|0,o=o+Math.imul(E,Y)|0,n=n+Math.imul(w,Z)|0,i=i+Math.imul(w,J)|0,i=i+Math.imul(_,Z)|0,o=o+Math.imul(_,J)|0,n=n+Math.imul(y,Q)|0,i=i+Math.imul(y,tt)|0,i=i+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0,n=n+Math.imul(p,rt)|0,i=i+Math.imul(p,nt)|0,i=i+Math.imul(b,rt)|0,o=o+Math.imul(b,nt)|0,n=n+Math.imul(c,ot)|0,i=i+Math.imul(c,at)|0,i=i+Math.imul(d,ot)|0,o=o+Math.imul(d,at)|0;var Mt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(P,q),i=Math.imul(P,F),i=i+Math.imul(T,q)|0,o=Math.imul(T,F),n=n+Math.imul(B,G)|0,i=i+Math.imul(B,V)|0,i=i+Math.imul(O,G)|0,o=o+Math.imul(O,V)|0,n=n+Math.imul(k,X)|0,i=i+Math.imul(k,Y)|0,i=i+Math.imul(x,X)|0,o=o+Math.imul(x,Y)|0,n=n+Math.imul(S,Z)|0,i=i+Math.imul(S,J)|0,i=i+Math.imul(E,Z)|0,o=o+Math.imul(E,J)|0,n=n+Math.imul(w,Q)|0,i=i+Math.imul(w,tt)|0,i=i+Math.imul(_,Q)|0,o=o+Math.imul(_,tt)|0,n=n+Math.imul(y,rt)|0,i=i+Math.imul(y,nt)|0,i=i+Math.imul(m,rt)|0,o=o+Math.imul(m,nt)|0,n=n+Math.imul(p,ot)|0,i=i+Math.imul(p,at)|0,i=i+Math.imul(b,ot)|0,o=o+Math.imul(b,at)|0,n=n+Math.imul(c,st)|0,i=i+Math.imul(c,ut)|0,i=i+Math.imul(d,st)|0,o=o+Math.imul(d,ut)|0;var St=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(C,q),i=Math.imul(C,F),i=i+Math.imul(N,q)|0,o=Math.imul(N,F),n=n+Math.imul(P,G)|0,i=i+Math.imul(P,V)|0,i=i+Math.imul(T,G)|0,o=o+Math.imul(T,V)|0,n=n+Math.imul(B,X)|0,i=i+Math.imul(B,Y)|0,i=i+Math.imul(O,X)|0,o=o+Math.imul(O,Y)|0,n=n+Math.imul(k,Z)|0,i=i+Math.imul(k,J)|0,i=i+Math.imul(x,Z)|0,o=o+Math.imul(x,J)|0,n=n+Math.imul(S,Q)|0,i=i+Math.imul(S,tt)|0,i=i+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,n=n+Math.imul(w,rt)|0,i=i+Math.imul(w,nt)|0,i=i+Math.imul(_,rt)|0,o=o+Math.imul(_,nt)|0,n=n+Math.imul(y,ot)|0,i=i+Math.imul(y,at)|0,i=i+Math.imul(m,ot)|0,o=o+Math.imul(m,at)|0,n=n+Math.imul(p,st)|0,i=i+Math.imul(p,ut)|0,i=i+Math.imul(b,st)|0,o=o+Math.imul(b,ut)|0,n=n+Math.imul(c,ct)|0,i=i+Math.imul(c,dt)|0,i=i+Math.imul(d,ct)|0,o=o+Math.imul(d,dt)|0;var Et=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(U,q),i=Math.imul(U,F),i=i+Math.imul(z,q)|0,o=Math.imul(z,F),n=n+Math.imul(C,G)|0,i=i+Math.imul(C,V)|0,i=i+Math.imul(N,G)|0,o=o+Math.imul(N,V)|0,n=n+Math.imul(P,X)|0,i=i+Math.imul(P,Y)|0,i=i+Math.imul(T,X)|0,o=o+Math.imul(T,Y)|0,n=n+Math.imul(B,Z)|0,i=i+Math.imul(B,J)|0,i=i+Math.imul(O,Z)|0,o=o+Math.imul(O,J)|0,n=n+Math.imul(k,Q)|0,i=i+Math.imul(k,tt)|0,i=i+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,n=n+Math.imul(S,rt)|0,i=i+Math.imul(S,nt)|0,i=i+Math.imul(E,rt)|0,o=o+Math.imul(E,nt)|0,n=n+Math.imul(w,ot)|0,i=i+Math.imul(w,at)|0,i=i+Math.imul(_,ot)|0,o=o+Math.imul(_,at)|0,n=n+Math.imul(y,st)|0,i=i+Math.imul(y,ut)|0,i=i+Math.imul(m,st)|0,o=o+Math.imul(m,ut)|0,n=n+Math.imul(p,ct)|0,i=i+Math.imul(p,dt)|0,i=i+Math.imul(b,ct)|0,o=o+Math.imul(b,dt)|0,n=n+Math.imul(c,pt)|0,i=i+Math.imul(c,bt)|0,i=i+Math.imul(d,pt)|0,o=o+Math.imul(d,bt)|0;var At=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(U,G),i=Math.imul(U,V),i=i+Math.imul(z,G)|0,o=Math.imul(z,V),n=n+Math.imul(C,X)|0,i=i+Math.imul(C,Y)|0,i=i+Math.imul(N,X)|0,o=o+Math.imul(N,Y)|0,n=n+Math.imul(P,Z)|0,i=i+Math.imul(P,J)|0,i=i+Math.imul(T,Z)|0,o=o+Math.imul(T,J)|0,n=n+Math.imul(B,Q)|0,i=i+Math.imul(B,tt)|0,i=i+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,n=n+Math.imul(k,rt)|0,i=i+Math.imul(k,nt)|0,i=i+Math.imul(x,rt)|0,o=o+Math.imul(x,nt)|0,n=n+Math.imul(S,ot)|0,i=i+Math.imul(S,at)|0,i=i+Math.imul(E,ot)|0,o=o+Math.imul(E,at)|0,n=n+Math.imul(w,st)|0,i=i+Math.imul(w,ut)|0,i=i+Math.imul(_,st)|0,o=o+Math.imul(_,ut)|0,n=n+Math.imul(y,ct)|0,i=i+Math.imul(y,dt)|0,i=i+Math.imul(m,ct)|0,o=o+Math.imul(m,dt)|0,n=n+Math.imul(p,pt)|0,i=i+Math.imul(p,bt)|0,i=i+Math.imul(b,pt)|0,o=o+Math.imul(b,bt)|0;var kt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(U,X),i=Math.imul(U,Y),i=i+Math.imul(z,X)|0,o=Math.imul(z,Y),n=n+Math.imul(C,Z)|0,i=i+Math.imul(C,J)|0,i=i+Math.imul(N,Z)|0,o=o+Math.imul(N,J)|0,n=n+Math.imul(P,Q)|0,i=i+Math.imul(P,tt)|0,i=i+Math.imul(T,Q)|0,o=o+Math.imul(T,tt)|0,n=n+Math.imul(B,rt)|0,i=i+Math.imul(B,nt)|0,i=i+Math.imul(O,rt)|0,o=o+Math.imul(O,nt)|0,n=n+Math.imul(k,ot)|0,i=i+Math.imul(k,at)|0,i=i+Math.imul(x,ot)|0,o=o+Math.imul(x,at)|0,n=n+Math.imul(S,st)|0,i=i+Math.imul(S,ut)|0,i=i+Math.imul(E,st)|0,o=o+Math.imul(E,ut)|0,n=n+Math.imul(w,ct)|0,i=i+Math.imul(w,dt)|0,i=i+Math.imul(_,ct)|0,o=o+Math.imul(_,dt)|0,n=n+Math.imul(y,pt)|0,i=i+Math.imul(y,bt)|0,i=i+Math.imul(m,pt)|0,o=o+Math.imul(m,bt)|0;var xt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(U,Z),i=Math.imul(U,J),i=i+Math.imul(z,Z)|0,o=Math.imul(z,J),n=n+Math.imul(C,Q)|0,i=i+Math.imul(C,tt)|0,i=i+Math.imul(N,Q)|0,o=o+Math.imul(N,tt)|0,n=n+Math.imul(P,rt)|0,i=i+Math.imul(P,nt)|0,i=i+Math.imul(T,rt)|0,o=o+Math.imul(T,nt)|0,n=n+Math.imul(B,ot)|0,i=i+Math.imul(B,at)|0,i=i+Math.imul(O,ot)|0,o=o+Math.imul(O,at)|0,n=n+Math.imul(k,st)|0,i=i+Math.imul(k,ut)|0,i=i+Math.imul(x,st)|0,o=o+Math.imul(x,ut)|0,n=n+Math.imul(S,ct)|0,i=i+Math.imul(S,dt)|0,i=i+Math.imul(E,ct)|0,o=o+Math.imul(E,dt)|0,n=n+Math.imul(w,pt)|0,i=i+Math.imul(w,bt)|0,i=i+Math.imul(_,pt)|0,o=o+Math.imul(_,bt)|0;var It=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(It>>>26)|0,It&=67108863,n=Math.imul(U,Q),i=Math.imul(U,tt),i=i+Math.imul(z,Q)|0,o=Math.imul(z,tt),n=n+Math.imul(C,rt)|0,i=i+Math.imul(C,nt)|0,i=i+Math.imul(N,rt)|0,o=o+Math.imul(N,nt)|0,n=n+Math.imul(P,ot)|0,i=i+Math.imul(P,at)|0,i=i+Math.imul(T,ot)|0,o=o+Math.imul(T,at)|0,n=n+Math.imul(B,st)|0,i=i+Math.imul(B,ut)|0,i=i+Math.imul(O,st)|0,o=o+Math.imul(O,ut)|0,n=n+Math.imul(k,ct)|0,i=i+Math.imul(k,dt)|0,i=i+Math.imul(x,ct)|0,o=o+Math.imul(x,dt)|0,n=n+Math.imul(S,pt)|0,i=i+Math.imul(S,bt)|0,i=i+Math.imul(E,pt)|0,o=o+Math.imul(E,bt)|0;var Bt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,n=Math.imul(U,rt),i=Math.imul(U,nt),i=i+Math.imul(z,rt)|0,o=Math.imul(z,nt),n=n+Math.imul(C,ot)|0,i=i+Math.imul(C,at)|0,i=i+Math.imul(N,ot)|0,o=o+Math.imul(N,at)|0,n=n+Math.imul(P,st)|0,i=i+Math.imul(P,ut)|0,i=i+Math.imul(T,st)|0,o=o+Math.imul(T,ut)|0,n=n+Math.imul(B,ct)|0,i=i+Math.imul(B,dt)|0,i=i+Math.imul(O,ct)|0,o=o+Math.imul(O,dt)|0,n=n+Math.imul(k,pt)|0,i=i+Math.imul(k,bt)|0,i=i+Math.imul(x,pt)|0,o=o+Math.imul(x,bt)|0;var Ot=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,n=Math.imul(U,ot),i=Math.imul(U,at),i=i+Math.imul(z,ot)|0,o=Math.imul(z,at),n=n+Math.imul(C,st)|0,i=i+Math.imul(C,ut)|0,i=i+Math.imul(N,st)|0,o=o+Math.imul(N,ut)|0,n=n+Math.imul(P,ct)|0,i=i+Math.imul(P,dt)|0,i=i+Math.imul(T,ct)|0,o=o+Math.imul(T,dt)|0,n=n+Math.imul(B,pt)|0,i=i+Math.imul(B,bt)|0,i=i+Math.imul(O,pt)|0,o=o+Math.imul(O,bt)|0;var Rt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,n=Math.imul(U,st),i=Math.imul(U,ut),i=i+Math.imul(z,st)|0,o=Math.imul(z,ut),n=n+Math.imul(C,ct)|0,i=i+Math.imul(C,dt)|0,i=i+Math.imul(N,ct)|0,o=o+Math.imul(N,dt)|0,n=n+Math.imul(P,pt)|0,i=i+Math.imul(P,bt)|0,i=i+Math.imul(T,pt)|0,o=o+Math.imul(T,bt)|0;var Pt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,n=Math.imul(U,ct),i=Math.imul(U,dt),i=i+Math.imul(z,ct)|0,o=Math.imul(z,dt),n=n+Math.imul(C,pt)|0,i=i+Math.imul(C,bt)|0,i=i+Math.imul(N,pt)|0,o=o+Math.imul(N,bt)|0;var Tt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(U,pt),i=Math.imul(U,bt),i=i+Math.imul(z,pt)|0,o=Math.imul(z,bt);var jt=(u+n|0)+((8191&i)<<13)|0;return u=(o+(i>>>13)|0)+(jt>>>26)|0,jt&=67108863,s[0]=vt,s[1]=yt,s[2]=mt,s[3]=gt,s[4]=wt,s[5]=_t,s[6]=Mt,s[7]=St,s[8]=Et,s[9]=At,s[10]=kt,s[11]=xt,s[12]=It,s[13]=Bt,s[14]=Ot,s[15]=Rt,s[16]=Pt,s[17]=Tt,s[18]=jt,0!==u&&(s[19]=u,r.length++),r};Math.imul||(E=u),o.prototype.mulTo=function(t,e){var r,n=this.length+t.length;return r=10===this.length&&10===t.length?E(this,t,e):n<63?u(this,t,e):n<1024?h(this,t,e):c(this,t,e)},d.prototype.makeRBT=function(t){for(var e=new Array(t),r=o.prototype._countBits(t)-1,n=0;n>=1;return n}, d.prototype.permute=function(t,e,r,n,i,o){for(var a=0;a>>=1)i++;return 1<>>=13,r[2*a+1]=8191&o,o>>>=13;for(a=2*e;a>=26,e+=i/67108864|0,e+=o>>>26,this.words[r]=67108863&o}return 0!==e&&(this.words[r]=e,this.length++),this},o.prototype.muln=function(t){return this.clone().imuln(t)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(t){var e=s(t);if(0===e.length)return new o(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,o=67108863>>>26-r<<26-r;if(0!==r){var a=0;for(e=0;e>>26-r}a&&(this.words[e]=a,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0);var i;i=e?(e-e%26)/26:0;var o=t%26,a=Math.min((t-o)/26,this.length),f=67108863^67108863>>>o<a)for(this.length-=a,u=0;u=0&&(0!==h||u>=i);u--){var c=0|this.words[u];this.words[u]=h<<26-o|c>>>o,h=c&f}return s&&0!==h&&(s.words[s.length++]=h),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},o.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},o.prototype.shln=function(t){return this.clone().ishln(t)},o.prototype.ushln=function(t){return this.clone().iushln(t)},o.prototype.shrn=function(t){return this.clone().ishrn(t)},o.prototype.ushrn=function(t){return this.clone().iushrn(t)},o.prototype.testn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},o.prototype.isubn=function(t){if(n("number"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(s/67108864|0),this.words[i+r]=67108863&a}for(;i>26,this.words[i+r]=67108863&a;if(0===f)return this.strip();for(n(f===-1),f=0,i=0;i>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},o.prototype._wordDiv=function(t,e){var r=this.length-t.length,n=this.clone(),i=t,a=0|i.words[i.length-1],f=this._countBits(a);r=26-f,0!==r&&(i=i.ushln(r),n.iushln(r),a=0|i.words[i.length-1]);var s,u=n.length-i.length;if("mod"!==e){s=new o(null),s.length=u+1,s.words=new Array(s.length);for(var h=0;h=0;d--){var l=67108864*(0|n.words[i.length+d])+(0|n.words[i.length+d-1]);for(l=Math.min(l/a|0,67108863),n._ishlnsubmul(i,l,d);0!==n.negative;)l--,n.negative=0,n._ishlnsubmul(i,1,d),n.isZero()||(n.negative^=1);s&&(s.words[d]=l)}return s&&s.strip(),n.strip(),"div"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},o.prototype.divmod=function(t,e,r){if(n(!t.isZero()),this.isZero())return{div:new o(0),mod:new o(0)};var i,a,f;return 0!==this.negative&&0===t.negative?(f=this.neg().divmod(t,e),"mod"!==e&&(i=f.div.neg()),"div"!==e&&(a=f.mod.neg(),r&&0!==a.negative&&a.iadd(t)),{div:i,mod:a}):0===this.negative&&0!==t.negative?(f=this.divmod(t.neg(),e),"mod"!==e&&(i=f.div.neg()),{div:i,mod:f.mod}):0!==(this.negative&t.negative)?(f=this.neg().divmod(t.neg(),e),"div"!==e&&(a=f.mod.neg(),r&&0!==a.negative&&a.isub(t)),{div:f.div,mod:a}):t.length>this.length||this.cmp(t)<0?{div:new o(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new o(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new o(this.modn(t.words[0]))}:this._wordDiv(t,e)},o.prototype.div=function(t){return this.divmod(t,"div",!1).div},o.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},o.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},o.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),o=r.cmp(n);return o<0||1===i&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},o.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},o.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},o.prototype.divn=function(t){return this.clone().idivn(t)},o.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),f=new o(0),s=new o(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var h=r.clone(),c=e.clone();!e.isZero();){for(var d=0,l=1;0===(e.words[0]&l)&&d<26;++d,l<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(i.isOdd()||a.isOdd())&&(i.iadd(h),a.isub(c)),i.iushrn(1),a.iushrn(1);for(var p=0,b=1;0===(r.words[0]&b)&&p<26;++p,b<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(f.isOdd()||s.isOdd())&&(f.iadd(h),s.isub(c)),f.iushrn(1),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(f),a.isub(s)):(r.isub(e),f.isub(i),s.isub(a))}return{a:f,b:s,gcd:r.iushln(u)}},o.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),f=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var s=0,u=1;0===(e.words[0]&u)&&s<26;++s,u<<=1);if(s>0)for(e.iushrn(s);s-- >0;)i.isOdd()&&i.iadd(f),i.iushrn(1);for(var h=0,c=1;0===(r.words[0]&c)&&h<26;++h,c<<=1);if(h>0)for(r.iushrn(h);h-- >0;)a.isOdd()&&a.iadd(f),a.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(a)):(r.isub(e),a.isub(i))}var d;return d=0===e.cmpn(1)?i:a,d.cmpn(0)<0&&d.iadd(t),d},o.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var o=e;e=r,r=o}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},o.prototype.invm=function(t){return this.egcd(t).a.umod(t)},o.prototype.isEven=function(){return 0===(1&this.words[0])},o.prototype.isOdd=function(){return 1===(1&this.words[0])},o.prototype.andln=function(t){return this.words[0]&t},o.prototype.bincn=function(t){n("number"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,f&=67108863,this.words[a]=f}return 0!==o&&(this.words[a]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(t){var e=t<0;if(0!==this.negative&&!e)return-1;if(0===this.negative&&e)return 1;this.strip();var r;if(this.length>1)r=1;else{e&&(t=-t),n(t<=67108863,"Number is too big");var i=0|this.words[0];r=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},o.prototype.gtn=function(t){return 1===this.cmpn(t)},o.prototype.gt=function(t){return 1===this.cmp(t)},o.prototype.gten=function(t){return this.cmpn(t)>=0},o.prototype.gte=function(t){return this.cmp(t)>=0},o.prototype.ltn=function(t){return this.cmpn(t)===-1},o.prototype.lt=function(t){return this.cmp(t)===-1},o.prototype.lten=function(t){return this.cmpn(t)<=0},o.prototype.lte=function(t){return this.cmp(t)<=0},o.prototype.eqn=function(t){return 0===this.cmpn(t)},o.prototype.eq=function(t){return 0===this.cmp(t)},o.red=function(t){return new m(t)},o.prototype.toRed=function(t){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},o.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(t){return this.red=t,this},o.prototype.forceRed=function(t){return n(!this.red,"Already a number in reduction context"),this._forceRed(t)},o.prototype.redAdd=function(t){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},o.prototype.redIAdd=function(t){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},o.prototype.redSub=function(t){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},o.prototype.redISub=function(t){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},o.prototype.redShl=function(t){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},o.prototype.redMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},o.prototype.redIMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},o.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(t){return n(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var A={k256:null,p224:null,p192:null,p25519:null};l.prototype._tmp=function(){var t=new o(null);return t.words=new Array(Math.ceil(this.n/13)),t},l.prototype.ireduce=function(t){var e,r=t;do this.split(r,this.tmp),r=this.imulK(r),r=r.iadd(this.tmp),e=r.bitLength();while(e>this.n);var n=e0?r.isub(this.p):r.strip(),r},l.prototype.split=function(t,e){t.iushrn(this.n,0,e)},l.prototype.imulK=function(t){return t.imul(this.k)},i(p,l),p.prototype.split=function(t,e){for(var r=4194303,n=Math.min(t.length,9),i=0;i>>22,o=a}o>>>=22,t.words[i-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},p.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},o._prime=function t(e){if(A[e])return A[e];var t;if("k256"===e)t=new p;else if("p224"===e)t=new b;else if("p192"===e)t=new v;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new y}return A[e]=t,t},m.prototype._verify1=function(t){n(0===t.negative,"red works only with positives"),n(t.red,"red works only with red numbers")},m.prototype._verify2=function(t,e){n(0===(t.negative|e.negative),"red works only with positives"),n(t.red&&t.red===e.red,"red works only with red numbers")},m.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},m.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},m.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},m.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},m.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},m.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},m.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},m.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},m.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},m.prototype.isqr=function(t){return this.imul(t,t.clone())},m.prototype.sqr=function(t){return this.mul(t,t)},m.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2===1),3===e){var r=this.m.add(new o(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),a=0;!i.isZero()&&0===i.andln(1);)a++,i.iushrn(1);n(!i.isZero());var f=new o(1).toRed(this),s=f.redNeg(),u=this.m.subn(1).iushrn(1),h=this.m.bitLength();for(h=new o(2*h*h).toRed(this);0!==this.pow(h,u).cmp(s);)h.redIAdd(s);for(var c=this.pow(h,i),d=this.pow(t,i.addn(1).iushrn(1)),l=this.pow(t,i),p=a;0!==l.cmp(f);){for(var b=l,v=0;0!==b.cmp(f);v++)b=b.redSqr();n(v=0;i--){for(var h=e.words[i],c=u-1;c>=0;c--){var d=h>>c&1;a!==n[0]&&(a=this.sqr(a)),0!==d||0!==f?(f<<=1,f|=d,s++,(s===r||0===i&&0===c)&&(a=this.mul(a,n[f]),s=0,f=0)):s=0}u=26}return a},m.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},m.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},o.mont=function(t){return new g(t)},i(g,m),g.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},g.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},g.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},g.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new o(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},g.prototype.invm=function(t){var e=this.imod(t._invmp(this.m).mul(this.r2));return e._forceRed(this)}}("undefined"==typeof t||t,this)}).call(e,r(92)(t))},function(t,e,r){var n=e;n.Reporter=r(582).Reporter,n.DecoderBuffer=r(234).DecoderBuffer,n.EncoderBuffer=r(234).EncoderBuffer,n.Node=r(581)},function(t,e,r){(function(e){t.exports=function(t,r){for(var n=Math.min(t.length,r.length),i=new e(n),o=0;ot.MAX_SAFE_BITMASK)throw new Error("Bitmask too large to be safely represented");if(this.getBitmask()&~t.SUPPORTED_BITMASK)throw new Error("Condition requested unsupported feature suites");if(this.getMaxFulfillmentLength()>t.MAX_FULFILLMENT_LENGTH)throw new Error("Condition requested too large of a max fulfillment size");return!0}}],[{key:"fromUri",value:function(e){if(e instanceof t)return e;if("string"!=typeof e)throw new Error("Serialized condition must be a string");var r=e.split(":");if("cc"!==r[0])throw new a('Serialized condition must start with "cc:"');if(!t.REGEX_STRICT.exec(e))throw new f("Invalid condition format");var n=new t;return n.setTypeId(parseInt(r[1],16)),n.setBitmask(parseInt(r[2],16)),n.setHash(u.decode(r[3])),n.setMaxFulfillmentLength(parseInt(r[4],10)),n}},{key:"fromBinary",value:function(e){e=h.from(e);var r=new t;return r.parseBinary(e),r}}]),t}();b.MAX_SAFE_BITMASK=4294967295,b.SUPPORTED_BITMASK=63,b.MAX_FULFILLMENT_LENGTH=65535,b.REGEX=l,b.REGEX_STRICT=p,t.exports=b}).call(e,r(1).Buffer)},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var r=0;rh;)if(f=s[h++],f!=f)return!0}else for(;u>h;h++)if((t||h in s)&&s[h]===r)return t||h||0;return!t&&-1}}},function(t,e,r){"use strict";var n=r(4),i=r(0),o=r(15),a=r(45),f=r(36),s=r(55),u=r(40),h=r(6),c=r(5),d=r(84),l=r(57),p=r(124);t.exports=function(t,e,r,b,v,y){var m=n[t],g=m,w=v?"set":"add",_=g&&g.prototype,M={},S=function(t){var e=_[t];o(_,t,"delete"==t?function(t){return!(y&&!h(t))&&e.call(this,0===t?0:t)}:"has"==t?function(t){return!(y&&!h(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return y&&!h(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,r){return e.call(this,0===t?0:t,r),this})};if("function"==typeof g&&(y||_.forEach&&!c(function(){(new g).entries().next()}))){var E=new g,A=E[w](y?{}:-0,1)!=E,k=c(function(){E.has(1)}),x=d(function(t){new g(t)}),I=!y&&c(function(){for(var t=new g,e=5;e--;)t[w](e,e);return!t.has(-0)});x||(g=e(function(e,r){u(e,g,t);var n=p(new m,e,g);return void 0!=r&&s(r,v,n[w],n),n}),g.prototype=_,_.constructor=g),(k||I)&&(S("delete"),S("has"),v&&S("get")),(I||A)&&S(w),y&&_.clear&&delete _.clear}else g=b.getConstructor(e,t,v,w),a(g.prototype,r),f.NEED=!0;return l(g,t),M[t]=g,i(i.G+i.W+i.F*(g!=m),M),y||b.setStrong(g,t,v),g}},function(t,e,r){"use strict";var n=r(14),i=r(15),o=r(5),a=r(24),f=r(7);t.exports=function(t,e,r){var s=f(t),u=r(a,s,""[t]),h=u[0],c=u[1];o(function(){var e={};return e[s]=function(){return 7},7!=""[t](e)})&&(i(String.prototype,t,h),n(RegExp.prototype,s,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},function(t,e,r){"use strict";var n=r(3);t.exports=function(){var t=n(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},function(t,e){t.exports=function(t,e,r){var n=void 0===r;switch(e.length){case 0:return n?t():t.call(r);case 1:return n?t(e[0]):t.call(r,e[0]);case 2:return n?t(e[0],e[1]):t.call(r,e[0],e[1]);case 3:return n?t(e[0],e[1],e[2]):t.call(r,e[0],e[1],e[2]);case 4:return n?t(e[0],e[1],e[2],e[3]):t.call(r,e[0],e[1],e[2],e[3])}return t.apply(r,e)}},function(t,e,r){var n=r(6),i=r(23),o=r(7)("match");t.exports=function(t){var e;return n(t)&&(void 0!==(e=t[o])?!!e:"RegExp"==i(t))}},function(t,e,r){var n=r(7)("iterator"),i=!1;try{var o=[7][n]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var r=!1;try{var o=[7],a=o[n]();a.next=function(){return{done:r=!0}},o[n]=function(){return a},t(o)}catch(t){}return r}},function(t,e,r){t.exports=r(41)||!r(5)(function(){var t=Math.random();__defineSetter__.call(null,t,function(){}),delete r(4)[t]})},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,r){var n=r(4),i="__core-js_shared__",o=n[i]||(n[i]={});t.exports=function(t){return o[t]||(o[t]={})}},function(t,e,r){for(var n,i=r(4),o=r(14),a=r(48),f=a("typed_array"),s=a("view"),u=!(!i.ArrayBuffer||!i.DataView),h=u,c=0,d=9,l="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");cf||t<0?(r=Math.abs(t)%f,t<0?f-r:r):t}function n(t){for(var e=0;e>>8^255&r^99,this.SBOX[i]=r,this.INV_SBOX[r]=i,o=t[i],a=t[o],f=t[a],n=257*t[r]^16843008*r,this.SUB_MIX[0][i]=n<<24|n>>>8,this.SUB_MIX[1][i]=n<<16|n>>>16,this.SUB_MIX[2][i]=n<<8|n>>>24,this.SUB_MIX[3][i]=n,n=16843009*f^65537*a^257*o^16843008*i,this.INV_SUB_MIX[0][r]=n<<24|n>>>8,this.INV_SUB_MIX[1][r]=n<<16|n>>>16,this.INV_SUB_MIX[2][r]=n<<8|n>>>24,this.INV_SUB_MIX[3][r]=n,0===i?i=s=1:(i=o^t[t[t[f^o]]],s^=t[t[s]]);return!0};var s=new i;a.blockSize=16,a.prototype.blockSize=a.blockSize,a.keySize=32,a.prototype.keySize=a.keySize,a.prototype._doReset=function(){var t,e,r,n,i,o;for(r=this._key,e=r.length,this._nRounds=e+6,i=4*(this._nRounds+1),this._keySchedule=[],n=0;n>>24,o=s.SBOX[o>>>24]<<24|s.SBOX[o>>>16&255]<<16|s.SBOX[o>>>8&255]<<8|s.SBOX[255&o],o^=s.RCON[n/e|0]<<24):e>6&&n%e===4?o=s.SBOX[o>>>24]<<24|s.SBOX[o>>>16&255]<<16|s.SBOX[o>>>8&255]<<8|s.SBOX[255&o]:void 0,this._keySchedule[n-e]^o);for(this._invKeySchedule=[],t=0;t>>24]]^s.INV_SUB_MIX[1][s.SBOX[o>>>16&255]]^s.INV_SUB_MIX[2][s.SBOX[o>>>8&255]]^s.INV_SUB_MIX[3][s.SBOX[255&o]]; return!0},a.prototype.encryptBlock=function(e){e=o(new t(e));var r=this._doCryptBlock(e,this._keySchedule,s.SUB_MIX,s.SBOX),n=new t(16);return n.writeUInt32BE(r[0],0),n.writeUInt32BE(r[1],4),n.writeUInt32BE(r[2],8),n.writeUInt32BE(r[3],12),n},a.prototype.decryptBlock=function(e){e=o(new t(e));var r=[e[3],e[1]];e[1]=r[0],e[3]=r[1];var n=this._doCryptBlock(e,this._invKeySchedule,s.INV_SUB_MIX,s.INV_SBOX),i=new t(16);return i.writeUInt32BE(n[0],0),i.writeUInt32BE(n[3],4),i.writeUInt32BE(n[2],8),i.writeUInt32BE(n[1],12),i},a.prototype.scrub=function(){n(this._keySchedule),n(this._invKeySchedule),n(this._key)},a.prototype._doCryptBlock=function(t,e,n,i){var o,a,f,s,u,h,c,d,l;a=t[0]^e[0],f=t[1]^e[1],s=t[2]^e[2],u=t[3]^e[3],o=4;for(var p=1;p>>24]^n[1][f>>>16&255]^n[2][s>>>8&255]^n[3][255&u]^e[o++],c=n[0][f>>>24]^n[1][s>>>16&255]^n[2][u>>>8&255]^n[3][255&a]^e[o++],d=n[0][s>>>24]^n[1][u>>>16&255]^n[2][a>>>8&255]^n[3][255&f]^e[o++],l=n[0][u>>>24]^n[1][a>>>16&255]^n[2][f>>>8&255]^n[3][255&s]^e[o++],a=h,f=c,s=d,u=l;return h=(i[a>>>24]<<24|i[f>>>16&255]<<16|i[s>>>8&255]<<8|i[255&u])^e[o++],c=(i[f>>>24]<<24|i[s>>>16&255]<<16|i[u>>>8&255]<<8|i[255&a])^e[o++],d=(i[s>>>24]<<24|i[u>>>16&255]<<16|i[a>>>8&255]<<8|i[255&f])^e[o++],l=(i[u>>>24]<<24|i[a>>>16&255]<<16|i[f>>>8&255]<<8|i[255&s])^e[o++],[r(h),r(c),r(d),r(l)]},e.AES=a}).call(e,r(1).Buffer)},function(t,e){e["aes-128-ecb"]={cipher:"AES",key:128,iv:0,mode:"ECB",type:"block"},e["aes-192-ecb"]={cipher:"AES",key:192,iv:0,mode:"ECB",type:"block"},e["aes-256-ecb"]={cipher:"AES",key:256,iv:0,mode:"ECB",type:"block"},e["aes-128-cbc"]={cipher:"AES",key:128,iv:16,mode:"CBC",type:"block"},e["aes-192-cbc"]={cipher:"AES",key:192,iv:16,mode:"CBC",type:"block"},e["aes-256-cbc"]={cipher:"AES",key:256,iv:16,mode:"CBC",type:"block"},e.aes128=e["aes-128-cbc"],e.aes192=e["aes-192-cbc"],e.aes256=e["aes-256-cbc"],e["aes-128-cfb"]={cipher:"AES",key:128,iv:16,mode:"CFB",type:"stream"},e["aes-192-cfb"]={cipher:"AES",key:192,iv:16,mode:"CFB",type:"stream"},e["aes-256-cfb"]={cipher:"AES",key:256,iv:16,mode:"CFB",type:"stream"},e["aes-128-cfb8"]={cipher:"AES",key:128,iv:16,mode:"CFB8",type:"stream"},e["aes-192-cfb8"]={cipher:"AES",key:192,iv:16,mode:"CFB8",type:"stream"},e["aes-256-cfb8"]={cipher:"AES",key:256,iv:16,mode:"CFB8",type:"stream"},e["aes-128-cfb1"]={cipher:"AES",key:128,iv:16,mode:"CFB1",type:"stream"},e["aes-192-cfb1"]={cipher:"AES",key:192,iv:16,mode:"CFB1",type:"stream"},e["aes-256-cfb1"]={cipher:"AES",key:256,iv:16,mode:"CFB1",type:"stream"},e["aes-128-ofb"]={cipher:"AES",key:128,iv:16,mode:"OFB",type:"stream"},e["aes-192-ofb"]={cipher:"AES",key:192,iv:16,mode:"OFB",type:"stream"},e["aes-256-ofb"]={cipher:"AES",key:256,iv:16,mode:"OFB",type:"stream"},e["aes-128-ctr"]={cipher:"AES",key:128,iv:16,mode:"CTR",type:"stream"},e["aes-192-ctr"]={cipher:"AES",key:192,iv:16,mode:"CTR",type:"stream"},e["aes-256-ctr"]={cipher:"AES",key:256,iv:16,mode:"CTR",type:"stream"},e["aes-128-gcm"]={cipher:"AES",key:128,iv:12,mode:"GCM",type:"auth"},e["aes-192-gcm"]={cipher:"AES",key:192,iv:12,mode:"GCM",type:"auth"},e["aes-256-gcm"]={cipher:"AES",key:256,iv:12,mode:"GCM",type:"auth"}},function(t,e,r){(function(t){function n(t){for(var e,r=t.length;r--;){if(e=t.readUInt8(r),255!==e){e++,t.writeUInt8(e,r);break}t.writeUInt8(0,r)}}function i(t){var e=t._cipher.encryptBlock(t._prev);return n(t._prev),e}var o=r(67);e.encrypt=function(e,r){for(;e._cache.lengthf||t<0?(r=Math.abs(t)%f,t<0?f-r:r):t}function n(t){for(var e=0;e>>8^255&r^99,this.SBOX[i]=r,this.INV_SBOX[r]=i,o=t[i],a=t[o],f=t[a],n=257*t[r]^16843008*r,this.SUB_MIX[0][i]=n<<24|n>>>8,this.SUB_MIX[1][i]=n<<16|n>>>16,this.SUB_MIX[2][i]=n<<8|n>>>24,this.SUB_MIX[3][i]=n,n=16843009*f^65537*a^257*o^16843008*i,this.INV_SUB_MIX[0][r]=n<<24|n>>>8,this.INV_SUB_MIX[1][r]=n<<16|n>>>16,this.INV_SUB_MIX[2][r]=n<<8|n>>>24,this.INV_SUB_MIX[3][r]=n,0===i?i=s=1:(i=o^t[t[t[f^o]]],s^=t[t[s]]);return!0};var s=new i;a.blockSize=16,a.prototype.blockSize=a.blockSize,a.keySize=32,a.prototype.keySize=a.keySize,a.prototype._doReset=function(){var t,e,r,n,i,o;for(r=this._key,e=r.length,this._nRounds=e+6,i=4*(this._nRounds+1),this._keySchedule=[],n=0;n>>24,o=s.SBOX[o>>>24]<<24|s.SBOX[o>>>16&255]<<16|s.SBOX[o>>>8&255]<<8|s.SBOX[255&o],o^=s.RCON[n/e|0]<<24):e>6&&n%e===4?o=s.SBOX[o>>>24]<<24|s.SBOX[o>>>16&255]<<16|s.SBOX[o>>>8&255]<<8|s.SBOX[255&o]:void 0,this._keySchedule[n-e]^o);for(this._invKeySchedule=[],t=0;t>>24]]^s.INV_SUB_MIX[1][s.SBOX[o>>>16&255]]^s.INV_SUB_MIX[2][s.SBOX[o>>>8&255]]^s.INV_SUB_MIX[3][s.SBOX[255&o]];return!0},a.prototype.encryptBlock=function(e){e=o(new t(e));var r=this._doCryptBlock(e,this._keySchedule,s.SUB_MIX,s.SBOX),n=new t(16);return n.writeUInt32BE(r[0],0),n.writeUInt32BE(r[1],4),n.writeUInt32BE(r[2],8),n.writeUInt32BE(r[3],12),n},a.prototype.decryptBlock=function(e){e=o(new t(e));var r=[e[3],e[1]];e[1]=r[0],e[3]=r[1];var n=this._doCryptBlock(e,this._invKeySchedule,s.INV_SUB_MIX,s.INV_SBOX),i=new t(16);return i.writeUInt32BE(n[0],0),i.writeUInt32BE(n[3],4),i.writeUInt32BE(n[2],8),i.writeUInt32BE(n[1],12),i},a.prototype.scrub=function(){n(this._keySchedule),n(this._invKeySchedule),n(this._key)},a.prototype._doCryptBlock=function(t,e,n,i){var o,a,f,s,u,h,c,d,l;a=t[0]^e[0],f=t[1]^e[1],s=t[2]^e[2],u=t[3]^e[3],o=4;for(var p=1;p>>24]^n[1][f>>>16&255]^n[2][s>>>8&255]^n[3][255&u]^e[o++],c=n[0][f>>>24]^n[1][s>>>16&255]^n[2][u>>>8&255]^n[3][255&a]^e[o++],d=n[0][s>>>24]^n[1][u>>>16&255]^n[2][a>>>8&255]^n[3][255&f]^e[o++],l=n[0][u>>>24]^n[1][a>>>16&255]^n[2][f>>>8&255]^n[3][255&s]^e[o++],a=h,f=c,s=d,u=l;return h=(i[a>>>24]<<24|i[f>>>16&255]<<16|i[s>>>8&255]<<8|i[255&u])^e[o++],c=(i[f>>>24]<<24|i[s>>>16&255]<<16|i[u>>>8&255]<<8|i[255&a])^e[o++],d=(i[s>>>24]<<24|i[u>>>16&255]<<16|i[a>>>8&255]<<8|i[255&f])^e[o++],l=(i[u>>>24]<<24|i[a>>>16&255]<<16|i[f>>>8&255]<<8|i[255&s])^e[o++],[r(h),r(c),r(d),r(l)]},e.AES=a}).call(e,r(1).Buffer)},function(t,e,r){(function(t){function n(t){for(var e,r=t.length;r--;){if(e=t.readUInt8(r),255!==e){e++,t.writeUInt8(e,r);break}t.writeUInt8(0,r)}}function i(t){var e=t._cipher.encryptBlock(t._prev);return n(t._prev),e}var o=r(69);e.encrypt=function(e,r){for(;e._cache.length>5]|=128<>>9<<4)+14]=e;for(var r=1732584193,n=-271733879,i=-1732584194,h=271733878,c=0;c>16)+(e>>16)+(r>>16);return n<<16|65535&r}function h(t,e){return t<>>32-e}var c=r(565);t.exports=function(t){return c.hash(t,n,16)}},function(t,e,r){var n=e;n.bignum=r(70),n.define=r(580).define,n.base=r(71),n.constants=r(235),n.decoders=r(584),n.encoders=r(586)},function(t,e,r){(function(t){function r(t){var e,r;return e=t>f||t<0?(r=Math.abs(t)%f,t<0?f-r:r):t}function n(t){for(var e=0;e>>8^255&r^99,this.SBOX[i]=r,this.INV_SBOX[r]=i,o=t[i],a=t[o],f=t[a],n=257*t[r]^16843008*r,this.SUB_MIX[0][i]=n<<24|n>>>8,this.SUB_MIX[1][i]=n<<16|n>>>16,this.SUB_MIX[2][i]=n<<8|n>>>24,this.SUB_MIX[3][i]=n,n=16843009*f^65537*a^257*o^16843008*i,this.INV_SUB_MIX[0][r]=n<<24|n>>>8,this.INV_SUB_MIX[1][r]=n<<16|n>>>16,this.INV_SUB_MIX[2][r]=n<<8|n>>>24,this.INV_SUB_MIX[3][r]=n,0===i?i=s=1:(i=o^t[t[t[f^o]]],s^=t[t[s]]);return!0};var s=new i;a.blockSize=16,a.prototype.blockSize=a.blockSize,a.keySize=32,a.prototype.keySize=a.keySize,a.prototype._doReset=function(){var t,e,r,n,i,o;for(r=this._key,e=r.length,this._nRounds=e+6,i=4*(this._nRounds+1),this._keySchedule=[],n=0;n>>24,o=s.SBOX[o>>>24]<<24|s.SBOX[o>>>16&255]<<16|s.SBOX[o>>>8&255]<<8|s.SBOX[255&o],o^=s.RCON[n/e|0]<<24):e>6&&n%e===4?o=s.SBOX[o>>>24]<<24|s.SBOX[o>>>16&255]<<16|s.SBOX[o>>>8&255]<<8|s.SBOX[255&o]:void 0,this._keySchedule[n-e]^o);for(this._invKeySchedule=[],t=0;t>>24]]^s.INV_SUB_MIX[1][s.SBOX[o>>>16&255]]^s.INV_SUB_MIX[2][s.SBOX[o>>>8&255]]^s.INV_SUB_MIX[3][s.SBOX[255&o]];return!0},a.prototype.encryptBlock=function(e){e=o(new t(e));var r=this._doCryptBlock(e,this._keySchedule,s.SUB_MIX,s.SBOX),n=new t(16);return n.writeUInt32BE(r[0],0),n.writeUInt32BE(r[1],4),n.writeUInt32BE(r[2],8),n.writeUInt32BE(r[3],12),n},a.prototype.decryptBlock=function(e){e=o(new t(e));var r=[e[3],e[1]];e[1]=r[0],e[3]=r[1];var n=this._doCryptBlock(e,this._invKeySchedule,s.INV_SUB_MIX,s.INV_SBOX),i=new t(16);return i.writeUInt32BE(n[0],0),i.writeUInt32BE(n[3],4),i.writeUInt32BE(n[2],8),i.writeUInt32BE(n[1],12),i},a.prototype.scrub=function(){n(this._keySchedule),n(this._invKeySchedule),n(this._key)},a.prototype._doCryptBlock=function(t,e,n,i){var o,a,f,s,u,h,c,d,l;a=t[0]^e[0],f=t[1]^e[1],s=t[2]^e[2],u=t[3]^e[3],o=4;for(var p=1;p>>24]^n[1][f>>>16&255]^n[2][s>>>8&255]^n[3][255&u]^e[o++],c=n[0][f>>>24]^n[1][s>>>16&255]^n[2][u>>>8&255]^n[3][255&a]^e[o++],d=n[0][s>>>24]^n[1][u>>>16&255]^n[2][a>>>8&255]^n[3][255&f]^e[o++],l=n[0][u>>>24]^n[1][a>>>16&255]^n[2][f>>>8&255]^n[3][255&s]^e[o++],a=h,f=c,s=d,u=l;return h=(i[a>>>24]<<24|i[f>>>16&255]<<16|i[s>>>8&255]<<8|i[255&u])^e[o++],c=(i[f>>>24]<<24|i[s>>>16&255]<<16|i[u>>>8&255]<<8|i[255&a])^e[o++],d=(i[s>>>24]<<24|i[u>>>16&255]<<16|i[a>>>8&255]<<8|i[255&f])^e[o++],l=(i[u>>>24]<<24|i[a>>>16&255]<<16|i[f>>>8&255]<<8|i[255&s])^e[o++],[r(h),r(c),r(d),r(l)]},e.AES=a}).call(e,r(1).Buffer)},function(t,e,r){(function(t){function n(t){for(var e,r=t.length;r--;){if(e=t.readUInt8(r),255!==e){e++,t.writeUInt8(e,r);break}t.writeUInt8(0,r)}}function i(t){var e=t._cipher.encryptBlock(t._prev);return n(t._prev),e}var o=r(72);e.encrypt=function(e,r){for(;e._cache.length0&&this._events[t].length>i&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace())),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(t,e){function r(){this.removeListener(t,r),i||(i=!0,e.apply(this,arguments))}if(!n(e))throw TypeError("listener must be a function");var i=!1;return r.listener=e,this.on(t,r),this},r.prototype.removeListener=function(t,e){var r,i,a,f;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(r=this._events[t],a=r.length,i=-1,r===e||n(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(o(r)){for(f=a;f-- >0;)if(r[f]===e||r[f].listener&&r[f].listener===e){i=f;break}if(i<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},r.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[t],n(r))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},r.prototype.listeners=function(t){var e;return e=this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},r.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(n(e))return 1;if(e)return e.length}return 0},r.listenerCount=function(t,e){return t.listenerCount(e)}},function(t,e){t.exports={newInvalidAsn1Error:function(t){var e=new Error;return e.name="InvalidAsn1Error",e.message=t||"",e}}},function(t,e){t.exports={EOC:0,Boolean:1,Integer:2,BitString:3,OctetString:4,Null:5,OID:6,ObjectDescriptor:7,External:8,Real:9,Enumeration:10,PDV:11,Utf8String:12,RelativeOID:13,Sequence:16,Set:17,NumericString:18,PrintableString:19,T61String:20,VideotexString:21,IA5String:22,UTCTime:23,GeneralizedTime:24,GraphicString:25,VisibleString:26,GeneralString:28,UniversalString:29,CharacterString:30,BMPString:31,Constructor:32,Context:128}},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=r(62),f=function(t){function e(){return n(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),e}(a);t.exports=f},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var r=0;rNumber.MAX_SAFE_INTEGER)throw new o("Type "+e+" is not supported");var r=!0,n=!1,i=void 0;try{for(var a,f=t.registeredTypes[Symbol.iterator]();!(r=(a=f.next()).done);r=!0){var s=a.value;if(e===s.typeId)return s.Class}}catch(t){n=!0,i=t}finally{try{!r&&f.return&&f.return()}finally{if(n)throw i}}throw new o("Type "+e+" is not supported")}},{key:"registerType",value:function(e){t.registeredTypes.push({typeId:e.TYPE_ID,Class:e})}}]),t}();a.registeredTypes=[],t.exports=a},function(t,e,r){"use strict";(function(e){function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var n=function(){function t(t,e){for(var r=0;r1?arguments[1]:void 0,r),s=a>2?arguments[2]:void 0,u=void 0===s?r:i(s,r);u>f;)e[f++]=t;return e}},function(t,e,r){"use strict";var n=r(9),i=r(37);t.exports=function(t,e,r){e in t?n.f(t,e,i(0,r)):t[e]=r}},function(t,e,r){var n=r(6),i=r(4).document,o=n(i)&&n(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,r){var n=r(7)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(r){try{return e[n]=!1,!"/./"[t](e)}catch(t){}}return!0}},function(t,e,r){t.exports=r(4).document&&document.documentElement},function(t,e,r){var n=r(6),i=r(132).set;t.exports=function(t,e,r){var o,a=e.constructor;return a!==r&&"function"==typeof a&&(o=a.prototype)!==r.prototype&&n(o)&&i&&i(t,o),t}},function(t,e,r){var n=r(56),i=r(7)("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(n.Array===t||o[i]===t)}},function(t,e,r){var n=r(23);t.exports=Array.isArray||function(t){return"Array"==n(t)}},function(t,e,r){"use strict";var n=r(42),i=r(37),o=r(57),a={};r(14)(a,r(7)("iterator"),function(){return this}),t.exports=function(t,e,r){t.prototype=n(a,{next:i(1,r)}),o(t,e+" Iterator")}},function(t,e,r){"use strict";var n=r(41),i=r(0),o=r(15),a=r(14),f=r(12),s=r(56),u=r(127),h=r(57),c=r(21),d=r(7)("iterator"),l=!([].keys&&"next"in[].keys()),p="@@iterator",b="keys",v="values",y=function(){return this};t.exports=function(t,e,r,m,g,w,_){u(r,e,m);var M,S,E,A=function(t){if(!l&&t in B)return B[t];switch(t){case b:return function(){return new r(this,t)};case v:return function(){return new r(this,t)}}return function(){return new r(this,t)}},k=e+" Iterator",x=g==v,I=!1,B=t.prototype,O=B[d]||B[p]||g&&B[g],R=O||A(g),P=g?x?A("entries"):R:void 0,T="Array"==e?B.entries||O:O;if(T&&(E=c(T.call(new t)),E!==Object.prototype&&(h(E,k,!0),n||f(E,d)||a(E,d,y))),x&&O&&O.name!==v&&(I=!0,R=function(){return O.call(this)}),n&&!_||!l&&!I&&B[d]||a(B,d,R),s[e]=R,s[k]=y,g)if(M={values:x?R:A(v),keys:w?R:A(b),entries:P},_)for(S in M)S in B||o(B,S,M[S]);else i(i.P+i.F*(l||I),e,M);return M}},function(t,e){var r=Math.expm1;t.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||r(-2e-17)!=-2e-17?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:r},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,r){var n=r(4),i=r(139).set,o=n.MutationObserver||n.WebKitMutationObserver,a=n.process,f=n.Promise,s="process"==r(23)(a);t.exports=function(){var t,e,r,u=function(){var n,i;for(s&&(n=a.domain)&&n.exit();t;){i=t.fn,t=t.next;try{i()}catch(n){throw t?r():e=void 0,n}}e=void 0,n&&n.enter()};if(s)r=function(){a.nextTick(u)};else if(o){var h=!0,c=document.createTextNode("");new o(u).observe(c,{characterData:!0}),r=function(){c.data=h=!h}}else if(f&&f.resolve){var d=f.resolve();r=function(){d.then(u)}}else r=function(){i.call(n,u)};return function(n){var i={fn:n,next:void 0};e&&(e.next=i),t||(t=i,r()),e=i}}},function(t,e,r){var n=r(6),i=r(3),o=function(t,e){if(i(t),!n(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,n){try{n=r(33)(Function.call,r(20).f(Object.prototype,"__proto__").set,2),n(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,r){return o(t,r),e?t.__proto__=r:n(t,r),t}}({},!1):void 0),check:o}},function(t,e,r){var n=r(87)("keys"),i=r(48);t.exports=function(t){return n[t]||(n[t]=i(t))}},function(t,e,r){var n=r(3),i=r(13),o=r(7)("species");t.exports=function(t,e){var r,a=n(t).constructor;return void 0===a||void 0==(r=n(a)[o])?e:i(r)}},function(t,e,r){var n=r(38),i=r(24);t.exports=function(t){return function(e,r){var o,a,f=String(i(e)),s=n(r),u=f.length;return s<0||s>=u?t?"":void 0:(o=f.charCodeAt(s),o<55296||o>56319||s+1===u||(a=f.charCodeAt(s+1))<56320||a>57343?t?f.charAt(s):o:t?f.slice(s,s+2):(o-55296<<10)+(a-56320)+65536)}}},function(t,e,r){var n=r(83),i=r(24);t.exports=function(t,e,r){if(n(e))throw TypeError("String#"+r+" doesn't accept regex!");return String(i(t))}},function(t,e,r){"use strict";var n=r(38),i=r(24);t.exports=function(t){var e=String(i(this)),r="",o=n(t);if(o<0||o==1/0)throw RangeError("Count can't be negative");for(;o>0;(o>>>=1)&&(e+=e))1&o&&(r+=e);return r}},function(t,e){t.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(t,e,r){var n,i,o,a=r(33),f=r(82),s=r(123),u=r(120),h=r(4),c=h.process,d=h.setImmediate,l=h.clearImmediate,p=h.MessageChannel,b=0,v={},y="onreadystatechange",m=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},g=function(t){m.call(t.data)};d&&l||(d=function(t){for(var e=[],r=1;arguments.length>r;)e.push(arguments[r++]);return v[++b]=function(){f("function"==typeof t?t:Function(t),e)},n(b),b},l=function(t){delete v[t]},"process"==r(23)(c)?n=function(t){c.nextTick(a(m,t,1))}:p?(i=new p,o=i.port2,i.port1.onmessage=g,n=a(o.postMessage,o,1)):h.addEventListener&&"function"==typeof postMessage&&!h.importScripts?(n=function(t){h.postMessage(t+"","*")},h.addEventListener("message",g,!1)):n=y in u("script")?function(t){s.appendChild(u("script"))[y]=function(){s.removeChild(this),m.call(t)}}:function(t){setTimeout(a(m,t,1),0)}),t.exports={set:d,clear:l}},function(t,e,r){"use strict";var n=r(4),i=r(8),o=r(41),a=r(88),f=r(14),s=r(45),u=r(5),h=r(40),c=r(38),d=r(10),l=r(43).f,p=r(9).f,b=r(118),v=r(57),y="ArrayBuffer",m="DataView",g="prototype",w="Wrong length!",_="Wrong index!",M=n[y],S=n[m],E=n.Math,A=n.RangeError,k=n.Infinity,x=M,I=E.abs,B=E.pow,O=E.floor,R=E.log,P=E.LN2,T="buffer",j="byteLength",C="byteOffset",N=i?"_b":T,L=i?"_l":j,U=i?"_o":C,z=function(t,e,r){ var n,i,o,a=Array(r),f=8*r-e-1,s=(1<>1,h=23===e?B(2,-24)-B(2,-77):0,c=0,d=t<0||0===t&&1/t<0?1:0;for(t=I(t),t!=t||t===k?(i=t!=t?1:0,n=s):(n=O(R(t)/P),t*(o=B(2,-n))<1&&(n--,o*=2),t+=n+u>=1?h/o:h*B(2,1-u),t*o>=2&&(n++,o/=2),n+u>=s?(i=0,n=s):n+u>=1?(i=(t*o-1)*B(2,e),n+=u):(i=t*B(2,u-1)*B(2,e),n=0));e>=8;a[c++]=255&i,i/=256,e-=8);for(n=n<0;a[c++]=255&n,n/=256,f-=8);return a[--c]|=128*d,a},D=function(t,e,r){var n,i=8*r-e-1,o=(1<>1,f=i-7,s=r-1,u=t[s--],h=127&u;for(u>>=7;f>0;h=256*h+t[s],s--,f-=8);for(n=h&(1<<-f)-1,h>>=-f,f+=e;f>0;n=256*n+t[s],s--,f-=8);if(0===h)h=1-a;else{if(h===o)return n?NaN:u?-k:k;n+=B(2,e),h-=a}return(u?-1:1)*n*B(2,h-e)},q=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},F=function(t){return[255&t]},K=function(t){return[255&t,t>>8&255]},G=function(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]},V=function(t){return z(t,52,8)},H=function(t){return z(t,23,4)},X=function(t,e,r){p(t[g],e,{get:function(){return this[r]}})},Y=function(t,e,r,n){var i=+r,o=c(i);if(i!=o||o<0||o+e>t[L])throw A(_);var a=t[N]._b,f=o+t[U],s=a.slice(f,f+e);return n?s:s.reverse()},W=function(t,e,r,n,i,o){var a=+r,f=c(a);if(a!=f||f<0||f+e>t[L])throw A(_);for(var s=t[N]._b,u=f+t[U],h=n(+i),d=0;dtt;)(J=Q[tt++])in M||f(M,J,x[J]);o||($.constructor=M)}var et=new S(new M(2)),rt=S[g].setInt8;et.setInt8(0,2147483648),et.setInt8(1,2147483649),!et.getInt8(0)&&et.getInt8(1)||s(S[g],{setInt8:function(t,e){rt.call(this,t,e<<24>>24)},setUint8:function(t,e){rt.call(this,t,e<<24>>24)}},!0)}else M=function(t){var e=Z(this,t);this._b=b.call(Array(e),0),this[L]=e},S=function(t,e,r){h(this,S,m),h(t,M,m);var n=t[L],i=c(e);if(i<0||i>n)throw A("Wrong offset!");if(r=void 0===r?n-i:d(r),i+r>n)throw A(w);this[N]=t,this[U]=i,this[L]=r},i&&(X(M,j,"_l"),X(S,T,"_b"),X(S,j,"_l"),X(S,C,"_o")),s(S[g],{getInt8:function(t){return Y(this,1,t)[0]<<24>>24},getUint8:function(t){return Y(this,1,t)[0]},getInt16:function(t){var e=Y(this,2,t,arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=Y(this,2,t,arguments[1]);return e[1]<<8|e[0]},getInt32:function(t){return q(Y(this,4,t,arguments[1]))},getUint32:function(t){return q(Y(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return D(Y(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return D(Y(this,8,t,arguments[1]),52,8)},setInt8:function(t,e){W(this,1,t,F,e)},setUint8:function(t,e){W(this,1,t,F,e)},setInt16:function(t,e){W(this,2,t,K,e,arguments[2])},setUint16:function(t,e){W(this,2,t,K,e,arguments[2])},setInt32:function(t,e){W(this,4,t,G,e,arguments[2])},setUint32:function(t,e){W(this,4,t,G,e,arguments[2])},setFloat32:function(t,e){W(this,4,t,H,e,arguments[2])},setFloat64:function(t,e){W(this,8,t,V,e,arguments[2])}});v(M,y),v(S,m),f(S[g],a.VIEW,!0),e[y]=M,e[m]=S},function(t,e,r){var n=r(4),i=r(32),o=r(41),a=r(189),f=r(9).f;t.exports=function(t){var e=i.Symbol||(i.Symbol=o?{}:n.Symbol||{});"_"==t.charAt(0)||t in e||f(e,t,{value:a.f(t)})}},function(t,e,r){var n=r(64),i=r(7)("iterator"),o=r(56);t.exports=r(32).getIteratorMethod=function(t){if(void 0!=t)return t[i]||t["@@iterator"]||o[n(t)]}},function(t,e,r){"use strict";var n=r(54),i=r(177),o=r(56),a=r(17);t.exports=r(128)(Array,"Array",function(t,e){this._t=a(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,r=this._i++;return!t||r>=t.length?(this._t=void 0,i(1)):"keys"==e?i(0,r):"values"==e?i(0,t[r]):i(0,[r,t[r]])},"values"),o.Arguments=o.Array,n("keys"),n("values"),n("entries")},function(t,e,r){t.exports=!r(199)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e,r){"use strict";e.utils=r(505),e.Cipher=r(502),e.DES=r(503),e.CBC=r(501),e.EDE=r(504)},function(t,e,r){(function(e){function n(t,r,n,o){e.isBuffer(t)||(t=new e(t,"binary")),r&&!e.isBuffer(r)&&(r=new e(r,"binary")),n/=8,o=o||0;for(var a,f,s=0,u=0,h=new e(n),c=new e(o),d=0,l=[];;){if(d++>0&&l.push(a),l.push(t),r&&l.push(r),a=i(e.concat(l)),l=[],f=0,n>0)for(;;){if(0===n)break;if(f===a.length)break;h[s++]=a[f],n--,f++}if(o>0&&f!==a.length)for(;;){if(0===o)break;if(f===a.length)break;c[u++]=a[f],o--,f++}if(0===n&&0===o)break}for(f=0;f0&&l.push(a),l.push(t),r&&l.push(r),a=i(e.concat(l)),l=[],f=0,n>0)for(;;){if(0===n)break;if(f===a.length)break;h[s++]=a[f],n--,f++}if(o>0&&f!==a.length)for(;;){if(0===o)break;if(f===a.length)break;c[u++]=a[f],o--,f++}if(0===n&&0===o)break}for(f=0;fn?r=i(t).update(r).digest():r.length=49&&a<=54?a-49+10:a>=17&&a<=22?a-17+10:15&a}return n}function f(t,e,r,n){for(var i=0,o=Math.min(t.length,r),a=e;a=49?f-49+10:f>=17?f-17+10:f}return i}function s(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}function u(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],o=0|e.words[0],a=i*o,f=67108863&a,s=a/67108864|0;r.words[0]=f;for(var u=1;u>>26,c=67108863&s,d=Math.min(u,e.length-1),l=Math.max(0,u-t.length+1);l<=d;l++){var p=u-l|0;i=0|t.words[p],o=0|e.words[l],a=i*o+c,h+=a/67108864|0,c=67108863&a}r.words[u]=0|c,s=0|h}return 0!==s?r.words[u]=0|s:r.length--,r.strip()}function h(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,o=0;o>>26)|0,i+=a>>>26,a&=67108863}r.words[o]=f,n=a,a=i}return 0!==n?r.words[o]=n:r.length--,r.strip()}function c(t,e,r){var n=new d;return n.mulp(t,e,r)}function d(t,e){this.x=t,this.y=e}function l(t,e){this.name=t,this.p=new o(e,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function p(){l.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function b(){l.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function v(){l.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function y(){l.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function m(t){if("string"==typeof t){var e=o._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function g(t){m.call(this,t),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}"object"==typeof t?t.exports=o:e.BN=o,o.BN=o,o.wordSize=26;var w;try{w=r(1).Buffer}catch(t){}o.isBN=function(t){return t instanceof o||null!==t&&"object"==typeof t&&t.constructor.wordSize===o.wordSize&&Array.isArray(t.words)},o.max=function(t,e){return t.cmp(e)>0?t:e},o.min=function(t,e){return t.cmp(e)<0?t:e},o.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36),t=t.toString().replace(/\s+/g,"");var i=0;"-"===t[0]&&i++,16===e?this._parseHex(t,i):this._parseBase(t,e,i),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(n(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initArray=function(t,e,r){if(n("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)a=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[o]|=a<>>26-f&67108863,f+=24,f>=26&&(f-=26,o++);else if("le"===r)for(i=0,o=0;i>>26-f&67108863,f+=24,f>=26&&(f-=26,o++);return this.strip()},o.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var r=0;r=e;r-=6)i=a(t,r,r+6),this.words[n]|=i<>>26-o&4194303,o+=24,o>=26&&(o-=26,n++);r+6!==e&&(i=a(t,e,r+6),this.words[n]|=i<>>26-o&4194303),this.strip()},o.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var o=t.length-r,a=o%n,s=Math.min(o,o-a)+r,u=0,h=r;h1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},o.prototype.inspect=function(){return(this.red?""};var _=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],M=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],S=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];o.prototype.toString=function(t,e){t=t||10,e=0|e||1;var r;if(16===t||"hex"===t){r="";for(var i=0,o=0,a=0;a>>24-i&16777215,r=0!==o||a!==this.length-1?_[6-s.length]+s+r:s+r,i+=2,i>=26&&(i-=26,a--)}for(0!==o&&(r=o.toString(16)+r);r.length%e!==0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var u=M[t],h=S[t];r="";var c=this.clone();for(c.negative=0;!c.isZero();){var d=c.modn(h).toString(t);c=c.idivn(h),r=c.isZero()?d+r:_[u-d.length]+d+r}for(this.isZero()&&(r="0"+r);r.length%e!==0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},o.prototype.toJSON=function(){return this.toString(16)},o.prototype.toBuffer=function(t,e){return n("undefined"!=typeof w),this.toArrayLike(w,t,e)},o.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},o.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),o=r||Math.max(1,i);n(i<=o,"byte array longer than desired length"),n(o>0,"Requested array length <= 0"),this.strip();var a,f,s="le"===e,u=new t(o),h=this.clone();if(s){for(f=0;!h.isZero();f++)a=h.andln(255),h.iushrn(8),u[f]=a;for(;f=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},o.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0===(8191&e)&&(r+=13,e>>>=13),0===(127&e)&&(r+=7,e>>>=7),0===(15&e)&&(r+=4,e>>>=4),0===(3&e)&&(r+=2,e>>>=2),0===(1&e)&&r++,r},o.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},o.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},o.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},o.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},o.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},o.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},o.prototype.inotn=function(t){n("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},o.prototype.notn=function(t){return this.clone().inotn(t)},o.prototype.setn=function(t,e){n("number"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),e?this.words[r]=this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},o.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r=this.cmp(t);if(0===r)return this.negative=0,this.length=1,this.words[0]=0,this;var n,i;r>0?(n=this,i=t):(n=t,i=this);for(var o=0,a=0;a>26,this.words[a]=67108863&e;for(;0!==o&&a>26,this.words[a]=67108863&e;if(0===o&&a>>13,l=0|a[1],p=8191&l,b=l>>>13,v=0|a[2],y=8191&v,m=v>>>13,g=0|a[3],w=8191&g,_=g>>>13,M=0|a[4],S=8191&M,E=M>>>13,A=0|a[5],k=8191&A,x=A>>>13,I=0|a[6],B=8191&I,O=I>>>13,R=0|a[7],P=8191&R,T=R>>>13,j=0|a[8],C=8191&j,N=j>>>13,L=0|a[9],U=8191&L,z=L>>>13,D=0|f[0],q=8191&D,F=D>>>13,K=0|f[1],G=8191&K,V=K>>>13,H=0|f[2],X=8191&H,Y=H>>>13,W=0|f[3],Z=8191&W,J=W>>>13,$=0|f[4],Q=8191&$,tt=$>>>13,et=0|f[5],rt=8191&et,nt=et>>>13,it=0|f[6],ot=8191&it,at=it>>>13,ft=0|f[7],st=8191&ft,ut=ft>>>13,ht=0|f[8],ct=8191&ht,dt=ht>>>13,lt=0|f[9],pt=8191<,bt=lt>>>13;r.negative=t.negative^e.negative,r.length=19,n=Math.imul(c,q),i=Math.imul(c,F),i=i+Math.imul(d,q)|0,o=Math.imul(d,F);var vt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(p,q),i=Math.imul(p,F),i=i+Math.imul(b,q)|0,o=Math.imul(b,F),n=n+Math.imul(c,G)|0,i=i+Math.imul(c,V)|0,i=i+Math.imul(d,G)|0,o=o+Math.imul(d,V)|0;var yt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,q),i=Math.imul(y,F),i=i+Math.imul(m,q)|0,o=Math.imul(m,F),n=n+Math.imul(p,G)|0,i=i+Math.imul(p,V)|0,i=i+Math.imul(b,G)|0,o=o+Math.imul(b,V)|0,n=n+Math.imul(c,X)|0,i=i+Math.imul(c,Y)|0,i=i+Math.imul(d,X)|0,o=o+Math.imul(d,Y)|0;var mt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(w,q),i=Math.imul(w,F),i=i+Math.imul(_,q)|0,o=Math.imul(_,F),n=n+Math.imul(y,G)|0,i=i+Math.imul(y,V)|0,i=i+Math.imul(m,G)|0,o=o+Math.imul(m,V)|0,n=n+Math.imul(p,X)|0,i=i+Math.imul(p,Y)|0,i=i+Math.imul(b,X)|0,o=o+Math.imul(b,Y)|0,n=n+Math.imul(c,Z)|0,i=i+Math.imul(c,J)|0,i=i+Math.imul(d,Z)|0,o=o+Math.imul(d,J)|0;var gt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(S,q),i=Math.imul(S,F),i=i+Math.imul(E,q)|0,o=Math.imul(E,F),n=n+Math.imul(w,G)|0,i=i+Math.imul(w,V)|0,i=i+Math.imul(_,G)|0,o=o+Math.imul(_,V)|0,n=n+Math.imul(y,X)|0,i=i+Math.imul(y,Y)|0,i=i+Math.imul(m,X)|0,o=o+Math.imul(m,Y)|0,n=n+Math.imul(p,Z)|0,i=i+Math.imul(p,J)|0,i=i+Math.imul(b,Z)|0,o=o+Math.imul(b,J)|0,n=n+Math.imul(c,Q)|0,i=i+Math.imul(c,tt)|0,i=i+Math.imul(d,Q)|0,o=o+Math.imul(d,tt)|0;var wt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(k,q),i=Math.imul(k,F),i=i+Math.imul(x,q)|0,o=Math.imul(x,F),n=n+Math.imul(S,G)|0,i=i+Math.imul(S,V)|0,i=i+Math.imul(E,G)|0,o=o+Math.imul(E,V)|0,n=n+Math.imul(w,X)|0,i=i+Math.imul(w,Y)|0,i=i+Math.imul(_,X)|0,o=o+Math.imul(_,Y)|0,n=n+Math.imul(y,Z)|0,i=i+Math.imul(y,J)|0,i=i+Math.imul(m,Z)|0,o=o+Math.imul(m,J)|0,n=n+Math.imul(p,Q)|0,i=i+Math.imul(p,tt)|0,i=i+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,n=n+Math.imul(c,rt)|0,i=i+Math.imul(c,nt)|0,i=i+Math.imul(d,rt)|0,o=o+Math.imul(d,nt)|0;var _t=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(B,q),i=Math.imul(B,F),i=i+Math.imul(O,q)|0,o=Math.imul(O,F),n=n+Math.imul(k,G)|0,i=i+Math.imul(k,V)|0,i=i+Math.imul(x,G)|0,o=o+Math.imul(x,V)|0,n=n+Math.imul(S,X)|0,i=i+Math.imul(S,Y)|0,i=i+Math.imul(E,X)|0,o=o+Math.imul(E,Y)|0,n=n+Math.imul(w,Z)|0,i=i+Math.imul(w,J)|0,i=i+Math.imul(_,Z)|0,o=o+Math.imul(_,J)|0,n=n+Math.imul(y,Q)|0,i=i+Math.imul(y,tt)|0,i=i+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0,n=n+Math.imul(p,rt)|0,i=i+Math.imul(p,nt)|0,i=i+Math.imul(b,rt)|0,o=o+Math.imul(b,nt)|0,n=n+Math.imul(c,ot)|0,i=i+Math.imul(c,at)|0,i=i+Math.imul(d,ot)|0,o=o+Math.imul(d,at)|0;var Mt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(P,q),i=Math.imul(P,F),i=i+Math.imul(T,q)|0,o=Math.imul(T,F),n=n+Math.imul(B,G)|0,i=i+Math.imul(B,V)|0,i=i+Math.imul(O,G)|0,o=o+Math.imul(O,V)|0,n=n+Math.imul(k,X)|0,i=i+Math.imul(k,Y)|0,i=i+Math.imul(x,X)|0,o=o+Math.imul(x,Y)|0,n=n+Math.imul(S,Z)|0,i=i+Math.imul(S,J)|0,i=i+Math.imul(E,Z)|0,o=o+Math.imul(E,J)|0,n=n+Math.imul(w,Q)|0,i=i+Math.imul(w,tt)|0,i=i+Math.imul(_,Q)|0,o=o+Math.imul(_,tt)|0,n=n+Math.imul(y,rt)|0,i=i+Math.imul(y,nt)|0,i=i+Math.imul(m,rt)|0,o=o+Math.imul(m,nt)|0,n=n+Math.imul(p,ot)|0,i=i+Math.imul(p,at)|0,i=i+Math.imul(b,ot)|0,o=o+Math.imul(b,at)|0,n=n+Math.imul(c,st)|0,i=i+Math.imul(c,ut)|0,i=i+Math.imul(d,st)|0,o=o+Math.imul(d,ut)|0;var St=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(C,q),i=Math.imul(C,F),i=i+Math.imul(N,q)|0,o=Math.imul(N,F),n=n+Math.imul(P,G)|0,i=i+Math.imul(P,V)|0,i=i+Math.imul(T,G)|0,o=o+Math.imul(T,V)|0,n=n+Math.imul(B,X)|0,i=i+Math.imul(B,Y)|0,i=i+Math.imul(O,X)|0,o=o+Math.imul(O,Y)|0,n=n+Math.imul(k,Z)|0,i=i+Math.imul(k,J)|0,i=i+Math.imul(x,Z)|0,o=o+Math.imul(x,J)|0,n=n+Math.imul(S,Q)|0,i=i+Math.imul(S,tt)|0,i=i+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,n=n+Math.imul(w,rt)|0,i=i+Math.imul(w,nt)|0,i=i+Math.imul(_,rt)|0,o=o+Math.imul(_,nt)|0,n=n+Math.imul(y,ot)|0,i=i+Math.imul(y,at)|0,i=i+Math.imul(m,ot)|0,o=o+Math.imul(m,at)|0,n=n+Math.imul(p,st)|0,i=i+Math.imul(p,ut)|0,i=i+Math.imul(b,st)|0,o=o+Math.imul(b,ut)|0,n=n+Math.imul(c,ct)|0,i=i+Math.imul(c,dt)|0,i=i+Math.imul(d,ct)|0,o=o+Math.imul(d,dt)|0;var Et=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(U,q),i=Math.imul(U,F),i=i+Math.imul(z,q)|0,o=Math.imul(z,F),n=n+Math.imul(C,G)|0,i=i+Math.imul(C,V)|0,i=i+Math.imul(N,G)|0,o=o+Math.imul(N,V)|0,n=n+Math.imul(P,X)|0,i=i+Math.imul(P,Y)|0,i=i+Math.imul(T,X)|0,o=o+Math.imul(T,Y)|0,n=n+Math.imul(B,Z)|0,i=i+Math.imul(B,J)|0,i=i+Math.imul(O,Z)|0,o=o+Math.imul(O,J)|0,n=n+Math.imul(k,Q)|0,i=i+Math.imul(k,tt)|0,i=i+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,n=n+Math.imul(S,rt)|0,i=i+Math.imul(S,nt)|0,i=i+Math.imul(E,rt)|0,o=o+Math.imul(E,nt)|0,n=n+Math.imul(w,ot)|0,i=i+Math.imul(w,at)|0,i=i+Math.imul(_,ot)|0,o=o+Math.imul(_,at)|0,n=n+Math.imul(y,st)|0,i=i+Math.imul(y,ut)|0,i=i+Math.imul(m,st)|0,o=o+Math.imul(m,ut)|0,n=n+Math.imul(p,ct)|0,i=i+Math.imul(p,dt)|0,i=i+Math.imul(b,ct)|0,o=o+Math.imul(b,dt)|0,n=n+Math.imul(c,pt)|0,i=i+Math.imul(c,bt)|0,i=i+Math.imul(d,pt)|0,o=o+Math.imul(d,bt)|0;var At=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(U,G),i=Math.imul(U,V),i=i+Math.imul(z,G)|0,o=Math.imul(z,V),n=n+Math.imul(C,X)|0,i=i+Math.imul(C,Y)|0,i=i+Math.imul(N,X)|0,o=o+Math.imul(N,Y)|0,n=n+Math.imul(P,Z)|0,i=i+Math.imul(P,J)|0,i=i+Math.imul(T,Z)|0,o=o+Math.imul(T,J)|0,n=n+Math.imul(B,Q)|0,i=i+Math.imul(B,tt)|0,i=i+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,n=n+Math.imul(k,rt)|0,i=i+Math.imul(k,nt)|0,i=i+Math.imul(x,rt)|0,o=o+Math.imul(x,nt)|0,n=n+Math.imul(S,ot)|0,i=i+Math.imul(S,at)|0,i=i+Math.imul(E,ot)|0,o=o+Math.imul(E,at)|0,n=n+Math.imul(w,st)|0,i=i+Math.imul(w,ut)|0,i=i+Math.imul(_,st)|0,o=o+Math.imul(_,ut)|0,n=n+Math.imul(y,ct)|0,i=i+Math.imul(y,dt)|0,i=i+Math.imul(m,ct)|0,o=o+Math.imul(m,dt)|0,n=n+Math.imul(p,pt)|0,i=i+Math.imul(p,bt)|0,i=i+Math.imul(b,pt)|0,o=o+Math.imul(b,bt)|0;var kt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(U,X),i=Math.imul(U,Y),i=i+Math.imul(z,X)|0,o=Math.imul(z,Y),n=n+Math.imul(C,Z)|0,i=i+Math.imul(C,J)|0,i=i+Math.imul(N,Z)|0,o=o+Math.imul(N,J)|0,n=n+Math.imul(P,Q)|0,i=i+Math.imul(P,tt)|0,i=i+Math.imul(T,Q)|0,o=o+Math.imul(T,tt)|0,n=n+Math.imul(B,rt)|0,i=i+Math.imul(B,nt)|0,i=i+Math.imul(O,rt)|0,o=o+Math.imul(O,nt)|0,n=n+Math.imul(k,ot)|0,i=i+Math.imul(k,at)|0,i=i+Math.imul(x,ot)|0,o=o+Math.imul(x,at)|0,n=n+Math.imul(S,st)|0,i=i+Math.imul(S,ut)|0,i=i+Math.imul(E,st)|0,o=o+Math.imul(E,ut)|0,n=n+Math.imul(w,ct)|0,i=i+Math.imul(w,dt)|0,i=i+Math.imul(_,ct)|0,o=o+Math.imul(_,dt)|0,n=n+Math.imul(y,pt)|0,i=i+Math.imul(y,bt)|0,i=i+Math.imul(m,pt)|0,o=o+Math.imul(m,bt)|0;var xt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(U,Z),i=Math.imul(U,J),i=i+Math.imul(z,Z)|0,o=Math.imul(z,J),n=n+Math.imul(C,Q)|0,i=i+Math.imul(C,tt)|0,i=i+Math.imul(N,Q)|0,o=o+Math.imul(N,tt)|0,n=n+Math.imul(P,rt)|0,i=i+Math.imul(P,nt)|0,i=i+Math.imul(T,rt)|0,o=o+Math.imul(T,nt)|0,n=n+Math.imul(B,ot)|0,i=i+Math.imul(B,at)|0,i=i+Math.imul(O,ot)|0,o=o+Math.imul(O,at)|0,n=n+Math.imul(k,st)|0,i=i+Math.imul(k,ut)|0,i=i+Math.imul(x,st)|0,o=o+Math.imul(x,ut)|0,n=n+Math.imul(S,ct)|0,i=i+Math.imul(S,dt)|0,i=i+Math.imul(E,ct)|0,o=o+Math.imul(E,dt)|0,n=n+Math.imul(w,pt)|0,i=i+Math.imul(w,bt)|0,i=i+Math.imul(_,pt)|0,o=o+Math.imul(_,bt)|0;var It=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(It>>>26)|0,It&=67108863,n=Math.imul(U,Q),i=Math.imul(U,tt),i=i+Math.imul(z,Q)|0,o=Math.imul(z,tt),n=n+Math.imul(C,rt)|0,i=i+Math.imul(C,nt)|0,i=i+Math.imul(N,rt)|0,o=o+Math.imul(N,nt)|0,n=n+Math.imul(P,ot)|0,i=i+Math.imul(P,at)|0,i=i+Math.imul(T,ot)|0,o=o+Math.imul(T,at)|0,n=n+Math.imul(B,st)|0,i=i+Math.imul(B,ut)|0,i=i+Math.imul(O,st)|0,o=o+Math.imul(O,ut)|0,n=n+Math.imul(k,ct)|0,i=i+Math.imul(k,dt)|0,i=i+Math.imul(x,ct)|0,o=o+Math.imul(x,dt)|0,n=n+Math.imul(S,pt)|0,i=i+Math.imul(S,bt)|0,i=i+Math.imul(E,pt)|0,o=o+Math.imul(E,bt)|0;var Bt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,n=Math.imul(U,rt),i=Math.imul(U,nt),i=i+Math.imul(z,rt)|0,o=Math.imul(z,nt),n=n+Math.imul(C,ot)|0,i=i+Math.imul(C,at)|0,i=i+Math.imul(N,ot)|0,o=o+Math.imul(N,at)|0,n=n+Math.imul(P,st)|0,i=i+Math.imul(P,ut)|0,i=i+Math.imul(T,st)|0,o=o+Math.imul(T,ut)|0,n=n+Math.imul(B,ct)|0,i=i+Math.imul(B,dt)|0,i=i+Math.imul(O,ct)|0,o=o+Math.imul(O,dt)|0,n=n+Math.imul(k,pt)|0,i=i+Math.imul(k,bt)|0,i=i+Math.imul(x,pt)|0,o=o+Math.imul(x,bt)|0;var Ot=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,n=Math.imul(U,ot),i=Math.imul(U,at),i=i+Math.imul(z,ot)|0,o=Math.imul(z,at),n=n+Math.imul(C,st)|0,i=i+Math.imul(C,ut)|0,i=i+Math.imul(N,st)|0,o=o+Math.imul(N,ut)|0,n=n+Math.imul(P,ct)|0,i=i+Math.imul(P,dt)|0,i=i+Math.imul(T,ct)|0,o=o+Math.imul(T,dt)|0,n=n+Math.imul(B,pt)|0,i=i+Math.imul(B,bt)|0,i=i+Math.imul(O,pt)|0,o=o+Math.imul(O,bt)|0;var Rt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,n=Math.imul(U,st),i=Math.imul(U,ut),i=i+Math.imul(z,st)|0,o=Math.imul(z,ut),n=n+Math.imul(C,ct)|0,i=i+Math.imul(C,dt)|0,i=i+Math.imul(N,ct)|0,o=o+Math.imul(N,dt)|0,n=n+Math.imul(P,pt)|0,i=i+Math.imul(P,bt)|0,i=i+Math.imul(T,pt)|0,o=o+Math.imul(T,bt)|0;var Pt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,n=Math.imul(U,ct),i=Math.imul(U,dt),i=i+Math.imul(z,ct)|0,o=Math.imul(z,dt),n=n+Math.imul(C,pt)|0,i=i+Math.imul(C,bt)|0,i=i+Math.imul(N,pt)|0,o=o+Math.imul(N,bt)|0;var Tt=(u+n|0)+((8191&i)<<13)|0;u=(o+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(U,pt),i=Math.imul(U,bt),i=i+Math.imul(z,pt)|0,o=Math.imul(z,bt);var jt=(u+n|0)+((8191&i)<<13)|0;return u=(o+(i>>>13)|0)+(jt>>>26)|0,jt&=67108863,s[0]=vt,s[1]=yt,s[2]=mt,s[3]=gt,s[4]=wt,s[5]=_t,s[6]=Mt,s[7]=St,s[8]=Et,s[9]=At,s[10]=kt,s[11]=xt,s[12]=It,s[13]=Bt,s[14]=Ot,s[15]=Rt,s[16]=Pt,s[17]=Tt,s[18]=jt,0!==u&&(s[19]=u,r.length++),r};Math.imul||(E=u),o.prototype.mulTo=function(t,e){var r,n=this.length+t.length;return r=10===this.length&&10===t.length?E(this,t,e):n<63?u(this,t,e):n<1024?h(this,t,e):c(this,t,e)},d.prototype.makeRBT=function(t){for(var e=new Array(t),r=o.prototype._countBits(t)-1,n=0;n>=1;return n},d.prototype.permute=function(t,e,r,n,i,o){for(var a=0;a>>=1)i++;return 1<>>=13,r[2*a+1]=8191&o,o>>>=13;for(a=2*e;a>=26,e+=i/67108864|0,e+=o>>>26,this.words[r]=67108863&o}return 0!==e&&(this.words[r]=e,this.length++),this},o.prototype.muln=function(t){return this.clone().imuln(t)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(t){var e=s(t);if(0===e.length)return new o(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,o=67108863>>>26-r<<26-r;if(0!==r){var a=0;for(e=0;e>>26-r}a&&(this.words[e]=a,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0);var i;i=e?(e-e%26)/26:0;var o=t%26,a=Math.min((t-o)/26,this.length),f=67108863^67108863>>>o<a)for(this.length-=a,u=0;u=0&&(0!==h||u>=i);u--){var c=0|this.words[u];this.words[u]=h<<26-o|c>>>o,h=c&f}return s&&0!==h&&(s.words[s.length++]=h),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},o.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},o.prototype.shln=function(t){return this.clone().ishln(t)},o.prototype.ushln=function(t){return this.clone().iushln(t)},o.prototype.shrn=function(t){return this.clone().ishrn(t)},o.prototype.ushrn=function(t){return this.clone().iushrn(t)},o.prototype.testn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},o.prototype.isubn=function(t){if(n("number"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(s/67108864|0),this.words[i+r]=67108863&a}for(;i>26,this.words[i+r]=67108863&a;if(0===f)return this.strip();for(n(f===-1),f=0,i=0;i>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},o.prototype._wordDiv=function(t,e){var r=this.length-t.length,n=this.clone(),i=t,a=0|i.words[i.length-1],f=this._countBits(a);r=26-f,0!==r&&(i=i.ushln(r),n.iushln(r),a=0|i.words[i.length-1]);var s,u=n.length-i.length;if("mod"!==e){s=new o(null),s.length=u+1,s.words=new Array(s.length);for(var h=0;h=0;d--){var l=67108864*(0|n.words[i.length+d])+(0|n.words[i.length+d-1]);for(l=Math.min(l/a|0,67108863),n._ishlnsubmul(i,l,d);0!==n.negative;)l--,n.negative=0,n._ishlnsubmul(i,1,d),n.isZero()||(n.negative^=1);s&&(s.words[d]=l)}return s&&s.strip(),n.strip(),"div"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},o.prototype.divmod=function(t,e,r){if(n(!t.isZero()),this.isZero())return{div:new o(0),mod:new o(0)};var i,a,f;return 0!==this.negative&&0===t.negative?(f=this.neg().divmod(t,e),"mod"!==e&&(i=f.div.neg()),"div"!==e&&(a=f.mod.neg(),r&&0!==a.negative&&a.iadd(t)),{div:i,mod:a}):0===this.negative&&0!==t.negative?(f=this.divmod(t.neg(),e),"mod"!==e&&(i=f.div.neg()),{div:i,mod:f.mod}):0!==(this.negative&t.negative)?(f=this.neg().divmod(t.neg(),e),"div"!==e&&(a=f.mod.neg(),r&&0!==a.negative&&a.isub(t)),{div:f.div,mod:a}):t.length>this.length||this.cmp(t)<0?{div:new o(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new o(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new o(this.modn(t.words[0]))}:this._wordDiv(t,e)},o.prototype.div=function(t){return this.divmod(t,"div",!1).div},o.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},o.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},o.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),o=r.cmp(n);return o<0||1===i&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},o.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},o.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},o.prototype.divn=function(t){return this.clone().idivn(t)},o.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),f=new o(0),s=new o(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var h=r.clone(),c=e.clone();!e.isZero();){for(var d=0,l=1;0===(e.words[0]&l)&&d<26;++d,l<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(i.isOdd()||a.isOdd())&&(i.iadd(h),a.isub(c)),i.iushrn(1),a.iushrn(1);for(var p=0,b=1;0===(r.words[0]&b)&&p<26;++p,b<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(f.isOdd()||s.isOdd())&&(f.iadd(h),s.isub(c)),f.iushrn(1),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(f),a.isub(s)):(r.isub(e),f.isub(i),s.isub(a))}return{a:f,b:s,gcd:r.iushln(u)}},o.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),f=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var s=0,u=1;0===(e.words[0]&u)&&s<26;++s,u<<=1);if(s>0)for(e.iushrn(s);s-- >0;)i.isOdd()&&i.iadd(f),i.iushrn(1);for(var h=0,c=1;0===(r.words[0]&c)&&h<26;++h,c<<=1);if(h>0)for(r.iushrn(h);h-- >0;)a.isOdd()&&a.iadd(f),a.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(a)):(r.isub(e),a.isub(i))}var d;return d=0===e.cmpn(1)?i:a,d.cmpn(0)<0&&d.iadd(t),d},o.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var o=e;e=r,r=o}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},o.prototype.invm=function(t){return this.egcd(t).a.umod(t)},o.prototype.isEven=function(){return 0===(1&this.words[0])},o.prototype.isOdd=function(){return 1===(1&this.words[0])},o.prototype.andln=function(t){return this.words[0]&t},o.prototype.bincn=function(t){n("number"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,f&=67108863,this.words[a]=f}return 0!==o&&(this.words[a]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(t){var e=t<0;if(0!==this.negative&&!e)return-1;if(0===this.negative&&e)return 1;this.strip();var r;if(this.length>1)r=1;else{e&&(t=-t),n(t<=67108863,"Number is too big");var i=0|this.words[0];r=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},o.prototype.gtn=function(t){return 1===this.cmpn(t)},o.prototype.gt=function(t){return 1===this.cmp(t)},o.prototype.gten=function(t){return this.cmpn(t)>=0},o.prototype.gte=function(t){return this.cmp(t)>=0},o.prototype.ltn=function(t){return this.cmpn(t)===-1},o.prototype.lt=function(t){return this.cmp(t)===-1},o.prototype.lten=function(t){return this.cmpn(t)<=0},o.prototype.lte=function(t){return this.cmp(t)<=0},o.prototype.eqn=function(t){return 0===this.cmpn(t)},o.prototype.eq=function(t){return 0===this.cmp(t)},o.red=function(t){return new m(t)},o.prototype.toRed=function(t){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},o.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(t){return this.red=t,this},o.prototype.forceRed=function(t){return n(!this.red,"Already a number in reduction context"),this._forceRed(t)},o.prototype.redAdd=function(t){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},o.prototype.redIAdd=function(t){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},o.prototype.redSub=function(t){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},o.prototype.redISub=function(t){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},o.prototype.redShl=function(t){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},o.prototype.redMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},o.prototype.redIMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},o.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(t){return n(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var A={k256:null,p224:null,p192:null,p25519:null};l.prototype._tmp=function(){var t=new o(null);return t.words=new Array(Math.ceil(this.n/13)),t},l.prototype.ireduce=function(t){var e,r=t;do this.split(r,this.tmp),r=this.imulK(r),r=r.iadd(this.tmp),e=r.bitLength();while(e>this.n);var n=e0?r.isub(this.p):r.strip(),r},l.prototype.split=function(t,e){t.iushrn(this.n,0,e)},l.prototype.imulK=function(t){return t.imul(this.k)},i(p,l),p.prototype.split=function(t,e){for(var r=4194303,n=Math.min(t.length,9),i=0;i>>22,o=a}o>>>=22,t.words[i-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},p.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},o._prime=function t(e){if(A[e])return A[e];var t;if("k256"===e)t=new p;else if("p224"===e)t=new b;else if("p192"===e)t=new v;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new y}return A[e]=t,t},m.prototype._verify1=function(t){n(0===t.negative,"red works only with positives"),n(t.red,"red works only with red numbers")},m.prototype._verify2=function(t,e){n(0===(t.negative|e.negative),"red works only with positives"),n(t.red&&t.red===e.red,"red works only with red numbers")},m.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},m.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},m.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},m.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},m.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},m.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},m.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},m.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},m.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},m.prototype.isqr=function(t){return this.imul(t,t.clone())},m.prototype.sqr=function(t){return this.mul(t,t)},m.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2===1),3===e){var r=this.m.add(new o(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),a=0;!i.isZero()&&0===i.andln(1);)a++,i.iushrn(1);n(!i.isZero());var f=new o(1).toRed(this),s=f.redNeg(),u=this.m.subn(1).iushrn(1),h=this.m.bitLength();for(h=new o(2*h*h).toRed(this);0!==this.pow(h,u).cmp(s);)h.redIAdd(s);for(var c=this.pow(h,i),d=this.pow(t,i.addn(1).iushrn(1)),l=this.pow(t,i),p=a;0!==l.cmp(f);){for(var b=l,v=0;0!==b.cmp(f);v++)b=b.redSqr();n(v=0;i--){for(var h=e.words[i],c=u-1;c>=0;c--){var d=h>>c&1;a!==n[0]&&(a=this.sqr(a)),0!==d||0!==f?(f<<=1,f|=d,s++,(s===r||0===i&&0===c)&&(a=this.mul(a,n[f]),s=0,f=0)):s=0}u=26}return a},m.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},m.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},o.mont=function(t){return new g(t)},i(g,m),g.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},g.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},g.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},g.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new o(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},g.prototype.invm=function(t){var e=this.imod(t._invmp(this.m).mul(this.r2));return e._forceRed(this)}}("undefined"==typeof t||t,this)}).call(e,r(92)(t))},function(t,e,r){(function(t,n){var i=r(149),o=r(576);e.pbkdf2=function(t,r,n,i,a,f){if("function"==typeof a&&(f=a,a=void 0),o(n,i),"function"!=typeof f)throw new Error("No callback provided to pbkdf2");setTimeout(function(){f(null,e.pbkdf2Sync(t,r,n,i,a))})};var a;if(t.browser)a="utf-8";else{var f=parseInt(t.version.split(".")[0].slice(1),10);a=f>=6?"utf-8":"binary"}e.pbkdf2Sync=function(t,e,r,f,s){n.isBuffer(t)||(t=new n(t,a)),n.isBuffer(e)||(e=new n(e,a)),o(r,f),s=s||"sha1";var u,h=1,c=new n(f),d=new n(e.length+4);e.copy(d,0,0,e.length);for(var l,p,b=1;b<=h;b++){d.writeUInt32BE(b,e.length);var v=i(s,t).update(d).digest();u||(u=v.length,p=new n(u),h=Math.ceil(f/u),l=f-(h-1)*u),v.copy(p,0,0,u);for(var y=1;y0&&l.push(a),l.push(t),r&&l.push(r),a=i(e.concat(l)),l=[],f=0,n>0)for(;;){if(0===n)break;if(f===a.length)break;h[s++]=a[f],n--,f++}if(o>0&&f!==a.length)for(;;){if(0===o)break;if(f===a.length)break;c[u++]=a[f],o--,f++}if(0===n&&0===o)break}for(f=0;f-1?n:E;f.WritableState=a;var k=r(73);k.inherits=r(74);var x,I={deprecate:r(598)};!function(){try{x=r(31)}catch(t){}finally{x||(x=r(110).EventEmitter)}}();var B=r(1).Buffer,O=r(156);k.inherits(f,x);var R;a.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(a.prototype,"buffer",{get:I.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(t){}}();var R;f.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},f.prototype.write=function(t,e,r){var n=this._writableState,o=!1;return"function"==typeof e&&(r=e,e=null),B.isBuffer(t)?e="buffer":e||(e=n.defaultEncoding),"function"!=typeof r&&(r=i),n.ended?s(this,r):u(this,n,t,r)&&(n.pendingcb++,o=c(this,n,t,e,r)),o},f.prototype.cork=function(){var t=this._writableState;t.corked++},f.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,t.writing||t.corked||t.finished||t.bufferProcessing||!t.bufferedRequest||m(this,t))},f.prototype.setDefaultEncoding=function(t){if("string"==typeof t&&(t=t.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((t+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},f.prototype._write=function(t,e,r){r(new Error("not implemented"))},f.prototype._writev=null,f.prototype.end=function(t,e,r){var n=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!==t&&void 0!==t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||M(this,n,r)}}).call(e,r(26),r(158).setImmediate)},function(t,e,r){"use strict";(function(t){var n=r(1),i=n.Buffer,o=n.SlowBuffer,a=n.kMaxLength||2147483647;e.alloc=function(t,e,r){if("function"==typeof i.alloc)return i.alloc(t,e,r);if("number"==typeof r)throw new TypeError("encoding must not be number");if("number"!=typeof t)throw new TypeError("size must be a number");if(t>a)throw new RangeError("size is too large");var n=r,o=e;void 0===o&&(n=void 0,o=0);var f=new i(t);if("string"==typeof o)for(var s=new i(o,n),u=s.length,h=-1;++ha)throw new RangeError("size is too large");return new i(t)},e.from=function(e,r,n){if("function"==typeof i.from&&(!t.Uint8Array||Uint8Array.from!==i.from))return i.from(e,r,n);if("number"==typeof e)throw new TypeError('"value" argument must not be a number');if("string"==typeof e)return new i(e,r);if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer){var o=r;if(1===arguments.length)return new i(e);"undefined"==typeof o&&(o=0);var a=n;if("undefined"==typeof a&&(a=e.byteLength-o),o>=e.byteLength)throw new RangeError("'offset' is out of bounds");if(a>e.byteLength-o)throw new RangeError("'length' is out of bounds");return new i(e.slice(o,o+a))}if(i.isBuffer(e)){var f=new i(e.length);return e.copy(f,0,0,e.length),f}if(e){if(Array.isArray(e)||"undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return new i(e);if("Buffer"===e.type&&Array.isArray(e.data))return new i(e.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")},e.allocUnsafeSlow=function(t){if("function"==typeof i.allocUnsafeSlow)return i.allocUnsafeSlow(t);if("number"!=typeof t)throw new TypeError("size must be a number");if(t>=a)throw new RangeError("size is too large");return new o(t)}}).call(e,r(39))},function(t,e,r){"use strict";(function(e){function r(t,r,n,i){if("function"!=typeof t)throw new TypeError('"callback" argument must be a function');var o,a,f=arguments.length;switch(f){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(f-1),a=0;a=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},e.setImmediate="function"==typeof t?t:function(t){var r=u++,n=!(arguments.length<2)&&f.call(arguments,1);return s[r]=!0,o(function(){s[r]&&(n?t.apply(null,n):t.call(null),e.clearImmediate(r))}),r},e.clearImmediate="function"==typeof n?n:function(t){delete s[t]}}).call(e,r(158).setImmediate,r(158).clearImmediate)},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=r(62),f=function(t){function e(){return n(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),e}(a);t.exports=f},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=r(62),f=function(t){function e(){return n(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return o(e,t),e}(a);t.exports=f},function(t,e,r){"use strict";(function(e){function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=function(){function t(t,e){for(var r=0;r2?arguments[2]:void 0,h=Math.min((void 0===u?a:i(u,a))-s,a-f),c=1;for(s0;)s in r?r[f]=r[s]:delete r[f],f+=c,s+=c;return r}},function(t,e,r){var n=r(55);t.exports=function(t,e){var r=[];return n(t,!1,r.push,r,e),r}},function(t,e,r){var n=r(13),i=r(11),o=r(65),a=r(10);t.exports=function(t,e,r,f,s){n(e);var u=i(t),h=o(u),c=a(u.length),d=s?c-1:0,l=s?-1:1;if(r<2)for(;;){if(d in h){f=h[d],d+=l;break}if(d+=l,s?d<0:c<=d)throw TypeError("Reduce of empty array with no initial value")}for(;s?d>=0:c>d;d+=l)d in h&&(f=e(f,h[d],d,u));return f}},function(t,e,r){"use strict";var n=r(13),i=r(6),o=r(82),a=[].slice,f={},s=function(t,e,r){if(!(e in f)){for(var n=[],i=0;i1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(r(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!v(this,t)}}),l&&n(c.prototype,"size",{get:function(){return s(this[b])}}),c},def:function(t,e,r){var n,i,o=v(t,e);return o?o.v=r:(t._l=o={i:i=p(e,!0),k:e,v:r,p:n=t._l,n:void 0,r:!1},t._f||(t._f=o),n&&(n.n=o),t[b]++,"F"!==i&&(t._i[i]=o)),t},getEntry:v,setStrong:function(t,e,r){h(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,r=t._l;r&&r.r;)r=r.p;return t._t&&(t._l=r=r?r.n:t._t._f)?"keys"==e?c(0,r.k):"values"==e?c(0,r.v):c(0,[r.k,r.v]):(t._t=void 0,c(1))},r?"entries":"values",!r,!0),d(e)}}},function(t,e,r){var n=r(64),i=r(168);t.exports=function(t){return function(){if(n(this)!=t)throw TypeError(t+"#toJSON isn't generic");return i(this)}}},function(t,e,r){"use strict";var n=r(45),i=r(36).getWeak,o=r(3),a=r(6),f=r(40),s=r(55),u=r(27),h=r(12),c=u(5),d=u(6),l=0,p=function(t){return t._l||(t._l=new b)},b=function(){this.a=[]},v=function(t,e){return c(t.a,function(t){return t[0]===e})};b.prototype={get:function(t){var e=v(this,t);if(e)return e[1]},has:function(t){return!!v(this,t)},set:function(t,e){var r=v(this,t);r?r[1]=e:this.a.push([t,e])},delete:function(t){var e=d(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},t.exports={getConstructor:function(t,e,r,o){var u=t(function(t,n){f(t,u,e,"_i"),t._i=l++,t._l=void 0,void 0!=n&&s(n,r,t[o],t)});return n(u.prototype,{delete:function(t){if(!a(t))return!1;var e=i(t);return e===!0?p(this).delete(t):e&&h(e,this._i)&&delete e[this._i]},has:function(t){if(!a(t))return!1;var e=i(t);return e===!0?p(this).has(t):e&&h(e,this._i)}}),u},def:function(t,e,r){var n=i(o(e),!0);return n===!0?p(t).set(e,r):n[t._i]=r,t},ufstore:p}},function(t,e,r){t.exports=!r(8)&&!r(5)(function(){return 7!=Object.defineProperty(r(120)("div"),"a",{get:function(){return 7}}).a})},function(t,e,r){var n=r(6),i=Math.floor;t.exports=function(t){return!n(t)&&isFinite(t)&&i(t)===t}},function(t,e,r){var n=r(3);t.exports=function(t,e,r,i){try{return i?e(n(r)[0],r[1]):e(r)}catch(e){var o=t.return;throw void 0!==o&&n(o.call(t)),e}}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e){t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,e,r){"use strict";var n=r(44),i=r(86),o=r(66),a=r(11),f=r(65),s=Object.assign;t.exports=!s||r(5)(function(){var t={},e={},r=Symbol(),n="abcdefghijklmnopqrst";return t[r]=7,n.split("").forEach(function(t){e[t]=t}),7!=s({},t)[r]||Object.keys(s({},e)).join("")!=n})?function(t,e){for(var r=a(t),s=arguments.length,u=1,h=i.f,c=o.f;s>u;)for(var d,l=f(arguments[u++]),p=h?n(l).concat(h(l)):n(l),b=p.length,v=0;b>v;)c.call(l,d=p[v++])&&(r[d]=l[d]);return r}:s},function(t,e,r){var n=r(9),i=r(3),o=r(44);t.exports=r(8)?Object.defineProperties:function(t,e){i(t);for(var r,a=o(e),f=a.length,s=0;f>s;)n.f(t,r=a[s++],e[r]);return t}},function(t,e,r){var n=r(17),i=r(43).f,o={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],f=function(t){try{return i(t)}catch(t){return a.slice()}};t.exports.f=function(t){return a&&"[object Window]"==o.call(t)?f(t):i(n(t))}},function(t,e,r){var n=r(12),i=r(17),o=r(78)(!1),a=r(133)("IE_PROTO");t.exports=function(t,e){var r,f=i(t),s=0,u=[];for(r in f)r!=a&&n(f,r)&&u.push(r);for(;e.length>s;)n(f,r=e[s++])&&(~o(u,r)||u.push(r));return u}},function(t,e,r){var n=r(44),i=r(17),o=r(66).f;t.exports=function(t){return function(e){for(var r,a=i(e),f=n(a),s=f.length,u=0,h=[];s>u;)o.call(a,r=f[u++])&&h.push(t?[r,a[r]]:a[r]);return h}}},function(t,e,r){var n=r(43),i=r(86),o=r(3),a=r(4).Reflect;t.exports=a&&a.ownKeys||function(t){var e=n.f(o(t)),r=i.f;return r?e.concat(r(t)):e}},function(t,e,r){var n=r(4).parseFloat,i=r(58).trim;t.exports=1/n(r(138)+"-0")!==-(1/0)?function(t){var e=i(String(t),3),r=n(e);return 0===r&&"-"==e.charAt(0)?-0:r}:n},function(t,e,r){var n=r(4).parseInt,i=r(58).trim,o=r(138),a=/^[\-+]?0[xX]/;t.exports=8!==n(o+"08")||22!==n(o+"0x16")?function(t,e){var r=i(String(t),3);return n(r,e>>>0||(a.test(r)?16:10))}:n},function(t,e){t.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},function(t,e,r){var n=r(10),i=r(137),o=r(24);t.exports=function(t,e,r,a){var f=String(o(t)),s=f.length,u=void 0===r?" ":String(r),h=n(e);if(h<=s||""==u)return f;var c=h-s,d=i.call(u,Math.ceil(c/u.length));return d.length>c&&(d=d.slice(0,c)),a?d+f:f+d}},function(t,e,r){e.f=r(7)},function(t,e,r){"use strict";var n=r(171);t.exports=r(79)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=n.getEntry(this,t);return e&&e.v},set:function(t,e){return n.def(this,0===t?0:t,e)}},n,!0)},function(t,e,r){r(8)&&"g"!=/./g.flags&&r(9).f(RegExp.prototype,"flags",{configurable:!0,get:r(81)})},function(t,e,r){"use strict";var n=r(171);t.exports=r(79)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return n.def(this,t=0===t?0:t,t)}},n)},function(t,e,r){"use strict";var n,i=r(27)(0),o=r(15),a=r(36),f=r(179),s=r(173),u=r(6),h=a.getWeak,c=Object.isExtensible,d=s.ufstore,l={},p=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},b={get:function(t){if(u(t)){var e=h(t);return e===!0?d(this).get(t):e?e[this._i]:void 0}},set:function(t,e){return s.def(this,t,e)}},v=t.exports=r(79)("WeakMap",p,b,s,!0,!0);7!=(new v).set((Object.freeze||Object)(l),7).get(l)&&(n=s.getConstructor(p),f(n.prototype,b),a.NEED=!0,i(["delete","has","get","set"],function(t){var e=v.prototype,r=e[t];o(e,t,function(e,i){if(u(e)&&!c(e)){this._f||(this._f=new n);var o=this._f[t](e,i);return"set"==t?this:o}return r.call(this,e,i)})}))},function(t,e){function r(t){throw new Error("Cannot find module '"+t+"'.")}r.keys=function(){return[]},r.resolve=r,t.exports=r,r.id=194},function(t,e){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var o=function(t){function e(t){r(this,e);var i=n(this,Object.getPrototypeOf(e).call(this));return Object.defineProperty(i,"message",{configurable:!0,enumerable:!1,value:void 0!==t?String(t):""}),Object.defineProperty(i,"name",{configurable:!0,enumerable:!1,value:i.constructor.name}),Error.captureStackTrace&&Error.captureStackTrace(i,i.constructor),i}return i(e,t),e}(Error);t.exports=o},function(t,e,r){r(486),t.exports=r(197).Number.isInteger},function(t,e){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},function(t,e,r){var n=r(200),i=r(197),o=r(478),a=r(480),f="prototype",s=function(t,e,r){var u,h,c,d=t&s.F,l=t&s.G,p=t&s.S,b=t&s.P,v=t&s.B,y=t&s.W,m=l?i:i[e]||(i[e]={}),g=m[f],w=l?n:p?n[e]:(n[e]||{})[f];l&&(r=e);for(u in r)h=!d&&w&&void 0!==w[u],h&&u in m||(c=h?w[u]:r[u],m[u]=l&&"function"!=typeof w[u]?r[u]:v&&h?o(c,n):y&&w[u]==c?function(t){var e=function(e,r,n){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,r)}return new t(e,r,n)}return t.apply(this,arguments)};return e[f]=t[f],e}(c):b&&"function"==typeof c?o(Function.call,c):c,b&&((m.virtual||(m.virtual={}))[u]=c,t&s.R&&g&&!g[u]&&a(g,u,c)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,t.exports=s},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e){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)},function(t,e,r){"use strict";t.exports=r(473)},function(t,e,r){"use strict";(function(e){/*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ function n(t,e){if(t===e)return 0;for(var r=t.length,n=e.length,i=0,o=Math.min(r,n);i=0;f--)if(s[f]!==u[f])return!1;for(f=s.length-1;f>=0;f--)if(a=s[f],!l(t[a],e[a],r,n))return!1;return!0}function v(t,e,r){l(t,e,!0)&&c(t,e,r,"notDeepStrictEqual",v)}function y(t,e){if(!t||!e)return!1;if("[object RegExp]"==Object.prototype.toString.call(e))return e.test(t);try{if(t instanceof e)return!0}catch(t){}return!Error.isPrototypeOf(e)&&e.call({},t)===!0}function m(t){var e;try{t()}catch(t){e=t}return e}function g(t,e,r,n){var i;if("function"!=typeof e)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(n=r,r=null),i=m(e),n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),t&&!i&&c(i,r,"Missing expected exception"+n);var o="string"==typeof n,a=!t&&w.isError(i),f=!t&&i&&!r;if((a&&o&&y(i,r)||f)&&c(i,r,"Got unwanted exception"+n),t&&i&&r&&!y(i,r)||!t&&i)throw i}var w=r(606),_=Object.prototype.hasOwnProperty,M=Array.prototype.slice,S=function(){return"foo"===function(){}.name}(),E=t.exports=d,A=/\s*function\s+([^\(\s]*)\s*/;E.AssertionError=function(t){this.name="AssertionError",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=h(this),this.generatedMessage=!0);var e=t.stackStartFunction||c;if(Error.captureStackTrace)Error.captureStackTrace(this,e);else{var r=new Error;if(r.stack){var n=r.stack,i=f(e),o=n.indexOf("\n"+i);if(o>=0){var a=n.indexOf("\n",o+1);n=n.substring(a+1)}this.stack=n}}},w.inherits(E.AssertionError,Error),E.fail=c,E.ok=d,E.equal=function(t,e,r){t!=e&&c(t,e,r,"==",E.equal)},E.notEqual=function(t,e,r){t==e&&c(t,e,r,"!=",E.notEqual)},E.deepEqual=function(t,e,r){l(t,e,!1)||c(t,e,r,"deepEqual",E.deepEqual)},E.deepStrictEqual=function(t,e,r){l(t,e,!0)||c(t,e,r,"deepStrictEqual",E.deepStrictEqual)},E.notDeepEqual=function(t,e,r){l(t,e,!1)&&c(t,e,r,"notDeepEqual",E.notDeepEqual)},E.notDeepStrictEqual=v,E.strictEqual=function(t,e,r){t!==e&&c(t,e,r,"===",E.strictEqual)},E.notStrictEqual=function(t,e,r){t===e&&c(t,e,r,"!==",E.notStrictEqual)},E.throws=function(t,e,r){g(!0,t,e,r)},E.doesNotThrow=function(t,e,r){g(!1,t,e,r)},E.ifError=function(t){if(t)throw t};var k=Object.keys||function(t){var e=[];for(var r in t)_.call(t,r)&&e.push(r);return e}}).call(e,r(39))},function(t,e,r){(function(e){function n(t,r,i,f){if(!(this instanceof n))return new n(t,r,i);a.call(this),this._finID=e.concat([i,new e([0,0,0,1])]),i=e.concat([i,new e([0,0,0,2])]),this._cipher=new o.AES(r),this._prev=new e(i.length),this._cache=new e(""),this._secCache=new e(""),this._decrypt=f,this._alen=0,this._len=0,i.copy(this._prev),this._mode=t;var u=new e(4);u.fill(0),this._ghash=new s(this._cipher.encryptBlock(u)),this._authTag=null,this._called=!1}function i(t,e){var r=0;t.length!==e.length&&r++;for(var n=Math.min(t.length,e.length),i=-1;++i>f%8,t._prev=n(t._prev,r?o:a);return u}function n(e,r){var n=e.length,i=-1,o=new t(e.length);for(e=t.concat([e,new t([r])]);++i>7;return o}e.encrypt=function(e,n,i){for(var o=n.length,a=new t(o),f=-1;++f>6],i=0===(32&r);if(31===(31&r)){var o=r;for(r=0;128===(128&o);){if(o=t.readUInt8(e),t.isError(o))return o;r<<=7,r|=127&o}}else r&=31;var a=c.tag[r];return{cls:n,primitive:i,tag:r,tagStr:a}}function a(t,e,r){var n=t.readUInt8(r);if(t.isError(n))return n;if(!e&&128===n)return null;if(0===(128&n))return n;var i=127&n;if(i>=4)return t.error("length octect is too long");n=0;for(var o=0;o=31?n.error("Multi-octet tag encoding unsupported"):(e||(i|=32),i|=c.tagClassByName[r||"universal"]<<6)}var f=r(2),s=r(1).Buffer,u=r(100),h=u.base,c=u.constants.der;t.exports=n,n.prototype.encode=function(t,e){return this.tree._encode(t,e).join()},f(i,h.Node),i.prototype._encodeComposite=function(t,e,r,n){var i=a(t,e,r,this.reporter);if(n.length<128){var o=new s(2);return o[0]=i,o[1]=n.length,this._createEncoderBuffer([o,n])}for(var f=1,u=n.length;u>=256;u>>=8)f++;var o=new s(2+f);o[0]=i,o[1]=128|f;for(var u=1+f,h=n.length;h>0;u--,h>>=8)o[u]=255&h;return this._createEncoderBuffer([o,n])},i.prototype._encodeStr=function(t,e){if("bitstr"===e)return this._createEncoderBuffer([0|t.unused,t.data]);if("bmpstr"===e){for(var r=new s(2*t.length),n=0;n=40)return this.reporter.error("Second objid identifier OOB");t.splice(0,2,40*t[0]+t[1])}for(var i=0,n=0;n=128;o>>=7)i++}for(var a=new s(i),f=a.length-1,n=t.length-1;n>=0;n--){var o=t[n];for(a[f--]=127&o;(o>>=7)>0;)a[f--]=128|127&o}return this._createEncoderBuffer(a)},i.prototype._encodeTime=function(t,e){var r,n=new Date(t);return"gentime"===e?r=[o(n.getFullYear()),o(n.getUTCMonth()+1),o(n.getUTCDate()),o(n.getUTCHours()),o(n.getUTCMinutes()),o(n.getUTCSeconds()),"Z"].join(""):"utctime"===e?r=[o(n.getFullYear()%100),o(n.getUTCMonth()+1),o(n.getUTCDate()),o(n.getUTCHours()),o(n.getUTCMinutes()),o(n.getUTCSeconds()),"Z"].join(""):this.reporter.error("Encoding "+e+" time is not supported yet"),this._encodeStr(r,"octstr")},i.prototype._encodeNull=function(){return this._createEncoderBuffer("")},i.prototype._encodeInt=function(t,e){if("string"==typeof t){if(!e)return this.reporter.error("String int or enum given, but no values map");if(!e.hasOwnProperty(t))return this.reporter.error("Values map doesn't contain: "+JSON.stringify(t));t=e[t]}if("number"!=typeof t&&!s.isBuffer(t)){var r=t.toArray();!t.sign&&128&r[0]&&r.unshift(0),t=new s(r)}if(s.isBuffer(t)){var n=t.length;0===t.length&&n++;var i=new s(n);return t.copy(i),0===t.length&&(i[0]=0),this._createEncoderBuffer(i)}if(t<128)return this._createEncoderBuffer(t);if(t<256)return this._createEncoderBuffer([0,t]);for(var n=1,o=t;o>=256;o>>=8)n++;for(var i=new Array(n),o=i.length-1;o>=0;o--)i[o]=255&t,t>>=8;return 128&i[0]&&i.unshift(0),this._createEncoderBuffer(new s(i))},i.prototype._encodeBool=function(t){return this._createEncoderBuffer(t?255:0)},i.prototype._use=function(t,e){return"function"==typeof t&&(t=t(e)),t._getEncoder("der").tree},i.prototype._skipDefault=function(t,e,r){var n,i=this._baseState;if(null===i.default)return!1;var o=t.join();if(void 0===i.defaultBuffer&&(i.defaultBuffer=this._encodeValue(i.default,e,r).join()),o.length!==i.defaultBuffer.length)return!1;for(n=0;n>f%8,t._prev=n(t._prev,r?o:a);return u}function n(e,r){var n=e.length,i=-1,o=new t(e.length);for(e=t.concat([e,new t([r])]);++i>7;return o}e.encrypt=function(e,n,i){for(var o=n.length,a=new t(o),f=-1;++f>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10)}function f(t){return(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7)}function s(t){return(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3}function u(t){return(t>>>17|t<<15)^(t>>>19|t<<13)^t>>>10}var h=r(2),c=r(60),d=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],l=new Array(64);h(n,c),n.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},n.prototype._update=function(t){for(var e=this._w,r=0|this._a,n=0|this._b,h=0|this._c,c=0|this._d,l=0|this._e,p=0|this._f,b=0|this._g,v=0|this._h,y=0;y<16;++y)e[y]=t.readInt32BE(4*y);for(;y<64;++y)e[y]=u(e[y-2])+e[y-7]+s(e[y-15])+e[y-16]|0;for(var m=0;m<64;++m){var g=v+f(l)+i(l,p,b)+d[m]+e[m]|0,w=a(r)+o(r,n,h)|0;v=b,b=p,p=l,l=c+g|0,c=h,h=n,n=r,r=g+w|0}this._a=r+this._a|0,this._b=n+this._b|0,this._c=h+this._c|0,this._d=c+this._d|0,this._e=l+this._e|0,this._f=p+this._f|0,this._g=b+this._g|0,this._h=v+this._h|0},n.prototype._hash=function(){var t=new e(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},t.exports=n}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(){this.init(),this._w=v,p.call(this,128,112)}function i(t,e,r){return r^t&(e^r)}function o(t,e,r){return t&e|r&(t|e)}function a(t,e){return(t>>>28|e<<4)^(e>>>2|t<<30)^(e>>>7|t<<25)}function f(t,e){return(t>>>14|e<<18)^(t>>>18|e<<14)^(e>>>9|t<<23)}function s(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^t>>>7}function u(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^(t>>>7|e<<25)}function h(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^t>>>6}function c(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^(t>>>6|e<<26)}function d(t,e){return t>>>0>>0?1:0}var l=r(2),p=r(60),b=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],v=new Array(160);l(n,p),n.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},n.prototype._update=function(t){for(var e=this._w,r=0|this._ah,n=0|this._bh,l=0|this._ch,p=0|this._dh,v=0|this._eh,y=0|this._fh,m=0|this._gh,g=0|this._hh,w=0|this._al,_=0|this._bl,M=0|this._cl,S=0|this._dl,E=0|this._el,A=0|this._fl,k=0|this._gl,x=0|this._hl,I=0;I<32;I+=2)e[I]=t.readInt32BE(4*I),e[I+1]=t.readInt32BE(4*I+4);for(;I<160;I+=2){var B=e[I-30],O=e[I-30+1],R=s(B,O),P=u(O,B); B=e[I-4],O=e[I-4+1];var T=h(B,O),j=c(O,B),C=e[I-14],N=e[I-14+1],L=e[I-32],U=e[I-32+1],z=P+N|0,D=R+C+d(z,P)|0;z=z+j|0,D=D+T+d(z,j)|0,z=z+U|0,D=D+L+d(z,U)|0,e[I]=D,e[I+1]=z}for(var q=0;q<160;q+=2){D=e[q],z=e[q+1];var F=o(r,n,l),K=o(w,_,M),G=a(r,w),V=a(w,r),H=f(v,E),X=f(E,v),Y=b[q],W=b[q+1],Z=i(v,y,m),J=i(E,A,k),$=x+X|0,Q=g+H+d($,x)|0;$=$+J|0,Q=Q+Z+d($,J)|0,$=$+W|0,Q=Q+Y+d($,W)|0,$=$+z|0,Q=Q+D+d($,z)|0;var tt=V+K|0,et=G+F+d(tt,V)|0;g=m,x=k,m=y,k=A,y=v,A=E,E=S+$|0,v=p+Q+d(E,S)|0,p=l,S=M,l=n,M=_,n=r,_=w,w=$+tt|0,r=Q+et+d(w,$)|0}this._al=this._al+w|0,this._bl=this._bl+_|0,this._cl=this._cl+M|0,this._dl=this._dl+S|0,this._el=this._el+E|0,this._fl=this._fl+A|0,this._gl=this._gl+k|0,this._hl=this._hl+x|0,this._ah=this._ah+r+d(this._al,w)|0,this._bh=this._bh+n+d(this._bl,_)|0,this._ch=this._ch+l+d(this._cl,M)|0,this._dh=this._dh+p+d(this._dl,S)|0,this._eh=this._eh+v+d(this._el,E)|0,this._fh=this._fh+y+d(this._fl,A)|0,this._gh=this._gh+m+d(this._gl,k)|0,this._hh=this._hh+g+d(this._hl,x)|0},n.prototype._hash=function(){function t(t,e,n){r.writeInt32BE(t,n),r.writeInt32BE(e,n+4)}var r=new e(64);return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),t(this._gh,this._gl,48),t(this._hh,this._hl,56),r},t.exports=n}).call(e,r(1).Buffer)},function(t,e,r){function n(){if(null!==g)return g;var t=1048576,e=[];e[0]=2;for(var r=1,n=3;nt;)r.ishrn(1);if(r.isEven()&&r.iadd(d),r.testn(1)||r.iadd(l),e.cmp(l)){if(!e.cmp(p))for(;r.mod(b).cmp(v);)r.iadd(m)}else for(;r.mod(u).cmp(y);)r.iadd(m);if(n=r.shrn(1),i(n)&&i(r)&&o(n)&&o(r)&&c.test(n)&&c.test(r))return r}}var f=r(61);t.exports=a,a.simpleSieve=i,a.fermatTest=o;var s=r(150),u=new s(24),h=r(230),c=new h,d=new s(1),l=new s(2),p=new s(5),b=(new s(16),new s(8),new s(10)),v=new s(3),y=(new s(7),new s(11)),m=new s(4),g=(new s(12),null)},function(t,e,r){function n(t){this.rand=t||new o.Rand}var i=r(150),o=r(575);t.exports=n,n.create=function(t){return new n(t)},n.prototype._rand=function(t){var e=t.bitLength(),r=this.rand.generate(Math.ceil(e/8));r[0]|=3;var n=7&e;return 0!==n&&(r[r.length-1]>>=7-n),new i(r)},n.prototype.test=function(t,e,r){var n=t.bitLength(),o=i.mont(t),a=new i(1).toRed(o);e||(e=Math.max(1,n/48|0));for(var f=t.subn(1),s=f.subn(1),u=0;!f.testn(u);u++);for(var h=t.shrn(u),c=f.toRed(o),d=!0;e>0;e--){var l=this._rand(s);r&&r(l);var p=l.toRed(o).redPow(h);if(0!==p.cmp(a)&&0!==p.cmp(c)){for(var b=1;b0;e--){var c=this._rand(f),d=t.gcd(c);if(0!==d.cmpn(1))return d;var l=c.toRed(n).redPow(u);if(0!==l.cmp(o)&&0!==l.cmp(h)){for(var p=1;p=0||!r.umod(t.prime1)||!r.umod(t.prime2);)r=new a(f(e));return r}var a=r(70),f=r(61);t.exports=i,i.getr=o}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(t){var r;"object"!=typeof t||e.isBuffer(t)||(r=t.passphrase,t=t.key),"string"==typeof t&&(t=new e(t));var n,a,s=f(t,r),u=s.tag,h=s.data;switch(u){case"PUBLIC KEY":switch(a=o.PublicKey.decode(h,"der"),n=a.algorithm.algorithm.join(".")){case"1.2.840.113549.1.1.1":return o.RSAPublicKey.decode(a.subjectPublicKey.data,"der");case"1.2.840.10045.2.1":return a.subjectPrivateKey=a.subjectPublicKey,{type:"ec",data:a};case"1.2.840.10040.4.1":return a.algorithm.params.pub_key=o.DSAparam.decode(a.subjectPublicKey.data,"der"),{type:"dsa",data:a.algorithm.params};default:throw new Error("unknown key id "+n)}throw new Error("unknown key type "+u);case"ENCRYPTED PRIVATE KEY":h=o.EncryptedPrivateKey.decode(h,"der"),h=i(h,r);case"PRIVATE KEY":switch(a=o.PrivateKey.decode(h,"der"),n=a.algorithm.algorithm.join(".")){case"1.2.840.113549.1.1.1":return o.RSAPrivateKey.decode(a.subjectPrivateKey,"der");case"1.2.840.10045.2.1":return{curve:a.algorithm.curve,privateKey:o.ECPrivateKey.decode(a.subjectPrivateKey,"der").privateKey};case"1.2.840.10040.4.1":return a.algorithm.params.priv_key=o.DSAparam.decode(a.subjectPrivateKey,"der"),{type:"dsa",params:a.algorithm.params};default:throw new Error("unknown key id "+n)}throw new Error("unknown key type "+u);case"RSA PUBLIC KEY":return o.RSAPublicKey.decode(h,"der");case"RSA PRIVATE KEY":return o.RSAPrivateKey.decode(h,"der");case"DSA PRIVATE KEY":return{type:"dsa",params:o.DSAPrivateKey.decode(h,"der")};case"EC PRIVATE KEY":return h=o.ECPrivateKey.decode(h,"der"),{curve:h.parameters.value,privateKey:h.privateKey};default:throw new Error("unknown key type "+u)}}function i(t,r){var n=t.algorithm.decrypt.kde.kdeparams.salt,i=parseInt(t.algorithm.decrypt.kde.kdeparams.iters.toString(),10),o=a[t.algorithm.decrypt.cipher.algo.join(".")],f=t.algorithm.decrypt.cipher.iv,h=t.subjectPrivateKey,c=parseInt(o.split("-")[1],10)/8,d=u.pbkdf2Sync(r,n,i,c),l=s.createDecipheriv(o,d,f),p=[];return p.push(l.update(h)),p.push(l.final()),e.concat(p)}var o=r(578),a=r(469),f=r(579),s=r(239),u=r(151);t.exports=n,n.signature=o.signature}).call(e,r(1).Buffer)},function(t,e,r){function n(t,e){return a.call(this,e),f.isBuffer(t)?(this.base=t,this.offset=0,void(this.length=t.length)):void this.error("Input not Buffer")}function i(t,e){if(Array.isArray(t))this.length=0,this.value=t.map(function(t){return t instanceof i||(t=new i(t,e)),this.length+=t.length,t},this);else if("number"==typeof t){if(!(0<=t&&t<=255))return e.error("non-byte EncoderBuffer value");this.value=t,this.length=1}else if("string"==typeof t)this.value=t,this.length=f.byteLength(t);else{if(!f.isBuffer(t))return e.error("Unsupported type: "+typeof t);this.value=t,this.length=t.length}}var o=r(2),a=r(71).Reporter,f=r(1).Buffer;o(n,a),e.DecoderBuffer=n,n.prototype.save=function(){return{offset:this.offset,reporter:a.prototype.save.call(this)}},n.prototype.restore=function(t){var e=new n(this.base);return e.offset=t.offset,e.length=this.offset,this.offset=t.offset,a.prototype.restore.call(this,t.reporter),e},n.prototype.isEmpty=function(){return this.offset===this.length},n.prototype.readUInt8=function(t){return this.offset+1<=this.length?this.base.readUInt8(this.offset++,!0):this.error(t||"DecoderBuffer overrun")},n.prototype.skip=function(t,e){if(!(this.offset+t<=this.length))return this.error(e||"DecoderBuffer overrun");var r=new n(this.base);return r._reporterState=this._reporterState,r.offset=this.offset,r.length=this.offset+t,this.offset+=t,r},n.prototype.raw=function(t){return this.base.slice(t?t.offset:this.offset,this.length)},e.EncoderBuffer=i,i.prototype.join=function(t,e){return t||(t=new f(this.length)),e||(e=0),0===this.length?t:(Array.isArray(this.value)?this.value.forEach(function(r){r.join(t,e),e+=r.length}):("number"==typeof this.value?t[e]=this.value:"string"==typeof this.value?t.write(this.value,e):f.isBuffer(this.value)&&this.value.copy(t,e),e+=this.length),t)}},function(t,e,r){var n=e;n._reverse=function(t){var e={};return Object.keys(t).forEach(function(r){(0|r)==r&&(r|=0);var n=t[r];e[n]=r}),e},n.der=r(583)},function(t,e,r){function n(t){this.enc="der",this.name=t.name,this.entity=t,this.tree=new i,this.tree._init(t.body)}function i(t){u.Node.call(this,"der",t)}function o(t,e){var r=t.readUInt8(e);if(t.isError(r))return r;var n=c.tagClass[r>>6],i=0===(32&r);if(31===(31&r)){var o=r;for(r=0;128===(128&o);){if(o=t.readUInt8(e),t.isError(o))return o;r<<=7,r|=127&o}}else r&=31;var a=c.tag[r];return{cls:n,primitive:i,tag:r,tagStr:a}}function a(t,e,r){var n=t.readUInt8(r);if(t.isError(n))return n;if(!e&&128===n)return null;if(0===(128&n))return n;var i=127&n;if(i>=4)return t.error("length octect is too long");n=0;for(var o=0;o=31?n.error("Multi-octet tag encoding unsupported"):(e||(i|=32),i|=c.tagClassByName[r||"universal"]<<6)}var f=r(2),s=r(1).Buffer,u=r(106),h=u.base,c=u.constants.der;t.exports=n,n.prototype.encode=function(t,e){return this.tree._encode(t,e).join()},f(i,h.Node),i.prototype._encodeComposite=function(t,e,r,n){var i=a(t,e,r,this.reporter);if(n.length<128){var o=new s(2);return o[0]=i,o[1]=n.length,this._createEncoderBuffer([o,n])}for(var f=1,u=n.length;u>=256;u>>=8)f++;var o=new s(2+f);o[0]=i,o[1]=128|f;for(var u=1+f,h=n.length;h>0;u--,h>>=8)o[u]=255&h;return this._createEncoderBuffer([o,n])},i.prototype._encodeStr=function(t,e){if("bitstr"===e)return this._createEncoderBuffer([0|t.unused,t.data]);if("bmpstr"===e){for(var r=new s(2*t.length),n=0;n=40)return this.reporter.error("Second objid identifier OOB");t.splice(0,2,40*t[0]+t[1])}for(var i=0,n=0;n=128;o>>=7)i++}for(var a=new s(i),f=a.length-1,n=t.length-1;n>=0;n--){var o=t[n];for(a[f--]=127&o;(o>>=7)>0;)a[f--]=128|127&o}return this._createEncoderBuffer(a)},i.prototype._encodeTime=function(t,e){var r,n=new Date(t);return"gentime"===e?r=[o(n.getFullYear()),o(n.getUTCMonth()+1),o(n.getUTCDate()),o(n.getUTCHours()),o(n.getUTCMinutes()),o(n.getUTCSeconds()),"Z"].join(""):"utctime"===e?r=[o(n.getFullYear()%100),o(n.getUTCMonth()+1),o(n.getUTCDate()),o(n.getUTCHours()),o(n.getUTCMinutes()),o(n.getUTCSeconds()),"Z"].join(""):this.reporter.error("Encoding "+e+" time is not supported yet"),this._encodeStr(r,"octstr")},i.prototype._encodeNull=function(){return this._createEncoderBuffer("")},i.prototype._encodeInt=function(t,e){if("string"==typeof t){if(!e)return this.reporter.error("String int or enum given, but no values map");if(!e.hasOwnProperty(t))return this.reporter.error("Values map doesn't contain: "+JSON.stringify(t));t=e[t]}if("number"!=typeof t&&!s.isBuffer(t)){var r=t.toArray();!t.sign&&128&r[0]&&r.unshift(0),t=new s(r)}if(s.isBuffer(t)){var n=t.length;0===t.length&&n++;var i=new s(n);return t.copy(i),0===t.length&&(i[0]=0),this._createEncoderBuffer(i)}if(t<128)return this._createEncoderBuffer(t);if(t<256)return this._createEncoderBuffer([0,t]);for(var n=1,o=t;o>=256;o>>=8)n++;for(var i=new Array(n),o=i.length-1;o>=0;o--)i[o]=255&t,t>>=8;return 128&i[0]&&i.unshift(0),this._createEncoderBuffer(new s(i))},i.prototype._encodeBool=function(t){return this._createEncoderBuffer(t?255:0)},i.prototype._use=function(t,e){return"function"==typeof t&&(t=t(e)),t._getEncoder("der").tree},i.prototype._skipDefault=function(t,e,r){var n,i=this._baseState;if(null===i.default)return!1;var o=t.join();if(void 0===i.defaultBuffer&&(i.defaultBuffer=this._encodeValue(i.default,e,r).join()),o.length!==i.defaultBuffer.length)return!1;for(n=0;n>f%8,t._prev=n(t._prev,r?o:a);return u}function n(e,r){var n=e.length,i=-1,o=new t(e.length);for(e=t.concat([e,new t([r])]);++i>7;return o}e.encrypt=function(e,n,i){for(var o=n.length,a=new t(o),f=-1;++f0)if(e.ended&&!i){var a=new Error("stream.push() after EOF");t.emit("error",a)}else if(e.endEmitted&&i){var s=new Error("stream.unshift() after end event");t.emit("error",s)}else{var u;!e.decoder||i||n||(r=e.decoder.write(r),u=!e.objectMode&&0===r.length),i||(e.reading=!1),u||(e.flowing&&0===e.length&&!e.sync?(t.emit("data",r),t.read(0)):(e.length+=e.objectMode?1:r.length,i?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&d(t))),p(t,e)}else i||(e.reading=!1);return f(e)}function f(t){return!t.ended&&(t.needReadable||t.length=q?t=q:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function u(t,e){return t<=0||0===e.length&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=s(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function h(t,e){var r=null;return T.isBuffer(e)||"string"==typeof e||null===e||void 0===e||t.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function c(t,e){if(!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,d(t)}}function d(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(L("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?B(l,t):l(t))}function l(t){L("emit readable"),t.emit("readable"),w(t)}function p(t,e){e.readingMore||(e.readingMore=!0,B(b,t,e))}function b(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=M(t,e.buffer,e.decoder),r}function M(t,e,r){var n;return to.length?o.length:t;if(i+=a===o.length?o:o.slice(0,t),t-=a,0===t){a===o.length?(++n,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=o.slice(a));break}++n}return e.length-=n,i}function E(t,e){var r=j.allocUnsafe(t),n=e.head,i=1;for(n.data.copy(r),t-=n.data.length;n=n.next;){var o=n.data,a=t>o.length?o.length:t;if(o.copy(r,r.length-t,0,a),t-=a,0===t){a===o.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=o.slice(a));break}++i}return e.length-=i,r}function A(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,B(k,e,t))}function k(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function x(t,e){for(var r=0,n=t.length;r=e.highWaterMark||e.ended))return L("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?A(this):d(this),null;if(t=u(t,e),0===t&&e.ended)return 0===e.length&&A(this),null;var n=e.needReadable;L("need readable",n),(0===e.length||e.length-t0?_(t,e):null,null===i?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&A(this)),null!==i&&this.emit("data",i),i},o.prototype._read=function(t){this.emit("error",new Error("not implemented"))},o.prototype.pipe=function(t,r){function i(t){L("onunpipe"),t===d&&a()}function o(){L("onend"),t.end()}function a(){L("cleanup"),t.removeListener("close",u),t.removeListener("finish",h),t.removeListener("drain",y),t.removeListener("error",s),t.removeListener("unpipe",i),d.removeListener("end",o),d.removeListener("end",a),d.removeListener("data",f),m=!0,!l.awaitDrain||t._writableState&&!t._writableState.needDrain||y()}function f(e){L("ondata"),g=!1;var r=t.write(e);!1!==r||g||((1===l.pipesCount&&l.pipes===t||l.pipesCount>1&&I(l.pipes,t)!==-1)&&!m&&(L("false write response, pause",d._readableState.awaitDrain),d._readableState.awaitDrain++,g=!0),d.pause())}function s(e){L("onerror",e),c(),t.removeListener("error",s),0===P(t,"error")&&t.emit("error",e)}function u(){t.removeListener("finish",h),c()}function h(){L("onfinish"),t.removeListener("close",u),c()}function c(){L("unpipe"),d.unpipe(t)}var d=this,l=this._readableState;switch(l.pipesCount){case 0:l.pipes=t;break;case 1:l.pipes=[l.pipes,t];break;default:l.pipes.push(t)}l.pipesCount+=1,L("pipe count=%d opts=%j",l.pipesCount,r);var p=(!r||r.end!==!1)&&t!==e.stdout&&t!==e.stderr,b=p?o:a;l.endEmitted?B(b):d.once("end",b),t.on("unpipe",i);var y=v(d);t.on("drain",y);var m=!1,g=!1;return d.on("data",f),n(t,"error",s),t.once("close",u),t.once("finish",h),t.emit("pipe",d),l.flowing||(L("pipe resume"),d.resume()),t},o.prototype.unpipe=function(t){var e=this._readableState;if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this),this);if(!t){var r=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var i=0;i=this._size)return null;var e=255&this._buf[t++];if(null===e)return null;if(128==(128&e)){if(e&=127,0==e)throw f("Indefinite length not supported");if(e>4)throw f("encoding too long");if(this._size-tthis._size-i)return null;if(this._offset=i,0===this.length)return r?new e(0):"";var a=this._buf.slice(this._offset,this._offset+this.length);return this._offset+=this.length,r?a:a.toString("utf8")},n.prototype.readOID=function(t){t||(t=o.OID);var e=this.readString(t,!0);if(null===e)return null;for(var r=[],n=0,i=0;i>0),r.join(".")},n.prototype._readTag=function(t){i.ok(void 0!==t);var e=this.peek();if(null===e)return null;if(e!==t)throw f("Expected 0x"+t.toString(16)+": got 0x"+e.toString(16));var r=this.readLength(this._offset+1);if(null===r)return null;if(this.length>4)throw f("Integer too long: "+this.length);if(this.length>this._size-r)return null;this._offset=r;for(var n=this._buf[this._offset],o=0,a=0;a>0},t.exports=n}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(t,e){o.ok(t),o.equal(typeof t,"object"),o.ok(e),o.equal(typeof e,"object");var r=Object.getOwnPropertyNames(t);return r.forEach(function(r){if(!e[r]){var n=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,n)}}),e}function i(t){t=n(s,t||{}),this._buf=new e(t.size||1024),this._size=this._buf.length,this._offset=0,this._options=t,this._seq=[]}var o=r(202),a=r(112),f=r(111),s=(f.newInvalidAsn1Error,{size:1024,growthFactor:8});Object.defineProperty(i.prototype,"buffer",{get:function(){if(this._seq.length)throw new InvalidAsn1Error(this._seq.length+" unended sequence(s)");return this._buf.slice(0,this._offset)}}),i.prototype.writeByte=function(t){if("number"!=typeof t)throw new TypeError("argument must be a Number");this._ensure(1),this._buf[this._offset++]=t},i.prototype.writeInt=function(t,e){if("number"!=typeof t)throw new TypeError("argument must be a Number");"number"!=typeof e&&(e=a.Integer);for(var r=4;(0===(4286578688&t)||(4286578688&t)===-8388608)&&r>1;)r--,t<<=8;if(r>4)throw new InvalidAsn1Error("BER ints cannot be > 0xffffffff");for(this._ensure(2+r),this._buf[this._offset++]=e,this._buf[this._offset++]=r;r-- >0;)this._buf[this._offset++]=(4278190080&t)>>>24,t<<=8},i.prototype.writeNull=function(){this.writeByte(a.Null),this.writeByte(0)},i.prototype.writeEnumeration=function(t,e){if("number"!=typeof t)throw new TypeError("argument must be a Number");return"number"!=typeof e&&(e=a.Enumeration),this.writeInt(t,e)},i.prototype.writeBoolean=function(t,e){if("boolean"!=typeof t)throw new TypeError("argument must be a Boolean");"number"!=typeof e&&(e=a.Boolean),this._ensure(3),this._buf[this._offset++]=e,this._buf[this._offset++]=1,this._buf[this._offset++]=t?255:0},i.prototype.writeString=function(t,r){if("string"!=typeof t)throw new TypeError("argument must be a string (was: "+typeof t+")");"number"!=typeof r&&(r=a.OctetString);var n=e.byteLength(t);this.writeByte(r),this.writeLength(n),n&&(this._ensure(n),this._buf.write(t,this._offset),this._offset+=n)},i.prototype.writeBuffer=function(t,r){if("number"!=typeof r)throw new TypeError("tag must be a number");if(!e.isBuffer(t))throw new TypeError("argument must be a buffer");this.writeByte(r),this.writeLength(t.length),this._ensure(t.length),t.copy(this._buf,this._offset,0,t.length),this._offset+=t.length},i.prototype.writeStringArray=function(t){if(!t instanceof Array)throw new TypeError("argument must be an Array[String]");var e=this;t.forEach(function(t){e.writeString(t)})},i.prototype.writeOID=function(t,e){function r(t,e){e<128?t.push(e):e<16384?(t.push(e>>>7|128),t.push(127&e)):e<2097152?(t.push(e>>>14|128),t.push(255&(e>>>7|128)),t.push(127&e)):e<268435456?(t.push(e>>>21|128),t.push(255&(e>>>14|128)),t.push(255&(e>>>7|128)),t.push(127&e)):(t.push(255&(e>>>28|128)),t.push(255&(e>>>21|128)),t.push(255&(e>>>14|128)),t.push(255&(e>>>7|128)),t.push(127&e))}if("string"!=typeof t)throw new TypeError("argument must be a string");if("number"!=typeof e&&(e=a.OID),!/^([0-9]+\.){3,}[0-9]+$/.test(t))throw new Error("argument is not a valid OID string");var n=t.split("."),i=[];i.push(40*parseInt(n[0],10)+parseInt(n[1],10)),n.slice(2).forEach(function(t){r(i,parseInt(t,10))});var o=this;this._ensure(2+i.length),this.writeByte(e),this.writeLength(i.length),i.forEach(function(t){o.writeByte(t)})},i.prototype.writeLength=function(t){if("number"!=typeof t)throw new TypeError("argument must be a Number");if(this._ensure(4),t<=127)this._buf[this._offset++]=t;else if(t<=255)this._buf[this._offset++]=129,this._buf[this._offset++]=t;else if(t<=65535)this._buf[this._offset++]=130,this._buf[this._offset++]=t>>8,this._buf[this._offset++]=t;else{if(!(t<=16777215))throw new InvalidAsn1ERror("Length too long (> 4 bytes)");this._buf[this._offset++]=131,this._buf[this._offset++]=t>>16,this._buf[this._offset++]=t>>8,this._buf[this._offset++]=t}},i.prototype.startSequence=function(t){"number"!=typeof t&&(t=a.Sequence|a.Constructor),this.writeByte(t),this._seq.push(this._offset),this._ensure(3),this._offset+=3},i.prototype.endSequence=function(){var t=this._seq.pop(),e=t+3,r=this._offset-e;if(r<=127)this._shift(e,r,-2),this._buf[t]=r;else if(r<=255)this._shift(e,r,-1),this._buf[t]=129,this._buf[t+1]=r;else if(r<=65535)this._buf[t]=130,this._buf[t+1]=r>>8,this._buf[t+2]=r;else{if(!(r<=16777215))throw new InvalidAsn1Error("Sequence too long");this._shift(e,r,1),this._buf[t]=131,this._buf[t+1]=r>>16,this._buf[t+2]=r>>8,this._buf[t+3]=r}},i.prototype._shift=function(t,e,r){o.ok(void 0!==t),o.ok(void 0!==e),o.ok(r),this._buf.copy(this._buf,t+r,t,t+e),this._offset+=r},i.prototype._ensure=function(t){if(o.ok(t),this._size-this._offset>>8*n-r,e.concat([l,u,new e([188])])}},{key:"verify",value:function(t,r,n){var i=Math.ceil(n/8),s=o.createHash(this.hashAlgorithm).update(t).digest();if(i>>8*i-n;if(h[0]&~d)return!1;var l=new a({hashAlgorithm:this.hashAlgorithm}),p=l.generate(c,i-this.hashLength-1),b=f(h,p);b[0]&=d;for(var v=i-this.hashLength-this.saltLength-2,y=0;y512||t.length<128)throw new Error("Modulus must be between 128 bytes (1017 bits) and 512 bytes (4096 bits), was: "+t.length+" bytes");this.modulus=t}},{key:"setSignature",value:function(t){if(!e.isBuffer(t))throw new TypeError("Signature must be a buffer, was: "+t);this.signature=t}},{key:"sign",value:function(t,e){this.modulus||this.setPublicModulus(s.modulusFromPrivateKey(e)),this.signature=l.sign(e,t)}},{key:"writeHashPayload",value:function(t){this.writeCommonHeader(t)}},{key:"parsePayload",value:function(t){this.setPublicModulus(t.readVarOctetString()),this.setSignature(t.readVarOctetString())}},{key:"writePayload",value:function(t){if(!this.signature)throw new c("Requires a signature");this.writeCommonHeader(t),t.writeVarOctetString(this.signature)}},{key:"calculateMaxFulfillmentLength",value:function(){var t=new h;if(!this.modulus)throw new c("Requires a public modulus");return this.writeCommonHeader(t),t.writeVarOctetString(this.modulus),t.getSize()}},{key:"validate",value:function(t){if(!e.isBuffer(t))throw new Error("Message must be provided as a Buffer, was: "+t);var r=l.verify(this.modulus,t,this.signature);if(!r)throw new d("Invalid RSA signature");return!0}}]),r}(u);p.TYPE_ID=3,p.FEATURE_BITMASK=17,t.exports=p}).call(e,r(1).Buffer)},function(t,e,r){"use strict";(function(e){function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var r=0;r=0;--n){var i=this.tryEntries[n],o=i.completion;if("root"===i.tryLoc)return e("end");if(i.tryLoc<=this.prev){var a=m.call(i,"catchLoc"),f=m.call(i,"finallyLoc");if(a&&f){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&m.call(n,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),l(r),I}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var i=n.arg;l(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:b(t),resultName:e,nextLoc:r},I}}}("object"==typeof e?e:"object"==typeof window?window:"object"==typeof self?self:this)}).call(e,r(39),r(26))},function(t,e,r){r(290),t.exports=r(32).RegExp.escape},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,r){var n=r(77);t.exports=function(t){if(!n(t))throw TypeError(t+" is not an object!");return t}},function(t,e,r){var n=r(270);t.exports=function(t,e,r){if(n(t),void 0===e)return t;switch(r){case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)}}return function(){return t.apply(e,arguments)}}},function(t,e,r){var n=r(77),i=r(165).document,o=n(i)&&n(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,e,r){var n=r(165),i=r(163),o=r(272),a=r(275),f="prototype",s=function(t,e,r){var u,h,c,d=t&s.F,l=t&s.G,p=t&s.S,b=t&s.P,v=t&s.B,y=t&s.W,m=l?i:i[e]||(i[e]={}),g=m[f],w=l?n:p?n[e]:(n[e]||{})[f];l&&(r=e);for(u in r)h=!d&&w&&void 0!==w[u],h&&u in m||(c=h?w[u]:r[u],m[u]=l&&"function"!=typeof w[u]?r[u]:v&&h?o(c,n):y&&w[u]==c?function(t){var e=function(e,r,n){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,r)}return new t(e,r,n)}return t.apply(this,arguments)};return e[f]=t[f],e}(c):b&&"function"==typeof c?o(Function.call,c):c,b&&((m.virtual||(m.virtual={}))[u]=c,t&s.R&&g&&!g[u]&&a(g,u,c)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,t.exports=s},function(t,e,r){var n=r(278),i=r(279);t.exports=r(117)?function(t,e,r){return n.f(t,e,i(1,r))}:function(t,e,r){return t[e]=r,t}},function(t,e,r){t.exports=!r(117)&&!r(164)(function(){return 7!=Object.defineProperty(r(273)("div"),"a",{get:function(){return 7}}).a})},function(t,e,r){var n=r(77),i=Math.floor;t.exports=function(t){return!n(t)&&isFinite(t)&&i(t)===t}},function(t,e,r){var n=r(271),i=r(276),o=r(280),a=Object.defineProperty;e.f=r(117)?Object.defineProperty:function(t,e,r){if(n(t),e=o(e,!0),n(r),i)try{return a(t,e,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(t[e]=r.value),t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,r){var n=r(77);t.exports=function(t,e){if(!n(t))return t;var r,i;if(e&&"function"==typeof(r=t.toString)&&!n(i=r.call(t)))return i;if("function"==typeof(r=t.valueOf)&&!n(i=r.call(t)))return i;if(!e&&"function"==typeof(r=t.toString)&&!n(i=r.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,e,r){var n=r(274);n(n.S,"Number",{isInteger:r(277)})},function(t,e,r){var n=r(6),i=r(126),o=r(7)("species");t.exports=function(t){var e;return i(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!i(e.prototype)||(e=void 0),n(e)&&(e=e[o],null===e&&(e=void 0))),void 0===e?Array:e}},function(t,e,r){var n=r(282);t.exports=function(t,e){return new(n(t))(e)}},function(t,e,r){"use strict";var n=r(3),i=r(29),o="number";t.exports=function(t){if("string"!==t&&t!==o&&"default"!==t)throw TypeError("Incorrect hint");return i(n(this),t!=o)}},function(t,e,r){var n=r(44),i=r(86),o=r(66);t.exports=function(t){var e=n(t),r=i.f;if(r)for(var a,f=r(t),s=o.f,u=0;f.length>u;)s.call(t,a=f[u++])&&e.push(a);return e}},function(t,e,r){var n=r(44),i=r(17);t.exports=function(t,e){for(var r,o=i(t),a=n(o),f=a.length,s=0;f>s;)if(o[r=a[s++]]===e)return r}},function(t,e,r){"use strict";var n=r(288),i=r(82),o=r(13);t.exports=function(){for(var t=o(this),e=arguments.length,r=Array(e),a=0,f=n._,s=!1;e>a;)(r[a]=arguments[a++])===f&&(s=!0);return function(){var n,o=this,a=arguments.length,u=0,h=0;if(!s&&!a)return i(t,r,o);if(n=r.slice(),s)for(;e>u;u++)n[u]===f&&(n[u]=arguments[h++]);for(;a>h;)n.push(arguments[h++]);return i(t,n,o)}}},function(t,e,r){t.exports=r(4)},function(t,e){t.exports=function(t,e){var r=e===Object(e)?function(t){return e[t]}:e;return function(e){return String(e).replace(t,r)}}},function(t,e,r){var n=r(0),i=r(289)(/[\\^$*+?.()|[\]{}]/g,"\\$&");n(n.S,"RegExp",{escape:function(t){return i(t)}})},function(t,e,r){var n=r(0);n(n.P,"Array",{copyWithin:r(167)}),r(54)("copyWithin")},function(t,e,r){"use strict";var n=r(0),i=r(27)(4);n(n.P+n.F*!r(25)([].every,!0),"Array",{every:function(t){return i(this,t,arguments[1])}})},function(t,e,r){var n=r(0);n(n.P,"Array",{fill:r(118)}),r(54)("fill")},function(t,e,r){"use strict";var n=r(0),i=r(27)(2);n(n.P+n.F*!r(25)([].filter,!0),"Array",{filter:function(t){return i(this,t,arguments[1])}})},function(t,e,r){"use strict";var n=r(0),i=r(27)(6),o="findIndex",a=!0;o in[]&&Array(1)[o](function(){a=!1}),n(n.P+n.F*a,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(54)(o)},function(t,e,r){"use strict";var n=r(0),i=r(27)(5),o="find",a=!0;o in[]&&Array(1)[o](function(){a=!1}),n(n.P+n.F*a,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(54)(o)},function(t,e,r){"use strict";var n=r(0),i=r(27)(0),o=r(25)([].forEach,!0);n(n.P+n.F*!o,"Array",{forEach:function(t){return i(this,t,arguments[1])}})},function(t,e,r){"use strict";var n=r(33),i=r(0),o=r(11),a=r(176),f=r(125),s=r(10),u=r(119),h=r(142);i(i.S+i.F*!r(84)(function(t){Array.from(t)}),"Array",{from:function(t){var e,r,i,c,d=o(t),l="function"==typeof this?this:Array,p=arguments.length,b=p>1?arguments[1]:void 0,v=void 0!==b,y=0,m=h(d);if(v&&(b=n(b,p>2?arguments[2]:void 0,2)),void 0==m||l==Array&&f(m))for(e=s(d.length),r=new l(e);e>y;y++)u(r,y,v?b(d[y],y):d[y]);else for(c=m.call(d),r=new l;!(i=c.next()).done;y++)u(r,y,v?a(c,b,[i.value,y],!0):i.value);return r.length=y,r}})},function(t,e,r){"use strict";var n=r(0),i=r(78)(!1),o=[].indexOf,a=!!o&&1/[1].indexOf(1,-0)<0;n(n.P+n.F*(a||!r(25)(o)),"Array",{indexOf:function(t){return a?o.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,e,r){var n=r(0);n(n.S,"Array",{isArray:r(126)})},function(t,e,r){"use strict";var n=r(0),i=r(17),o=[].join;n(n.P+n.F*(r(65)!=Object||!r(25)(o)),"Array",{join:function(t){return o.call(i(this),void 0===t?",":t)}})},function(t,e,r){"use strict";var n=r(0),i=r(17),o=r(38),a=r(10),f=[].lastIndexOf,s=!!f&&1/[1].lastIndexOf(1,-0)<0;n(n.P+n.F*(s||!r(25)(f)),"Array",{lastIndexOf:function(t){if(s)return f.apply(this,arguments)||0;var e=i(this),r=a(e.length),n=r-1;for(arguments.length>1&&(n=Math.min(n,o(arguments[1]))),n<0&&(n=r+n);n>=0;n--)if(n in e&&e[n]===t)return n||0;return-1}})},function(t,e,r){"use strict";var n=r(0),i=r(27)(1);n(n.P+n.F*!r(25)([].map,!0),"Array",{map:function(t){return i(this,t,arguments[1])}})},function(t,e,r){"use strict";var n=r(0),i=r(119);n(n.S+n.F*r(5)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments.length,r=new("function"==typeof this?this:Array)(e);e>t;)i(r,t,arguments[t++]);return r.length=e,r}})},function(t,e,r){"use strict";var n=r(0),i=r(169);n(n.P+n.F*!r(25)([].reduceRight,!0),"Array",{reduceRight:function(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,e,r){"use strict";var n=r(0),i=r(169);n(n.P+n.F*!r(25)([].reduce,!0),"Array",{reduce:function(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,e,r){"use strict";var n=r(0),i=r(123),o=r(23),a=r(47),f=r(10),s=[].slice;n(n.P+n.F*r(5)(function(){i&&s.call(i)}),"Array",{slice:function(t,e){var r=f(this.length),n=o(this);if(e=void 0===e?r:e,"Array"==n)return s.call(this,t,e);for(var i=a(t,r),u=a(e,r),h=f(u-i),c=Array(h),d=0;d9?t:"0"+t};n(n.P+n.F*(i(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!i(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(o.call(this)))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),r=t.getUTCMilliseconds(),n=e<0?"-":e>9999?"+":"";return n+("00000"+Math.abs(e)).slice(n?-6:-4)+"-"+a(t.getUTCMonth()+1)+"-"+a(t.getUTCDate())+"T"+a(t.getUTCHours())+":"+a(t.getUTCMinutes())+":"+a(t.getUTCSeconds())+"."+(r>99?r:"0"+a(r))+"Z"}})},function(t,e,r){"use strict";var n=r(0),i=r(11),o=r(29);n(n.P+n.F*r(5)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(t){var e=i(this),r=o(e);return"number"!=typeof r||isFinite(r)?e.toISOString():null}})},function(t,e,r){var n=r(7)("toPrimitive"),i=Date.prototype;n in i||r(14)(i,n,r(284))},function(t,e,r){var n=Date.prototype,i="Invalid Date",o="toString",a=n[o],f=n.getTime;new Date(NaN)+""!=i&&r(15)(n,o,function(){var t=f.call(this);return t===t?a.call(this):i})},function(t,e,r){var n=r(0);n(n.P,"Function",{bind:r(170)})},function(t,e,r){"use strict";var n=r(6),i=r(21),o=r(7)("hasInstance"),a=Function.prototype;o in a||r(9).f(a,o,{value:function(t){if("function"!=typeof this||!n(t))return!1;if(!n(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,e,r){var n=r(9).f,i=r(37),o=r(12),a=Function.prototype,f=/^\s*function ([^ (]*)/,s="name",u=Object.isExtensible||function(){return!0};s in a||r(8)&&n(a,s,{configurable:!0,get:function(){try{var t=this,e=(""+t).match(f)[1];return o(t,s)||!u(t)||n(t,s,i(5,e)),e}catch(t){return""}}})},function(t,e,r){var n=r(0),i=r(178),o=Math.sqrt,a=Math.acosh;n(n.S+n.F*!(a&&710==Math.floor(a(Number.MAX_VALUE))&&a(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,e,r){function n(t){return isFinite(t=+t)&&0!=t?t<0?-n(-t):Math.log(t+Math.sqrt(t*t+1)):t}var i=r(0),o=Math.asinh;i(i.S+i.F*!(o&&1/o(0)>0),"Math",{asinh:n})},function(t,e,r){var n=r(0),i=Math.atanh;n(n.S+n.F*!(i&&1/i(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,e,r){var n=r(0),i=r(130);n(n.S,"Math",{cbrt:function(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,e,r){var n=r(0);n(n.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,e,r){var n=r(0),i=Math.exp;n(n.S,"Math",{cosh:function(t){return(i(t=+t)+i(-t))/2}})},function(t,e,r){var n=r(0),i=r(129);n(n.S+n.F*(i!=Math.expm1),"Math",{expm1:i})},function(t,e,r){var n=r(0),i=r(130),o=Math.pow,a=o(2,-52),f=o(2,-23),s=o(2,127)*(2-f),u=o(2,-126),h=function(t){return t+1/a-1/a};n(n.S,"Math",{fround:function(t){var e,r,n=Math.abs(t),o=i(t);return ns||r!=r?o*(1/0):o*r)}})},function(t,e,r){var n=r(0),i=Math.abs;n(n.S,"Math",{hypot:function(t,e){for(var r,n,o=0,a=0,f=arguments.length,s=0;a0?(n=r/s,o+=n*n):o+=r;return s===1/0?1/0:s*Math.sqrt(o)}})},function(t,e,r){var n=r(0),i=Math.imul;n(n.S+n.F*r(5)(function(){return i(4294967295,5)!=-5||2!=i.length}),"Math",{imul:function(t,e){var r=65535,n=+t,i=+e,o=r&n,a=r&i;return 0|o*a+((r&n>>>16)*a+o*(r&i>>>16)<<16>>>0)}})},function(t,e,r){var n=r(0);n(n.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},function(t,e,r){var n=r(0);n(n.S,"Math",{log1p:r(178)})},function(t,e,r){var n=r(0);n(n.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,e,r){var n=r(0);n(n.S,"Math",{sign:r(130)})},function(t,e,r){var n=r(0),i=r(129),o=Math.exp;n(n.S+n.F*r(5)(function(){return!Math.sinh(-2e-17)!=-2e-17}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,e,r){var n=r(0),i=r(129),o=Math.exp;n(n.S,"Math",{tanh:function(t){var e=i(t=+t),r=i(-t);return e==1/0?1:r==1/0?-1:(e-r)/(o(t)+o(-t))}})},function(t,e,r){var n=r(0);n(n.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,e,r){"use strict";var n=r(4),i=r(12),o=r(23),a=r(124),f=r(29),s=r(5),u=r(43).f,h=r(20).f,c=r(9).f,d=r(58).trim,l="Number",p=n[l],b=p,v=p.prototype,y=o(r(42)(v))==l,m="trim"in String.prototype,g=function(t){var e=f(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():d(e,3);var r,n,i,o=e.charCodeAt(0);if(43===o||45===o){if(r=e.charCodeAt(2),88===r||120===r)return NaN}else if(48===o){switch(e.charCodeAt(1)){case 66:case 98:n=2,i=49;break;case 79:case 111:n=8,i=55;break;default:return+e}for(var a,s=e.slice(2),u=0,h=s.length;ui)return NaN;return parseInt(s,n)}}return+e};if(!p(" 0o1")||!p("0b1")||p("+0x1")){p=function(t){var e=arguments.length<1?0:t,r=this;return r instanceof p&&(y?s(function(){v.valueOf.call(r)}):o(r)!=l)?a(new b(g(e)),r,p):g(e)};for(var w,_=r(8)?u(b):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),M=0;_.length>M;M++)i(b,w=_[M])&&!i(p,w)&&c(p,w,h(b,w));p.prototype=v,v.constructor=p,r(15)(n,l,p)}},function(t,e,r){var n=r(0);n(n.S,"Number",{EPSILON:Math.pow(2,-52)})},function(t,e,r){var n=r(0),i=r(4).isFinite;n(n.S,"Number",{isFinite:function(t){return"number"==typeof t&&i(t)}})},function(t,e,r){var n=r(0);n(n.S,"Number",{isInteger:r(175)})},function(t,e,r){var n=r(0);n(n.S,"Number",{isNaN:function(t){return t!=t}})},function(t,e,r){var n=r(0),i=r(175),o=Math.abs;n(n.S,"Number",{isSafeInteger:function(t){return i(t)&&o(t)<=9007199254740991}})},function(t,e,r){var n=r(0);n(n.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,e,r){var n=r(0);n(n.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,e,r){var n=r(0),i=r(185);n(n.S+n.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(t,e,r){var n=r(0),i=r(186);n(n.S+n.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(t,e,r){"use strict";var n=r(0),i=r(38),o=r(166),a=r(137),f=1..toFixed,s=Math.floor,u=[0,0,0,0,0,0],h="Number.toFixed: incorrect invocation!",c="0",d=function(t,e){for(var r=-1,n=e;++r<6;)n+=t*u[r],u[r]=n%1e7,n=s(n/1e7)},l=function(t){for(var e=6,r=0;--e>=0;)r+=u[e],u[e]=s(r/t),r=r%t*1e7},p=function(){for(var t=6,e="";--t>=0;)if(""!==e||0===t||0!==u[t]){var r=String(u[t]);e=""===e?r:e+a.call(c,7-r.length)+r}return e},b=function(t,e,r){return 0===e?r:e%2===1?b(t,e-1,r*t):b(t*t,e/2,r)},v=function(t){for(var e=0,r=t;r>=4096;)e+=12,r/=4096;for(;r>=2;)e+=1,r/=2;return e};n(n.P+n.F*(!!f&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r(5)(function(){f.call({})})),"Number",{toFixed:function(t){var e,r,n,f,s=o(this,h),u=i(t),y="",m=c;if(u<0||u>20)throw RangeError(h);if(s!=s)return"NaN";if(s<=-1e21||s>=1e21)return String(s);if(s<0&&(y="-",s=-s),s>1e-21)if(e=v(s*b(2,69,1))-69,r=e<0?s*b(2,-e,1):s/b(2,e,1),r*=4503599627370496,e=52-e,e>0){for(d(0,r),n=u;n>=7;)d(1e7,0),n-=7;for(d(b(10,n,1),0),n=e-1;n>=23;)l(1<<23),n-=23;l(1<0?(f=m.length,m=y+(f<=u?"0."+a.call(c,u-f)+m:m.slice(0,f-u)+"."+m.slice(f-u))):m=y+m,m}})},function(t,e,r){"use strict";var n=r(0),i=r(5),o=r(166),a=1..toPrecision;n(n.P+n.F*(i(function(){return"1"!==a.call(1,void 0)})||!i(function(){a.call({})})),"Number",{toPrecision:function(t){var e=o(this,"Number#toPrecision: incorrect invocation!");return void 0===t?a.call(e):a.call(e,t)}})},function(t,e,r){var n=r(0);n(n.S+n.F,"Object",{assign:r(179)})},function(t,e,r){var n=r(0);n(n.S,"Object",{create:r(42)})},function(t,e,r){var n=r(0);n(n.S+n.F*!r(8),"Object",{defineProperties:r(180)})},function(t,e,r){var n=r(0);n(n.S+n.F*!r(8),"Object",{defineProperty:r(9).f})},function(t,e,r){var n=r(6),i=r(36).onFreeze;r(28)("freeze",function(t){return function(e){return t&&n(e)?t(i(e)):e}})},function(t,e,r){var n=r(17),i=r(20).f;r(28)("getOwnPropertyDescriptor",function(){return function(t,e){return i(n(t),e)}})},function(t,e,r){r(28)("getOwnPropertyNames",function(){return r(181).f})},function(t,e,r){var n=r(11),i=r(21);r(28)("getPrototypeOf",function(){return function(t){return i(n(t))}})},function(t,e,r){var n=r(6);r(28)("isExtensible",function(t){return function(e){return!!n(e)&&(!t||t(e))}})},function(t,e,r){var n=r(6);r(28)("isFrozen",function(t){return function(e){return!n(e)||!!t&&t(e)}})},function(t,e,r){var n=r(6);r(28)("isSealed",function(t){return function(e){return!n(e)||!!t&&t(e)}})},function(t,e,r){var n=r(0);n(n.S,"Object",{is:r(187)})},function(t,e,r){var n=r(11),i=r(44);r(28)("keys",function(){return function(t){return i(n(t))}})},function(t,e,r){var n=r(6),i=r(36).onFreeze;r(28)("preventExtensions",function(t){return function(e){return t&&n(e)?t(i(e)):e}})},function(t,e,r){var n=r(6),i=r(36).onFreeze;r(28)("seal",function(t){return function(e){return t&&n(e)?t(i(e)):e}})},function(t,e,r){var n=r(0);n(n.S,"Object",{setPrototypeOf:r(132).set})},function(t,e,r){"use strict";var n=r(64),i={};i[r(7)("toStringTag")]="z",i+""!="[object z]"&&r(15)(Object.prototype,"toString",function(){return"[object "+n(this)+"]"},!0)},function(t,e,r){var n=r(0),i=r(185);n(n.G+n.F*(parseFloat!=i),{parseFloat:i})},function(t,e,r){var n=r(0),i=r(186);n(n.G+n.F*(parseInt!=i),{parseInt:i})},function(t,e,r){"use strict";var n,i,o,a=r(41),f=r(4),s=r(33),u=r(64),h=r(0),c=r(6),d=r(13),l=r(40),p=r(55),b=r(134),v=r(139).set,y=r(131)(),m="Promise",g=f.TypeError,w=f.process,_=f[m],w=f.process,M="process"==u(w),S=function(){},E=!!function(){try{var t=_.resolve(1),e=(t.constructor={})[r(7)("species")]=function(t){t(S,S)};return(M||"function"==typeof PromiseRejectionEvent)&&t.then(S)instanceof e}catch(t){}}(),A=function(t,e){return t===e||t===_&&e===o},k=function(t){var e;return!(!c(t)||"function"!=typeof(e=t.then))&&e},x=function(t){return A(_,t)?new I(t):new i(t)},I=i=function(t){var e,r;this.promise=new t(function(t,n){if(void 0!==e||void 0!==r)throw g("Bad Promise constructor");e=t,r=n}),this.resolve=d(e),this.reject=d(r)},B=function(t){try{t()}catch(t){return{error:t}}},O=function(t,e){if(!t._n){t._n=!0;var r=t._c;y(function(){for(var n=t._v,i=1==t._s,o=0,a=function(e){var r,o,a=i?e.ok:e.fail,f=e.resolve,s=e.reject,u=e.domain;try{a?(i||(2==t._h&&T(t),t._h=1),a===!0?r=n:(u&&u.enter(),r=a(n),u&&u.exit()),r===e.promise?s(g("Promise-chain cycle")):(o=k(r))?o.call(r,f,s):f(r)):s(n)}catch(t){s(t)}};r.length>o;)a(r[o++]);t._c=[],t._n=!1,e&&!t._h&&R(t)})}},R=function(t){v.call(f,function(){var e,r,n,i=t._v;if(P(t)&&(e=B(function(){M?w.emit("unhandledRejection",i,t):(r=f.onunhandledrejection)?r({promise:t,reason:i}):(n=f.console)&&n.error&&n.error("Unhandled promise rejection",i)}),t._h=M||P(t)?2:1),t._a=void 0,e)throw e.error})},P=function(t){if(1==t._h)return!1;for(var e,r=t._a||t._c,n=0;r.length>n;)if(e=r[n++],e.fail||!P(e.promise))return!1;return!0},T=function(t){v.call(f,function(){var e;M?w.emit("rejectionHandled",t):(e=f.onrejectionhandled)&&e({promise:t,reason:t._v})})},j=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),O(e,!0))},C=function(t){var e,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===t)throw g("Promise can't be resolved itself");(e=k(t))?y(function(){var n={_w:r,_d:!1};try{e.call(t,s(C,n,1),s(j,n,1))}catch(t){j.call(n,t)}}):(r._v=t,r._s=1,O(r,!1))}catch(t){j.call({_w:r,_d:!1},t)}}};E||(_=function(t){l(this,_,m,"_h"),d(t),n.call(this);try{t(s(C,this,1),s(j,this,1))}catch(t){j.call(this,t)}},n=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},n.prototype=r(45)(_.prototype,{then:function(t,e){var r=x(b(this,_));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=M?w.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&O(this,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),I=function(){var t=new n;this.promise=t,this.resolve=s(C,t,1),this.reject=s(j,t,1)}),h(h.G+h.W+h.F*!E,{Promise:_}),r(57)(_,m),r(46)(m),o=r(32)[m],h(h.S+h.F*!E,m,{reject:function(t){var e=x(this),r=e.reject;return r(t),e.promise}}),h(h.S+h.F*(a||!E),m,{resolve:function(t){if(t instanceof _&&A(t.constructor,this))return t;var e=x(this),r=e.resolve;return r(t),e.promise}}),h(h.S+h.F*!(E&&r(84)(function(t){_.all(t).catch(S)})),m,{all:function(t){var e=this,r=x(e),n=r.resolve,i=r.reject,o=B(function(){var r=[],o=0,a=1;p(t,!1,function(t){var f=o++,s=!1;r.push(void 0),a++,e.resolve(t).then(function(t){s||(s=!0,r[f]=t,--a||n(r))},i)}),--a||n(r)});return o&&i(o.error),r.promise},race:function(t){var e=this,r=x(e),n=r.reject,i=B(function(){p(t,!1,function(t){e.resolve(t).then(r.resolve,n)})});return i&&n(i.error),r.promise}})},function(t,e,r){var n=r(0),i=r(13),o=r(3),a=(r(4).Reflect||{}).apply,f=Function.apply;n(n.S+n.F*!r(5)(function(){a(function(){})}),"Reflect",{apply:function(t,e,r){var n=i(t),s=o(r);return a?a(n,e,s):f.call(n,e,s)}})},function(t,e,r){var n=r(0),i=r(42),o=r(13),a=r(3),f=r(6),s=r(5),u=r(170),h=(r(4).Reflect||{}).construct,c=s(function(){function t(){}return!(h(function(){},[],t)instanceof t)}),d=!s(function(){h(function(){})});n(n.S+n.F*(c||d),"Reflect",{construct:function(t,e){o(t),a(e);var r=arguments.length<3?t:o(arguments[2]);if(d&&!c)return h(t,e,r);if(t==r){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var n=[null];return n.push.apply(n,e),new(u.apply(t,n))}var s=r.prototype,l=i(f(s)?s:Object.prototype),p=Function.apply.call(t,l,e);return f(p)?p:l}})},function(t,e,r){var n=r(9),i=r(0),o=r(3),a=r(29);i(i.S+i.F*r(5)(function(){Reflect.defineProperty(n.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,r){o(t),e=a(e,!0),o(r);try{return n.f(t,e,r),!0}catch(t){return!1}}})},function(t,e,r){var n=r(0),i=r(20).f,o=r(3);n(n.S,"Reflect",{deleteProperty:function(t,e){var r=i(o(t),e);return!(r&&!r.configurable)&&delete t[e]}})},function(t,e,r){"use strict";var n=r(0),i=r(3),o=function(t){this._t=i(t),this._i=0;var e,r=this._k=[];for(e in t)r.push(e)};r(127)(o,"Object",function(){var t,e=this,r=e._k;do if(e._i>=r.length)return{value:void 0,done:!0};while(!((t=r[e._i++])in e._t));return{value:t,done:!1}}),n(n.S,"Reflect",{enumerate:function(t){return new o(t)}})},function(t,e,r){var n=r(20),i=r(0),o=r(3);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return n.f(o(t),e)}})},function(t,e,r){var n=r(0),i=r(21),o=r(3);n(n.S,"Reflect",{getPrototypeOf:function(t){return i(o(t))}})},function(t,e,r){function n(t,e){var r,f,h=arguments.length<3?t:arguments[2];return u(t)===h?t[e]:(r=i.f(t,e))?a(r,"value")?r.value:void 0!==r.get?r.get.call(h):void 0:s(f=o(t))?n(f,e,h):void 0}var i=r(20),o=r(21),a=r(12),f=r(0),s=r(6),u=r(3);f(f.S,"Reflect",{get:n})},function(t,e,r){var n=r(0);n(n.S,"Reflect",{has:function(t,e){return e in t}})},function(t,e,r){var n=r(0),i=r(3),o=Object.isExtensible;n(n.S,"Reflect",{isExtensible:function(t){return i(t),!o||o(t)}})},function(t,e,r){var n=r(0);n(n.S,"Reflect",{ownKeys:r(184)})},function(t,e,r){var n=r(0),i=r(3),o=Object.preventExtensions;n(n.S,"Reflect",{preventExtensions:function(t){i(t);try{return o&&o(t),!0}catch(t){return!1}}})},function(t,e,r){var n=r(0),i=r(132);i&&n(n.S,"Reflect",{setPrototypeOf:function(t,e){i.check(t,e);try{return i.set(t,e),!0}catch(t){return!1}}})},function(t,e,r){function n(t,e,r){var s,d,l=arguments.length<4?t:arguments[3],p=o.f(h(t),e);if(!p){if(c(d=a(t)))return n(d,e,r,l);p=u(0)}return f(p,"value")?!(p.writable===!1||!c(l))&&(s=o.f(l,e)||u(0),s.value=r,i.f(l,e,s),!0):void 0!==p.set&&(p.set.call(l,r),!0)}var i=r(9),o=r(20),a=r(21),f=r(12),s=r(0),u=r(37),h=r(3),c=r(6);s(s.S,"Reflect",{set:n})},function(t,e,r){var n=r(4),i=r(124),o=r(9).f,a=r(43).f,f=r(83),s=r(81),u=n.RegExp,h=u,c=u.prototype,d=/a/g,l=/a/g,p=new u(d)!==d;if(r(8)&&(!p||r(5)(function(){return l[r(7)("match")]=!1,u(d)!=d||u(l)==l||"/a/i"!=u(d,"i")}))){u=function(t,e){var r=this instanceof u,n=f(t),o=void 0===e;return!r&&n&&t.constructor===u&&o?t:i(p?new h(n&&!o?t.source:t,e):h((n=t instanceof u)?t.source:t,n&&o?s.call(t):e),r?this:c,u)};for(var b=(function(t){t in u||o(u,t,{configurable:!0,get:function(){return h[t]},set:function(e){h[t]=e}})}),v=a(h),y=0;v.length>y;)b(v[y++]);c.constructor=u,u.prototype=c,r(15)(n,"RegExp",u)}r(46)("RegExp")},function(t,e,r){r(80)("match",1,function(t,e,r){return[function(r){"use strict";var n=t(this),i=void 0==r?void 0:r[e];return void 0!==i?i.call(r,n):new RegExp(r)[e](String(n))},r]})},function(t,e,r){ r(80)("replace",2,function(t,e,r){return[function(n,i){"use strict";var o=t(this),a=void 0==n?void 0:n[e];return void 0!==a?a.call(n,o,i):r.call(String(o),n,i)},r]})},function(t,e,r){r(80)("search",1,function(t,e,r){return[function(r){"use strict";var n=t(this),i=void 0==r?void 0:r[e];return void 0!==i?i.call(r,n):new RegExp(r)[e](String(n))},r]})},function(t,e,r){r(80)("split",2,function(t,e,n){"use strict";var i=r(83),o=n,a=[].push,f="split",s="length",u="lastIndex";if("c"=="abbc"[f](/(b)*/)[1]||4!="test"[f](/(?:)/,-1)[s]||2!="ab"[f](/(?:ab)*/)[s]||4!="."[f](/(.?)(.?)/)[s]||"."[f](/()()/)[s]>1||""[f](/.?/)[s]){var h=void 0===/()??/.exec("")[1];n=function(t,e){var r=String(this);if(void 0===t&&0===e)return[];if(!i(t))return o.call(r,t,e);var n,f,c,d,l,p=[],b=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),v=0,y=void 0===e?4294967295:e>>>0,m=new RegExp(t.source,b+"g");for(h||(n=new RegExp("^"+m.source+"$(?!\\s)",b));(f=m.exec(r))&&(c=f.index+f[0][s],!(c>v&&(p.push(r.slice(v,f.index)),!h&&f[s]>1&&f[0].replace(n,function(){for(l=1;l1&&f.index=y)));)m[u]===f.index&&m[u]++;return v===r[s]?!d&&m.test("")||p.push(""):p.push(r.slice(v)),p[s]>y?p.slice(0,y):p}}else"0"[f](void 0,0)[s]&&(n=function(t,e){return void 0===t&&0===e?[]:o.call(this,t,e)});return[function(r,i){var o=t(this),a=void 0==r?void 0:r[e];return void 0!==a?a.call(r,o,i):n.call(String(o),r,i)},n]})},function(t,e,r){"use strict";r(191);var n=r(3),i=r(81),o=r(8),a="toString",f=/./[a],s=function(t){r(15)(RegExp.prototype,a,t,!0)};r(5)(function(){return"/a/b"!=f.call({source:"a",flags:"b"})})?s(function(){var t=n(this);return"/".concat(t.source,"/","flags"in t?t.flags:!o&&t instanceof RegExp?i.call(t):void 0)}):f.name!=a&&s(function(){return f.call(this)})},function(t,e,r){"use strict";r(16)("anchor",function(t){return function(e){return t(this,"a","name",e)}})},function(t,e,r){"use strict";r(16)("big",function(t){return function(){return t(this,"big","","")}})},function(t,e,r){"use strict";r(16)("blink",function(t){return function(){return t(this,"blink","","")}})},function(t,e,r){"use strict";r(16)("bold",function(t){return function(){return t(this,"b","","")}})},function(t,e,r){"use strict";var n=r(0),i=r(135)(!1);n(n.P,"String",{codePointAt:function(t){return i(this,t)}})},function(t,e,r){"use strict";var n=r(0),i=r(10),o=r(136),a="endsWith",f=""[a];n(n.P+n.F*r(122)(a),"String",{endsWith:function(t){var e=o(this,t,a),r=arguments.length>1?arguments[1]:void 0,n=i(e.length),s=void 0===r?n:Math.min(i(r),n),u=String(t);return f?f.call(e,u,s):e.slice(s-u.length,s)===u}})},function(t,e,r){"use strict";r(16)("fixed",function(t){return function(){return t(this,"tt","","")}})},function(t,e,r){"use strict";r(16)("fontcolor",function(t){return function(e){return t(this,"font","color",e)}})},function(t,e,r){"use strict";r(16)("fontsize",function(t){return function(e){return t(this,"font","size",e)}})},function(t,e,r){var n=r(0),i=r(47),o=String.fromCharCode,a=String.fromCodePoint;n(n.S+n.F*(!!a&&1!=a.length),"String",{fromCodePoint:function(t){for(var e,r=[],n=arguments.length,a=0;n>a;){if(e=+arguments[a++],i(e,1114111)!==e)throw RangeError(e+" is not a valid code point");r.push(e<65536?o(e):o(((e-=65536)>>10)+55296,e%1024+56320))}return r.join("")}})},function(t,e,r){"use strict";var n=r(0),i=r(136),o="includes";n(n.P+n.F*r(122)(o),"String",{includes:function(t){return!!~i(this,t,o).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,r){"use strict";r(16)("italics",function(t){return function(){return t(this,"i","","")}})},function(t,e,r){"use strict";var n=r(135)(!0);r(128)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,r=this._i;return r>=e.length?{value:void 0,done:!0}:(t=n(e,r),this._i+=t.length,{value:t,done:!1})})},function(t,e,r){"use strict";r(16)("link",function(t){return function(e){return t(this,"a","href",e)}})},function(t,e,r){var n=r(0),i=r(17),o=r(10);n(n.S,"String",{raw:function(t){for(var e=i(t.raw),r=o(e.length),n=arguments.length,a=[],f=0;r>f;)a.push(String(e[f++])),f1?arguments[1]:void 0,e.length)),n=String(t);return f?f.call(e,n,r):e.slice(r,r+n.length)===n}})},function(t,e,r){"use strict";r(16)("strike",function(t){return function(){return t(this,"strike","","")}})},function(t,e,r){"use strict";r(16)("sub",function(t){return function(){return t(this,"sub","","")}})},function(t,e,r){"use strict";r(16)("sup",function(t){return function(){return t(this,"sup","","")}})},function(t,e,r){"use strict";r(58)("trim",function(t){return function(){return t(this,3)}})},function(t,e,r){"use strict";var n=r(4),i=r(12),o=r(8),a=r(0),f=r(15),s=r(36).KEY,u=r(5),h=r(87),c=r(57),d=r(48),l=r(7),p=r(189),b=r(141),v=r(286),y=r(285),m=r(126),g=r(3),w=r(17),_=r(29),M=r(37),S=r(42),E=r(181),A=r(20),k=r(9),x=r(44),I=A.f,B=k.f,O=E.f,R=n.Symbol,P=n.JSON,T=P&&P.stringify,j="prototype",C=l("_hidden"),N=l("toPrimitive"),L={}.propertyIsEnumerable,U=h("symbol-registry"),z=h("symbols"),D=h("op-symbols"),q=Object[j],F="function"==typeof R,K=n.QObject,G=!K||!K[j]||!K[j].findChild,V=o&&u(function(){return 7!=S(B({},"a",{get:function(){return B(this,"a",{value:7}).a}})).a})?function(t,e,r){var n=I(q,e);n&&delete q[e],B(t,e,r),n&&t!==q&&B(q,e,n)}:B,H=function(t){var e=z[t]=S(R[j]);return e._k=t,e},X=F&&"symbol"==typeof R.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof R},Y=function(t,e,r){return t===q&&Y(D,e,r),g(t),e=_(e,!0),g(r),i(z,e)?(r.enumerable?(i(t,C)&&t[C][e]&&(t[C][e]=!1),r=S(r,{enumerable:M(0,!1)})):(i(t,C)||B(t,C,M(1,{})),t[C][e]=!0),V(t,e,r)):B(t,e,r)},W=function(t,e){g(t);for(var r,n=y(e=w(e)),i=0,o=n.length;o>i;)Y(t,r=n[i++],e[r]);return t},Z=function(t,e){return void 0===e?S(t):W(S(t),e)},J=function(t){var e=L.call(this,t=_(t,!0));return!(this===q&&i(z,t)&&!i(D,t))&&(!(e||!i(this,t)||!i(z,t)||i(this,C)&&this[C][t])||e)},$=function(t,e){if(t=w(t),e=_(e,!0),t!==q||!i(z,e)||i(D,e)){var r=I(t,e);return!r||!i(z,e)||i(t,C)&&t[C][e]||(r.enumerable=!0),r}},Q=function(t){for(var e,r=O(w(t)),n=[],o=0;r.length>o;)i(z,e=r[o++])||e==C||e==s||n.push(e);return n},tt=function(t){for(var e,r=t===q,n=O(r?D:w(t)),o=[],a=0;n.length>a;)!i(z,e=n[a++])||r&&!i(q,e)||o.push(z[e]);return o};F||(R=function(){if(this instanceof R)throw TypeError("Symbol is not a constructor!");var t=d(arguments.length>0?arguments[0]:void 0),e=function(r){this===q&&e.call(D,r),i(this,C)&&i(this[C],t)&&(this[C][t]=!1),V(this,t,M(1,r))};return o&&G&&V(q,t,{configurable:!0,set:e}),H(t)},f(R[j],"toString",function(){return this._k}),A.f=$,k.f=Y,r(43).f=E.f=Q,r(66).f=J,r(86).f=tt,o&&!r(41)&&f(q,"propertyIsEnumerable",J,!0),p.f=function(t){return H(l(t))}),a(a.G+a.W+a.F*!F,{Symbol:R});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),rt=0;et.length>rt;)l(et[rt++]);for(var et=x(l.store),rt=0;et.length>rt;)b(et[rt++]);a(a.S+a.F*!F,"Symbol",{for:function(t){return i(U,t+="")?U[t]:U[t]=R(t)},keyFor:function(t){if(X(t))return v(U,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){G=!0},useSimple:function(){G=!1}}),a(a.S+a.F*!F,"Object",{create:Z,defineProperty:Y,defineProperties:W,getOwnPropertyDescriptor:$,getOwnPropertyNames:Q,getOwnPropertySymbols:tt}),P&&a(a.S+a.F*(!F||u(function(){var t=R();return"[null]"!=T([t])||"{}"!=T({a:t})||"{}"!=T(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!X(t)){for(var e,r,n=[t],i=1;arguments.length>i;)n.push(arguments[i++]);return e=n[1],"function"==typeof e&&(r=e),!r&&m(e)||(e=function(t,e){if(r&&(e=r.call(this,t,e)),!X(e))return e}),n[1]=e,T.apply(P,n)}}}),R[j][N]||r(14)(R[j],N,R[j].valueOf),c(R,"Symbol"),c(Math,"Math",!0),c(n.JSON,"JSON",!0)},function(t,e,r){"use strict";var n=r(0),i=r(88),o=r(140),a=r(3),f=r(47),s=r(10),u=r(6),h=r(4).ArrayBuffer,c=r(134),d=o.ArrayBuffer,l=o.DataView,p=i.ABV&&h.isView,b=d.prototype.slice,v=i.VIEW,y="ArrayBuffer";n(n.G+n.W+n.F*(h!==d),{ArrayBuffer:d}),n(n.S+n.F*!i.CONSTR,y,{isView:function(t){return p&&p(t)||u(t)&&v in t}}),n(n.P+n.U+n.F*r(5)(function(){return!new d(2).slice(1,void 0).byteLength}),y,{slice:function(t,e){if(void 0!==b&&void 0===e)return b.call(a(this),t);for(var r=a(this).byteLength,n=f(t,r),i=f(void 0===e?r:e,r),o=new(c(this,d))(s(i-n)),u=new l(this),h=new l(o),p=0;n0?arguments[0]:void 0)}},{add:function(t){return n.def(this,t,!0)}},n,!1,!0)},function(t,e,r){"use strict";var n=r(0),i=r(78)(!0);n(n.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),r(54)("includes")},function(t,e,r){var n=r(0),i=r(131)(),o=r(4).process,a="process"==r(23)(o);n(n.G,{asap:function(t){var e=a&&o.domain;i(e?e.bind(t):t)}})},function(t,e,r){var n=r(0),i=r(23);n(n.S,"Error",{isError:function(t){return"Error"===i(t)}})},function(t,e,r){var n=r(0);n(n.P+n.R,"Map",{toJSON:r(172)("Map")})},function(t,e,r){var n=r(0);n(n.S,"Math",{iaddh:function(t,e,r,n){var i=t>>>0,o=e>>>0,a=r>>>0;return o+(n>>>0)+((i&a|(i|a)&~(i+a>>>0))>>>31)|0}})},function(t,e,r){var n=r(0);n(n.S,"Math",{imulh:function(t,e){var r=65535,n=+t,i=+e,o=n&r,a=i&r,f=n>>16,s=i>>16,u=(f*a>>>0)+(o*a>>>16);return f*s+(u>>16)+((o*s>>>0)+(u&r)>>16)}})},function(t,e,r){var n=r(0);n(n.S,"Math",{isubh:function(t,e,r,n){var i=t>>>0,o=e>>>0,a=r>>>0;return o-(n>>>0)-((~i&a|~(i^a)&i-a>>>0)>>>31)|0}})},function(t,e,r){var n=r(0);n(n.S,"Math",{umulh:function(t,e){var r=65535,n=+t,i=+e,o=n&r,a=i&r,f=n>>>16,s=i>>>16,u=(f*a>>>0)+(o*a>>>16);return f*s+(u>>>16)+((o*s>>>0)+(u&r)>>>16)}})},function(t,e,r){"use strict";var n=r(0),i=r(11),o=r(13),a=r(9);r(8)&&n(n.P+r(85),"Object",{__defineGetter__:function(t,e){a.f(i(this),t,{get:o(e),enumerable:!0,configurable:!0})}})},function(t,e,r){"use strict";var n=r(0),i=r(11),o=r(13),a=r(9);r(8)&&n(n.P+r(85),"Object",{__defineSetter__:function(t,e){a.f(i(this),t,{set:o(e),enumerable:!0,configurable:!0})}})},function(t,e,r){var n=r(0),i=r(183)(!0);n(n.S,"Object",{entries:function(t){return i(t)}})},function(t,e,r){var n=r(0),i=r(184),o=r(17),a=r(20),f=r(119);n(n.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,r=o(t),n=a.f,s=i(r),u={},h=0;s.length>h;)f(u,e=s[h++],n(r,e));return u}})},function(t,e,r){"use strict";var n=r(0),i=r(11),o=r(29),a=r(21),f=r(20).f;r(8)&&n(n.P+r(85),"Object",{__lookupGetter__:function(t){var e,r=i(this),n=o(t,!0);do if(e=f(r,n))return e.get;while(r=a(r))}})},function(t,e,r){"use strict";var n=r(0),i=r(11),o=r(29),a=r(21),f=r(20).f;r(8)&&n(n.P+r(85),"Object",{__lookupSetter__:function(t){var e,r=i(this),n=o(t,!0);do if(e=f(r,n))return e.set;while(r=a(r))}})},function(t,e,r){var n=r(0),i=r(183)(!1);n(n.S,"Object",{values:function(t){return i(t)}})},function(t,e,r){"use strict";var n=r(0),i=r(4),o=r(32),a=r(131)(),f=r(7)("observable"),s=r(13),u=r(3),h=r(40),c=r(45),d=r(14),l=r(55),p=l.RETURN,b=function(t){return null==t?void 0:s(t)},v=function(t){var e=t._c;e&&(t._c=void 0,e())},y=function(t){return void 0===t._o},m=function(t){y(t)||(t._o=void 0,v(t))},g=function(t,e){u(t),this._c=void 0,this._o=t,t=new w(this);try{var r=e(t),n=r;null!=r&&("function"==typeof r.unsubscribe?r=function(){n.unsubscribe()}:s(r),this._c=r)}catch(e){return void t.error(e)}y(this)&&v(this)};g.prototype=c({},{unsubscribe:function(){m(this)}});var w=function(t){this._s=t};w.prototype=c({},{next:function(t){var e=this._s;if(!y(e)){var r=e._o;try{var n=b(r.next);if(n)return n.call(r,t)}catch(t){try{m(e)}finally{throw t}}}},error:function(t){var e=this._s;if(y(e))throw t;var r=e._o;e._o=void 0;try{var n=b(r.error);if(!n)throw t;t=n.call(r,t)}catch(t){try{v(e)}finally{throw t}}return v(e),t},complete:function(t){var e=this._s;if(!y(e)){var r=e._o;e._o=void 0;try{var n=b(r.complete);t=n?n.call(r,t):void 0}catch(t){try{v(e)}finally{throw t}}return v(e),t}}});var _=function(t){h(this,_,"Observable","_f")._f=s(t)};c(_.prototype,{subscribe:function(t){return new g(t,this._f)},forEach:function(t){var e=this;return new(o.Promise||i.Promise)(function(r,n){s(t);var i=e.subscribe({next:function(e){try{return t(e)}catch(t){n(t),i.unsubscribe()}},error:n,complete:r})})}}),c(_,{from:function(t){var e="function"==typeof this?this:_,r=b(u(t)[f]);if(r){var n=u(r.call(t));return n.constructor===e?n:new e(function(t){return n.subscribe(t)})}return new e(function(e){var r=!1;return a(function(){if(!r){try{if(l(t,!1,function(t){if(e.next(t),r)return p})===p)return}catch(t){if(r)throw t;return void e.error(t)}e.complete()}}),function(){r=!0}})},of:function(){for(var t=0,e=arguments.length,r=Array(e);t1?arguments[1]:void 0,!1)}})},function(t,e,r){"use strict";var n=r(0),i=r(188);n(n.P,"String",{padStart:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},function(t,e,r){"use strict";r(58)("trimLeft",function(t){return function(){return t(this,1)}},"trimStart")},function(t,e,r){"use strict";r(58)("trimRight",function(t){return function(){return t(this,2)}},"trimEnd")},function(t,e,r){r(141)("asyncIterator")},function(t,e,r){r(141)("observable")},function(t,e,r){var n=r(0);n(n.S,"System",{global:r(4)})},function(t,e,r){for(var n=r(143),i=r(15),o=r(4),a=r(14),f=r(56),s=r(7),u=s("iterator"),h=s("toStringTag"),c=f.Array,d=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],l=0;l<5;l++){var p,b=d[l],v=o[b],y=v&&v.prototype;if(y){y[u]||a(y,u,c),y[h]||a(y,h,b),f[b]=c;for(p in n)y[p]||i(y,p,n[p],!0)}}},function(t,e,r){var n=r(0),i=r(139);n(n.G+n.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,e,r){var n=r(4),i=r(0),o=r(82),a=r(287),f=n.navigator,s=!!f&&/MSIE .\./.test(f.userAgent),u=function(t){return s?function(e,r){return t(o(a,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),r)}:t};i(i.G+i.B+i.F*s,{setTimeout:u(n.setTimeout),setInterval:u(n.setInterval)})},function(t,e,r){r(410),r(349),r(351),r(350),r(353),r(355),r(360),r(354),r(352),r(362),r(361),r(357),r(358),r(356),r(348),r(359),r(363),r(364),r(316),r(318),r(317),r(366),r(365),r(336),r(346),r(347),r(337),r(338),r(339),r(340),r(341),r(342),r(343),r(344),r(345),r(319),r(320),r(321),r(322),r(323),r(324),r(325),r(326),r(327),r(328),r(329),r(330),r(331),r(332),r(333),r(334),r(335),r(397),r(402),r(409),r(400),r(392),r(393),r(398),r(403),r(405),r(388),r(389),r(390),r(391),r(394),r(395),r(396),r(399),r(401),r(404),r(406),r(407),r(408),r(311),r(313),r(312),r(315),r(314),r(300),r(298),r(304),r(301),r(307),r(309),r(297),r(303),r(294),r(308),r(292),r(306),r(305),r(299),r(302),r(291),r(293),r(296),r(295),r(310),r(143),r(382),r(387),r(191),r(383),r(384),r(385),r(386),r(367),r(190),r(192),r(193),r(422),r(411),r(412),r(417),r(420),r(421),r(415),r(418),r(416),r(419),r(413),r(414),r(368),r(369),r(370),r(371),r(372),r(375),r(373),r(374),r(376),r(377),r(378),r(379),r(381),r(380),r(423),r(449),r(452),r(451),r(453),r(454),r(450),r(455),r(456),r(434),r(437),r(433),r(431),r(432),r(435),r(436),r(426),r(448),r(457),r(425),r(427),r(429),r(428),r(430),r(439),r(440),r(442),r(441),r(444),r(443),r(445),r(446),r(447),r(424),r(438),r(460),r(459),r(458),t.exports=r(32)},function(t,e,r){t.exports=r(463)("ed25519")},function(t,e,r){(function(n,i){function o(t){"string"==typeof t?t={bindings:t}:t||(t={}),t.__proto__=c,t.module_root||(t.module_root=e.getRoot(e.getFileName())),".node"!=f.extname(t.bindings)&&(t.bindings+=".node");for(var r,n,i,o=[],a=0,u=t.try.length;a=6.0.0 <7.0.0",_npmVersion:"3.10.3",_nodeVersion:"6.3.0",_npmUser:{name:"indutny",email:"fedor@indutny.com"},dist:{shasum:"e4c81e0829cf0a65ab70e998b8232723b5c1bc48",tarball:"https://registry.npmjs.org/elliptic/-/elliptic-6.3.2.tgz"},maintainers:[{name:"indutny",email:"fedor@indutny.com"}],_npmOperationalInternal:{host:"packages-16-east.internal.npmjs.com",tmp:"tmp/elliptic-6.3.2.tgz_1473938837205_0.3108903462998569"},directories:{},_resolved:"https://registry.npmjs.org/elliptic/-/elliptic-6.3.2.tgz"}},function(t,e){t.exports={"2.16.840.1.101.3.4.1.1":"aes-128-ecb","2.16.840.1.101.3.4.1.2":"aes-128-cbc","2.16.840.1.101.3.4.1.3":"aes-128-ofb","2.16.840.1.101.3.4.1.4":"aes-128-cfb","2.16.840.1.101.3.4.1.21":"aes-192-ecb","2.16.840.1.101.3.4.1.22":"aes-192-cbc","2.16.840.1.101.3.4.1.23":"aes-192-ofb","2.16.840.1.101.3.4.1.24":"aes-192-cfb","2.16.840.1.101.3.4.1.41":"aes-256-ecb","2.16.840.1.101.3.4.1.42":"aes-256-cbc","2.16.840.1.101.3.4.1.43":"aes-256-ofb","2.16.840.1.101.3.4.1.44":"aes-256-cfb"}},function(t,e){t.exports={name:"elliptic",version:"6.3.2",description:"EC cryptography",main:"lib/elliptic.js",files:["lib"],scripts:{jscs:"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",jshint:"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",lint:"npm run jscs && npm run jshint",unit:"istanbul test _mocha --reporter=spec test/index.js",test:"npm run lint && npm run unit",version:"grunt dist && git add dist/"},repository:{type:"git",url:"git+ssh://git@github.com/indutny/elliptic.git"},keywords:["EC","Elliptic","curve","Cryptography"],author:{name:"Fedor Indutny",email:"fedor@indutny.com"},license:"MIT",bugs:{url:"https://github.com/indutny/elliptic/issues"},homepage:"https://github.com/indutny/elliptic",devDependencies:{brfs:"^1.4.3",coveralls:"^2.11.3",grunt:"^0.4.5","grunt-browserify":"^5.0.0","grunt-contrib-connect":"^1.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^1.0.1","grunt-mocha-istanbul":"^3.0.1","grunt-saucelabs":"^8.6.2",istanbul:"^0.4.2",jscs:"^2.9.0",jshint:"^2.6.0",mocha:"^2.1.0"},dependencies:{"bn.js":"^4.4.0",brorand:"^1.0.1","hash.js":"^1.0.0",inherits:"^2.0.1"},gitHead:"cbace4683a4a548dc0306ef36756151a20299cd5",_id:"elliptic@6.3.2",_shasum:"e4c81e0829cf0a65ab70e998b8232723b5c1bc48",_from:"elliptic@>=6.0.0 <7.0.0",_npmVersion:"3.10.3",_nodeVersion:"6.3.0",_npmUser:{name:"indutny",email:"fedor@indutny.com"},dist:{shasum:"e4c81e0829cf0a65ab70e998b8232723b5c1bc48",tarball:"https://registry.npmjs.org/elliptic/-/elliptic-6.3.2.tgz"},maintainers:[{name:"indutny",email:"fedor@indutny.com"}],_npmOperationalInternal:{host:"packages-16-east.internal.npmjs.com",tmp:"tmp/elliptic-6.3.2.tgz_1473938837205_0.3108903462998569"},directories:{},_resolved:"https://registry.npmjs.org/elliptic/-/elliptic-6.3.2.tgz"}},function(t,e){t.exports={modp1:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},modp2:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},modp5:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},modp14:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},modp15:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},modp16:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" },modp17:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},modp18:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}}},function(t,e){t.exports={"2.16.840.1.101.3.4.1.1":"aes-128-ecb","2.16.840.1.101.3.4.1.2":"aes-128-cbc","2.16.840.1.101.3.4.1.3":"aes-128-ofb","2.16.840.1.101.3.4.1.4":"aes-128-cfb","2.16.840.1.101.3.4.1.21":"aes-192-ecb","2.16.840.1.101.3.4.1.22":"aes-192-cbc","2.16.840.1.101.3.4.1.23":"aes-192-ofb","2.16.840.1.101.3.4.1.24":"aes-192-cfb","2.16.840.1.101.3.4.1.41":"aes-256-ecb","2.16.840.1.101.3.4.1.42":"aes-256-cbc","2.16.840.1.101.3.4.1.43":"aes-256-ofb","2.16.840.1.101.3.4.1.44":"aes-256-cfb"}},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=r(195),f=function(t){function e(){return n(this,e),i(this,Object.getPrototypeOf(e).apply(this,arguments))}return o(e,t),e}(a);t.exports=f},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=r(195),f=function(t){function e(){return n(this,e),i(this,Object.getPrototypeOf(e).apply(this,arguments))}return o(e,t),e}(a);t.exports=f},function(t,e,r){"use strict";(function(e){function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=function(){function t(t,e){for(var r=0;r127){var e=Math.ceil(t.length.toString(2).length/8);this.skip(e)}this.skip(t.length)}},{key:"write",value:function(t){this.size+=t.length}},{key:"skip",value:function(t){this.size+=t}},{key:"getSize",value:function(){return this.size}}]),t}();[1,2,4,8].forEach(function(t){a.prototype["writeUInt"+8*t]=function(e){return this.writeUInt(e,t)}}),t.exports=a}).call(e,r(1).Buffer)},function(t,e,r){"use strict";(function(e){function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=function(){function t(t,e){for(var r=0;rt.MAX_INT_BYTES)throw new Error("Tried to read too large integer (requested: "+e+", max: "+t.MAX_INT_BYTES+")");this.ensureAvailable(e);var r=this.buffer.readUIntBE(this.cursor,e);return r}},{key:"skipUInt",value:function(t){this.skip(t)}},{key:"readUInt64",value:function(){return[this.readUInt32(),this.readUInt32()]}},{key:"peekUInt64",value:function(){this.bookmark();var t=this.readUInt64();return this.restore(),t}},{key:"skipUInt64",value:function(){this.skip(8)}},{key:"readVarUInt",value:function(){var e=this.readVarOctetString();if(e.length>t.MAX_INT_BYTES)throw new a("UInt of length "+e.length+" too large to parse as integer (max: "+t.MAX_INT_BYTES+")");if(0===e.length)throw new a("UInt of length 0 is invalid");return e.readUIntBE(0,e.length)}},{key:"peekVarUInt",value:function(){this.bookmark();var t=this.readVarUInt();return this.restore(),t}},{key:"skipVarUInt",value:function(){this.skipVarOctetString()}},{key:"readOctetString",value:function(t){return this.read(t)}},{key:"peekOctetString",value:function(t){return this.peek(t)}},{key:"skipOctetString",value:function(t){return this.skip(t)}},{key:"readLengthPrefix",value:function(){var e=this.readUInt8();if(e&t.HIGH_BIT){var r=e&t.LOWER_SEVEN_BITS,n=this.readUInt(r),i=Math.max(128,1<<8*(r-1));if(n8*r)throw new Error("UInt "+t+" does not fit in "+r+" bytes");var n=new e(r);n.writeUIntBE(t,0,r),this.write(n)}},{key:"writeVarUInt",value:function(r){if(e.isBuffer(r))return void this.writeVarOctetString(r);if(!o(r))throw new Error("UInt must be an integer");if(r<0)throw new Error("UInt must be positive");if(r>t.MAX_SAFE_INTEGER)throw new Error("UInt is too large");var n=Math.ceil(r.toString(2).length/8),i=new e(n);i.writeUIntBE(r,0,n),this.writeVarOctetString(i)}},{key:"writeUInt64",value:function(e){if(o(e)&&e<=t.MAX_SAFE_INTEGER)return this.writeUInt32(Math.floor(e/4294967296)),void this.writeUInt32(4294967295&e);if(!Array.isArray(e)||2!==e.length||!o(e[0])||!o(e[1]))throw new TypeError("Expected 64-bit integer as an array of two 32-bit words");this.writeUInt32(e[0]),this.writeUInt32(e[1])}},{key:"writeOctetString",value:function(t,e){if(t.length!==e)throw new Error("Incorrect length for octet string (actual: "+t.length+", expected: "+e+")");this.write(t)}},{key:"writeVarOctetString",value:function(t){if(!e.isBuffer(t))throw new TypeError("Expects a buffer");var r=128;if(t.length<=127)this.writeUInt8(t.length);else{var n=Math.ceil(t.length.toString(2).length/8);this.writeUInt8(r|n),this.writeUInt(t.length,n)}this.write(t)}},{key:"write",value:function(t){this.components.push(t)}},{key:"getBuffer",value:function(){return e.concat(this.components)}}]),t}();a.MAX_SAFE_INTEGER=r(475),[1,2,4].forEach(function(t){a.prototype["writeUInt"+8*t]=function(e){this.writeUInt(e,t)}}),t.exports=a}).call(e,r(1).Buffer)},function(t,e,r){r(487),t.exports=9007199254740991},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,r){var n=r(89);t.exports=function(t){if(!n(t))throw TypeError(t+" is not an object!");return t}},function(t,e,r){var n=r(476);t.exports=function(t,e,r){if(n(t),void 0===e)return t;switch(r){case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)}}return function(){return t.apply(e,arguments)}}},function(t,e,r){var n=r(89),i=r(200).document,o=n(i)&&n(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,e,r){var n=r(483),i=r(484);t.exports=r(144)?function(t,e,r){return n.f(t,e,i(1,r))}:function(t,e,r){return t[e]=r,t}},function(t,e,r){t.exports=!r(144)&&!r(199)(function(){return 7!=Object.defineProperty(r(479)("div"),"a",{get:function(){return 7}}).a})},function(t,e,r){var n=r(89),i=Math.floor;t.exports=function(t){return!n(t)&&isFinite(t)&&i(t)===t}},function(t,e,r){var n=r(477),i=r(481),o=r(485),a=Object.defineProperty;e.f=r(144)?Object.defineProperty:function(t,e,r){if(n(t),e=o(e,!0),n(r),i)try{return a(t,e,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(t[e]=r.value),t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,r){var n=r(89);t.exports=function(t,e){if(!n(t))return t;var r,i;if(e&&"function"==typeof(r=t.toString)&&!n(i=r.call(t)))return i;if("function"==typeof(r=t.valueOf)&&!n(i=r.call(t)))return i;if(!e&&"function"==typeof(r=t.toString)&&!n(i=r.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,e,r){var n=r(198);n(n.S,"Number",{isInteger:r(482)})},function(t,e,r){var n=r(198);n(n.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,e,r){!function(t){"use strict";function e(t,e,r,n){t[e]=r>>24&255,t[e+1]=r>>16&255,t[e+2]=r>>8&255,t[e+3]=255&r,t[e+4]=n>>24&255,t[e+5]=n>>16&255,t[e+6]=n>>8&255,t[e+7]=255&n}function n(t,e,r,n,i){var o,a=0;for(o=0;o>>8)-1}function i(t,e,r,i){return n(t,e,r,i,16)}function o(t,e,r,i){return n(t,e,r,i,32)}function a(t,e,r,n){for(var i,o=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&r[0]|(255&r[1])<<8|(255&r[2])<<16|(255&r[3])<<24,f=255&r[4]|(255&r[5])<<8|(255&r[6])<<16|(255&r[7])<<24,s=255&r[8]|(255&r[9])<<8|(255&r[10])<<16|(255&r[11])<<24,u=255&r[12]|(255&r[13])<<8|(255&r[14])<<16|(255&r[15])<<24,h=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,c=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,d=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,l=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,p=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,b=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,v=255&r[16]|(255&r[17])<<8|(255&r[18])<<16|(255&r[19])<<24,y=255&r[20]|(255&r[21])<<8|(255&r[22])<<16|(255&r[23])<<24,m=255&r[24]|(255&r[25])<<8|(255&r[26])<<16|(255&r[27])<<24,g=255&r[28]|(255&r[29])<<8|(255&r[30])<<16|(255&r[31])<<24,w=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,_=o,M=a,S=f,E=s,A=u,k=h,x=c,I=d,B=l,O=p,R=b,P=v,T=y,j=m,C=g,N=w,L=0;L<20;L+=2)i=_+T|0,A^=i<<7|i>>>25,i=A+_|0,B^=i<<9|i>>>23,i=B+A|0,T^=i<<13|i>>>19,i=T+B|0,_^=i<<18|i>>>14,i=k+M|0,O^=i<<7|i>>>25,i=O+k|0,j^=i<<9|i>>>23,i=j+O|0,M^=i<<13|i>>>19,i=M+j|0,k^=i<<18|i>>>14,i=R+x|0,C^=i<<7|i>>>25,i=C+R|0,S^=i<<9|i>>>23,i=S+C|0,x^=i<<13|i>>>19,i=x+S|0,R^=i<<18|i>>>14,i=N+P|0,E^=i<<7|i>>>25,i=E+N|0,I^=i<<9|i>>>23,i=I+E|0,P^=i<<13|i>>>19,i=P+I|0,N^=i<<18|i>>>14,i=_+E|0,M^=i<<7|i>>>25,i=M+_|0,S^=i<<9|i>>>23,i=S+M|0,E^=i<<13|i>>>19,i=E+S|0,_^=i<<18|i>>>14,i=k+A|0,x^=i<<7|i>>>25,i=x+k|0,I^=i<<9|i>>>23,i=I+x|0,A^=i<<13|i>>>19,i=A+I|0,k^=i<<18|i>>>14,i=R+O|0,P^=i<<7|i>>>25,i=P+R|0,B^=i<<9|i>>>23,i=B+P|0,O^=i<<13|i>>>19,i=O+B|0,R^=i<<18|i>>>14,i=N+C|0,T^=i<<7|i>>>25,i=T+N|0,j^=i<<9|i>>>23,i=j+T|0,C^=i<<13|i>>>19,i=C+j|0,N^=i<<18|i>>>14;_=_+o|0,M=M+a|0,S=S+f|0,E=E+s|0,A=A+u|0,k=k+h|0,x=x+c|0,I=I+d|0,B=B+l|0,O=O+p|0,R=R+b|0,P=P+v|0,T=T+y|0,j=j+m|0,C=C+g|0,N=N+w|0,t[0]=_>>>0&255,t[1]=_>>>8&255,t[2]=_>>>16&255,t[3]=_>>>24&255,t[4]=M>>>0&255,t[5]=M>>>8&255,t[6]=M>>>16&255,t[7]=M>>>24&255,t[8]=S>>>0&255,t[9]=S>>>8&255,t[10]=S>>>16&255,t[11]=S>>>24&255,t[12]=E>>>0&255,t[13]=E>>>8&255,t[14]=E>>>16&255,t[15]=E>>>24&255,t[16]=A>>>0&255,t[17]=A>>>8&255,t[18]=A>>>16&255,t[19]=A>>>24&255,t[20]=k>>>0&255,t[21]=k>>>8&255,t[22]=k>>>16&255,t[23]=k>>>24&255,t[24]=x>>>0&255,t[25]=x>>>8&255,t[26]=x>>>16&255,t[27]=x>>>24&255,t[28]=I>>>0&255,t[29]=I>>>8&255,t[30]=I>>>16&255,t[31]=I>>>24&255,t[32]=B>>>0&255,t[33]=B>>>8&255,t[34]=B>>>16&255,t[35]=B>>>24&255,t[36]=O>>>0&255,t[37]=O>>>8&255,t[38]=O>>>16&255,t[39]=O>>>24&255,t[40]=R>>>0&255,t[41]=R>>>8&255,t[42]=R>>>16&255,t[43]=R>>>24&255,t[44]=P>>>0&255,t[45]=P>>>8&255,t[46]=P>>>16&255,t[47]=P>>>24&255,t[48]=T>>>0&255,t[49]=T>>>8&255,t[50]=T>>>16&255,t[51]=T>>>24&255,t[52]=j>>>0&255,t[53]=j>>>8&255,t[54]=j>>>16&255,t[55]=j>>>24&255,t[56]=C>>>0&255,t[57]=C>>>8&255,t[58]=C>>>16&255,t[59]=C>>>24&255,t[60]=N>>>0&255,t[61]=N>>>8&255,t[62]=N>>>16&255,t[63]=N>>>24&255}function f(t,e,r,n){for(var i,o=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&r[0]|(255&r[1])<<8|(255&r[2])<<16|(255&r[3])<<24,f=255&r[4]|(255&r[5])<<8|(255&r[6])<<16|(255&r[7])<<24,s=255&r[8]|(255&r[9])<<8|(255&r[10])<<16|(255&r[11])<<24,u=255&r[12]|(255&r[13])<<8|(255&r[14])<<16|(255&r[15])<<24,h=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,c=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,d=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,l=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,p=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,b=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,v=255&r[16]|(255&r[17])<<8|(255&r[18])<<16|(255&r[19])<<24,y=255&r[20]|(255&r[21])<<8|(255&r[22])<<16|(255&r[23])<<24,m=255&r[24]|(255&r[25])<<8|(255&r[26])<<16|(255&r[27])<<24,g=255&r[28]|(255&r[29])<<8|(255&r[30])<<16|(255&r[31])<<24,w=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,_=o,M=a,S=f,E=s,A=u,k=h,x=c,I=d,B=l,O=p,R=b,P=v,T=y,j=m,C=g,N=w,L=0;L<20;L+=2)i=_+T|0,A^=i<<7|i>>>25,i=A+_|0,B^=i<<9|i>>>23,i=B+A|0,T^=i<<13|i>>>19,i=T+B|0,_^=i<<18|i>>>14,i=k+M|0,O^=i<<7|i>>>25,i=O+k|0,j^=i<<9|i>>>23,i=j+O|0,M^=i<<13|i>>>19,i=M+j|0,k^=i<<18|i>>>14,i=R+x|0,C^=i<<7|i>>>25,i=C+R|0,S^=i<<9|i>>>23,i=S+C|0,x^=i<<13|i>>>19,i=x+S|0,R^=i<<18|i>>>14,i=N+P|0,E^=i<<7|i>>>25,i=E+N|0,I^=i<<9|i>>>23,i=I+E|0,P^=i<<13|i>>>19,i=P+I|0,N^=i<<18|i>>>14,i=_+E|0,M^=i<<7|i>>>25,i=M+_|0,S^=i<<9|i>>>23,i=S+M|0,E^=i<<13|i>>>19,i=E+S|0,_^=i<<18|i>>>14,i=k+A|0,x^=i<<7|i>>>25,i=x+k|0,I^=i<<9|i>>>23,i=I+x|0,A^=i<<13|i>>>19,i=A+I|0,k^=i<<18|i>>>14,i=R+O|0,P^=i<<7|i>>>25,i=P+R|0,B^=i<<9|i>>>23,i=B+P|0,O^=i<<13|i>>>19,i=O+B|0,R^=i<<18|i>>>14,i=N+C|0,T^=i<<7|i>>>25,i=T+N|0,j^=i<<9|i>>>23,i=j+T|0,C^=i<<13|i>>>19,i=C+j|0,N^=i<<18|i>>>14;t[0]=_>>>0&255,t[1]=_>>>8&255,t[2]=_>>>16&255,t[3]=_>>>24&255,t[4]=k>>>0&255,t[5]=k>>>8&255,t[6]=k>>>16&255,t[7]=k>>>24&255,t[8]=R>>>0&255,t[9]=R>>>8&255,t[10]=R>>>16&255,t[11]=R>>>24&255,t[12]=N>>>0&255,t[13]=N>>>8&255,t[14]=N>>>16&255,t[15]=N>>>24&255,t[16]=x>>>0&255,t[17]=x>>>8&255,t[18]=x>>>16&255,t[19]=x>>>24&255,t[20]=I>>>0&255,t[21]=I>>>8&255,t[22]=I>>>16&255,t[23]=I>>>24&255,t[24]=B>>>0&255,t[25]=B>>>8&255,t[26]=B>>>16&255,t[27]=B>>>24&255,t[28]=O>>>0&255,t[29]=O>>>8&255,t[30]=O>>>16&255,t[31]=O>>>24&255}function s(t,e,r,n){a(t,e,r,n)}function u(t,e,r,n){f(t,e,r,n)}function h(t,e,r,n,i,o,a){var f,u,h=new Uint8Array(16),c=new Uint8Array(64);for(u=0;u<16;u++)h[u]=0;for(u=0;u<8;u++)h[u]=o[u];for(;i>=64;){for(s(c,h,a,dt),u=0;u<64;u++)t[e+u]=r[n+u]^c[u];for(f=1,u=8;u<16;u++)f=f+(255&h[u])|0,h[u]=255&f,f>>>=8;i-=64,e+=64,n+=64}if(i>0)for(s(c,h,a,dt),u=0;u=64;){for(s(u,f,i,dt),a=0;a<64;a++)t[e+a]=u[a];for(o=1,a=8;a<16;a++)o=o+(255&f[a])|0,f[a]=255&o,o>>>=8;r-=64,e+=64}if(r>0)for(s(u,f,i,dt),a=0;a>16&1),o[r-1]&=65535;o[15]=a[15]-32767-(o[14]>>16&1),i=o[15]>>16&1,o[14]&=65535,w(a,o,1-i)}for(r=0;r<16;r++)t[2*r]=255&a[r],t[2*r+1]=a[r]>>8}function M(t,e){var r=new Uint8Array(32),n=new Uint8Array(32);return _(r,t),_(n,e),o(r,0,n,0)}function S(t){var e=new Uint8Array(32);return _(e,t),1&e[0]}function E(t,e){var r;for(r=0;r<16;r++)t[r]=e[2*r]+(e[2*r+1]<<8);t[15]&=32767}function A(t,e,r){for(var n=0;n<16;n++)t[n]=e[n]+r[n]}function k(t,e,r){for(var n=0;n<16;n++)t[n]=e[n]-r[n]}function x(t,e,r){var n,i,o=0,a=0,f=0,s=0,u=0,h=0,c=0,d=0,l=0,p=0,b=0,v=0,y=0,m=0,g=0,w=0,_=0,M=0,S=0,E=0,A=0,k=0,x=0,I=0,B=0,O=0,R=0,P=0,T=0,j=0,C=0,N=r[0],L=r[1],U=r[2],z=r[3],D=r[4],q=r[5],F=r[6],K=r[7],G=r[8],V=r[9],H=r[10],X=r[11],Y=r[12],W=r[13],Z=r[14],J=r[15];n=e[0],o+=n*N,a+=n*L,f+=n*U,s+=n*z,u+=n*D,h+=n*q,c+=n*F,d+=n*K,l+=n*G,p+=n*V,b+=n*H,v+=n*X,y+=n*Y,m+=n*W,g+=n*Z,w+=n*J,n=e[1],a+=n*N,f+=n*L,s+=n*U,u+=n*z,h+=n*D,c+=n*q,d+=n*F,l+=n*K,p+=n*G,b+=n*V,v+=n*H,y+=n*X,m+=n*Y,g+=n*W,w+=n*Z,_+=n*J,n=e[2],f+=n*N,s+=n*L,u+=n*U,h+=n*z,c+=n*D,d+=n*q,l+=n*F,p+=n*K,b+=n*G,v+=n*V,y+=n*H,m+=n*X,g+=n*Y,w+=n*W,_+=n*Z,M+=n*J,n=e[3],s+=n*N,u+=n*L,h+=n*U,c+=n*z,d+=n*D,l+=n*q,p+=n*F,b+=n*K,v+=n*G,y+=n*V,m+=n*H,g+=n*X,w+=n*Y,_+=n*W,M+=n*Z,S+=n*J,n=e[4],u+=n*N,h+=n*L,c+=n*U,d+=n*z,l+=n*D,p+=n*q,b+=n*F,v+=n*K,y+=n*G,m+=n*V,g+=n*H,w+=n*X,_+=n*Y,M+=n*W,S+=n*Z,E+=n*J,n=e[5],h+=n*N,c+=n*L,d+=n*U,l+=n*z,p+=n*D,b+=n*q,v+=n*F,y+=n*K,m+=n*G,g+=n*V,w+=n*H,_+=n*X,M+=n*Y,S+=n*W,E+=n*Z,A+=n*J,n=e[6],c+=n*N,d+=n*L,l+=n*U,p+=n*z,b+=n*D,v+=n*q,y+=n*F,m+=n*K,g+=n*G,w+=n*V,_+=n*H,M+=n*X,S+=n*Y,E+=n*W,A+=n*Z,k+=n*J,n=e[7],d+=n*N,l+=n*L,p+=n*U,b+=n*z,v+=n*D,y+=n*q,m+=n*F,g+=n*K,w+=n*G,_+=n*V,M+=n*H,S+=n*X,E+=n*Y,A+=n*W,k+=n*Z,x+=n*J,n=e[8],l+=n*N,p+=n*L,b+=n*U,v+=n*z,y+=n*D,m+=n*q,g+=n*F,w+=n*K,_+=n*G,M+=n*V,S+=n*H,E+=n*X,A+=n*Y,k+=n*W,x+=n*Z,I+=n*J,n=e[9],p+=n*N,b+=n*L,v+=n*U,y+=n*z,m+=n*D,g+=n*q,w+=n*F,_+=n*K,M+=n*G,S+=n*V,E+=n*H,A+=n*X,k+=n*Y,x+=n*W,I+=n*Z,B+=n*J,n=e[10],b+=n*N,v+=n*L,y+=n*U,m+=n*z,g+=n*D,w+=n*q,_+=n*F,M+=n*K,S+=n*G,E+=n*V,A+=n*H,k+=n*X,x+=n*Y,I+=n*W,B+=n*Z,O+=n*J,n=e[11],v+=n*N,y+=n*L,m+=n*U,g+=n*z,w+=n*D,_+=n*q,M+=n*F,S+=n*K,E+=n*G,A+=n*V,k+=n*H,x+=n*X;I+=n*Y;B+=n*W,O+=n*Z,R+=n*J,n=e[12],y+=n*N,m+=n*L,g+=n*U,w+=n*z,_+=n*D,M+=n*q,S+=n*F,E+=n*K,A+=n*G,k+=n*V,x+=n*H,I+=n*X,B+=n*Y,O+=n*W,R+=n*Z,P+=n*J,n=e[13],m+=n*N,g+=n*L,w+=n*U,_+=n*z,M+=n*D,S+=n*q,E+=n*F,A+=n*K,k+=n*G,x+=n*V,I+=n*H,B+=n*X,O+=n*Y,R+=n*W,P+=n*Z,T+=n*J,n=e[14],g+=n*N,w+=n*L,_+=n*U,M+=n*z,S+=n*D,E+=n*q,A+=n*F,k+=n*K,x+=n*G,I+=n*V,B+=n*H,O+=n*X,R+=n*Y,P+=n*W,T+=n*Z,j+=n*J,n=e[15],w+=n*N,_+=n*L,M+=n*U,S+=n*z,E+=n*D,A+=n*q,k+=n*F,x+=n*K,I+=n*G,B+=n*V,O+=n*H,R+=n*X,P+=n*Y,T+=n*W,j+=n*Z,C+=n*J,o+=38*_,a+=38*M,f+=38*S,s+=38*E,u+=38*A,h+=38*k,c+=38*x,d+=38*I,l+=38*B,p+=38*O,b+=38*R,v+=38*P,y+=38*T,m+=38*j,g+=38*C,i=1,n=o+i+65535,i=Math.floor(n/65536),o=n-65536*i,n=a+i+65535,i=Math.floor(n/65536),a=n-65536*i,n=f+i+65535,i=Math.floor(n/65536),f=n-65536*i,n=s+i+65535,i=Math.floor(n/65536),s=n-65536*i,n=u+i+65535,i=Math.floor(n/65536),u=n-65536*i,n=h+i+65535,i=Math.floor(n/65536),h=n-65536*i,n=c+i+65535,i=Math.floor(n/65536),c=n-65536*i,n=d+i+65535,i=Math.floor(n/65536),d=n-65536*i,n=l+i+65535,i=Math.floor(n/65536),l=n-65536*i,n=p+i+65535,i=Math.floor(n/65536),p=n-65536*i,n=b+i+65535,i=Math.floor(n/65536),b=n-65536*i,n=v+i+65535,i=Math.floor(n/65536),v=n-65536*i,n=y+i+65535,i=Math.floor(n/65536),y=n-65536*i,n=m+i+65535,i=Math.floor(n/65536),m=n-65536*i,n=g+i+65535,i=Math.floor(n/65536),g=n-65536*i,n=w+i+65535,i=Math.floor(n/65536),w=n-65536*i,o+=i-1+37*(i-1),i=1,n=o+i+65535,i=Math.floor(n/65536),o=n-65536*i,n=a+i+65535,i=Math.floor(n/65536),a=n-65536*i,n=f+i+65535,i=Math.floor(n/65536),f=n-65536*i,n=s+i+65535,i=Math.floor(n/65536),s=n-65536*i,n=u+i+65535,i=Math.floor(n/65536),u=n-65536*i,n=h+i+65535,i=Math.floor(n/65536),h=n-65536*i,n=c+i+65535,i=Math.floor(n/65536),c=n-65536*i,n=d+i+65535,i=Math.floor(n/65536),d=n-65536*i,n=l+i+65535,i=Math.floor(n/65536),l=n-65536*i,n=p+i+65535,i=Math.floor(n/65536),p=n-65536*i,n=b+i+65535,i=Math.floor(n/65536),b=n-65536*i,n=v+i+65535,i=Math.floor(n/65536),v=n-65536*i,n=y+i+65535,i=Math.floor(n/65536),y=n-65536*i,n=m+i+65535,i=Math.floor(n/65536),m=n-65536*i,n=g+i+65535,i=Math.floor(n/65536),g=n-65536*i,n=w+i+65535,i=Math.floor(n/65536),w=n-65536*i,o+=i-1+37*(i-1),t[0]=o,t[1]=a,t[2]=f,t[3]=s,t[4]=u,t[5]=h,t[6]=c,t[7]=d,t[8]=l,t[9]=p,t[10]=b,t[11]=v,t[12]=y,t[13]=m;t[14]=g;t[15]=w}function I(t,e){x(t,e,e)}function B(t,e){var r,n=tt();for(r=0;r<16;r++)n[r]=e[r];for(r=253;r>=0;r--)I(n,n),2!==r&&4!==r&&x(n,n,e);for(r=0;r<16;r++)t[r]=n[r]}function O(t,e){var r,n=tt();for(r=0;r<16;r++)n[r]=e[r];for(r=250;r>=0;r--)I(n,n),1!==r&&x(n,n,e);for(r=0;r<16;r++)t[r]=n[r]}function R(t,e,r){var n,i,o=new Uint8Array(32),a=new Float64Array(80),f=tt(),s=tt(),u=tt(),h=tt(),c=tt(),d=tt();for(i=0;i<31;i++)o[i]=e[i];for(o[31]=127&e[31]|64,o[0]&=248,E(a,r),i=0;i<16;i++)s[i]=a[i],h[i]=f[i]=u[i]=0;for(f[0]=h[0]=1,i=254;i>=0;--i)n=o[i>>>3]>>>(7&i)&1,w(f,s,n),w(u,h,n),A(c,f,u),k(f,f,u),A(u,s,h),k(s,s,h),I(h,c),I(d,f),x(f,u,f),x(u,s,c),A(c,f,u),k(f,f,u),I(s,f),k(u,h,d),x(f,u,at),A(f,f,h),x(u,u,f),x(f,h,d),x(h,s,a),I(s,c),w(f,s,n),w(u,h,n);for(i=0;i<16;i++)a[i+16]=f[i],a[i+32]=u[i],a[i+48]=s[i],a[i+64]=h[i];var l=a.subarray(32),p=a.subarray(16);return B(l,l),x(p,p,l),_(t,p),0}function P(t,e){return R(t,e,nt)}function T(t,e){return et(e,32),P(t,e)}function j(t,e,r){var n=new Uint8Array(32);return R(n,r,e),u(t,rt,n,dt)}function C(t,e,r,n,i,o){var a=new Uint8Array(32);return j(a,i,o),pt(t,e,r,n,a)}function N(t,e,r,n,i,o){var a=new Uint8Array(32);return j(a,i,o),bt(t,e,r,n,a)}function L(t,e,r,n){for(var i,o,a,f,s,u,h,c,d,l,p,b,v,y,m,g,w,_,M,S,E,A,k,x,I,B,O=new Int32Array(16),R=new Int32Array(16),P=t[0],T=t[1],j=t[2],C=t[3],N=t[4],L=t[5],U=t[6],z=t[7],D=e[0],q=e[1],F=e[2],K=e[3],G=e[4],V=e[5],H=e[6],X=e[7],Y=0;n>=128;){for(M=0;M<16;M++)S=8*M+Y,O[M]=r[S+0]<<24|r[S+1]<<16|r[S+2]<<8|r[S+3],R[M]=r[S+4]<<24|r[S+5]<<16|r[S+6]<<8|r[S+7];for(M=0;M<80;M++)if(i=P,o=T,a=j,f=C,s=N,u=L,h=U,c=z,d=D,l=q,p=F,b=K,v=G,y=V,m=H,g=X,E=z,A=X,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=(N>>>14|G<<18)^(N>>>18|G<<14)^(G>>>9|N<<23),A=(G>>>14|N<<18)^(G>>>18|N<<14)^(N>>>9|G<<23),k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,E=N&L^~N&U,A=G&V^~G&H,k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,E=vt[2*M],A=vt[2*M+1],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,E=O[M%16],A=R[M%16],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,w=65535&I|B<<16,_=65535&k|x<<16,E=w,A=_,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=(P>>>28|D<<4)^(D>>>2|P<<30)^(D>>>7|P<<25),A=(D>>>28|P<<4)^(P>>>2|D<<30)^(P>>>7|D<<25),k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,E=P&T^P&j^T&j,A=D&q^D&F^q&F,k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,c=65535&I|B<<16,g=65535&k|x<<16,E=f,A=b,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=w,A=_,k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,f=65535&I|B<<16,b=65535&k|x<<16,T=i,j=o,C=a,N=f,L=s,U=u,z=h,P=c,q=d,F=l,K=p,G=b,V=v,H=y,X=m,D=g,M%16===15)for(S=0;S<16;S++)E=O[S],A=R[S],k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=O[(S+9)%16],A=R[(S+9)%16],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,w=O[(S+1)%16],_=R[(S+1)%16],E=(w>>>1|_<<31)^(w>>>8|_<<24)^w>>>7,A=(_>>>1|w<<31)^(_>>>8|w<<24)^(_>>>7|w<<25),k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,w=O[(S+14)%16],_=R[(S+14)%16],E=(w>>>19|_<<13)^(_>>>29|w<<3)^w>>>6,A=(_>>>19|w<<13)^(w>>>29|_<<3)^(_>>>6|w<<26),k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,O[S]=65535&I|B<<16,R[S]=65535&k|x<<16;E=P,A=D,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=t[0],A=e[0],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,t[0]=P=65535&I|B<<16,e[0]=D=65535&k|x<<16,E=T,A=q,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=t[1],A=e[1],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,t[1]=T=65535&I|B<<16,e[1]=q=65535&k|x<<16,E=j,A=F,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=t[2],A=e[2],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,t[2]=j=65535&I|B<<16,e[2]=F=65535&k|x<<16,E=C,A=K,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=t[3],A=e[3],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,t[3]=C=65535&I|B<<16,e[3]=K=65535&k|x<<16,E=N,A=G,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=t[4],A=e[4],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,t[4]=N=65535&I|B<<16,e[4]=G=65535&k|x<<16,E=L,A=V,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=t[5],A=e[5],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,t[5]=L=65535&I|B<<16,e[5]=V=65535&k|x<<16,E=U,A=H,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=t[6],A=e[6],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,t[6]=U=65535&I|B<<16,e[6]=H=65535&k|x<<16,E=z,A=X,k=65535&A,x=A>>>16,I=65535&E,B=E>>>16,E=t[7],A=e[7],k+=65535&A,x+=A>>>16,I+=65535&E,B+=E>>>16,x+=k>>>16,I+=x>>>16,B+=I>>>16,t[7]=z=65535&I|B<<16,e[7]=X=65535&k|x<<16,Y+=128,n-=128}return n}function U(t,r,n){var i,o=new Int32Array(8),a=new Int32Array(8),f=new Uint8Array(256),s=n;for(o[0]=1779033703,o[1]=3144134277,o[2]=1013904242,o[3]=2773480762,o[4]=1359893119,o[5]=2600822924,o[6]=528734635,o[7]=1541459225,a[0]=4089235720,a[1]=2227873595,a[2]=4271175723,a[3]=1595750129,a[4]=2917565137,a[5]=725511199,a[6]=4215389547,a[7]=327033209,L(o,a,r,n),n%=128,i=0;i=0;--i)n=r[i/8|0]>>(7&i)&1,D(t,e,n),z(e,t),z(t,t),D(t,e,n)}function K(t,e){var r=[tt(),tt(),tt(),tt()]; m(r[0],ut),m(r[1],ht),m(r[2],ot),x(r[3],ut,ht),F(t,r,e)}function G(t,e,r){var n,i=new Uint8Array(64),o=[tt(),tt(),tt(),tt()];for(r||et(e,32),U(i,e,32),i[0]&=248,i[31]&=127,i[31]|=64,K(o,i),q(t,o),n=0;n<32;n++)e[n+32]=t[n];return 0}function V(t,e){var r,n,i,o;for(n=63;n>=32;--n){for(r=0,i=n-32,o=n-12;i>8,e[i]-=256*r;e[i]+=r,e[n]=0}for(r=0,i=0;i<32;i++)e[i]+=r-(e[31]>>4)*yt[i],r=e[i]>>8,e[i]&=255;for(i=0;i<32;i++)e[i]-=r*yt[i];for(n=0;n<32;n++)e[n+1]+=e[n]>>8,t[n]=255&e[n]}function H(t){var e,r=new Float64Array(64);for(e=0;e<64;e++)r[e]=t[e];for(e=0;e<64;e++)t[e]=0;V(t,r)}function X(t,e,r,n){var i,o,a=new Uint8Array(64),f=new Uint8Array(64),s=new Uint8Array(64),u=new Float64Array(64),h=[tt(),tt(),tt(),tt()];U(a,n,32),a[0]&=248,a[31]&=127,a[31]|=64;var c=r+64;for(i=0;i>7&&k(t[0],it,t[0]),x(t[3],t[0],t[1]),0)}function W(t,e,r,n){var i,a,f=new Uint8Array(32),s=new Uint8Array(64),u=[tt(),tt(),tt(),tt()],h=[tt(),tt(),tt(),tt()];if(a=-1,r<64)return-1;if(Y(h,n))return-1;for(i=0;i>>13|r<<3),n=255&t[4]|(255&t[5])<<8,this.r[2]=7939&(r>>>10|n<<6),i=255&t[6]|(255&t[7])<<8,this.r[3]=8191&(n>>>7|i<<9),o=255&t[8]|(255&t[9])<<8,this.r[4]=255&(i>>>4|o<<12),this.r[5]=o>>>1&8190,a=255&t[10]|(255&t[11])<<8,this.r[6]=8191&(o>>>14|a<<2),f=255&t[12]|(255&t[13])<<8,this.r[7]=8065&(a>>>11|f<<5),s=255&t[14]|(255&t[15])<<8,this.r[8]=8191&(f>>>8|s<<8),this.r[9]=s>>>5&127,this.pad[0]=255&t[16]|(255&t[17])<<8,this.pad[1]=255&t[18]|(255&t[19])<<8,this.pad[2]=255&t[20]|(255&t[21])<<8,this.pad[3]=255&t[22]|(255&t[23])<<8,this.pad[4]=255&t[24]|(255&t[25])<<8,this.pad[5]=255&t[26]|(255&t[27])<<8,this.pad[6]=255&t[28]|(255&t[29])<<8,this.pad[7]=255&t[30]|(255&t[31])<<8};lt.prototype.blocks=function(t,e,r){for(var n,i,o,a,f,s,u,h,c,d,l,p,b,v,y,m,g,w,_,M=this.fin?0:2048,S=this.h[0],E=this.h[1],A=this.h[2],k=this.h[3],x=this.h[4],I=this.h[5],B=this.h[6],O=this.h[7],R=this.h[8],P=this.h[9],T=this.r[0],j=this.r[1],C=this.r[2],N=this.r[3],L=this.r[4],U=this.r[5],z=this.r[6],D=this.r[7],q=this.r[8],F=this.r[9];r>=16;)n=255&t[e+0]|(255&t[e+1])<<8,S+=8191&n,i=255&t[e+2]|(255&t[e+3])<<8,E+=8191&(n>>>13|i<<3),o=255&t[e+4]|(255&t[e+5])<<8,A+=8191&(i>>>10|o<<6),a=255&t[e+6]|(255&t[e+7])<<8,k+=8191&(o>>>7|a<<9),f=255&t[e+8]|(255&t[e+9])<<8,x+=8191&(a>>>4|f<<12),I+=f>>>1&8191,s=255&t[e+10]|(255&t[e+11])<<8,B+=8191&(f>>>14|s<<2),u=255&t[e+12]|(255&t[e+13])<<8,O+=8191&(s>>>11|u<<5),h=255&t[e+14]|(255&t[e+15])<<8,R+=8191&(u>>>8|h<<8),P+=h>>>5|M,c=0,d=c,d+=S*T,d+=E*(5*F),d+=A*(5*q),d+=k*(5*D),d+=x*(5*z),c=d>>>13,d&=8191,d+=I*(5*U),d+=B*(5*L),d+=O*(5*N),d+=R*(5*C),d+=P*(5*j),c+=d>>>13,d&=8191,l=c,l+=S*j,l+=E*T,l+=A*(5*F),l+=k*(5*q),l+=x*(5*D),c=l>>>13,l&=8191,l+=I*(5*z),l+=B*(5*U),l+=O*(5*L),l+=R*(5*N),l+=P*(5*C),c+=l>>>13,l&=8191,p=c,p+=S*C,p+=E*j,p+=A*T,p+=k*(5*F),p+=x*(5*q),c=p>>>13,p&=8191,p+=I*(5*D),p+=B*(5*z),p+=O*(5*U),p+=R*(5*L),p+=P*(5*N),c+=p>>>13,p&=8191,b=c,b+=S*N,b+=E*C,b+=A*j,b+=k*T,b+=x*(5*F),c=b>>>13,b&=8191,b+=I*(5*q),b+=B*(5*D),b+=O*(5*z),b+=R*(5*U),b+=P*(5*L),c+=b>>>13,b&=8191,v=c,v+=S*L,v+=E*N,v+=A*C,v+=k*j,v+=x*T,c=v>>>13,v&=8191,v+=I*(5*F),v+=B*(5*q),v+=O*(5*D),v+=R*(5*z),v+=P*(5*U),c+=v>>>13,v&=8191,y=c,y+=S*U,y+=E*L,y+=A*N,y+=k*C,y+=x*j,c=y>>>13,y&=8191,y+=I*T,y+=B*(5*F),y+=O*(5*q),y+=R*(5*D),y+=P*(5*z),c+=y>>>13,y&=8191,m=c,m+=S*z,m+=E*U,m+=A*L,m+=k*N,m+=x*C,c=m>>>13,m&=8191,m+=I*j,m+=B*T,m+=O*(5*F),m+=R*(5*q),m+=P*(5*D),c+=m>>>13,m&=8191,g=c,g+=S*D,g+=E*z,g+=A*U,g+=k*L,g+=x*N,c=g>>>13,g&=8191,g+=I*C,g+=B*j,g+=O*T,g+=R*(5*F),g+=P*(5*q),c+=g>>>13,g&=8191,w=c,w+=S*q,w+=E*D,w+=A*z,w+=k*U,w+=x*L,c=w>>>13,w&=8191,w+=I*N,w+=B*C,w+=O*j,w+=R*T,w+=P*(5*F),c+=w>>>13,w&=8191,_=c,_+=S*F,_+=E*q,_+=A*D,_+=k*z,_+=x*U,c=_>>>13,_&=8191,_+=I*L,_+=B*N,_+=O*C,_+=R*j,_+=P*T,c+=_>>>13,_&=8191,c=(c<<2)+c|0,c=c+d|0,d=8191&c,c>>>=13,l+=c,S=d,E=l,A=p,k=b,x=v,I=y,B=m,O=g,R=w,P=_,e+=16,r-=16;this.h[0]=S,this.h[1]=E,this.h[2]=A,this.h[3]=k,this.h[4]=x,this.h[5]=I,this.h[6]=B,this.h[7]=O,this.h[8]=R,this.h[9]=P},lt.prototype.finish=function(t,e){var r,n,i,o,a=new Uint16Array(10);if(this.leftover){for(o=this.leftover,this.buffer[o++]=1;o<16;o++)this.buffer[o]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(r=this.h[1]>>>13,this.h[1]&=8191,o=2;o<10;o++)this.h[o]+=r,r=this.h[o]>>>13,this.h[o]&=8191;for(this.h[0]+=5*r,r=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=r,r=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=r,a[0]=this.h[0]+5,r=a[0]>>>13,a[0]&=8191,o=1;o<10;o++)a[o]=this.h[o]+r,r=a[o]>>>13,a[o]&=8191;for(a[9]-=8192,n=(1^r)-1,o=0;o<10;o++)a[o]&=n;for(n=~n,o=0;o<10;o++)this.h[o]=this.h[o]&n|a[o];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),i=this.h[0]+this.pad[0],this.h[0]=65535&i,o=1;o<8;o++)i=(this.h[o]+this.pad[o]|0)+(i>>>16)|0,this.h[o]=65535&i;t[e+0]=this.h[0]>>>0&255,t[e+1]=this.h[0]>>>8&255,t[e+2]=this.h[1]>>>0&255,t[e+3]=this.h[1]>>>8&255,t[e+4]=this.h[2]>>>0&255,t[e+5]=this.h[2]>>>8&255,t[e+6]=this.h[3]>>>0&255,t[e+7]=this.h[3]>>>8&255,t[e+8]=this.h[4]>>>0&255,t[e+9]=this.h[4]>>>8&255,t[e+10]=this.h[5]>>>0&255,t[e+11]=this.h[5]>>>8&255,t[e+12]=this.h[6]>>>0&255,t[e+13]=this.h[6]>>>8&255,t[e+14]=this.h[7]>>>0&255,t[e+15]=this.h[7]>>>8&255},lt.prototype.update=function(t,e,r){var n,i;if(this.leftover){for(i=16-this.leftover,i>r&&(i=r),n=0;n=16&&(i=r-r%16,this.blocks(t,e,i),e+=i,r-=i),r){for(n=0;n=0},t.sign.keyPair=function(){var t=new Uint8Array(Rt),e=new Uint8Array(Pt);return G(t,e),{publicKey:t,secretKey:e}},t.sign.keyPair.fromSecretKey=function(t){if($(t),t.length!==Pt)throw new Error("bad secret key size");for(var e=new Uint8Array(Rt),r=0;r0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===t[e-2]?2:"="===t[e-1]?1:0}function n(t){return 3*t.length/4-r(t)}function i(t){var e,n,i,o,a,f,s=t.length;a=r(t),f=new h(3*s/4-a),i=a>0?s-4:s;var c=0;for(e=0,n=0;e>16&255,f[c++]=o>>8&255,f[c++]=255&o;return 2===a?(o=u[t.charCodeAt(e)]<<2|u[t.charCodeAt(e+1)]>>4,f[c++]=255&o):1===a&&(o=u[t.charCodeAt(e)]<<10|u[t.charCodeAt(e+1)]<<4|u[t.charCodeAt(e+2)]>>2,f[c++]=o>>8&255,f[c++]=255&o),f}function o(t){return s[t>>18&63]+s[t>>12&63]+s[t>>6&63]+s[63&t]}function a(t,e,r){for(var n,i=[],a=e;ah?h:u+f));return 1===n?(e=t[r-1],i+=s[e>>2],i+=s[e<<4&63],i+="=="):2===n&&(e=(t[r-2]<<8)+t[r-1],i+=s[e>>10],i+=s[e>>4&63],i+=s[e<<2&63],i+="="),o.push(i),o.join("")}e.byteLength=n,e.toByteArray=i,e.fromByteArray=f;for(var s=[],u=[],h="undefined"!=typeof Uint8Array?Uint8Array:Array,c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=0,l=c.length;d>1,h=-7,c=r?i-1:0,d=r?-1:1,l=t[e+c];for(c+=d,o=l&(1<<-h)-1,l>>=-h,h+=f;h>0;o=256*o+t[e+c],c+=d,h-=8);for(a=o&(1<<-h)-1,o>>=-h,h+=n;h>0;a=256*a+t[e+c],c+=d,h-=8);if(0===o)o=1-u;else{if(o===s)return a?NaN:(l?-1:1)*(1/0);a+=Math.pow(2,n),o-=u}return(l?-1:1)*a*Math.pow(2,o-n)},e.write=function(t,e,r,n,i,o){var a,f,s,u=8*o-i-1,h=(1<>1,d=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:o-1,p=n?1:-1,b=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(f=isNaN(e)?1:0,a=h):(a=Math.floor(Math.log(e)/Math.LN2),e*(s=Math.pow(2,-a))<1&&(a--,s*=2),e+=a+c>=1?d/s:d*Math.pow(2,1-c),e*s>=2&&(a++,s/=2),a+c>=h?(f=0,a=h):a+c>=1?(f=(e*s-1)*Math.pow(2,i),a+=c):(f=e*Math.pow(2,c-1)*Math.pow(2,i),a=0));i>=8;t[r+l]=255&f,l+=p,f/=256,i-=8);for(a=a<0;t[r+l]=255&a,l+=p,a/=256,u-=8);t[r+l-p]|=128*b}},function(t,e){var r={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},function(t,e,r){function n(t,e){var r,n;if(t=t.toLowerCase(),d[t])r=d[t].key,n=d[t].iv;else{if(!c[t])throw new TypeError("invalid suite type");r=8*c[t].key,n=c[t].iv}var i=s(e,!1,r,n);return o(t,i.key,i.iv)}function i(t,e){var r,n;if(t=t.toLowerCase(),d[t])r=d[t].key,n=d[t].iv;else{if(!c[t])throw new TypeError("invalid suite type");r=8*c[t].key,n=c[t].iv}var i=s(e,!1,r,n);return a(t,i.key,i.iv)}function o(t,e,r){if(t=t.toLowerCase(),d[t])return u.createCipheriv(t,e,r);if(c[t])return new h({key:e,iv:r,mode:t});throw new TypeError("invalid suite type")}function a(t,e,r){if(t=t.toLowerCase(),d[t])return u.createDecipheriv(t,e,r);if(c[t])return new h({key:e,iv:r,mode:t,decrypt:!0});throw new TypeError("invalid suite type")}function f(){return Object.keys(c).concat(u.getCiphers())}var s=r(146),u=r(494),h=r(498),c=r(499),d=r(95);e.createCipher=e.Cipher=n,e.createCipheriv=e.Cipheriv=o,e.createDecipher=e.Decipher=i,e.createDecipheriv=e.Decipheriv=a,e.listCiphers=e.getCiphers=f},function(t,e,r){function n(){return Object.keys(a)}var i=r(496);e.createCipher=e.Cipher=i.createCipher,e.createCipheriv=e.Cipheriv=i.createCipheriv;var o=r(495);e.createDecipher=e.Decipher=o.createDecipher,e.createDecipheriv=e.Decipheriv=o.createDecipheriv;var a=r(95);e.listCiphers=e.getCiphers=n},function(t,e,r){(function(t){function n(e,r,o){return this instanceof n?(u.call(this),this._cache=new i,this._last=void 0,this._cipher=new s.AES(r),this._prev=new t(o.length),o.copy(this._prev),this._mode=e,void(this._autopadding=!0)):new n(e,r,o)}function i(){return this instanceof i?void(this.cache=new t("")):new i}function o(t){for(var e=t[15],r=-1;++r16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e}else if(this.cache.length>=16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e;return null},i.prototype.flush=function(){if(this.cache.length)return this.cache};var b={ECB:r(208),CBC:r(204),CFB:r(205),CFB8:r(207),CFB1:r(206),OFB:r(209),CTR:r(96),GCM:r(96)};e.createDecipher=f,e.createDecipheriv=a}).call(e,r(1).Buffer)},function(t,e,r){(function(t){function n(e,r,o){return this instanceof n?(s.call(this),this._cache=new i,this._cipher=new f.AES(r),this._prev=new t(o.length),o.copy(this._prev),this._mode=e,void(this._autopadding=!0)):new n(e,r,o)}function i(){return this instanceof i?void(this.cache=new t("")):new i}function o(e,r,i){var o=h[e.toLowerCase()];if(!o)throw new TypeError("invalid suite type");if("string"==typeof i&&(i=new t(i)),"string"==typeof r&&(r=new t(r)),r.length!==o.key/8)throw new TypeError("invalid key length "+r.length);if(i.length!==o.iv)throw new TypeError("invalid iv length "+i.length);return"stream"===o.type?new d(p[o.mode],r,i):"auth"===o.type?new l(p[o.mode],r,i):new n(p[o.mode],r,i)}function a(t,e){var r=h[t.toLowerCase()];if(!r)throw new TypeError("invalid suite type");var n=c(e,!1,r.key,r.iv);return o(t,n.key,n.iv)}var f=r(94),s=r(97),u=r(2),h=r(95),c=r(146),d=r(210),l=r(203);u(n,s),n.prototype._update=function(e){this._cache.add(e);for(var r,n,i=[];r=this._cache.get();)n=this._mode.encrypt(this,r),i.push(n);return t.concat(i)},n.prototype._final=function(){var t=this._cache.flush();if(this._autopadding)return t=this._mode.encrypt(this,t),this._cipher.scrub(),t;if("10101010101010101010101010101010"!==t.toString("hex"))throw this._cipher.scrub(),new Error("data not multiple of block length")},n.prototype.setAutoPadding=function(t){return this._autopadding=!!t,this},i.prototype.add=function(e){this.cache=t.concat([this.cache,e])},i.prototype.get=function(){if(this.cache.length>15){var t=this.cache.slice(0,16);return this.cache=this.cache.slice(16),t}return null},i.prototype.flush=function(){for(var e=16-this.cache.length,r=new t(e),n=-1;++ns||t<0?(r=Math.abs(t)%s,t<0?s-r:r):t}function a(t,e){return[t[0]^e[0],t[1]^e[1],t[2]^e[2],t[3]^e[3]]}var f=new e(16);f.fill(0),t.exports=r,r.prototype.ghash=function(t){for(var e=-1;++e0;t--)o[t]=o[t]>>>1|(1&o[t-1])<<31;o[0]=o[0]>>>1,r&&(o[0]=o[0]^225<<24)}this.state=i(f)},r.prototype.update=function(t){this.cache=e.concat([this.cache,t]);for(var r;this.cache.length>=16;)r=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(r)},r.prototype.final=function(t,r){return this.cache.length&&this.ghash(e.concat([this.cache,f],16)),this.ghash(i([0,t,0,r])),this.state};var s=Math.pow(2,32)}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(t){i.call(this);var r,n=t.mode.toLowerCase(),o=f[n];r=t.decrypt?"decrypt":"encrypt";var a=t.key;"des-ede"!==n&&"des-ede-cbc"!==n||(a=e.concat([a,a.slice(0,8)]));var s=t.iv;this._des=o.create({key:a,iv:s,type:r})}var i=r(500),o=r(145),a=r(2),f={"des-ede3-cbc":o.CBC.instantiate(o.EDE),"des-ede3":o.EDE,"des-ede-cbc":o.CBC.instantiate(o.EDE),"des-ede":o.EDE,"des-cbc":o.CBC.instantiate(o.DES),"des-ecb":o.DES};f.des=f["des-cbc"],f.des3=f["des-ede3-cbc"],t.exports=n,a(n,i),n.prototype._update=function(t){return new e(this._des.update(t))},n.prototype._final=function(){return new e(this._des.final())}}).call(e,r(1).Buffer)},function(t,e){e["des-ecb"]={key:8,iv:0},e["des-cbc"]=e.des={key:8,iv:8},e["des-ede3-cbc"]=e.des3={key:24,iv:8},e["des-ede3"]={key:24,iv:0},e["des-ede-cbc"]={key:16,iv:8},e["des-ede"]={key:16,iv:0}},function(t,e,r){(function(e){function n(t){i.call(this),this.hashMode="string"==typeof t,this.hashMode?this[t]=this._finalOrDigest:this.final=this._finalOrDigest,this._decoder=null,this._encoding=null}var i=r(31).Transform,o=r(2),a=r(52).StringDecoder;t.exports=n,o(n,i),n.prototype.update=function(t,r,n){"string"==typeof t&&(t=new e(t,r));var i=this._update(t);return this.hashMode?this:(n&&(i=this._toString(i,n)),i)},n.prototype.setAutoPadding=function(){},n.prototype.getAuthTag=function(){throw new Error("trying to get auth tag in unsupported state")},n.prototype.setAuthTag=function(){throw new Error("trying to set auth tag in unsupported state")},n.prototype.setAAD=function(){throw new Error("trying to set aad in unsupported state")},n.prototype._transform=function(t,e,r){var n;try{this.hashMode?this._update(t):this.push(this._update(t))}catch(t){n=t}finally{r(n)}},n.prototype._flush=function(t){var e;try{this.push(this._final())}catch(t){e=t}finally{t(e)}},n.prototype._finalOrDigest=function(t){var r=this._final()||new e("");return t&&(r=this._toString(r,t,!0)),r},n.prototype._toString=function(t,e,r){if(this._decoder||(this._decoder=new a(e),this._encoding=e),this._encoding!==e)throw new Error("can't switch encodings");var n=this._decoder.write(t);return r&&(n+=this._decoder.end()),n}}).call(e,r(1).Buffer)},function(t,e,r){"use strict";function n(t){o.equal(t.length,8,"Invalid IV length"),this.iv=new Array(8);for(var e=0;e0;n--)e+=this._buffer(t,e),r+=this._flushBuffer(i,r);return e+=this._buffer(t,e),i},n.prototype.final=function(t){var e;t&&(e=this.update(t));var r;return r="encrypt"===this.type?this._finalEncrypt():this._finalDecrypt(),e?e.concat(r):r},n.prototype._pad=function(t,e){if(0===e)return!1;for(;e>>1];r=s.r28shl(r,a),n=s.r28shl(n,a),s.pc2(r,n,t.keys,i)}},i.prototype._update=function(t,e,r,n){var i=this._desState,o=s.readUInt32BE(t,e),a=s.readUInt32BE(t,e+4);s.ip(o,a,i.tmp,0),o=i.tmp[0],a=i.tmp[1],"encrypt"===this.type?this._encrypt(i,o,a,i.tmp,0):this._decrypt(i,o,a,i.tmp,0),o=i.tmp[0],a=i.tmp[1],s.writeUInt32BE(r,o,n),s.writeUInt32BE(r,a,n+4)},i.prototype._pad=function(t,e){for(var r=t.length-e,n=e;n>>0,o=l}s.rip(a,o,n,i)},i.prototype._decrypt=function(t,e,r,n,i){for(var o=r,a=e,f=t.keys.length-2;f>=0;f-=2){var u=t.keys[f],h=t.keys[f+1];s.expand(o,t.tmp,0),u^=t.tmp[0],h^=t.tmp[1];var c=s.substitute(u,h),d=s.permute(c),l=o;o=(a^d)>>>0,a=l}s.rip(o,a,n,i)}},function(t,e,r){"use strict";function n(t,e){o.equal(e.length,24,"Invalid key length");var r=e.slice(0,8),n=e.slice(8,16),i=e.slice(16,24);"encrypt"===t?this.ciphers=[u.create({type:"encrypt",key:r}),u.create({type:"decrypt",key:n}),u.create({type:"encrypt",key:i})]:this.ciphers=[u.create({type:"decrypt",key:i}),u.create({type:"encrypt",key:n}),u.create({type:"decrypt",key:r})]}function i(t){s.call(this,t);var e=new n(this.type,this.options.key);this._edeState=e}var o=r(98),a=r(2),f=r(145),s=f.Cipher,u=f.DES;a(i,s),t.exports=i,i.create=function(t){return new i(t)},i.prototype._update=function(t,e,r,n){var i=this._edeState;i.ciphers[0]._update(t,e,r,n),i.ciphers[1]._update(r,n,r,n),i.ciphers[2]._update(r,n,r,n)},i.prototype._pad=u.prototype._pad,i.prototype._unpad=u.prototype._unpad},function(t,e){"use strict";e.readUInt32BE=function(t,e){var r=t[0+e]<<24|t[1+e]<<16|t[2+e]<<8|t[3+e];return r>>>0},e.writeUInt32BE=function(t,e,r){t[0+r]=e>>>24,t[1+r]=e>>>16&255,t[2+r]=e>>>8&255,t[3+r]=255&e},e.ip=function(t,e,r,n){for(var i=0,o=0,a=6;a>=0;a-=2){for(var f=0;f<=24;f+=8)i<<=1,i|=e>>>f+a&1;for(var f=0;f<=24;f+=8)i<<=1,i|=t>>>f+a&1}for(var a=6;a>=0;a-=2){for(var f=1;f<=25;f+=8)o<<=1,o|=e>>>f+a&1;for(var f=1;f<=25;f+=8)o<<=1,o|=t>>>f+a&1}r[n+0]=i>>>0,r[n+1]=o>>>0},e.rip=function(t,e,r,n){for(var i=0,o=0,a=0;a<4;a++)for(var f=24;f>=0;f-=8)i<<=1,i|=e>>>f+a&1,i<<=1,i|=t>>>f+a&1;for(var a=4;a<8;a++)for(var f=24;f>=0;f-=8)o<<=1,o|=e>>>f+a&1,o<<=1,o|=t>>>f+a&1;r[n+0]=i>>>0,r[n+1]=o>>>0},e.pc1=function(t,e,r,n){for(var i=0,o=0,a=7;a>=5;a--){ for(var f=0;f<=24;f+=8)i<<=1,i|=e>>f+a&1;for(var f=0;f<=24;f+=8)i<<=1,i|=t>>f+a&1}for(var f=0;f<=24;f+=8)i<<=1,i|=e>>f+a&1;for(var a=1;a<=3;a++){for(var f=0;f<=24;f+=8)o<<=1,o|=e>>f+a&1;for(var f=0;f<=24;f+=8)o<<=1,o|=t>>f+a&1}for(var f=0;f<=24;f+=8)o<<=1,o|=t>>f+a&1;r[n+0]=i>>>0,r[n+1]=o>>>0},e.r28shl=function(t,e){return t<>>28-e};var r=[14,11,17,4,27,23,25,0,13,22,7,18,5,9,16,24,2,20,12,21,1,8,15,26,15,4,25,19,9,1,26,16,5,11,23,8,12,7,17,0,22,3,10,14,6,20,27,24];e.pc2=function(t,e,n,i){for(var o=0,a=0,f=r.length>>>1,s=0;s>>r[s]&1;for(var s=f;s>>r[s]&1;n[i+0]=o>>>0,n[i+1]=a>>>0},e.expand=function(t,e,r){var n=0,i=0;n=(1&t)<<5|t>>>27;for(var o=23;o>=15;o-=4)n<<=6,n|=t>>>o&63;for(var o=11;o>=3;o-=4)i|=t>>>o&63,i<<=6;i|=(31&t)<<1|t>>>31,e[r+0]=n>>>0,e[r+1]=i>>>0};var n=[14,0,4,15,13,7,1,4,2,14,15,2,11,13,8,1,3,10,10,6,6,12,12,11,5,9,9,5,0,3,7,8,4,15,1,12,14,8,8,2,13,4,6,9,2,1,11,7,15,5,12,11,9,3,7,14,3,10,10,0,5,6,0,13,15,3,1,13,8,4,14,7,6,15,11,2,3,8,4,14,9,12,7,0,2,1,13,10,12,6,0,9,5,11,10,5,0,13,14,8,7,10,11,1,10,3,4,15,13,4,1,2,5,11,8,6,12,7,6,12,9,0,3,5,2,14,15,9,10,13,0,7,9,0,14,9,6,3,3,4,15,6,5,10,1,2,13,8,12,5,7,14,11,12,4,11,2,15,8,1,13,1,6,10,4,13,9,0,8,6,15,9,3,8,0,7,11,4,1,15,2,14,12,3,5,11,10,5,14,2,7,12,7,13,13,8,14,11,3,5,0,6,6,15,9,0,10,3,1,4,2,7,8,2,5,12,11,1,12,10,4,14,15,9,10,3,6,15,9,0,0,6,12,10,11,1,7,13,13,8,15,9,1,4,3,5,14,11,5,12,2,7,8,2,4,14,2,14,12,11,4,2,1,12,7,4,10,7,11,13,6,1,8,5,5,0,3,15,15,10,13,3,0,9,14,8,9,6,4,11,2,8,1,12,11,7,10,1,13,14,7,2,8,13,15,6,9,15,12,0,5,9,6,10,3,4,0,5,14,3,12,10,1,15,10,4,15,2,9,7,2,12,6,9,8,5,0,6,13,1,3,13,4,14,14,0,7,11,5,3,11,8,9,4,14,3,15,2,5,12,2,9,8,5,12,15,3,10,7,11,0,14,4,1,10,7,1,6,13,0,11,8,6,13,4,13,11,0,2,11,14,7,15,4,0,9,8,1,13,10,3,14,12,3,9,5,7,12,5,2,10,15,6,8,1,6,1,6,4,11,11,13,13,8,12,1,3,4,7,10,14,7,10,9,15,5,6,0,8,15,0,14,5,2,9,3,2,12,13,1,2,15,8,13,4,8,6,10,15,3,11,7,1,4,10,12,9,5,3,6,14,11,5,0,0,14,12,9,7,2,7,2,11,1,4,14,1,7,9,4,12,10,14,8,2,13,0,15,6,12,10,9,13,0,15,3,3,5,5,6,8,11];e.substitute=function(t,e){for(var r=0,i=0;i<4;i++){var o=t>>>18-6*i&63,a=n[64*i+o];r<<=4,r|=a}for(var i=0;i<4;i++){var o=e>>>18-6*i&63,a=n[256+64*i+o];r<<=4,r|=a}return r>>>0};var i=[16,25,12,11,3,20,4,15,31,17,9,6,27,14,1,22,30,24,8,18,0,5,29,23,13,19,2,26,10,21,28,7];e.permute=function(t){for(var e=0,r=0;r>>i[r]&1;return e>>>0},e.padSplit=function(t,e,r){for(var n=t.toString(2);n.length=0||!r.umod(t.prime1)||!r.umod(t.prime2);)r=new a(f(e));return r}var a=r(18),f=r(61);t.exports=i,i.getr=o}).call(e,r(1).Buffer)},function(t,e,r){"use strict";function n(t,e){this.type=t,this.p=new o(e.p,16),this.red=e.prime?o.red(e.prime):o.mont(this.p),this.zero=new o(0).toRed(this.red),this.one=new o(1).toRed(this.red),this.two=new o(2).toRed(this.red),this.n=e.n&&new o(e.n,16),this.g=e.g&&this.pointFromJSON(e.g,e.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4);var r=this.n&&this.p.div(this.n);!r||r.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function i(t,e){this.curve=t,this.type=e,this.precomputed=null}var o=r(18),a=r(19),f=a.utils,s=f.getNAF,u=f.getJSF,h=f.assert;t.exports=n,n.prototype.point=function(){throw new Error("Not implemented")},n.prototype.validate=function(){throw new Error("Not implemented")},n.prototype._fixedNafMul=function(t,e){h(t.precomputed);var r=t._getDoubles(),n=s(e,1),i=(1<=a;e--)f=(f<<1)+n[e];o.push(f)}for(var u=this.jpoint(null,null,null),c=this.jpoint(null,null,null),d=i;d>0;d--){for(var a=0;a=0;f--){for(var e=0;f>=0&&0===o[f];f--)e++;if(f>=0&&e++,a=a.dblp(e),f<0)break;var u=o[f];h(0!==u),a="affine"===t.type?u>0?a.mixedAdd(i[u-1>>1]):a.mixedAdd(i[-u-1>>1].neg()):u>0?a.add(i[u-1>>1]):a.add(i[-u-1>>1].neg())}return"affine"===t.type?a.toP():a},n.prototype._wnafMulAdd=function(t,e,r,n,i){for(var o=this._wnafT1,a=this._wnafT2,f=this._wnafT3,h=0,c=0;c=1;c-=2){var p=c-1,b=c;if(1===o[p]&&1===o[b]){var v=[e[p],null,null,e[b]];0===e[p].y.cmp(e[b].y)?(v[1]=e[p].add(e[b]),v[2]=e[p].toJ().mixedAdd(e[b].neg())):0===e[p].y.cmp(e[b].y.redNeg())?(v[1]=e[p].toJ().mixedAdd(e[b]),v[2]=e[p].add(e[b].neg())):(v[1]=e[p].toJ().mixedAdd(e[b]),v[2]=e[p].toJ().mixedAdd(e[b].neg()));var y=[-3,-1,-5,-7,0,7,5,1,3],m=u(r[p],r[b]);h=Math.max(m[0].length,h),f[p]=new Array(h),f[b]=new Array(h);for(var g=0;g=0;c--){for(var E=0;c>=0;){for(var A=!0,g=0;g=0&&E++,M=M.dblp(E),c<0)break;for(var g=0;g0?d=a[g][k-1>>1]:k<0&&(d=a[g][-k-1>>1].neg()),M="affine"===d.type?M.mixedAdd(d):M.add(d))}}for(var c=0;c=Math.ceil((t.bitLength()+1)/e.step)},i.prototype._getDoubles=function(t,e){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var r=[this],n=this,i=0;i":""},i.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&0===this.y.cmp(this.z)},i.prototype._extDbl=function(){var t=this.x.redSqr(),e=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var n=this.curve._mulA(t),i=this.x.redAdd(this.y).redSqr().redISub(t).redISub(e),o=n.redAdd(e),a=o.redSub(r),f=n.redSub(e),s=i.redMul(a),u=o.redMul(f),h=i.redMul(f),c=a.redMul(o);return this.curve.point(s,u,c,h)},i.prototype._projDbl=function(){var t,e,r,n=this.x.redAdd(this.y).redSqr(),i=this.x.redSqr(),o=this.y.redSqr();if(this.curve.twisted){var a=this.curve._mulA(i),f=a.redAdd(o);if(this.zOne)t=n.redSub(i).redSub(o).redMul(f.redSub(this.curve.two)),e=f.redMul(a.redSub(o)),r=f.redSqr().redSub(f).redSub(f);else{var s=this.z.redSqr(),u=f.redSub(s).redISub(s);t=n.redSub(i).redISub(o).redMul(u),e=f.redMul(a.redSub(o)),r=f.redMul(u)}}else{var a=i.redAdd(o),s=this.curve._mulC(this.c.redMul(this.z)).redSqr(),u=a.redSub(s).redSub(s);t=this.curve._mulC(n.redISub(a)).redMul(u),e=this.curve._mulC(a).redMul(i.redISub(o)),r=a.redMul(u)}return this.curve.point(t,e,r)},i.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},i.prototype._extAdd=function(t){var e=this.y.redSub(this.x).redMul(t.y.redSub(t.x)),r=this.y.redAdd(this.x).redMul(t.y.redAdd(t.x)),n=this.t.redMul(this.curve.dd).redMul(t.t),i=this.z.redMul(t.z.redAdd(t.z)),o=r.redSub(e),a=i.redSub(n),f=i.redAdd(n),s=r.redAdd(e),u=o.redMul(a),h=f.redMul(s),c=o.redMul(s),d=a.redMul(f);return this.curve.point(u,h,d,c)},i.prototype._projAdd=function(t){var e,r,n=this.z.redMul(t.z),i=n.redSqr(),o=this.x.redMul(t.x),a=this.y.redMul(t.y),f=this.curve.d.redMul(o).redMul(a),s=i.redSub(f),u=i.redAdd(f),h=this.x.redAdd(this.y).redMul(t.x.redAdd(t.y)).redISub(o).redISub(a),c=n.redMul(s).redMul(h);return this.curve.twisted?(e=n.redMul(u).redMul(a.redSub(this.curve._mulA(o))),r=s.redMul(u)):(e=n.redMul(u).redMul(a.redSub(o)),r=this.curve._mulC(s).redMul(u)),this.curve.point(c,e,r)},i.prototype.add=function(t){return this.isInfinity()?t:t.isInfinity()?this:this.curve.extended?this._extAdd(t):this._projAdd(t)},i.prototype.mul=function(t){return this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve._wnafMul(this,t)},i.prototype.mulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!1)},i.prototype.jmulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!0)},i.prototype.normalize=function(){if(this.zOne)return this;var t=this.z.redInvm();return this.x=this.x.redMul(t),this.y=this.y.redMul(t),this.t&&(this.t=this.t.redMul(t)),this.z=this.curve.one,this.zOne=!0,this},i.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},i.prototype.getX=function(){return this.normalize(),this.x.fromRed()},i.prototype.getY=function(){return this.normalize(),this.y.fromRed()},i.prototype.eq=function(t){return this===t||0===this.getX().cmp(t.getX())&&0===this.getY().cmp(t.getY())},i.prototype.eqXToP=function(t){var e=t.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(e))return!0;for(var r=t.clone(),n=this.curve.redN.redMul(this.z);;){if(r.iadd(this.curve.n),r.cmp(this.curve.p)>=0)return!1;if(e.redIAdd(n),0===this.x.cmp(e))return!0}return!1},i.prototype.toP=i.prototype.normalize,i.prototype.mixedAdd=i.prototype.add},function(t,e,r){"use strict";function n(t){s.call(this,"mont",t),this.a=new a(t.a,16).toRed(this.red),this.b=new a(t.b,16).toRed(this.red),this.i4=new a(4).toRed(this.red).redInvm(),this.two=new a(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function i(t,e,r){s.BasePoint.call(this,t,"projective"),null===e&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new a(e,16),this.z=new a(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}var o=r(99),a=r(18),f=r(2),s=o.base,u=r(19),h=u.utils;f(n,s),t.exports=n,n.prototype.validate=function(t){var e=t.normalize().x,r=e.redSqr(),n=r.redMul(e).redAdd(r.redMul(this.a)).redAdd(e),i=n.redSqrt();return 0===i.redSqr().cmp(n)},f(i,s.BasePoint),n.prototype.decodePoint=function(t,e){return this.point(h.toArray(t,e),1)},n.prototype.point=function(t,e){return new i(this,t,e)},n.prototype.pointFromJSON=function(t){return i.fromJSON(this,t)},i.prototype.precompute=function(){},i.prototype._encode=function(){return this.getX().toArray("be",this.curve.p.byteLength())},i.fromJSON=function(t,e){return new i(t,e[0],e[1]||t.one)},i.prototype.inspect=function(){return this.isInfinity()?"":""},i.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},i.prototype.dbl=function(){var t=this.x.redAdd(this.z),e=t.redSqr(),r=this.x.redSub(this.z),n=r.redSqr(),i=e.redSub(n),o=e.redMul(n),a=i.redMul(n.redAdd(this.curve.a24.redMul(i)));return this.curve.point(o,a)},i.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},i.prototype.diffAdd=function(t,e){var r=this.x.redAdd(this.z),n=this.x.redSub(this.z),i=t.x.redAdd(t.z),o=t.x.redSub(t.z),a=o.redMul(r),f=i.redMul(n),s=e.z.redMul(a.redAdd(f).redSqr()),u=e.x.redMul(a.redISub(f).redSqr());return this.curve.point(s,u)},i.prototype.mul=function(t){for(var e=t.clone(),r=this,n=this.curve.point(null,null),i=this,o=[];0!==e.cmpn(0);e.iushrn(1))o.push(e.andln(1));for(var a=o.length-1;a>=0;a--)0===o[a]?(r=r.diffAdd(n,i),n=n.dbl()):(n=r.diffAdd(n,i),r=r.dbl());return n},i.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},i.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},i.prototype.eq=function(t){return 0===this.getX().cmp(t.getX())},i.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},i.prototype.getX=function(){return this.normalize(),this.x.fromRed()}},function(t,e,r){"use strict";function n(t){h.call(this,"short",t),this.a=new s(t.a,16).toRed(this.red),this.b=new s(t.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(t),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function i(t,e,r,n){h.BasePoint.call(this,t,"affine"),null===e&&null===r?(this.x=null,this.y=null,this.inf=!0):(this.x=new s(e,16),this.y=new s(r,16),n&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function o(t,e,r,n){h.BasePoint.call(this,t,"jacobian"),null===e&&null===r&&null===n?(this.x=this.curve.one,this.y=this.curve.one,this.z=new s(0)):(this.x=new s(e,16),this.y=new s(r,16),this.z=new s(n,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}var a=r(99),f=r(19),s=r(18),u=r(2),h=a.base,c=f.utils.assert;u(n,h),t.exports=n,n.prototype._getEndomorphism=function(t){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var e,r;if(t.beta)e=new s(t.beta,16).toRed(this.red);else{var n=this._getEndoRoots(this.p);e=n[0].cmp(n[1])<0?n[0]:n[1],e=e.toRed(this.red)}if(t.lambda)r=new s(t.lambda,16);else{var i=this._getEndoRoots(this.n);0===this.g.mul(i[0]).x.cmp(this.g.x.redMul(e))?r=i[0]:(r=i[1],c(0===this.g.mul(r).x.cmp(this.g.x.redMul(e))))}var o;return o=t.basis?t.basis.map(function(t){return{a:new s(t.a,16),b:new s(t.b,16)}}):this._getEndoBasis(r),{beta:e,lambda:r,basis:o}}},n.prototype._getEndoRoots=function(t){var e=t===this.p?this.red:s.mont(t),r=new s(2).toRed(e).redInvm(),n=r.redNeg(),i=new s(3).toRed(e).redNeg().redSqrt().redMul(r),o=n.redAdd(i).fromRed(),a=n.redSub(i).fromRed();return[o,a]},n.prototype._getEndoBasis=function(t){for(var e,r,n,i,o,a,f,u,h,c=this.n.ushrn(Math.floor(this.n.bitLength()/2)),d=t,l=this.n.clone(),p=new s(1),b=new s(0),v=new s(0),y=new s(1),m=0;0!==d.cmpn(0);){var g=l.div(d);u=l.sub(g.mul(d)),h=v.sub(g.mul(p));var w=y.sub(g.mul(b));if(!n&&u.cmp(c)<0)e=f.neg(),r=p,n=u.neg(),i=h;else if(n&&2===++m)break;f=u,l=d,d=u,v=p,p=h,y=b,b=w}o=u.neg(),a=h;var _=n.sqr().add(i.sqr()),M=o.sqr().add(a.sqr());return M.cmp(_)>=0&&(o=e,a=r),n.negative&&(n=n.neg(),i=i.neg()),o.negative&&(o=o.neg(),a=a.neg()),[{a:n,b:i},{a:o,b:a}]},n.prototype._endoSplit=function(t){var e=this.endo.basis,r=e[0],n=e[1],i=n.b.mul(t).divRound(this.n),o=r.b.neg().mul(t).divRound(this.n),a=i.mul(r.a),f=o.mul(n.a),s=i.mul(r.b),u=o.mul(n.b),h=t.sub(a).sub(f),c=s.add(u).neg();return{k1:h,k2:c}},n.prototype.pointFromX=function(t,e){t=new s(t,16),t.red||(t=t.toRed(this.red));var r=t.redSqr().redMul(t).redIAdd(t.redMul(this.a)).redIAdd(this.b),n=r.redSqrt();if(0!==n.redSqr().redSub(r).cmp(this.zero))throw new Error("invalid point");var i=n.fromRed().isOdd();return(e&&!i||!e&&i)&&(n=n.redNeg()),this.point(t,n)},n.prototype.validate=function(t){if(t.inf)return!0;var e=t.x,r=t.y,n=this.a.redMul(e),i=e.redSqr().redMul(e).redIAdd(n).redIAdd(this.b);return 0===r.redSqr().redISub(i).cmpn(0)},n.prototype._endoWnafMulAdd=function(t,e,r){for(var n=this._endoWnafT1,i=this._endoWnafT2,o=0;o":""},i.prototype.isInfinity=function(){return this.inf},i.prototype.add=function(t){if(this.inf)return t;if(t.inf)return this;if(this.eq(t))return this.dbl();if(this.neg().eq(t))return this.curve.point(null,null);if(0===this.x.cmp(t.x))return this.curve.point(null,null);var e=this.y.redSub(t.y);0!==e.cmpn(0)&&(e=e.redMul(this.x.redSub(t.x).redInvm()));var r=e.redSqr().redISub(this.x).redISub(t.x),n=e.redMul(this.x.redSub(r)).redISub(this.y);return this.curve.point(r,n)},i.prototype.dbl=function(){if(this.inf)return this;var t=this.y.redAdd(this.y);if(0===t.cmpn(0))return this.curve.point(null,null);var e=this.curve.a,r=this.x.redSqr(),n=t.redInvm(),i=r.redAdd(r).redIAdd(r).redIAdd(e).redMul(n),o=i.redSqr().redISub(this.x.redAdd(this.x)),a=i.redMul(this.x.redSub(o)).redISub(this.y);return this.curve.point(o,a)},i.prototype.getX=function(){return this.x.fromRed()},i.prototype.getY=function(){return this.y.fromRed()},i.prototype.mul=function(t){return t=new s(t,16),this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve.endo?this.curve._endoWnafMulAdd([this],[t]):this.curve._wnafMul(this,t)},i.prototype.mulAdd=function(t,e,r){var n=[this,e],i=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i):this.curve._wnafMulAdd(1,n,i,2)},i.prototype.jmulAdd=function(t,e,r){var n=[this,e],i=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i,!0):this.curve._wnafMulAdd(1,n,i,2,!0)},i.prototype.eq=function(t){return this===t||this.inf===t.inf&&(this.inf||0===this.x.cmp(t.x)&&0===this.y.cmp(t.y))},i.prototype.neg=function(t){if(this.inf)return this;var e=this.curve.point(this.x,this.y.redNeg());if(t&&this.precomputed){var r=this.precomputed,n=function(t){return t.neg()};e.precomputed={naf:r.naf&&{wnd:r.naf.wnd,points:r.naf.points.map(n)},doubles:r.doubles&&{step:r.doubles.step,points:r.doubles.points.map(n)}}}return e},i.prototype.toJ=function(){if(this.inf)return this.curve.jpoint(null,null,null);var t=this.curve.jpoint(this.x,this.y,this.curve.one);return t},u(o,h.BasePoint),n.prototype.jpoint=function(t,e,r){return new o(this,t,e,r)},o.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var t=this.z.redInvm(),e=t.redSqr(),r=this.x.redMul(e),n=this.y.redMul(e).redMul(t);return this.curve.point(r,n)},o.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},o.prototype.add=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;var e=t.z.redSqr(),r=this.z.redSqr(),n=this.x.redMul(e),i=t.x.redMul(r),o=this.y.redMul(e.redMul(t.z)),a=t.y.redMul(r.redMul(this.z)),f=n.redSub(i),s=o.redSub(a);if(0===f.cmpn(0))return 0!==s.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var u=f.redSqr(),h=u.redMul(f),c=n.redMul(u),d=s.redSqr().redIAdd(h).redISub(c).redISub(c),l=s.redMul(c.redISub(d)).redISub(o.redMul(h)),p=this.z.redMul(t.z).redMul(f);return this.curve.jpoint(d,l,p)},o.prototype.mixedAdd=function(t){if(this.isInfinity())return t.toJ();if(t.isInfinity())return this;var e=this.z.redSqr(),r=this.x,n=t.x.redMul(e),i=this.y,o=t.y.redMul(e).redMul(this.z),a=r.redSub(n),f=i.redSub(o);if(0===a.cmpn(0))return 0!==f.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var s=a.redSqr(),u=s.redMul(a),h=r.redMul(s),c=f.redSqr().redIAdd(u).redISub(h).redISub(h),d=f.redMul(h.redISub(c)).redISub(i.redMul(u)),l=this.z.redMul(a);return this.curve.jpoint(c,d,l)},o.prototype.dblp=function(t){if(0===t)return this;if(this.isInfinity())return this;if(!t)return this.dbl();if(this.curve.zeroA||this.curve.threeA){for(var e=this,r=0;r=0)return!1;if(r.redIAdd(i),0===this.x.cmp(r))return!0}return!1},o.prototype.inspect=function(){return this.isInfinity()?"":""},o.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}},function(t,e,r){"use strict";function n(t){"short"===t.type?this.curve=new f.curve.short(t):"edwards"===t.type?this.curve=new f.curve.edwards(t):this.curve=new f.curve.mont(t),this.g=this.curve.g,this.n=this.curve.n,this.hash=t.hash,s(this.g.validate(),"Invalid curve"),s(this.g.mul(this.n).isInfinity(),"Invalid curve, G*N != O")}function i(t,e){Object.defineProperty(o,t,{configurable:!0,enumerable:!0,get:function(){var r=new n(e);return Object.defineProperty(o,t,{configurable:!0,enumerable:!0,value:r}),r}})}var o=e,a=r(49),f=r(19),s=f.utils.assert;o.PresetCurve=n,i("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:a.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),i("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:a.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),i("p256",{ type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:a.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),i("p384",{type:"short",prime:null,p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff",a:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc",b:"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",n:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",hash:a.sha384,gRed:!1,g:["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7","3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"]}),i("p521",{type:"short",prime:null,p:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff",a:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc",b:"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",n:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",hash:a.sha512,gRed:!1,g:["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66","00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"]}),i("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"0",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:a.sha256,gRed:!1,g:["9"]}),i("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:a.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]});var u;try{u=r(520)}catch(t){u=void 0}i("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:a.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",u]})},function(t,e,r){"use strict";function n(t){return this instanceof n?("string"==typeof t&&(f(o.curves.hasOwnProperty(t),"Unknown curve "+t),t=o.curves[t]),t instanceof o.curves.PresetCurve&&(t={curve:t}),this.curve=t.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=t.curve.g,this.g.precompute(t.curve.n.bitLength()+1),void(this.hash=t.hash||t.curve.hash)):new n(t)}var i=r(18),o=r(19),a=o.utils,f=a.assert,s=r(514),u=r(515);t.exports=n,n.prototype.keyPair=function(t){return new s(this,t)},n.prototype.keyFromPrivate=function(t,e){return s.fromPrivate(this,t,e)},n.prototype.keyFromPublic=function(t,e){return s.fromPublic(this,t,e)},n.prototype.genKeyPair=function(t){t||(t={});for(var e=new o.hmacDRBG({hash:this.hash,pers:t.pers,entropy:t.entropy||o.rand(this.hash.hmacStrength),nonce:this.n.toArray()}),r=this.n.byteLength(),n=this.n.sub(new i(2));;){var a=new i(e.generate(r));if(!(a.cmp(n)>0))return a.iaddn(1),this.keyFromPrivate(a)}},n.prototype._truncateToN=function(t,e){var r=8*t.byteLength()-this.n.bitLength();return r>0&&(t=t.ushrn(r)),!e&&t.cmp(this.n)>=0?t.sub(this.n):t},n.prototype.sign=function(t,e,r,n){"object"==typeof r&&(n=r,r=null),n||(n={}),e=this.keyFromPrivate(e,r),t=this._truncateToN(new i(t,16));for(var a=this.n.byteLength(),f=e.getPrivate().toArray("be",a),s=t.toArray("be",a),h=new o.hmacDRBG({hash:this.hash,entropy:f,nonce:s,pers:n.pers,persEnc:n.persEnc}),c=this.n.sub(new i(1)),d=0;!0;d++){var l=n.k?n.k(d):new i(h.generate(this.n.byteLength()));if(l=this._truncateToN(l,!0),!(l.cmpn(1)<=0||l.cmp(c)>=0)){var p=this.g.mul(l);if(!p.isInfinity()){var b=p.getX(),v=b.umod(this.n);if(0!==v.cmpn(0)){var y=l.invm(this.n).mul(v.mul(e.getPrivate()).iadd(t));if(y=y.umod(this.n),0!==y.cmpn(0)){var m=(p.getY().isOdd()?1:0)|(0!==b.cmp(v)?2:0);return n.canonical&&y.cmp(this.nh)>0&&(y=this.n.sub(y),m^=1),new u({r:v,s:y,recoveryParam:m})}}}}}},n.prototype.verify=function(t,e,r,n){t=this._truncateToN(new i(t,16)),r=this.keyFromPublic(r,n),e=new u(e,"hex");var o=e.r,a=e.s;if(o.cmpn(1)<0||o.cmp(this.n)>=0)return!1;if(a.cmpn(1)<0||a.cmp(this.n)>=0)return!1;var f=a.invm(this.n),s=f.mul(t).umod(this.n),h=f.mul(o).umod(this.n);if(!this.curve._maxwellTrick){var c=this.g.mulAdd(s,r.getPublic(),h);return!c.isInfinity()&&0===c.getX().umod(this.n).cmp(o)}var c=this.g.jmulAdd(s,r.getPublic(),h);return!c.isInfinity()&&c.eqXToP(o)},n.prototype.recoverPubKey=function(t,e,r,n){f((3&r)===r,"The recovery param is more than two bits"),e=new u(e,n);var o=this.n,a=new i(t),s=e.r,h=e.s,c=1&r,d=r>>1;if(s.cmp(this.curve.p.umod(this.curve.n))>=0&&d)throw new Error("Unable to find sencond key candinate");s=d?this.curve.pointFromX(s.add(this.curve.n),c):this.curve.pointFromX(s,c);var l=e.r.invm(o),p=o.sub(a).mul(l).umod(o),b=h.mul(l).umod(o);return this.g.mulAdd(p,s,b)},n.prototype.getKeyRecoveryParam=function(t,e,r,n){if(e=new u(e,n),null!==e.recoveryParam)return e.recoveryParam;for(var i=0;i<4;i++){var o;try{o=this.recoverPubKey(t,e,i)}catch(t){continue}if(o.eq(r))return i}throw new Error("Unable to find valid recovery factor")}},function(t,e,r){"use strict";function n(t,e){this.ec=t,this.priv=null,this.pub=null,e.priv&&this._importPrivate(e.priv,e.privEnc),e.pub&&this._importPublic(e.pub,e.pubEnc)}var i=r(18);t.exports=n,n.fromPublic=function(t,e,r){return e instanceof n?e:new n(t,{pub:e,pubEnc:r})},n.fromPrivate=function(t,e,r){return e instanceof n?e:new n(t,{priv:e,privEnc:r})},n.prototype.validate=function(){var t=this.getPublic();return t.isInfinity()?{result:!1,reason:"Invalid public key"}:t.validate()?t.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:"Public key * N != O"}:{result:!1,reason:"Public key is not a point"}},n.prototype.getPublic=function(t,e){return"string"==typeof t&&(e=t,t=null),this.pub||(this.pub=this.ec.g.mul(this.priv)),e?this.pub.encode(e,t):this.pub},n.prototype.getPrivate=function(t){return"hex"===t?this.priv.toString(16,2):this.priv},n.prototype._importPrivate=function(t,e){this.priv=new i(t,e||16),this.priv=this.priv.umod(this.ec.curve.n)},n.prototype._importPublic=function(t,e){return t.x||t.y?void(this.pub=this.ec.curve.point(t.x,t.y)):void(this.pub=this.ec.curve.decodePoint(t,e))},n.prototype.derive=function(t){return t.mul(this.priv).getX()},n.prototype.sign=function(t,e,r){return this.ec.sign(t,this,e,r)},n.prototype.verify=function(t,e){return this.ec.verify(t,e,this)},n.prototype.inspect=function(){return""}},function(t,e,r){"use strict";function n(t,e){return t instanceof n?t:void(this._importDER(t,e)||(c(t.r&&t.s,"Signature without r or s"),this.r=new s(t.r,16),this.s=new s(t.s,16),void 0===t.recoveryParam?this.recoveryParam=null:this.recoveryParam=t.recoveryParam))}function i(){this.place=0}function o(t,e){var r=t[e.place++];if(!(128&r))return r;for(var n=15&r,i=0,o=0,a=e.place;o>>3);for(t.push(128|r);--r;)t.push(e>>>(r<<3)&255);t.push(e)}var s=r(18),u=r(19),h=u.utils,c=h.assert;t.exports=n,n.prototype._importDER=function(t,e){t=h.toArray(t,e);var r=new i;if(48!==t[r.place++])return!1;var n=o(t,r);if(n+r.place!==t.length)return!1;if(2!==t[r.place++])return!1;var a=o(t,r),f=t.slice(r.place,a+r.place);if(r.place+=a,2!==t[r.place++])return!1;var u=o(t,r);if(t.length!==u+r.place)return!1;var c=t.slice(r.place,u+r.place);return 0===f[0]&&128&f[1]&&(f=f.slice(1)),0===c[0]&&128&c[1]&&(c=c.slice(1)),this.r=new s(f),this.s=new s(c),this.recoveryParam=null,!0},n.prototype.toDER=function(t){var e=this.r.toArray(),r=this.s.toArray();for(128&e[0]&&(e=[0].concat(e)),128&r[0]&&(r=[0].concat(r)),e=a(e),r=a(r);!(r[0]||128&r[1]);)r=r.slice(1);var n=[2];f(n,e.length),n=n.concat(e),n.push(2),f(n,r.length);var i=n.concat(r),o=[48];return f(o,i.length),o=o.concat(i),h.encode(o,t)}},function(t,e,r){"use strict";function n(t){if(f("ed25519"===t,"only tested with ed25519 so far"),!(this instanceof n))return new n(t);var t=o.curves[t].curve;this.curve=t,this.g=t.g,this.g.precompute(t.n.bitLength()+1),this.pointClass=t.point().constructor,this.encodingLength=Math.ceil(t.n.bitLength()/8),this.hash=i.sha512}var i=r(49),o=r(19),a=o.utils,f=a.assert,s=a.parseBytes,u=r(517),h=r(518);t.exports=n,n.prototype.sign=function(t,e){t=s(t);var r=this.keyFromSecret(e),n=this.hashInt(r.messagePrefix(),t),i=this.g.mul(n),o=this.encodePoint(i),a=this.hashInt(o,r.pubBytes(),t).mul(r.priv()),f=n.add(a).umod(this.curve.n);return this.makeSignature({R:i,S:f,Rencoded:o})},n.prototype.verify=function(t,e,r){t=s(t),e=this.makeSignature(e);var n=this.keyFromPublic(r),i=this.hashInt(e.Rencoded(),n.pubBytes(),t),o=this.g.mul(e.S()),a=e.R().add(n.pub().mul(i));return a.eq(o)},n.prototype.hashInt=function(){for(var t=this.hash(),e=0;e=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(e,r,i)}var i=r(49),o=r(19),a=o.utils,f=a.assert;t.exports=n,n.prototype._init=function(t,e,r){var n=t.concat(e).concat(r);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var i=0;i=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(t.concat(r||[])),this.reseed=1},n.prototype.generate=function(t,e,r,n){if(this.reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof e&&(n=r,r=e,e=null),r&&(r=a.toArray(r,n),this._update(r));for(var i=[];i.length>8,a=255&i;o?r.push(o,a):r.push(a)}return r}function i(t){return 1===t.length?"0"+t:t}function o(t){for(var e="",r=0;r=0;){var o;if(i.isOdd()){var a=i.andln(n-1);o=a>(n>>1)-1?(n>>1)-a:a,i.isubn(o)}else o=0;r.push(o);for(var f=0!==i.cmpn(0)&&0===i.andln(n-1)?e+1:1,s=1;s0||e.cmpn(-i)>0;){var o=t.andln(3)+n&3,a=e.andln(3)+i&3;3===o&&(o=-1),3===a&&(a=-1);var f;if(0===(1&o))f=0;else{var s=t.andln(7)+n&7;f=3!==s&&5!==s||2!==a?o:-o}r[0].push(f);var u;if(0===(1&a))u=0;else{var s=e.andln(7)+i&7;u=3!==s&&5!==s||2!==o?a:-a}r[1].push(u),2*n===f+1&&(n=1-n),2*i===u+1&&(i=1-i),t.iushrn(1),e.iushrn(1)}return r}function s(t,e,r){var n="_"+e;t.prototype[e]=function(){return void 0!==this[n]?this[n]:this[n]=r.call(this)}}function u(t){return"string"==typeof t?c.toArray(t,"hex"):t}function h(t){return new d(t,"hex","le")}var c=e,d=r(18);c.assert=function(t,e){if(!t)throw new Error(e||"Assertion failed")},c.toArray=n,c.zero2=i,c.toHex=o,c.encode=function(t,e){return"hex"===e?o(t):t},c.getNAF=a,c.getJSF=f,c.cachedProperty=s,c.parseBytes=u,c.intFromLE=h},function(t,e,r){function n(t){this.rand=t}var i;if(t.exports=function(t){return i||(i=new n(null)),i.generate(t)},t.exports.Rand=n,n.prototype.generate=function(t){return this._rand(t)},"object"==typeof window)window.crypto&&window.crypto.getRandomValues?n.prototype._rand=function(t){var e=new Uint8Array(t);return window.crypto.getRandomValues(e),e}:window.msCrypto&&window.msCrypto.getRandomValues?n.prototype._rand=function(t){var e=new Uint8Array(t);return window.msCrypto.getRandomValues(e),e}:n.prototype._rand=function(){throw new Error("Not implemented yet")};else try{var o=r(609);n.prototype._rand=function(t){return o.randomBytes(t)}}catch(t){n.prototype._rand=function(t){for(var e=new Uint8Array(t),r=0;r=this._delta8){t=this.pending;var r=t.length%this._delta8;this.pending=t.slice(t.length-r,t.length),0===this.pending.length&&(this.pending=null),t=o.join32(t,0,t.length-r,this.endian);for(var n=0;n>>24&255,n[i++]=t>>>16&255,n[i++]=t>>>8&255,n[i++]=255&t}else{n[i++]=255&t,n[i++]=t>>>8&255,n[i++]=t>>>16&255,n[i++]=t>>>24&255,n[i++]=0,n[i++]=0,n[i++]=0,n[i++]=0;for(var o=8;othis.blockSize&&(t=(new this.Hash).update(t).digest()),a(t.length<=this.blockSize);for(var e=t.length;e>>3}function p(t){return R(t,17)^R(t,19)^t>>>10}function b(t,e,r,n){return 0===t?s(e,r,n):1===t||3===t?h(e,r,n):2===t?u(e,r,n):void 0}function v(t,e,r,n,i,o){var a=t&r^~t&i;return a<0&&(a+=4294967296),a}function y(t,e,r,n,i,o){var a=e&n^~e&o;return a<0&&(a+=4294967296),a}function m(t,e,r,n,i,o){var a=t&r^t&i^r&i;return a<0&&(a+=4294967296),a}function g(t,e,r,n,i,o){var a=e&n^e&o^n&o;return a<0&&(a+=4294967296),a}function w(t,e){var r=N(t,e,28),n=N(e,t,2),i=N(e,t,7),o=r^n^i;return o<0&&(o+=4294967296),o}function _(t,e){var r=L(t,e,28),n=L(e,t,2),i=L(e,t,7),o=r^n^i;return o<0&&(o+=4294967296),o}function M(t,e){var r=N(t,e,14),n=N(t,e,18),i=N(e,t,9),o=r^n^i;return o<0&&(o+=4294967296),o}function S(t,e){var r=L(t,e,14),n=L(t,e,18),i=L(e,t,9),o=r^n^i;return o<0&&(o+=4294967296),o}function E(t,e){var r=N(t,e,1),n=N(t,e,8),i=U(t,e,7),o=r^n^i;return o<0&&(o+=4294967296),o}function A(t,e){var r=L(t,e,1),n=L(t,e,8),i=z(t,e,7),o=r^n^i;return o<0&&(o+=4294967296),o}function k(t,e){var r=N(t,e,19),n=N(e,t,29),i=U(t,e,6),o=r^n^i;return o<0&&(o+=4294967296),o}function x(t,e){var r=L(t,e,19),n=L(e,t,29),i=z(t,e,6),o=r^n^i;return o<0&&(o+=4294967296),o}var I=r(49),B=I.utils,O=B.assert,R=B.rotr32,P=B.rotl32,T=B.sum32,j=B.sum32_4,C=B.sum32_5,N=B.rotr64_hi,L=B.rotr64_lo,U=B.shr64_hi,z=B.shr64_lo,D=B.sum64,q=B.sum64_hi,F=B.sum64_lo,K=B.sum64_4_hi,G=B.sum64_4_lo,V=B.sum64_5_hi,H=B.sum64_5_lo,X=I.common.BlockHash,Y=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],W=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],Z=[1518500249,1859775393,2400959708,3395469782];B.inherits(n,X),e.sha256=n,n.blockSize=512,n.outSize=256,n.hmacStrength=192,n.padLength=64,n.prototype._update=function(t,e){for(var r=this.W,n=0;n<16;n++)r[n]=t[e+n];for(;n>8,a=255&i;o?r.push(o,a):r.push(a)}else for(var n=0;n>>24|t>>>8&65280|t<<8&16711680|(255&t)<<24;return e>>>0}function a(t,e){for(var r="",n=0;n>>0}return o}function h(t,e){for(var r=new Array(4*t.length),n=0,i=0;n>>24,r[i+1]=o>>>16&255,r[i+2]=o>>>8&255,r[i+3]=255&o):(r[i+3]=o>>>24,r[i+2]=o>>>16&255,r[i+1]=o>>>8&255,r[i]=255&o)}return r}function c(t,e){return t>>>e|t<<32-e}function d(t,e){return t<>>32-e}function l(t,e){return t+e>>>0}function p(t,e,r){return t+e+r>>>0}function b(t,e,r,n){return t+e+r+n>>>0}function v(t,e,r,n,i){return t+e+r+n+i>>>0}function y(t,e){if(!t)throw new Error(e||"Assertion failed")}function m(t,e,r,n){var i=t[e],o=t[e+1],a=n+o>>>0,f=(a>>0,t[e+1]=a}function g(t,e,r,n){var i=e+n>>>0,o=(i>>0}function w(t,e,r,n){var i=e+n;return i>>>0}function _(t,e,r,n,i,o,a,f){var s=0,u=e;u=u+n>>>0,s+=u>>0,s+=u>>0,s+=u>>0}function M(t,e,r,n,i,o,a,f){var s=e+n+o+f;return s>>>0}function S(t,e,r,n,i,o,a,f,s,u){var h=0,c=e;c=c+n>>>0,h+=c>>0,h+=c>>0,h+=c>>0,h+=c>>0}function E(t,e,r,n,i,o,a,f,s,u){var h=e+n+o+f+u;return h>>>0}function A(t,e,r){var n=e<<32-r|t>>>r;return n>>>0}function k(t,e,r){var n=t<<32-r|e>>>r;return n>>>0}function x(t,e,r){return t>>>r}function I(t,e,r){var n=t<<32-r|e>>>r;return n>>>0}var B=e,O=r(2);B.toArray=n,B.toHex=i,B.htonl=o,B.toHex32=a,B.zero2=f,B.zero8=s,B.join32=u,B.split32=h,B.rotr32=c,B.rotl32=d,B.sum32=l,B.sum32_3=p,B.sum32_4=b,B.sum32_5=v,B.assert=y,B.inherits=O,e.sum64=m,e.sum64_hi=g,e.sum64_lo=w,e.sum64_4_hi=_,e.sum64_4_lo=M,e.sum64_5_hi=S,e.sum64_5_lo=E,e.rotr64_hi=A,e.rotr64_lo=k,e.shr64_hi=x,e.shr64_lo=I},function(t,e,r){var n=r(100),i=n.define("RSAPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("modulus").int(),this.key("publicExponent").int(),this.key("privateExponent").int(),this.key("prime1").int(),this.key("prime2").int(),this.key("exponent1").int(),this.key("exponent2").int(),this.key("coefficient").int())});e.RSAPrivateKey=i;var o=n.define("RSAPublicKey",function(){this.seq().obj(this.key("modulus").int(),this.key("publicExponent").int())});e.RSAPublicKey=o;var a=n.define("SubjectPublicKeyInfo",function(){this.seq().obj(this.key("algorithm").use(f),this.key("subjectPublicKey").bitstr())});e.PublicKey=a;var f=n.define("AlgorithmIdentifier",function(){this.seq().obj(this.key("algorithm").objid(),this.key("none").null_().optional(),this.key("curve").objid().optional(),this.key("params").seq().obj(this.key("p").int(),this.key("q").int(),this.key("g").int()).optional())}),s=n.define("PrivateKeyInfo",function(){this.seq().obj(this.key("version").int(),this.key("algorithm").use(f),this.key("subjectPrivateKey").octstr())});e.PrivateKey=s;var u=n.define("EncryptedPrivateKeyInfo",function(){this.seq().obj(this.key("algorithm").seq().obj(this.key("id").objid(),this.key("decrypt").seq().obj(this.key("kde").seq().obj(this.key("id").objid(),this.key("kdeparams").seq().obj(this.key("salt").octstr(),this.key("iters").int())),this.key("cipher").seq().obj(this.key("algo").objid(),this.key("iv").octstr()))),this.key("subjectPrivateKey").octstr())});e.EncryptedPrivateKey=u;var h=n.define("DSAPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("p").int(),this.key("q").int(),this.key("g").int(),this.key("pub_key").int(),this.key("priv_key").int())});e.DSAPrivateKey=h,e.DSAparam=n.define("DSAparam",function(){this.int()});var c=n.define("ECPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("privateKey").octstr(),this.key("parameters").optional().explicit(0).use(d),this.key("publicKey").optional().explicit(1).bitstr())});e.ECPrivateKey=c;var d=n.define("ECParameters",function(){this.choice({namedCurve:this.objid()})});e.signature=n.define("signature",function(){this.seq().obj(this.key("r").int(),this.key("s").int())})},function(t,e,r){(function(e){var n=/Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)\r?\n\r?\n([0-9A-z\n\r\+\/\=]+)\r?\n/m,i=/^-----BEGIN (.*) KEY-----\r?\n/m,o=/^-----BEGIN (.*) KEY-----\r?\n([0-9A-z\n\r\+\/\=]+)\r?\n-----END \1 KEY-----$/m,a=r(148),f=r(219);t.exports=function(t,r){var s,u=t.toString(),h=u.match(n);if(h){var c="aes"+h[1],d=new e(h[2],"hex"),l=new e(h[3].replace(/\r?\n/g,""),"base64"),p=a(r,d.slice(0,8),parseInt(h[1],10)).key,b=[],v=f.createDecipheriv(c,p,d);b.push(v.update(l)),b.push(v.final()),s=e.concat(b)}else{var y=u.match(o);s=new e(y[2].replace(/\r?\n/g,""),"base64")}var m=u.match(i)[1]+" KEY";return{tag:m,data:s}}}).call(e,r(1).Buffer)},function(t,e,r){function n(t,e){this.name=t,this.body=e,this.decoders={},this.encoders={}}var i=r(100),o=r(2),a=e;a.define=function(t,e){return new n(t,e)},n.prototype._createNamed=function(t){var e;try{e=r(251).runInThisContext("(function "+this.name+"(entity) {\n this._initNamed(entity);\n})")}catch(t){e=function(t){this._initNamed(t)}}return o(e,t),e.prototype._initNamed=function(e){t.call(this,e)},new e(this)},n.prototype._getDecoder=function(t){return t=t||"der",this.decoders.hasOwnProperty(t)||(this.decoders[t]=this._createNamed(i.decoders[t])),this.decoders[t]},n.prototype.decode=function(t,e,r){return this._getDecoder(e).decode(t,r)},n.prototype._getEncoder=function(t){return t=t||"der",this.encoders.hasOwnProperty(t)||(this.encoders[t]=this._createNamed(i.encoders[t])),this.encoders[t]},n.prototype.encode=function(t,e,r){return this._getEncoder(e).encode(t,r)}},function(t,e,r){function n(t,e){var r={};this._baseState=r,r.enc=t,r.parent=e||null,r.children=null,r.tag=null,r.args=null,r.reverseArgs=null,r.choice=null,r.optional=!1,r.any=!1,r.obj=!1,r.use=null,r.useDecoder=null,r.key=null,r.default=null,r.explicit=null,r.implicit=null,r.contains=null,r.parent||(r.children=[],this._wrap())}var i=r(68).Reporter,o=r(68).EncoderBuffer,a=r(68).DecoderBuffer,f=r(538),s=["seq","seqof","set","setof","objid","bool","gentime","utctime","null_","enum","int","bitstr","bmpstr","charstr","genstr","graphstr","ia5str","iso646str","numstr","octstr","printstr","t61str","unistr","utf8str","videostr"],u=["key","obj","use","optional","explicit","implicit","def","choice","any","contains"].concat(s),h=["_peekTag","_decodeTag","_use","_decodeStr","_decodeObjid","_decodeTime","_decodeNull","_decodeInt","_decodeBool","_decodeList","_encodeComposite","_encodeStr","_encodeObjid","_encodeTime","_encodeNull","_encodeInt","_encodeBool"];t.exports=n;var c=["enc","parent","children","tag","args","reverseArgs","choice","optional","any","obj","use","alteredUse","key","default","explicit","implicit","contains"];n.prototype.clone=function(){var t=this._baseState,e={};c.forEach(function(r){e[r]=t[r]});var r=new this.constructor(e.parent);return r._baseState=e,r},n.prototype._wrap=function(){var t=this._baseState;u.forEach(function(e){this[e]=function(){var r=new this.constructor(this);return t.children.push(r),r[e].apply(r,arguments)}},this)},n.prototype._init=function(t){var e=this._baseState;f(null===e.parent),t.call(this),e.children=e.children.filter(function(t){return t._baseState.parent===this},this),f.equal(e.children.length,1,"Root node can have only one child")},n.prototype._useArgs=function(t){var e=this._baseState,r=t.filter(function(t){return t instanceof this.constructor},this);t=t.filter(function(t){return!(t instanceof this.constructor)},this),0!==r.length&&(f(null===e.children),e.children=r,r.forEach(function(t){t._baseState.parent=this},this)),0!==t.length&&(f(null===e.args),e.args=t,e.reverseArgs=t.map(function(t){if("object"!=typeof t||t.constructor!==Object)return t;var e={};return Object.keys(t).forEach(function(r){r==(0|r)&&(r|=0);var n=t[r];e[n]=r}),e}))},h.forEach(function(t){n.prototype[t]=function(){var e=this._baseState;throw new Error(t+" not implemented for encoding: "+e.enc)}}),s.forEach(function(t){n.prototype[t]=function(){var e=this._baseState,r=Array.prototype.slice.call(arguments);return f(null===e.tag),e.tag=t,this._useArgs(r),this}}),n.prototype.use=function(t){var e=this._baseState;return f(null===e.use),e.use=t,this},n.prototype.optional=function(){var t=this._baseState;return t.optional=!0,this},n.prototype.def=function(t){var e=this._baseState;return f(null===e.default),e.default=t,e.optional=!0,this},n.prototype.explicit=function(t){var e=this._baseState;return f(null===e.explicit&&null===e.implicit),e.explicit=t,this},n.prototype.implicit=function(t){var e=this._baseState;return f(null===e.explicit&&null===e.implicit),e.implicit=t,this},n.prototype.obj=function(){var t=this._baseState,e=Array.prototype.slice.call(arguments);return t.obj=!0,0!==e.length&&this._useArgs(e),this},n.prototype.key=function(t){var e=this._baseState;return f(null===e.key),e.key=t,this},n.prototype.any=function(){var t=this._baseState;return t.any=!0,this},n.prototype.choice=function(t){var e=this._baseState;return f(null===e.choice),e.choice=t,this._useArgs(Object.keys(t).map(function(e){return t[e]})),this},n.prototype.contains=function(t){var e=this._baseState;return f(null===e.use),e.contains=t,this},n.prototype._decode=function(t,e){var r=this._baseState;if(null===r.parent)return t.wrapResult(r.children[0]._decode(t,e));var n=r.default,i=!0,o=null;if(null!==r.key&&(o=t.enterKey(r.key)),r.optional){var f=null;if(null!==r.explicit?f=r.explicit:null!==r.implicit?f=r.implicit:null!==r.tag&&(f=r.tag),null!==f||r.any){if(i=this._peekTag(t,f,r.any),t.isError(i))return i}else{var s=t.save();try{null===r.choice?this._decodeGeneric(r.tag,t,e):this._decodeChoice(t,e),i=!0}catch(t){i=!1}t.restore(s)}}var u;if(r.obj&&i&&(u=t.enterObject()),i){if(null!==r.explicit){var h=this._decodeTag(t,r.explicit);if(t.isError(h))return h;t=h}var c=t.offset;if(null===r.use&&null===r.choice){if(r.any)var s=t.save();var d=this._decodeTag(t,null!==r.implicit?r.implicit:r.tag,r.any);if(t.isError(d))return d;r.any?n=t.raw(s):t=d}if(e&&e.track&&null!==r.tag&&e.track(t.path(),c,t.length,"tagged"),e&&e.track&&null!==r.tag&&e.track(t.path(),t.offset,t.length,"content"),n=r.any?n:null===r.choice?this._decodeGeneric(r.tag,t,e):this._decodeChoice(t,e),t.isError(n))return n;if(r.any||null!==r.choice||null===r.children||r.children.forEach(function(r){r._decode(t,e)}),r.contains&&("octstr"===r.tag||"bitstr"===r.tag)){var l=new a(n);n=this._getUse(r.contains,t._reporterState.obj)._decode(l,e)}}return r.obj&&i&&(n=t.leaveObject(u)),null===r.key||null===n&&i!==!0?null!==o&&t.exitKey(o):t.leaveKey(o,r.key,n),n},n.prototype._decodeGeneric=function(t,e,r){var n=this._baseState;return"seq"===t||"set"===t?null:"seqof"===t||"setof"===t?this._decodeList(e,t,n.args[0],r):/str$/.test(t)?this._decodeStr(e,t,r):"objid"===t&&n.args?this._decodeObjid(e,n.args[0],n.args[1],r):"objid"===t?this._decodeObjid(e,null,null,r):"gentime"===t||"utctime"===t?this._decodeTime(e,t,r):"null_"===t?this._decodeNull(e,r):"bool"===t?this._decodeBool(e,r):"int"===t||"enum"===t?this._decodeInt(e,n.args&&n.args[0],r):null!==n.use?this._getUse(n.use,e._reporterState.obj)._decode(e,r):e.error("unknown tag: "+t)},n.prototype._getUse=function(t,e){var r=this._baseState;return r.useDecoder=this._use(t,e),f(null===r.useDecoder._baseState.parent),r.useDecoder=r.useDecoder._baseState.children[0],r.implicit!==r.useDecoder._baseState.implicit&&(r.useDecoder=r.useDecoder.clone(),r.useDecoder._baseState.implicit=r.implicit),r.useDecoder},n.prototype._decodeChoice=function(t,e){var r=this._baseState,n=null,i=!1;return Object.keys(r.choice).some(function(o){var a=t.save(),f=r.choice[o];try{var s=f._decode(t,e);if(t.isError(s))return!1;n={type:o,value:s},i=!0}catch(e){return t.restore(a),!1}return!0},this),i?n:t.error("Choice not matched")},n.prototype._createEncoderBuffer=function(t){return new o(t,this.reporter)},n.prototype._encode=function(t,e,r){var n=this._baseState;if(null===n.default||n.default!==t){var i=this._encodeValue(t,e,r);if(void 0!==i&&!this._skipDefault(i,e,r))return i}},n.prototype._encodeValue=function(t,e,r){var n=this._baseState;if(null===n.parent)return n.children[0]._encode(t,e||new i);var o=null;if(this.reporter=e,n.optional&&void 0===t){if(null===n.default)return;t=n.default}var a=null,f=!1;if(n.any)o=this._createEncoderBuffer(t);else if(n.choice)o=this._encodeChoice(t,e);else if(n.contains)a=this._getUse(n.contains,r)._encode(t,e),f=!0;else if(n.children)a=n.children.map(function(r){if("null_"===r._baseState.tag)return r._encode(null,e,t);if(null===r._baseState.key)return e.error("Child should have a key");var n=e.enterKey(r._baseState.key);if("object"!=typeof t)return e.error("Child expected, but input is not object");var i=r._encode(t[r._baseState.key],e,t);return e.leaveKey(n),i},this).filter(function(t){return t}),a=this._createEncoderBuffer(a);else if("seqof"===n.tag||"setof"===n.tag){if(!n.args||1!==n.args.length)return e.error("Too many args for : "+n.tag);if(!Array.isArray(t))return e.error("seqof/setof, but data is not Array");var s=this.clone();s._baseState.implicit=null,a=this._createEncoderBuffer(t.map(function(r){var n=this._baseState;return this._getUse(n.args[0],t)._encode(r,e)},s))}else null!==n.use?o=this._getUse(n.use,r)._encode(t,e):(a=this._encodePrimitive(n.tag,t),f=!0);var o;if(!n.any&&null===n.choice){var u=null!==n.implicit?n.implicit:n.tag,h=null===n.implicit?"universal":"context";null===u?null===n.use&&e.error("Tag could be ommited only for .use()"):null===n.use&&(o=this._encodeComposite(u,f,h,a))}return null!==n.explicit&&(o=this._encodeComposite(n.explicit,!1,"context",o)),o},n.prototype._encodeChoice=function(t,e){var r=this._baseState,n=r.choice[t.type];return n||f(!1,t.type+" not found in "+JSON.stringify(Object.keys(r.choice))),n._encode(t.value,e)},n.prototype._encodePrimitive=function(t,e){var r=this._baseState;if(/str$/.test(t))return this._encodeStr(e,t);if("objid"===t&&r.args)return this._encodeObjid(e,r.reverseArgs[0],r.args[1]);if("objid"===t)return this._encodeObjid(e,null,null);if("gentime"===t||"utctime"===t)return this._encodeTime(e,t);if("null_"===t)return this._encodeNull();if("int"===t||"enum"===t)return this._encodeInt(e,r.args&&r.reverseArgs[0]);if("bool"===t)return this._encodeBool(e);throw new Error("Unsupported tag: "+t)},n.prototype._isNumstr=function(t){return/^[0-9 ]*$/.test(t)},n.prototype._isPrintstr=function(t){return/^[A-Za-z0-9 '\(\)\+,\-\.\/:=\?]*$/.test(t)}},function(t,e,r){function n(t){this._reporterState={obj:null,path:[],options:t||{},errors:[]}}function i(t,e){this.path=t,this.rethrow(e)}var o=r(2);e.Reporter=n,n.prototype.isError=function(t){return t instanceof i},n.prototype.save=function(){var t=this._reporterState;return{obj:t.obj,pathLen:t.path.length}},n.prototype.restore=function(t){var e=this._reporterState;e.obj=t.obj,e.path=e.path.slice(0,t.pathLen)},n.prototype.enterKey=function(t){return this._reporterState.path.push(t)},n.prototype.exitKey=function(t){var e=this._reporterState;e.path=e.path.slice(0,t-1)},n.prototype.leaveKey=function(t,e,r){var n=this._reporterState;this.exitKey(t),null!==n.obj&&(n.obj[e]=r)},n.prototype.path=function(){return this._reporterState.path.join("/")},n.prototype.enterObject=function(){var t=this._reporterState,e=t.obj;return t.obj={},e},n.prototype.leaveObject=function(t){var e=this._reporterState,r=e.obj;return e.obj=t,r},n.prototype.error=function(t){var e,r=this._reporterState,n=t instanceof i;if(e=n?t:new i(r.path.map(function(t){return"["+JSON.stringify(t)+"]"}).join(""),t.message||t,t.stack),!r.options.partial)throw e;return n||r.errors.push(e),e},n.prototype.wrapResult=function(t){var e=this._reporterState;return e.options.partial?{result:this.isError(t)?null:t,errors:e.errors}:t},o(i,Error),i.prototype.rethrow=function(t){if(this.message=t+" at: "+(this.path||"(shallow)"),Error.captureStackTrace&&Error.captureStackTrace(this,i),!this.stack)try{throw new Error(this.message)}catch(t){this.stack=t.stack}return this}},function(t,e,r){var n=r(215);e.tagClass={0:"universal",1:"application",2:"context",3:"private"},e.tagClassByName=n._reverse(e.tagClass),e.tag={0:"end",1:"bool",2:"int",3:"bitstr",4:"octstr",5:"null_",6:"objid",7:"objDesc",8:"external",9:"real",10:"enum",11:"embed",12:"utf8str",13:"relativeOid",16:"seq",17:"set",18:"numstr",19:"printstr",20:"t61str", 21:"videostr",22:"ia5str",23:"utctime",24:"gentime",25:"graphstr",26:"iso646str",27:"genstr",28:"unistr",29:"charstr",30:"bmpstr"},e.tagByName=n._reverse(e.tag)},function(t,e,r){var n=e;n.der=r(216),n.pem=r(535)},function(t,e,r){function n(t){a.call(this,t),this.enc="pem"}var i=r(2),o=r(1).Buffer,a=r(216);i(n,a),t.exports=n,n.prototype.decode=function(t,e){for(var r=t.toString().split(/[\r\n]+/g),n=e.label.toUpperCase(),i=/^-----(BEGIN|END) ([^-]+)-----$/,f=-1,s=-1,u=0;u16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e}else if(this.cache.length>=16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e;return null},i.prototype.flush=function(){if(this.cache.length)return this.cache};var b={ECB:r(224),CBC:r(220),CFB:r(221),CFB8:r(223),CFB1:r(222),OFB:r(225),CTR:r(102),GCM:r(102)};e.createDecipher=f,e.createDecipheriv=a}).call(e,r(1).Buffer)},function(t,e,r){(function(t){function n(e,r,o){return this instanceof n?(s.call(this),this._cache=new i,this._cipher=new f.AES(r),this._prev=new t(o.length),o.copy(this._prev),this._mode=e,void(this._autopadding=!0)):new n(e,r,o)}function i(){return this instanceof i?void(this.cache=new t("")):new i}function o(e,r,i){var o=h[e.toLowerCase()];if(!o)throw new TypeError("invalid suite type");if("string"==typeof i&&(i=new t(i)),"string"==typeof r&&(r=new t(r)),r.length!==o.key/8)throw new TypeError("invalid key length "+r.length);if(i.length!==o.iv)throw new TypeError("invalid iv length "+i.length);return"stream"===o.type?new d(p[o.mode],r,i):"auth"===o.type?new l(p[o.mode],r,i):new n(p[o.mode],r,i)}function a(t,e){var r=h[t.toLowerCase()];if(!r)throw new TypeError("invalid suite type");var n=c(e,!1,r.key,r.iv);return o(t,n.key,n.iv)}var f=r(101),s=r(103),u=r(2),h=r(147),c=r(148),d=r(226),l=r(218);u(n,s),n.prototype._update=function(e){this._cache.add(e);for(var r,n,i=[];r=this._cache.get();)n=this._mode.encrypt(this,r),i.push(n);return t.concat(i)},n.prototype._final=function(){var t=this._cache.flush();if(this._autopadding)return t=this._mode.encrypt(this,t),this._cipher.scrub(),t;if("10101010101010101010101010101010"!==t.toString("hex"))throw this._cipher.scrub(),new Error("data not multiple of block length")},n.prototype.setAutoPadding=function(t){return this._autopadding=!!t,this},i.prototype.add=function(e){this.cache=t.concat([this.cache,e])},i.prototype.get=function(){if(this.cache.length>15){var t=this.cache.slice(0,16);return this.cache=this.cache.slice(16),t}return null},i.prototype.flush=function(){for(var e=16-this.cache.length,r=new t(e),n=-1;++ns||t<0?(r=Math.abs(t)%s,t<0?s-r:r):t}function a(t,e){return[t[0]^e[0],t[1]^e[1],t[2]^e[2],t[3]^e[3]]}var f=new e(16);f.fill(0),t.exports=r,r.prototype.ghash=function(t){for(var e=-1;++e0;t--)o[t]=o[t]>>>1|(1&o[t-1])<<31;o[0]=o[0]>>>1,r&&(o[0]=o[0]^225<<24)}this.state=i(f)},r.prototype.update=function(t){this.cache=e.concat([this.cache,t]);for(var r;this.cache.length>=16;)r=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(r)},r.prototype.final=function(t,r){return this.cache.length&&this.ghash(e.concat([this.cache,f],16)),this.ghash(i([0,t,0,r])),this.state};var s=Math.pow(2,32)}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(t,e,r,n){var a=v(e);if(a.curve){if("ecdsa"!==n)throw new Error("wrong private key type");return i(t,a)}if("dsa"===a.type){if("dsa"!==n)throw new Error("wrong private key type");return o(t,a,r)}if("rsa"!==n)throw new Error("wrong private key type");for(var f=a.modulus.byteLength(),s=[0,1];t.length+s.length+10&&r.ishrn(n),r}function u(t,r){t=s(t,r),t=t.mod(r);var n=new e(t.toArray());if(n.length=e)throw new Error("invalid sig")}var f=r(212),s=r(19),u=r(213),h=r(18),c=s.ec;t.exports=n}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(t){this.curveType=f[t],this.curveType||(this.curveType={name:t}),this.curve=new o.ec(this.curveType.name),this.keys=void 0}function i(t,r,n){Array.isArray(t)||(t=t.toArray());var i=new e(t);if(n&&i.length0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function i(t,e){this.curve=t,this.type=e,this.precomputed=null}var o=r(30),a=r(22),f=a.utils,s=f.getNAF,u=f.getJSF,h=f.assert;t.exports=n,n.prototype.point=function(){throw new Error("Not implemented")},n.prototype.validate=function(){throw new Error("Not implemented")},n.prototype._fixedNafMul=function(t,e){h(t.precomputed);var r=t._getDoubles(),n=s(e,1),i=(1<=a;e--)f=(f<<1)+n[e];o.push(f)}for(var u=this.jpoint(null,null,null),c=this.jpoint(null,null,null),d=i;d>0;d--){for(var a=0;a=0;f--){for(var e=0;f>=0&&0===o[f];f--)e++;if(f>=0&&e++,a=a.dblp(e),f<0)break;var u=o[f];h(0!==u),a="affine"===t.type?u>0?a.mixedAdd(i[u-1>>1]):a.mixedAdd(i[-u-1>>1].neg()):u>0?a.add(i[u-1>>1]):a.add(i[-u-1>>1].neg())}return"affine"===t.type?a.toP():a},n.prototype._wnafMulAdd=function(t,e,r,n,i){for(var o=this._wnafT1,a=this._wnafT2,f=this._wnafT3,h=0,c=0;c=1;c-=2){var p=c-1,b=c;if(1===o[p]&&1===o[b]){var v=[e[p],null,null,e[b]];0===e[p].y.cmp(e[b].y)?(v[1]=e[p].add(e[b]),v[2]=e[p].toJ().mixedAdd(e[b].neg())):0===e[p].y.cmp(e[b].y.redNeg())?(v[1]=e[p].toJ().mixedAdd(e[b]),v[2]=e[p].add(e[b].neg())):(v[1]=e[p].toJ().mixedAdd(e[b]),v[2]=e[p].toJ().mixedAdd(e[b].neg()));var y=[-3,-1,-5,-7,0,7,5,1,3],m=u(r[p],r[b]);h=Math.max(m[0].length,h),f[p]=new Array(h),f[b]=new Array(h);for(var g=0;g=0;c--){for(var E=0;c>=0;){for(var A=!0,g=0;g=0&&E++,M=M.dblp(E),c<0)break;for(var g=0;g0?d=a[g][k-1>>1]:k<0&&(d=a[g][-k-1>>1].neg()),M="affine"===d.type?M.mixedAdd(d):M.add(d))}}for(var c=0;c=Math.ceil((t.bitLength()+1)/e.step)},i.prototype._getDoubles=function(t,e){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var r=[this],n=this,i=0;i":""},i.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&0===this.y.cmp(this.z)},i.prototype._extDbl=function(){var t=this.x.redSqr(),e=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var n=this.curve._mulA(t),i=this.x.redAdd(this.y).redSqr().redISub(t).redISub(e),o=n.redAdd(e),a=o.redSub(r),f=n.redSub(e),s=i.redMul(a),u=o.redMul(f),h=i.redMul(f),c=a.redMul(o);return this.curve.point(s,u,c,h)},i.prototype._projDbl=function(){var t,e,r,n=this.x.redAdd(this.y).redSqr(),i=this.x.redSqr(),o=this.y.redSqr();if(this.curve.twisted){var a=this.curve._mulA(i),f=a.redAdd(o);if(this.zOne)t=n.redSub(i).redSub(o).redMul(f.redSub(this.curve.two)),e=f.redMul(a.redSub(o)),r=f.redSqr().redSub(f).redSub(f);else{var s=this.z.redSqr(),u=f.redSub(s).redISub(s);t=n.redSub(i).redISub(o).redMul(u),e=f.redMul(a.redSub(o)),r=f.redMul(u)}}else{var a=i.redAdd(o),s=this.curve._mulC(this.c.redMul(this.z)).redSqr(),u=a.redSub(s).redSub(s);t=this.curve._mulC(n.redISub(a)).redMul(u),e=this.curve._mulC(a).redMul(i.redISub(o)),r=a.redMul(u)}return this.curve.point(t,e,r)},i.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},i.prototype._extAdd=function(t){var e=this.y.redSub(this.x).redMul(t.y.redSub(t.x)),r=this.y.redAdd(this.x).redMul(t.y.redAdd(t.x)),n=this.t.redMul(this.curve.dd).redMul(t.t),i=this.z.redMul(t.z.redAdd(t.z)),o=r.redSub(e),a=i.redSub(n),f=i.redAdd(n),s=r.redAdd(e),u=o.redMul(a),h=f.redMul(s),c=o.redMul(s),d=a.redMul(f);return this.curve.point(u,h,d,c)},i.prototype._projAdd=function(t){var e,r,n=this.z.redMul(t.z),i=n.redSqr(),o=this.x.redMul(t.x),a=this.y.redMul(t.y),f=this.curve.d.redMul(o).redMul(a),s=i.redSub(f),u=i.redAdd(f),h=this.x.redAdd(this.y).redMul(t.x.redAdd(t.y)).redISub(o).redISub(a),c=n.redMul(s).redMul(h);return this.curve.twisted?(e=n.redMul(u).redMul(a.redSub(this.curve._mulA(o))),r=s.redMul(u)):(e=n.redMul(u).redMul(a.redSub(o)),r=this.curve._mulC(s).redMul(u)),this.curve.point(c,e,r)},i.prototype.add=function(t){return this.isInfinity()?t:t.isInfinity()?this:this.curve.extended?this._extAdd(t):this._projAdd(t)},i.prototype.mul=function(t){return this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve._wnafMul(this,t)},i.prototype.mulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!1)},i.prototype.jmulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!0)},i.prototype.normalize=function(){if(this.zOne)return this;var t=this.z.redInvm();return this.x=this.x.redMul(t),this.y=this.y.redMul(t),this.t&&(this.t=this.t.redMul(t)),this.z=this.curve.one,this.zOne=!0,this},i.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},i.prototype.getX=function(){return this.normalize(),this.x.fromRed()},i.prototype.getY=function(){return this.normalize(),this.y.fromRed()},i.prototype.eq=function(t){return this===t||0===this.getX().cmp(t.getX())&&0===this.getY().cmp(t.getY())},i.prototype.eqXToP=function(t){var e=t.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(e))return!0;for(var r=t.clone(),n=this.curve.redN.redMul(this.z);;){if(r.iadd(this.curve.n),r.cmp(this.curve.p)>=0)return!1;if(e.redIAdd(n),0===this.x.cmp(e))return!0}return!1},i.prototype.toP=i.prototype.normalize,i.prototype.mixedAdd=i.prototype.add},function(t,e,r){"use strict";function n(t){s.call(this,"mont",t),this.a=new a(t.a,16).toRed(this.red),this.b=new a(t.b,16).toRed(this.red),this.i4=new a(4).toRed(this.red).redInvm(),this.two=new a(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function i(t,e,r){s.BasePoint.call(this,t,"projective"),null===e&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new a(e,16),this.z=new a(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}var o=r(104),a=r(30),f=r(2),s=o.base,u=r(22),h=u.utils;f(n,s),t.exports=n,n.prototype.validate=function(t){var e=t.normalize().x,r=e.redSqr(),n=r.redMul(e).redAdd(r.redMul(this.a)).redAdd(e),i=n.redSqrt();return 0===i.redSqr().cmp(n)},f(i,s.BasePoint),n.prototype.decodePoint=function(t,e){return this.point(h.toArray(t,e),1)},n.prototype.point=function(t,e){return new i(this,t,e)},n.prototype.pointFromJSON=function(t){return i.fromJSON(this,t)},i.prototype.precompute=function(){},i.prototype._encode=function(){return this.getX().toArray("be",this.curve.p.byteLength())},i.fromJSON=function(t,e){return new i(t,e[0],e[1]||t.one)},i.prototype.inspect=function(){return this.isInfinity()?"":""},i.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},i.prototype.dbl=function(){var t=this.x.redAdd(this.z),e=t.redSqr(),r=this.x.redSub(this.z),n=r.redSqr(),i=e.redSub(n),o=e.redMul(n),a=i.redMul(n.redAdd(this.curve.a24.redMul(i)));return this.curve.point(o,a)},i.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},i.prototype.diffAdd=function(t,e){var r=this.x.redAdd(this.z),n=this.x.redSub(this.z),i=t.x.redAdd(t.z),o=t.x.redSub(t.z),a=o.redMul(r),f=i.redMul(n),s=e.z.redMul(a.redAdd(f).redSqr()),u=e.x.redMul(a.redISub(f).redSqr());return this.curve.point(s,u)},i.prototype.mul=function(t){for(var e=t.clone(),r=this,n=this.curve.point(null,null),i=this,o=[];0!==e.cmpn(0);e.iushrn(1))o.push(e.andln(1));for(var a=o.length-1;a>=0;a--)0===o[a]?(r=r.diffAdd(n,i),n=n.dbl()):(n=r.diffAdd(n,i),r=r.dbl());return n},i.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},i.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},i.prototype.eq=function(t){return 0===this.getX().cmp(t.getX())},i.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},i.prototype.getX=function(){return this.normalize(),this.x.fromRed()}},function(t,e,r){"use strict";function n(t){h.call(this,"short",t),this.a=new s(t.a,16).toRed(this.red),this.b=new s(t.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(t),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function i(t,e,r,n){h.BasePoint.call(this,t,"affine"),null===e&&null===r?(this.x=null,this.y=null,this.inf=!0):(this.x=new s(e,16),this.y=new s(r,16),n&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function o(t,e,r,n){h.BasePoint.call(this,t,"jacobian"),null===e&&null===r&&null===n?(this.x=this.curve.one,this.y=this.curve.one,this.z=new s(0)):(this.x=new s(e,16),this.y=new s(r,16),this.z=new s(n,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}var a=r(104),f=r(22),s=r(30),u=r(2),h=a.base,c=f.utils.assert;u(n,h),t.exports=n,n.prototype._getEndomorphism=function(t){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var e,r;if(t.beta)e=new s(t.beta,16).toRed(this.red);else{var n=this._getEndoRoots(this.p);e=n[0].cmp(n[1])<0?n[0]:n[1],e=e.toRed(this.red)}if(t.lambda)r=new s(t.lambda,16);else{var i=this._getEndoRoots(this.n);0===this.g.mul(i[0]).x.cmp(this.g.x.redMul(e))?r=i[0]:(r=i[1],c(0===this.g.mul(r).x.cmp(this.g.x.redMul(e))))}var o;return o=t.basis?t.basis.map(function(t){return{a:new s(t.a,16),b:new s(t.b,16)}}):this._getEndoBasis(r),{beta:e,lambda:r,basis:o}}},n.prototype._getEndoRoots=function(t){var e=t===this.p?this.red:s.mont(t),r=new s(2).toRed(e).redInvm(),n=r.redNeg(),i=new s(3).toRed(e).redNeg().redSqrt().redMul(r),o=n.redAdd(i).fromRed(),a=n.redSub(i).fromRed();return[o,a]},n.prototype._getEndoBasis=function(t){for(var e,r,n,i,o,a,f,u,h,c=this.n.ushrn(Math.floor(this.n.bitLength()/2)),d=t,l=this.n.clone(),p=new s(1),b=new s(0),v=new s(0),y=new s(1),m=0;0!==d.cmpn(0);){var g=l.div(d);u=l.sub(g.mul(d)),h=v.sub(g.mul(p));var w=y.sub(g.mul(b));if(!n&&u.cmp(c)<0)e=f.neg(),r=p,n=u.neg(),i=h;else if(n&&2===++m)break;f=u,l=d,d=u,v=p,p=h,y=b,b=w}o=u.neg(),a=h;var _=n.sqr().add(i.sqr()),M=o.sqr().add(a.sqr());return M.cmp(_)>=0&&(o=e,a=r),n.negative&&(n=n.neg(),i=i.neg()),o.negative&&(o=o.neg(),a=a.neg()),[{a:n,b:i},{a:o,b:a}]},n.prototype._endoSplit=function(t){var e=this.endo.basis,r=e[0],n=e[1],i=n.b.mul(t).divRound(this.n),o=r.b.neg().mul(t).divRound(this.n),a=i.mul(r.a),f=o.mul(n.a),s=i.mul(r.b),u=o.mul(n.b),h=t.sub(a).sub(f),c=s.add(u).neg();return{k1:h,k2:c}},n.prototype.pointFromX=function(t,e){t=new s(t,16),t.red||(t=t.toRed(this.red));var r=t.redSqr().redMul(t).redIAdd(t.redMul(this.a)).redIAdd(this.b),n=r.redSqrt();if(0!==n.redSqr().redSub(r).cmp(this.zero))throw new Error("invalid point");var i=n.fromRed().isOdd();return(e&&!i||!e&&i)&&(n=n.redNeg()),this.point(t,n)},n.prototype.validate=function(t){if(t.inf)return!0;var e=t.x,r=t.y,n=this.a.redMul(e),i=e.redSqr().redMul(e).redIAdd(n).redIAdd(this.b);return 0===r.redSqr().redISub(i).cmpn(0)},n.prototype._endoWnafMulAdd=function(t,e,r){for(var n=this._endoWnafT1,i=this._endoWnafT2,o=0;o":""},i.prototype.isInfinity=function(){return this.inf},i.prototype.add=function(t){if(this.inf)return t;if(t.inf)return this;if(this.eq(t))return this.dbl();if(this.neg().eq(t))return this.curve.point(null,null);if(0===this.x.cmp(t.x))return this.curve.point(null,null);var e=this.y.redSub(t.y);0!==e.cmpn(0)&&(e=e.redMul(this.x.redSub(t.x).redInvm()));var r=e.redSqr().redISub(this.x).redISub(t.x),n=e.redMul(this.x.redSub(r)).redISub(this.y);return this.curve.point(r,n)},i.prototype.dbl=function(){if(this.inf)return this;var t=this.y.redAdd(this.y);if(0===t.cmpn(0))return this.curve.point(null,null);var e=this.curve.a,r=this.x.redSqr(),n=t.redInvm(),i=r.redAdd(r).redIAdd(r).redIAdd(e).redMul(n),o=i.redSqr().redISub(this.x.redAdd(this.x)),a=i.redMul(this.x.redSub(o)).redISub(this.y);return this.curve.point(o,a)},i.prototype.getX=function(){return this.x.fromRed()},i.prototype.getY=function(){return this.y.fromRed()},i.prototype.mul=function(t){return t=new s(t,16),this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve.endo?this.curve._endoWnafMulAdd([this],[t]):this.curve._wnafMul(this,t)},i.prototype.mulAdd=function(t,e,r){var n=[this,e],i=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i):this.curve._wnafMulAdd(1,n,i,2)},i.prototype.jmulAdd=function(t,e,r){var n=[this,e],i=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i,!0):this.curve._wnafMulAdd(1,n,i,2,!0)},i.prototype.eq=function(t){return this===t||this.inf===t.inf&&(this.inf||0===this.x.cmp(t.x)&&0===this.y.cmp(t.y))},i.prototype.neg=function(t){if(this.inf)return this;var e=this.curve.point(this.x,this.y.redNeg());if(t&&this.precomputed){var r=this.precomputed,n=function(t){return t.neg()};e.precomputed={naf:r.naf&&{wnd:r.naf.wnd,points:r.naf.points.map(n)},doubles:r.doubles&&{step:r.doubles.step,points:r.doubles.points.map(n)}}}return e},i.prototype.toJ=function(){if(this.inf)return this.curve.jpoint(null,null,null);var t=this.curve.jpoint(this.x,this.y,this.curve.one);return t}, u(o,h.BasePoint),n.prototype.jpoint=function(t,e,r){return new o(this,t,e,r)},o.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var t=this.z.redInvm(),e=t.redSqr(),r=this.x.redMul(e),n=this.y.redMul(e).redMul(t);return this.curve.point(r,n)},o.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},o.prototype.add=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;var e=t.z.redSqr(),r=this.z.redSqr(),n=this.x.redMul(e),i=t.x.redMul(r),o=this.y.redMul(e.redMul(t.z)),a=t.y.redMul(r.redMul(this.z)),f=n.redSub(i),s=o.redSub(a);if(0===f.cmpn(0))return 0!==s.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var u=f.redSqr(),h=u.redMul(f),c=n.redMul(u),d=s.redSqr().redIAdd(h).redISub(c).redISub(c),l=s.redMul(c.redISub(d)).redISub(o.redMul(h)),p=this.z.redMul(t.z).redMul(f);return this.curve.jpoint(d,l,p)},o.prototype.mixedAdd=function(t){if(this.isInfinity())return t.toJ();if(t.isInfinity())return this;var e=this.z.redSqr(),r=this.x,n=t.x.redMul(e),i=this.y,o=t.y.redMul(e).redMul(this.z),a=r.redSub(n),f=i.redSub(o);if(0===a.cmpn(0))return 0!==f.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var s=a.redSqr(),u=s.redMul(a),h=r.redMul(s),c=f.redSqr().redIAdd(u).redISub(h).redISub(h),d=f.redMul(h.redISub(c)).redISub(i.redMul(u)),l=this.z.redMul(a);return this.curve.jpoint(c,d,l)},o.prototype.dblp=function(t){if(0===t)return this;if(this.isInfinity())return this;if(!t)return this.dbl();if(this.curve.zeroA||this.curve.threeA){for(var e=this,r=0;r=0)return!1;if(r.redIAdd(i),0===this.x.cmp(r))return!0}return!1},o.prototype.inspect=function(){return this.isInfinity()?"":""},o.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}},function(t,e,r){"use strict";function n(t){"short"===t.type?this.curve=new f.curve.short(t):"edwards"===t.type?this.curve=new f.curve.edwards(t):this.curve=new f.curve.mont(t),this.g=this.curve.g,this.n=this.curve.n,this.hash=t.hash,s(this.g.validate(),"Invalid curve"),s(this.g.mul(this.n).isInfinity(),"Invalid curve, G*N != O")}function i(t,e){Object.defineProperty(o,t,{configurable:!0,enumerable:!0,get:function(){var r=new n(e);return Object.defineProperty(o,t,{configurable:!0,enumerable:!0,value:r}),r}})}var o=e,a=r(50),f=r(22),s=f.utils.assert;o.PresetCurve=n,i("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:a.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),i("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:a.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),i("p256",{type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:a.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),i("p384",{type:"short",prime:null,p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff",a:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc",b:"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",n:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",hash:a.sha384,gRed:!1,g:["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7","3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"]}),i("p521",{type:"short",prime:null,p:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff",a:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc",b:"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",n:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",hash:a.sha512,gRed:!1,g:["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66","00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"]}),i("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"0",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:a.sha256,gRed:!1,g:["9"]}),i("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:a.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]});var u;try{u=r(557)}catch(t){u=void 0}i("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:a.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",u]})},function(t,e,r){"use strict";function n(t){return this instanceof n?("string"==typeof t&&(f(o.curves.hasOwnProperty(t),"Unknown curve "+t),t=o.curves[t]),t instanceof o.curves.PresetCurve&&(t={curve:t}),this.curve=t.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=t.curve.g,this.g.precompute(t.curve.n.bitLength()+1),void(this.hash=t.hash||t.curve.hash)):new n(t)}var i=r(30),o=r(22),a=o.utils,f=a.assert,s=r(551),u=r(552);t.exports=n,n.prototype.keyPair=function(t){return new s(this,t)},n.prototype.keyFromPrivate=function(t,e){return s.fromPrivate(this,t,e)},n.prototype.keyFromPublic=function(t,e){return s.fromPublic(this,t,e)},n.prototype.genKeyPair=function(t){t||(t={});for(var e=new o.hmacDRBG({hash:this.hash,pers:t.pers,entropy:t.entropy||o.rand(this.hash.hmacStrength),nonce:this.n.toArray()}),r=this.n.byteLength(),n=this.n.sub(new i(2));;){var a=new i(e.generate(r));if(!(a.cmp(n)>0))return a.iaddn(1),this.keyFromPrivate(a)}},n.prototype._truncateToN=function(t,e){var r=8*t.byteLength()-this.n.bitLength();return r>0&&(t=t.ushrn(r)),!e&&t.cmp(this.n)>=0?t.sub(this.n):t},n.prototype.sign=function(t,e,r,n){"object"==typeof r&&(n=r,r=null),n||(n={}),e=this.keyFromPrivate(e,r),t=this._truncateToN(new i(t,16));for(var a=this.n.byteLength(),f=e.getPrivate().toArray("be",a),s=t.toArray("be",a),h=new o.hmacDRBG({hash:this.hash,entropy:f,nonce:s,pers:n.pers,persEnc:n.persEnc}),c=this.n.sub(new i(1)),d=0;!0;d++){var l=n.k?n.k(d):new i(h.generate(this.n.byteLength()));if(l=this._truncateToN(l,!0),!(l.cmpn(1)<=0||l.cmp(c)>=0)){var p=this.g.mul(l);if(!p.isInfinity()){var b=p.getX(),v=b.umod(this.n);if(0!==v.cmpn(0)){var y=l.invm(this.n).mul(v.mul(e.getPrivate()).iadd(t));if(y=y.umod(this.n),0!==y.cmpn(0)){var m=(p.getY().isOdd()?1:0)|(0!==b.cmp(v)?2:0);return n.canonical&&y.cmp(this.nh)>0&&(y=this.n.sub(y),m^=1),new u({r:v,s:y,recoveryParam:m})}}}}}},n.prototype.verify=function(t,e,r,n){t=this._truncateToN(new i(t,16)),r=this.keyFromPublic(r,n),e=new u(e,"hex");var o=e.r,a=e.s;if(o.cmpn(1)<0||o.cmp(this.n)>=0)return!1;if(a.cmpn(1)<0||a.cmp(this.n)>=0)return!1;var f=a.invm(this.n),s=f.mul(t).umod(this.n),h=f.mul(o).umod(this.n);if(!this.curve._maxwellTrick){var c=this.g.mulAdd(s,r.getPublic(),h);return!c.isInfinity()&&0===c.getX().umod(this.n).cmp(o)}var c=this.g.jmulAdd(s,r.getPublic(),h);return!c.isInfinity()&&c.eqXToP(o)},n.prototype.recoverPubKey=function(t,e,r,n){f((3&r)===r,"The recovery param is more than two bits"),e=new u(e,n);var o=this.n,a=new i(t),s=e.r,h=e.s,c=1&r,d=r>>1;if(s.cmp(this.curve.p.umod(this.curve.n))>=0&&d)throw new Error("Unable to find sencond key candinate");s=d?this.curve.pointFromX(s.add(this.curve.n),c):this.curve.pointFromX(s,c);var l=e.r.invm(o),p=o.sub(a).mul(l).umod(o),b=h.mul(l).umod(o);return this.g.mulAdd(p,s,b)},n.prototype.getKeyRecoveryParam=function(t,e,r,n){if(e=new u(e,n),null!==e.recoveryParam)return e.recoveryParam;for(var i=0;i<4;i++){var o;try{o=this.recoverPubKey(t,e,i)}catch(t){continue}if(o.eq(r))return i}throw new Error("Unable to find valid recovery factor")}},function(t,e,r){"use strict";function n(t,e){this.ec=t,this.priv=null,this.pub=null,e.priv&&this._importPrivate(e.priv,e.privEnc),e.pub&&this._importPublic(e.pub,e.pubEnc)}var i=r(30);t.exports=n,n.fromPublic=function(t,e,r){return e instanceof n?e:new n(t,{pub:e,pubEnc:r})},n.fromPrivate=function(t,e,r){return e instanceof n?e:new n(t,{priv:e,privEnc:r})},n.prototype.validate=function(){var t=this.getPublic();return t.isInfinity()?{result:!1,reason:"Invalid public key"}:t.validate()?t.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:"Public key * N != O"}:{result:!1,reason:"Public key is not a point"}},n.prototype.getPublic=function(t,e){return"string"==typeof t&&(e=t,t=null),this.pub||(this.pub=this.ec.g.mul(this.priv)),e?this.pub.encode(e,t):this.pub},n.prototype.getPrivate=function(t){return"hex"===t?this.priv.toString(16,2):this.priv},n.prototype._importPrivate=function(t,e){this.priv=new i(t,e||16),this.priv=this.priv.umod(this.ec.curve.n)},n.prototype._importPublic=function(t,e){return t.x||t.y?void(this.pub=this.ec.curve.point(t.x,t.y)):void(this.pub=this.ec.curve.decodePoint(t,e))},n.prototype.derive=function(t){return t.mul(this.priv).getX()},n.prototype.sign=function(t,e,r){return this.ec.sign(t,this,e,r)},n.prototype.verify=function(t,e){return this.ec.verify(t,e,this)},n.prototype.inspect=function(){return""}},function(t,e,r){"use strict";function n(t,e){return t instanceof n?t:void(this._importDER(t,e)||(c(t.r&&t.s,"Signature without r or s"),this.r=new s(t.r,16),this.s=new s(t.s,16),void 0===t.recoveryParam?this.recoveryParam=null:this.recoveryParam=t.recoveryParam))}function i(){this.place=0}function o(t,e){var r=t[e.place++];if(!(128&r))return r;for(var n=15&r,i=0,o=0,a=e.place;o>>3);for(t.push(128|r);--r;)t.push(e>>>(r<<3)&255);t.push(e)}var s=r(30),u=r(22),h=u.utils,c=h.assert;t.exports=n,n.prototype._importDER=function(t,e){t=h.toArray(t,e);var r=new i;if(48!==t[r.place++])return!1;var n=o(t,r);if(n+r.place!==t.length)return!1;if(2!==t[r.place++])return!1;var a=o(t,r),f=t.slice(r.place,a+r.place);if(r.place+=a,2!==t[r.place++])return!1;var u=o(t,r);if(t.length!==u+r.place)return!1;var c=t.slice(r.place,u+r.place);return 0===f[0]&&128&f[1]&&(f=f.slice(1)),0===c[0]&&128&c[1]&&(c=c.slice(1)),this.r=new s(f),this.s=new s(c),this.recoveryParam=null,!0},n.prototype.toDER=function(t){var e=this.r.toArray(),r=this.s.toArray();for(128&e[0]&&(e=[0].concat(e)),128&r[0]&&(r=[0].concat(r)),e=a(e),r=a(r);!(r[0]||128&r[1]);)r=r.slice(1);var n=[2];f(n,e.length),n=n.concat(e),n.push(2),f(n,r.length);var i=n.concat(r),o=[48];return f(o,i.length),o=o.concat(i),h.encode(o,t)}},function(t,e,r){"use strict";function n(t){if(f("ed25519"===t,"only tested with ed25519 so far"),!(this instanceof n))return new n(t);var t=o.curves[t].curve;this.curve=t,this.g=t.g,this.g.precompute(t.n.bitLength()+1),this.pointClass=t.point().constructor,this.encodingLength=Math.ceil(t.n.bitLength()/8),this.hash=i.sha512}var i=r(50),o=r(22),a=o.utils,f=a.assert,s=a.parseBytes,u=r(554),h=r(555);t.exports=n,n.prototype.sign=function(t,e){t=s(t);var r=this.keyFromSecret(e),n=this.hashInt(r.messagePrefix(),t),i=this.g.mul(n),o=this.encodePoint(i),a=this.hashInt(o,r.pubBytes(),t).mul(r.priv()),f=n.add(a).umod(this.curve.n);return this.makeSignature({R:i,S:f,Rencoded:o})},n.prototype.verify=function(t,e,r){t=s(t),e=this.makeSignature(e);var n=this.keyFromPublic(r),i=this.hashInt(e.Rencoded(),n.pubBytes(),t),o=this.g.mul(e.S()),a=e.R().add(n.pub().mul(i));return a.eq(o)},n.prototype.hashInt=function(){for(var t=this.hash(),e=0;e=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(e,r,i)}var i=r(50),o=r(22),a=o.utils,f=a.assert;t.exports=n,n.prototype._init=function(t,e,r){var n=t.concat(e).concat(r);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var i=0;i=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(t.concat(r||[])),this.reseed=1},n.prototype.generate=function(t,e,r,n){if(this.reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof e&&(n=r,r=e,e=null),r&&(r=a.toArray(r,n),this._update(r));for(var i=[];i.length>8,a=255&i;o?r.push(o,a):r.push(a)}return r}function i(t){return 1===t.length?"0"+t:t}function o(t){for(var e="",r=0;r=0;){var o;if(i.isOdd()){var a=i.andln(n-1);o=a>(n>>1)-1?(n>>1)-a:a,i.isubn(o)}else o=0;r.push(o);for(var f=0!==i.cmpn(0)&&0===i.andln(n-1)?e+1:1,s=1;s0||e.cmpn(-i)>0;){var o=t.andln(3)+n&3,a=e.andln(3)+i&3;3===o&&(o=-1),3===a&&(a=-1);var f;if(0===(1&o))f=0;else{var s=t.andln(7)+n&7;f=3!==s&&5!==s||2!==a?o:-o}r[0].push(f);var u;if(0===(1&a))u=0;else{var s=e.andln(7)+i&7;u=3!==s&&5!==s||2!==o?a:-a}r[1].push(u),2*n===f+1&&(n=1-n),2*i===u+1&&(i=1-i),t.iushrn(1),e.iushrn(1)}return r}function s(t,e,r){var n="_"+e;t.prototype[e]=function(){return void 0!==this[n]?this[n]:this[n]=r.call(this)}}function u(t){return"string"==typeof t?c.toArray(t,"hex"):t}function h(t){return new d(t,"hex","le")}var c=e,d=r(30);c.assert=function(t,e){if(!t)throw new Error(e||"Assertion failed")},c.toArray=n,c.zero2=i,c.toHex=o,c.encode=function(t,e){return"hex"===e?o(t):t},c.getNAF=a,c.getJSF=f,c.cachedProperty=s,c.parseBytes=u,c.intFromLE=h},function(t,e,r){function n(t){this.rand=t}var i;if(t.exports=function(t){return i||(i=new n(null)),i.generate(t)},t.exports.Rand=n,n.prototype.generate=function(t){return this._rand(t)},"object"==typeof window)window.crypto&&window.crypto.getRandomValues?n.prototype._rand=function(t){var e=new Uint8Array(t);return window.crypto.getRandomValues(e),e}:window.msCrypto&&window.msCrypto.getRandomValues?n.prototype._rand=function(t){var e=new Uint8Array(t);return window.msCrypto.getRandomValues(e),e}:n.prototype._rand=function(){throw new Error("Not implemented yet")};else try{var o=r(610);n.prototype._rand=function(t){return o.randomBytes(t)}}catch(t){n.prototype._rand=function(t){for(var e=new Uint8Array(t),r=0;r=this._delta8){t=this.pending;var r=t.length%this._delta8;this.pending=t.slice(t.length-r,t.length),0===this.pending.length&&(this.pending=null),t=o.join32(t,0,t.length-r,this.endian);for(var n=0;n>>24&255,n[i++]=t>>>16&255,n[i++]=t>>>8&255,n[i++]=255&t}else{n[i++]=255&t,n[i++]=t>>>8&255,n[i++]=t>>>16&255,n[i++]=t>>>24&255,n[i++]=0,n[i++]=0,n[i++]=0,n[i++]=0;for(var o=8;othis.blockSize&&(t=(new this.Hash).update(t).digest()),a(t.length<=this.blockSize);for(var e=t.length;e>>3}function p(t){return R(t,17)^R(t,19)^t>>>10}function b(t,e,r,n){return 0===t?s(e,r,n):1===t||3===t?h(e,r,n):2===t?u(e,r,n):void 0}function v(t,e,r,n,i,o){var a=t&r^~t&i;return a<0&&(a+=4294967296),a}function y(t,e,r,n,i,o){var a=e&n^~e&o;return a<0&&(a+=4294967296),a}function m(t,e,r,n,i,o){var a=t&r^t&i^r&i;return a<0&&(a+=4294967296),a}function g(t,e,r,n,i,o){var a=e&n^e&o^n&o;return a<0&&(a+=4294967296),a}function w(t,e){var r=N(t,e,28),n=N(e,t,2),i=N(e,t,7),o=r^n^i;return o<0&&(o+=4294967296),o}function _(t,e){var r=L(t,e,28),n=L(e,t,2),i=L(e,t,7),o=r^n^i;return o<0&&(o+=4294967296),o}function M(t,e){var r=N(t,e,14),n=N(t,e,18),i=N(e,t,9),o=r^n^i;return o<0&&(o+=4294967296),o}function S(t,e){var r=L(t,e,14),n=L(t,e,18),i=L(e,t,9),o=r^n^i;return o<0&&(o+=4294967296),o}function E(t,e){var r=N(t,e,1),n=N(t,e,8),i=U(t,e,7),o=r^n^i;return o<0&&(o+=4294967296),o}function A(t,e){var r=L(t,e,1),n=L(t,e,8),i=z(t,e,7),o=r^n^i;return o<0&&(o+=4294967296),o}function k(t,e){var r=N(t,e,19),n=N(e,t,29),i=U(t,e,6),o=r^n^i;return o<0&&(o+=4294967296),o}function x(t,e){var r=L(t,e,19),n=L(e,t,29),i=z(t,e,6),o=r^n^i;return o<0&&(o+=4294967296),o}var I=r(50),B=I.utils,O=B.assert,R=B.rotr32,P=B.rotl32,T=B.sum32,j=B.sum32_4,C=B.sum32_5,N=B.rotr64_hi,L=B.rotr64_lo,U=B.shr64_hi,z=B.shr64_lo,D=B.sum64,q=B.sum64_hi,F=B.sum64_lo,K=B.sum64_4_hi,G=B.sum64_4_lo,V=B.sum64_5_hi,H=B.sum64_5_lo,X=I.common.BlockHash,Y=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],W=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],Z=[1518500249,1859775393,2400959708,3395469782];B.inherits(n,X),e.sha256=n,n.blockSize=512,n.outSize=256,n.hmacStrength=192,n.padLength=64,n.prototype._update=function(t,e){for(var r=this.W,n=0;n<16;n++)r[n]=t[e+n];for(;n>8,a=255&i;o?r.push(o,a):r.push(a)}else for(var n=0;n>>24|t>>>8&65280|t<<8&16711680|(255&t)<<24;return e>>>0}function a(t,e){for(var r="",n=0;n>>0}return o}function h(t,e){for(var r=new Array(4*t.length),n=0,i=0;n>>24,r[i+1]=o>>>16&255,r[i+2]=o>>>8&255,r[i+3]=255&o):(r[i+3]=o>>>24,r[i+2]=o>>>16&255,r[i+1]=o>>>8&255,r[i]=255&o)}return r}function c(t,e){return t>>>e|t<<32-e}function d(t,e){return t<>>32-e}function l(t,e){return t+e>>>0}function p(t,e,r){return t+e+r>>>0}function b(t,e,r,n){return t+e+r+n>>>0}function v(t,e,r,n,i){return t+e+r+n+i>>>0}function y(t,e){if(!t)throw new Error(e||"Assertion failed")}function m(t,e,r,n){var i=t[e],o=t[e+1],a=n+o>>>0,f=(a>>0,t[e+1]=a}function g(t,e,r,n){var i=e+n>>>0,o=(i>>0}function w(t,e,r,n){var i=e+n;return i>>>0}function _(t,e,r,n,i,o,a,f){var s=0,u=e;u=u+n>>>0,s+=u>>0,s+=u>>0,s+=u>>0}function M(t,e,r,n,i,o,a,f){var s=e+n+o+f;return s>>>0}function S(t,e,r,n,i,o,a,f,s,u){var h=0,c=e;c=c+n>>>0,h+=c>>0,h+=c>>0,h+=c>>0,h+=c>>0}function E(t,e,r,n,i,o,a,f,s,u){var h=e+n+o+f+u;return h>>>0}function A(t,e,r){var n=e<<32-r|t>>>r;return n>>>0}function k(t,e,r){var n=t<<32-r|e>>>r;return n>>>0}function x(t,e,r){return t>>>r}function I(t,e,r){var n=t<<32-r|e>>>r;return n>>>0}var B=e,O=r(2);B.toArray=n,B.toHex=i,B.htonl=o,B.toHex32=a,B.zero2=f,B.zero8=s,B.join32=u,B.split32=h,B.rotr32=c,B.rotl32=d,B.sum32=l,B.sum32_3=p,B.sum32_4=b,B.sum32_5=v,B.assert=y,B.inherits=O,e.sum64=m,e.sum64_hi=g,e.sum64_lo=w,e.sum64_4_hi=_,e.sum64_4_lo=M,e.sum64_5_hi=S,e.sum64_5_lo=E,e.rotr64_hi=A,e.rotr64_lo=k,e.shr64_hi=x,e.shr64_lo=I},function(t,e,r){"use strict";(function(t){function r(e,r){if(e.length%o!==0){var n=e.length+(o-e.length%o);e=t.concat([e,a],n)}for(var i=[],f=r?e.readInt32BE:e.readInt32LE,s=0;s>>5]|=t[r]<<24-n%32;return e}function n(t){for(var e=[],r=0;r<32*t.length;r+=8)e.push(t[r>>>5]>>>24-r%32&255);return e}function i(t,e,r){for(var n=0;n<16;n++){var i=r+n,c=e[i];e[i]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}var m,g,w,_,M,S,E,A,k,x;S=m=t[0],E=g=t[1],A=w=t[2],k=_=t[3],x=M=t[4];var I;for(n=0;n<80;n+=1)I=m+e[r+d[n]]|0,I+=n<16?o(g,w,_)+v[0]:n<32?a(g,w,_)+v[1]:n<48?f(g,w,_)+v[2]:n<64?s(g,w,_)+v[3]:u(g,w,_)+v[4],I|=0,I=h(I,p[n]),I=I+M|0,m=M,M=_,_=h(w,10),w=g,g=I,I=S+e[r+l[n]]|0,I+=n<16?u(E,A,k)+y[0]:n<32?s(E,A,k)+y[1]:n<48?f(E,A,k)+y[2]:n<64?a(E,A,k)+y[3]:o(E,A,k)+y[4],I|=0,I=h(I,b[n]),I=I+x|0,S=x,x=k,k=h(A,10),A=E,E=I;I=t[1]+w+k|0,t[1]=t[2]+_+x|0,t[2]=t[3]+M+S|0,t[3]=t[4]+m+E|0,t[4]=t[0]+g+A|0,t[0]=I}function o(t,e,r){return t^e^r}function a(t,e,r){return t&e|~t&r}function f(t,e,r){return(t|~e)^r}function s(t,e,r){return t&r|e&~r}function u(t,e,r){return t^(e|~r)}function h(t,e){return t<>>32-e}function c(t){var o=[1732584193,4023233417,2562383102,271733878,3285377520];"string"==typeof t&&(t=new e(t,"utf8"));var a=r(t),f=8*t.length,s=8*t.length;a[f>>>5]|=128<<24-f%32,a[(f+64>>>9<<4)+14]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8);for(var u=0;u>>24)|4278255360&(h<<24|h>>>8)}var c=n(o);return new e(c)}/** @preserve (c) 2012 by Cédric Mesnil. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var d=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],l=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],p=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],b=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11],v=[0,1518500249,1859775393,2400959708,2840853838],y=[1352829926,1548603684,1836072691,2053994217,0];t.exports=c}).call(e,r(1).Buffer)},function(t,e,r){var e=t.exports=function(t){t=t.toLowerCase();var r=e[t];if(!r)throw new Error(t+" is not supported (we accept pull requests)");return new r};e.sha=r(569),e.sha1=r(570),e.sha224=r(571),e.sha256=r(227),e.sha384=r(572),e.sha512=r(228)},function(t,e,r){(function(e){function n(){this.init(),this._w=h,s.call(this,64,56)}function i(t){return t<<5|t>>>27}function o(t){return t<<30|t>>>2}function a(t,e,r,n){return 0===t?e&r|~e&n:2===t?e&r|e&n|r&n:e^r^n}var f=r(2),s=r(60),u=[1518500249,1859775393,-1894007588,-899497514],h=new Array(80);f(n,s),n.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},n.prototype._update=function(t){for(var e=this._w,r=0|this._a,n=0|this._b,f=0|this._c,s=0|this._d,h=0|this._e,c=0;c<16;++c)e[c]=t.readInt32BE(4*c);for(;c<80;++c)e[c]=e[c-3]^e[c-8]^e[c-14]^e[c-16];for(var d=0;d<80;++d){var l=~~(d/20),p=i(r)+a(l,n,f,s)+h+e[d]+u[l]|0;h=s,s=f,f=o(n),n=r,r=p}this._a=r+this._a|0,this._b=n+this._b|0,this._c=f+this._c|0,this._d=s+this._d|0,this._e=h+this._e|0},n.prototype._hash=function(){var t=new e(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=n}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(){this.init(),this._w=c,u.call(this,64,56)}function i(t){return t<<1|t>>>31}function o(t){return t<<5|t>>>27}function a(t){return t<<30|t>>>2}function f(t,e,r,n){return 0===t?e&r|~e&n:2===t?e&r|e&n|r&n:e^r^n}var s=r(2),u=r(60),h=[1518500249,1859775393,-1894007588,-899497514],c=new Array(80);s(n,u),n.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},n.prototype._update=function(t){for(var e=this._w,r=0|this._a,n=0|this._b,s=0|this._c,u=0|this._d,c=0|this._e,d=0;d<16;++d)e[d]=t.readInt32BE(4*d);for(;d<80;++d)e[d]=i(e[d-3]^e[d-8]^e[d-14]^e[d-16]);for(var l=0;l<80;++l){var p=~~(l/20),b=o(r)+f(p,n,s,u)+c+e[l]+h[p]|0;c=u,u=s,s=a(n),n=r,r=b}this._a=r+this._a|0,this._b=n+this._b|0,this._c=s+this._c|0,this._d=u+this._d|0,this._e=c+this._e|0},n.prototype._hash=function(){var t=new e(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},t.exports=n}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(){this.init(),this._w=f,a.call(this,64,56)}var i=r(2),o=r(227),a=r(60),f=new Array(64);i(n,o),n.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},n.prototype._hash=function(){var t=new e(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},t.exports=n}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(){this.init(),this._w=f,a.call(this,128,112)}var i=r(2),o=r(228),a=r(60),f=new Array(160);i(n,o),n.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},n.prototype._hash=function(){function t(t,e,n){r.writeInt32BE(t,n),r.writeInt32BE(e,n+4)}var r=new e(48);return t(this._ah,this._al,0),t(this._bh,this._bl,8),t(this._ch,this._cl,16),t(this._dh,this._dl,24),t(this._eh,this._el,32),t(this._fh,this._fl,40),r},t.exports=n}).call(e,r(1).Buffer)},function(t,e,r){(function(t){function n(e){var r=new t(a[e].prime,"hex"),n=new t(a[e].gen,"hex");return new f(r,n)}function i(e,r,n,a){return t.isBuffer(r)||void 0===s[r]?i(e,"binary",r,n):(r=r||"binary",a=a||"binary",n=n||new t([2]),t.isBuffer(n)||(n=new t(n,a)),"number"==typeof e?new f(o(e,n),n,!0):(t.isBuffer(e)||(e=new t(e,r)),new f(e,n,!0)))}var o=r(229),a=r(468),f=r(574),s={binary:!0,hex:!0,base64:!0};e.DiffieHellmanGroup=e.createDiffieHellmanGroup=e.getDiffieHellman=n,e.createDiffieHellman=e.DiffieHellman=i}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(t,r){return r=r||"utf8",e.isBuffer(t)||(t=new e(t,r)),this._pub=new s(t),this}function i(t,r){return r=r||"utf8",e.isBuffer(t)||(t=new e(t,r)),this._priv=new s(t),this}function o(t,e){var r=e.toString("hex"),n=[r,t.toString(16)].join("_");if(n in m)return m[n];var i=0;if(t.isEven()||!v.simpleSieve||!v.fermatTest(t)||!h.test(t))return i+=1,i+="02"===r||"05"===r?8:4,m[n]=i,i;h.test(t.shrn(1))||(i+=2);var o;switch(r){case"02":t.mod(c).cmp(d)&&(i+=8);break;case"05":o=t.mod(l),o.cmp(p)&&o.cmp(b)&&(i+=8);break;default:i+=4}return m[n]=i,i}function a(t,e,r){this.setGenerator(e),this.__prime=new s(t),this._prime=s.mont(this.__prime),this._primeLen=t.length,this._pub=void 0,this._priv=void 0,this._primeCode=void 0,r?(this.setPublicKey=n,this.setPrivateKey=i):this._primeCode=8}function f(t,r){var n=new e(t.toArray());return r?n.toString(r):n}var s=r(150),u=r(230),h=new u,c=new s(24),d=new s(11),l=new s(10),p=new s(3),b=new s(7),v=r(229),y=r(61);t.exports=a;var m={};Object.defineProperty(a.prototype,"verifyError",{enumerable:!0,get:function(){return"number"!=typeof this._primeCode&&(this._primeCode=o(this.__prime,this.__gen)),this._primeCode}}),a.prototype.generateKeys=function(){return this._priv||(this._priv=new s(y(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},a.prototype.computeSecret=function(t){t=new s(t),t=t.toRed(this._prime);var r=t.redPow(this._priv).fromRed(),n=new e(r.toArray()),i=this.getPrime();if(n.lengthr||e!==e)throw new TypeError("Bad key length")}},function(t,e,r){e.publicEncrypt=r(593),e.privateDecrypt=r(592),e.privateEncrypt=function(t,r){return e.publicEncrypt(t,r,!0)},e.publicDecrypt=function(t,r){return e.privateDecrypt(t,r,!0)}},function(t,e,r){var n=r(106),i=n.define("RSAPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("modulus").int(),this.key("publicExponent").int(),this.key("privateExponent").int(),this.key("prime1").int(),this.key("prime2").int(),this.key("exponent1").int(),this.key("exponent2").int(),this.key("coefficient").int())});e.RSAPrivateKey=i;var o=n.define("RSAPublicKey",function(){this.seq().obj(this.key("modulus").int(),this.key("publicExponent").int())});e.RSAPublicKey=o;var a=n.define("SubjectPublicKeyInfo",function(){this.seq().obj(this.key("algorithm").use(f),this.key("subjectPublicKey").bitstr())});e.PublicKey=a;var f=n.define("AlgorithmIdentifier",function(){this.seq().obj(this.key("algorithm").objid(),this.key("none").null_().optional(),this.key("curve").objid().optional(),this.key("params").seq().obj(this.key("p").int(),this.key("q").int(),this.key("g").int()).optional())}),s=n.define("PrivateKeyInfo",function(){this.seq().obj(this.key("version").int(),this.key("algorithm").use(f),this.key("subjectPrivateKey").octstr())});e.PrivateKey=s;var u=n.define("EncryptedPrivateKeyInfo",function(){this.seq().obj(this.key("algorithm").seq().obj(this.key("id").objid(),this.key("decrypt").seq().obj(this.key("kde").seq().obj(this.key("id").objid(),this.key("kdeparams").seq().obj(this.key("salt").octstr(),this.key("iters").int())),this.key("cipher").seq().obj(this.key("algo").objid(),this.key("iv").octstr()))),this.key("subjectPrivateKey").octstr())});e.EncryptedPrivateKey=u;var h=n.define("DSAPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("p").int(),this.key("q").int(),this.key("g").int(),this.key("pub_key").int(),this.key("priv_key").int())});e.DSAPrivateKey=h,e.DSAparam=n.define("DSAparam",function(){this.int()});var c=n.define("ECPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("privateKey").octstr(),this.key("parameters").optional().explicit(0).use(d),this.key("publicKey").optional().explicit(1).bitstr())});e.ECPrivateKey=c;var d=n.define("ECParameters",function(){this.choice({namedCurve:this.objid()})});e.signature=n.define("signature",function(){this.seq().obj(this.key("r").int(),this.key("s").int())})},function(t,e,r){(function(e){var n=/Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)\r?\n\r?\n([0-9A-z\n\r\+\/\=]+)\r?\n/m,i=/^-----BEGIN (.*) KEY-----\r?\n/m,o=/^-----BEGIN (.*) KEY-----\r?\n([0-9A-z\n\r\+\/\=]+)\r?\n-----END \1 KEY-----$/m,a=r(153),f=r(239);t.exports=function(t,r){var s,u=t.toString(),h=u.match(n);if(h){var c="aes"+h[1],d=new e(h[2],"hex"),l=new e(h[3].replace(/\r?\n/g,""),"base64"),p=a(r,d.slice(0,8),parseInt(h[1],10)).key,b=[],v=f.createDecipheriv(c,p,d);b.push(v.update(l)),b.push(v.final()),s=e.concat(b)}else{var y=u.match(o);s=new e(y[2].replace(/\r?\n/g,""),"base64")}var m=u.match(i)[1]+" KEY";return{tag:m,data:s}}}).call(e,r(1).Buffer)},function(t,e,r){function n(t,e){this.name=t,this.body=e,this.decoders={},this.encoders={}}var i=r(106),o=r(2),a=e;a.define=function(t,e){return new n(t,e)},n.prototype._createNamed=function(t){var e;try{e=r(251).runInThisContext("(function "+this.name+"(entity) {\n this._initNamed(entity);\n})")}catch(t){e=function(t){this._initNamed(t)}}return o(e,t),e.prototype._initNamed=function(e){t.call(this,e)},new e(this)},n.prototype._getDecoder=function(t){return t=t||"der",this.decoders.hasOwnProperty(t)||(this.decoders[t]=this._createNamed(i.decoders[t])),this.decoders[t]},n.prototype.decode=function(t,e,r){return this._getDecoder(e).decode(t,r)},n.prototype._getEncoder=function(t){return t=t||"der",this.encoders.hasOwnProperty(t)||(this.encoders[t]=this._createNamed(i.encoders[t])),this.encoders[t]},n.prototype.encode=function(t,e,r){return this._getEncoder(e).encode(t,r)}},function(t,e,r){function n(t,e){var r={};this._baseState=r,r.enc=t,r.parent=e||null,r.children=null,r.tag=null,r.args=null,r.reverseArgs=null,r.choice=null,r.optional=!1,r.any=!1,r.obj=!1,r.use=null,r.useDecoder=null,r.key=null,r.default=null,r.explicit=null,r.implicit=null,r.contains=null,r.parent||(r.children=[],this._wrap())}var i=r(71).Reporter,o=r(71).EncoderBuffer,a=r(71).DecoderBuffer,f=r(588),s=["seq","seqof","set","setof","objid","bool","gentime","utctime","null_","enum","int","bitstr","bmpstr","charstr","genstr","graphstr","ia5str","iso646str","numstr","octstr","printstr","t61str","unistr","utf8str","videostr"],u=["key","obj","use","optional","explicit","implicit","def","choice","any","contains"].concat(s),h=["_peekTag","_decodeTag","_use","_decodeStr","_decodeObjid","_decodeTime","_decodeNull","_decodeInt","_decodeBool","_decodeList","_encodeComposite","_encodeStr","_encodeObjid","_encodeTime","_encodeNull","_encodeInt","_encodeBool"];t.exports=n;var c=["enc","parent","children","tag","args","reverseArgs","choice","optional","any","obj","use","alteredUse","key","default","explicit","implicit","contains"];n.prototype.clone=function(){var t=this._baseState,e={};c.forEach(function(r){e[r]=t[r]});var r=new this.constructor(e.parent);return r._baseState=e,r},n.prototype._wrap=function(){var t=this._baseState;u.forEach(function(e){this[e]=function(){var r=new this.constructor(this);return t.children.push(r),r[e].apply(r,arguments)}},this)},n.prototype._init=function(t){var e=this._baseState;f(null===e.parent),t.call(this),e.children=e.children.filter(function(t){return t._baseState.parent===this},this),f.equal(e.children.length,1,"Root node can have only one child")},n.prototype._useArgs=function(t){var e=this._baseState,r=t.filter(function(t){return t instanceof this.constructor},this);t=t.filter(function(t){return!(t instanceof this.constructor)},this),0!==r.length&&(f(null===e.children),e.children=r,r.forEach(function(t){t._baseState.parent=this},this)),0!==t.length&&(f(null===e.args),e.args=t,e.reverseArgs=t.map(function(t){if("object"!=typeof t||t.constructor!==Object)return t;var e={};return Object.keys(t).forEach(function(r){r==(0|r)&&(r|=0);var n=t[r];e[n]=r}),e}))},h.forEach(function(t){n.prototype[t]=function(){var e=this._baseState;throw new Error(t+" not implemented for encoding: "+e.enc)}}),s.forEach(function(t){n.prototype[t]=function(){var e=this._baseState,r=Array.prototype.slice.call(arguments);return f(null===e.tag),e.tag=t,this._useArgs(r),this}}),n.prototype.use=function(t){var e=this._baseState;return f(null===e.use),e.use=t,this},n.prototype.optional=function(){var t=this._baseState;return t.optional=!0,this},n.prototype.def=function(t){var e=this._baseState;return f(null===e.default),e.default=t,e.optional=!0,this},n.prototype.explicit=function(t){var e=this._baseState;return f(null===e.explicit&&null===e.implicit),e.explicit=t,this},n.prototype.implicit=function(t){var e=this._baseState;return f(null===e.explicit&&null===e.implicit),e.implicit=t,this},n.prototype.obj=function(){var t=this._baseState,e=Array.prototype.slice.call(arguments);return t.obj=!0,0!==e.length&&this._useArgs(e),this},n.prototype.key=function(t){var e=this._baseState;return f(null===e.key),e.key=t,this},n.prototype.any=function(){var t=this._baseState;return t.any=!0,this},n.prototype.choice=function(t){var e=this._baseState;return f(null===e.choice),e.choice=t,this._useArgs(Object.keys(t).map(function(e){return t[e]})),this},n.prototype.contains=function(t){var e=this._baseState;return f(null===e.use),e.contains=t,this},n.prototype._decode=function(t,e){var r=this._baseState;if(null===r.parent)return t.wrapResult(r.children[0]._decode(t,e));var n=r.default,i=!0,o=null;if(null!==r.key&&(o=t.enterKey(r.key)),r.optional){var f=null;if(null!==r.explicit?f=r.explicit:null!==r.implicit?f=r.implicit:null!==r.tag&&(f=r.tag),null!==f||r.any){if(i=this._peekTag(t,f,r.any),t.isError(i))return i}else{var s=t.save();try{null===r.choice?this._decodeGeneric(r.tag,t,e):this._decodeChoice(t,e),i=!0}catch(t){i=!1}t.restore(s)}}var u;if(r.obj&&i&&(u=t.enterObject()),i){if(null!==r.explicit){var h=this._decodeTag(t,r.explicit);if(t.isError(h))return h;t=h}var c=t.offset;if(null===r.use&&null===r.choice){if(r.any)var s=t.save();var d=this._decodeTag(t,null!==r.implicit?r.implicit:r.tag,r.any);if(t.isError(d))return d;r.any?n=t.raw(s):t=d}if(e&&e.track&&null!==r.tag&&e.track(t.path(),c,t.length,"tagged"),e&&e.track&&null!==r.tag&&e.track(t.path(),t.offset,t.length,"content"),n=r.any?n:null===r.choice?this._decodeGeneric(r.tag,t,e):this._decodeChoice(t,e),t.isError(n))return n;if(r.any||null!==r.choice||null===r.children||r.children.forEach(function(r){r._decode(t,e)}),r.contains&&("octstr"===r.tag||"bitstr"===r.tag)){var l=new a(n);n=this._getUse(r.contains,t._reporterState.obj)._decode(l,e)}}return r.obj&&i&&(n=t.leaveObject(u)),null===r.key||null===n&&i!==!0?null!==o&&t.exitKey(o):t.leaveKey(o,r.key,n),n},n.prototype._decodeGeneric=function(t,e,r){var n=this._baseState;return"seq"===t||"set"===t?null:"seqof"===t||"setof"===t?this._decodeList(e,t,n.args[0],r):/str$/.test(t)?this._decodeStr(e,t,r):"objid"===t&&n.args?this._decodeObjid(e,n.args[0],n.args[1],r):"objid"===t?this._decodeObjid(e,null,null,r):"gentime"===t||"utctime"===t?this._decodeTime(e,t,r):"null_"===t?this._decodeNull(e,r):"bool"===t?this._decodeBool(e,r):"int"===t||"enum"===t?this._decodeInt(e,n.args&&n.args[0],r):null!==n.use?this._getUse(n.use,e._reporterState.obj)._decode(e,r):e.error("unknown tag: "+t)},n.prototype._getUse=function(t,e){var r=this._baseState;return r.useDecoder=this._use(t,e),f(null===r.useDecoder._baseState.parent),r.useDecoder=r.useDecoder._baseState.children[0],r.implicit!==r.useDecoder._baseState.implicit&&(r.useDecoder=r.useDecoder.clone(),r.useDecoder._baseState.implicit=r.implicit),r.useDecoder},n.prototype._decodeChoice=function(t,e){var r=this._baseState,n=null,i=!1;return Object.keys(r.choice).some(function(o){var a=t.save(),f=r.choice[o];try{var s=f._decode(t,e);if(t.isError(s))return!1;n={type:o,value:s},i=!0}catch(e){return t.restore(a),!1}return!0},this),i?n:t.error("Choice not matched")},n.prototype._createEncoderBuffer=function(t){return new o(t,this.reporter)},n.prototype._encode=function(t,e,r){var n=this._baseState;if(null===n.default||n.default!==t){var i=this._encodeValue(t,e,r);if(void 0!==i&&!this._skipDefault(i,e,r))return i}},n.prototype._encodeValue=function(t,e,r){var n=this._baseState;if(null===n.parent)return n.children[0]._encode(t,e||new i);var o=null;if(this.reporter=e,n.optional&&void 0===t){if(null===n.default)return;t=n.default}var a=null,f=!1;if(n.any)o=this._createEncoderBuffer(t);else if(n.choice)o=this._encodeChoice(t,e);else if(n.contains)a=this._getUse(n.contains,r)._encode(t,e),f=!0;else if(n.children)a=n.children.map(function(r){if("null_"===r._baseState.tag)return r._encode(null,e,t);if(null===r._baseState.key)return e.error("Child should have a key");var n=e.enterKey(r._baseState.key);if("object"!=typeof t)return e.error("Child expected, but input is not object");var i=r._encode(t[r._baseState.key],e,t);return e.leaveKey(n),i},this).filter(function(t){return t}),a=this._createEncoderBuffer(a);else if("seqof"===n.tag||"setof"===n.tag){if(!n.args||1!==n.args.length)return e.error("Too many args for : "+n.tag);if(!Array.isArray(t))return e.error("seqof/setof, but data is not Array");var s=this.clone();s._baseState.implicit=null,a=this._createEncoderBuffer(t.map(function(r){var n=this._baseState;return this._getUse(n.args[0],t)._encode(r,e)},s))}else null!==n.use?o=this._getUse(n.use,r)._encode(t,e):(a=this._encodePrimitive(n.tag,t),f=!0);var o;if(!n.any&&null===n.choice){var u=null!==n.implicit?n.implicit:n.tag,h=null===n.implicit?"universal":"context";null===u?null===n.use&&e.error("Tag could be ommited only for .use()"):null===n.use&&(o=this._encodeComposite(u,f,h,a))}return null!==n.explicit&&(o=this._encodeComposite(n.explicit,!1,"context",o)),o},n.prototype._encodeChoice=function(t,e){var r=this._baseState,n=r.choice[t.type];return n||f(!1,t.type+" not found in "+JSON.stringify(Object.keys(r.choice))),n._encode(t.value,e)},n.prototype._encodePrimitive=function(t,e){var r=this._baseState;if(/str$/.test(t))return this._encodeStr(e,t);if("objid"===t&&r.args)return this._encodeObjid(e,r.reverseArgs[0],r.args[1]);if("objid"===t)return this._encodeObjid(e,null,null);if("gentime"===t||"utctime"===t)return this._encodeTime(e,t);if("null_"===t)return this._encodeNull();if("int"===t||"enum"===t)return this._encodeInt(e,r.args&&r.reverseArgs[0]);if("bool"===t)return this._encodeBool(e);throw new Error("Unsupported tag: "+t)},n.prototype._isNumstr=function(t){return/^[0-9 ]*$/.test(t)},n.prototype._isPrintstr=function(t){return/^[A-Za-z0-9 '\(\)\+,\-\.\/:=\?]*$/.test(t)}},function(t,e,r){function n(t){this._reporterState={obj:null,path:[],options:t||{},errors:[]}}function i(t,e){this.path=t,this.rethrow(e)}var o=r(2);e.Reporter=n,n.prototype.isError=function(t){return t instanceof i},n.prototype.save=function(){var t=this._reporterState;return{obj:t.obj,pathLen:t.path.length}},n.prototype.restore=function(t){var e=this._reporterState;e.obj=t.obj,e.path=e.path.slice(0,t.pathLen)},n.prototype.enterKey=function(t){return this._reporterState.path.push(t)},n.prototype.exitKey=function(t){var e=this._reporterState;e.path=e.path.slice(0,t-1)},n.prototype.leaveKey=function(t,e,r){var n=this._reporterState;this.exitKey(t),null!==n.obj&&(n.obj[e]=r)},n.prototype.path=function(){return this._reporterState.path.join("/")},n.prototype.enterObject=function(){var t=this._reporterState,e=t.obj;return t.obj={},e},n.prototype.leaveObject=function(t){var e=this._reporterState,r=e.obj;return e.obj=t,r},n.prototype.error=function(t){var e,r=this._reporterState,n=t instanceof i;if(e=n?t:new i(r.path.map(function(t){return"["+JSON.stringify(t)+"]"}).join(""),t.message||t,t.stack),!r.options.partial)throw e;return n||r.errors.push(e),e},n.prototype.wrapResult=function(t){var e=this._reporterState;return e.options.partial?{result:this.isError(t)?null:t,errors:e.errors}:t},o(i,Error),i.prototype.rethrow=function(t){if(this.message=t+" at: "+(this.path||"(shallow)"),Error.captureStackTrace&&Error.captureStackTrace(this,i),!this.stack)try{throw new Error(this.message)}catch(t){this.stack=t.stack}return this}},function(t,e,r){var n=r(235);e.tagClass={0:"universal",1:"application",2:"context",3:"private"},e.tagClassByName=n._reverse(e.tagClass),e.tag={0:"end",1:"bool",2:"int",3:"bitstr",4:"octstr",5:"null_",6:"objid",7:"objDesc",8:"external",9:"real",10:"enum",11:"embed",12:"utf8str",13:"relativeOid",16:"seq",17:"set",18:"numstr",19:"printstr",20:"t61str",21:"videostr",22:"ia5str",23:"utctime",24:"gentime",25:"graphstr",26:"iso646str",27:"genstr",28:"unistr",29:"charstr",30:"bmpstr"},e.tagByName=n._reverse(e.tag)},function(t,e,r){var n=e;n.der=r(236),n.pem=r(585)},function(t,e,r){function n(t){a.call(this,t),this.enc="pem"}var i=r(2),o=r(1).Buffer,a=r(236);i(n,a),t.exports=n,n.prototype.decode=function(t,e){for(var r=t.toString().split(/[\r\n]+/g),n=e.label.toUpperCase(),i=/^-----(BEGIN|END) ([^-]+)-----$/,f=-1,s=-1,u=0;u16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e}else if(this.cache.length>=16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e;return null},i.prototype.flush=function(){if(this.cache.length)return this.cache};var b={ECB:r(244),CBC:r(240),CFB:r(241),CFB8:r(243),CFB1:r(242),OFB:r(245),CTR:r(108),GCM:r(108)};e.createDecipher=f,e.createDecipheriv=a}).call(e,r(1).Buffer)},function(t,e,r){(function(t){function n(e,r,o){return this instanceof n?(s.call(this),this._cache=new i,this._cipher=new f.AES(r),this._prev=new t(o.length),o.copy(this._prev),this._mode=e,void(this._autopadding=!0)):new n(e,r,o)}function i(){return this instanceof i?void(this.cache=new t("")):new i}function o(e,r,i){var o=h[e.toLowerCase()];if(!o)throw new TypeError("invalid suite type");if("string"==typeof i&&(i=new t(i)),"string"==typeof r&&(r=new t(r)),r.length!==o.key/8)throw new TypeError("invalid key length "+r.length);if(i.length!==o.iv)throw new TypeError("invalid iv length "+i.length);return"stream"===o.type?new d(p[o.mode],r,i):"auth"===o.type?new l(p[o.mode],r,i):new n(p[o.mode],r,i)}function a(t,e){var r=h[t.toLowerCase()];if(!r)throw new TypeError("invalid suite type");var n=c(e,!1,r.key,r.iv);return o(t,n.key,n.iv)}var f=r(107),s=r(109),u=r(2),h=r(152),c=r(153),d=r(246),l=r(238);u(n,s),n.prototype._update=function(e){this._cache.add(e);for(var r,n,i=[];r=this._cache.get();)n=this._mode.encrypt(this,r),i.push(n);return t.concat(i)},n.prototype._final=function(){var t=this._cache.flush();if(this._autopadding)return t=this._mode.encrypt(this,t),this._cipher.scrub(),t;if("10101010101010101010101010101010"!==t.toString("hex"))throw this._cipher.scrub(),new Error("data not multiple of block length")},n.prototype.setAutoPadding=function(t){return this._autopadding=!!t,this},i.prototype.add=function(e){this.cache=t.concat([this.cache,e])},i.prototype.get=function(){if(this.cache.length>15){var t=this.cache.slice(0,16);return this.cache=this.cache.slice(16),t}return null},i.prototype.flush=function(){for(var e=16-this.cache.length,r=new t(e),n=-1;++ns||t<0?(r=Math.abs(t)%s,t<0?s-r:r):t}function a(t,e){return[t[0]^e[0],t[1]^e[1],t[2]^e[2],t[3]^e[3]]}var f=new e(16);f.fill(0),t.exports=r,r.prototype.ghash=function(t){for(var e=-1;++e0;t--)o[t]=o[t]>>>1|(1&o[t-1])<<31;o[0]=o[0]>>>1,r&&(o[0]=o[0]^225<<24)}this.state=i(f)},r.prototype.update=function(t){this.cache=e.concat([this.cache,t]);for(var r;this.cache.length>=16;)r=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(r)},r.prototype.final=function(t,r){return this.cache.length&&this.ghash(e.concat([this.cache,f],16)),this.ghash(i([0,t,0,r])),this.state};var s=Math.pow(2,32)}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(t,r){var n=(t.modulus,t.modulus.byteLength()),i=(r.length,c("sha1").update(new e("")).digest()),a=i.length;if(0!==r[0])throw new Error("decryption error");var u=r.slice(1,a+1),h=r.slice(a+1),d=s(u,f(h,a)),l=s(h,f(d,n-a-1));if(o(i,l.slice(0,a)))throw new Error("decryption error");for(var p=a;0===l[p];)p++;if(1!==l[p++])throw new Error("decryption error");return l.slice(p)}function i(t,e,r){for(var n=e.slice(0,2),i=2,o=0;0!==e[i++];)if(i>=e.length){o++;break}var a=e.slice(2,i-1);e.slice(i-1,i);if(("0002"!==n.toString("hex")&&!r||"0001"!==n.toString("hex")&&r)&&o++,a.length<8&&o++,o)throw new Error("decryption error");return e.slice(i)}function o(t,r){t=new e(t),r=new e(r);var n=0,i=t.length;t.length!==r.length&&(n++,i=Math.min(t.length,r.length));for(var o=-1;++oc||new u(r).cmp(s.modulus)>=0)throw new Error("decryption error");var l;l=o?d(new u(r),s):h(r,s);var p=new e(c-l.length);if(p.fill(0),l=e.concat([p,l],c),4===f)return n(s,l);if(1===f)return i(s,l,o);if(3===f)return l;throw new Error("unknown padding")}}).call(e,r(1).Buffer)},function(t,e,r){(function(e){function n(t,r){var n=t.modulus.byteLength(),i=r.length,o=s("sha1").update(new e("")).digest(),a=o.length,d=2*a;if(i>n-d-2)throw new Error("message too long");var l=new e(n-i-d-2);l.fill(0);var p=n-a-1,b=f(a),v=h(e.concat([o,l,new e([1]),r],p),u(b,p)),y=h(b,u(v,a));return new c(e.concat([new e([0]),y,v],n))}function i(t,r,n){var i=r.length,a=t.modulus.byteLength();if(i>a-11)throw new Error("message too long");var f;return n?(f=new e(a-i-3),f.fill(255)):f=o(a-i-3),new c(e.concat([new e([0,n?1:2]),f,new e([0]),r],a))}function o(t,r){for(var n,i=new e(t),o=0,a=f(2*t),s=0;o=0)throw new Error("data too long for modulus")}return r?l(f,s):d(f,s)}}).call(e,r(1).Buffer)},function(t,e,r){(function(t){function r(t,e){for(var r=0,n=t.length-1;n>=0;n--){var i=t[n];"."===i?t.splice(n,1):".."===i?(t.splice(n,1), r++):r&&(t.splice(n,1),r--)}if(e)for(;r--;r)t.unshift("..");return t}function n(t,e){if(t.filter)return t.filter(e);for(var r=[],n=0;n=-1&&!i;o--){var a=o>=0?arguments[o]:t.cwd();if("string"!=typeof a)throw new TypeError("Arguments to path.resolve must be strings");a&&(e=a+"/"+e,i="/"===a.charAt(0))}return e=r(n(e.split("/"),function(t){return!!t}),!i).join("/"),(i?"/":"")+e||"."},e.normalize=function(t){var i=e.isAbsolute(t),o="/"===a(t,-1);return t=r(n(t.split("/"),function(t){return!!t}),!i).join("/"),t||i||(t="."),t&&o&&(t+="/"),(i?"/":"")+t},e.isAbsolute=function(t){return"/"===t.charAt(0)},e.join=function(){var t=Array.prototype.slice.call(arguments,0);return e.normalize(n(t,function(t,e){if("string"!=typeof t)throw new TypeError("Arguments to path.join must be strings");return t}).join("/"))},e.relative=function(t,r){function n(t){for(var e=0;e=0&&""===t[r];r--);return e>r?[]:t.slice(e,r-e+1)}t=e.resolve(t).substr(1),r=e.resolve(r).substr(1);for(var i=n(t.split("/")),o=n(r.split("/")),a=Math.min(i.length,o.length),f=a,s=0;s0?this.tail.next=e:this.head=e,this.tail=e,++this.length},n.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},n.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},n.prototype.clear=function(){this.head=this.tail=null,this.length=0},n.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r},n.prototype.concat=function(t){if(0===this.length)return i.alloc(0);if(1===this.length)return this.head.data;for(var e=i.allocUnsafe(t>>>0),r=this.head,n=0;r;)r.data.copy(e,n),n+=r.data.length,r=r.next;return e}},function(t,e){var r={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},function(t,e,r){(function(e){function r(t,e){function r(){if(!i){if(n("throwDeprecation"))throw new Error(e);n("traceDeprecation")?console.trace(e):console.warn(e),i=!0}return t.apply(this,arguments)}if(n("noDeprecation"))return t;var i=!1;return r}function n(t){try{if(!e.localStorage)return!1}catch(t){return!1}var r=e.localStorage[t];return null!=r&&"true"===String(r).toLowerCase()}t.exports=r}).call(e,r(39))},function(t,e,r){t.exports=r(249)},function(t,e,r){(function(n){var i=function(){try{return r(31)}catch(t){}}();e=t.exports=r(250),e.Stream=i||e,e.Readable=e,e.Writable=r(155),e.Duplex=r(51),e.Transform=r(154),e.PassThrough=r(249),!n.browser&&"disable"===n.env.READABLE_STREAM&&i&&(t.exports=i)}).call(e,r(26))},function(t,e,r){t.exports=r(154)},function(t,e,r){t.exports=r(155)},function(t,e){"function"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}},function(t,e){"function"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}},function(t,e){t.exports=function(t){return t&&"object"==typeof t&&"function"==typeof t.copy&&"function"==typeof t.fill&&"function"==typeof t.readUInt8}},function(t,e,r){(function(t,n){function i(t,r){var n={seen:[],stylize:a};return arguments.length>=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),b(r)?n.showHidden=r:r&&e._extend(n,r),_(n.showHidden)&&(n.showHidden=!1),_(n.depth)&&(n.depth=2),_(n.colors)&&(n.colors=!1),_(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=o),s(n,t,n.depth)}function o(t,e){var r=i.styles[e];return r?"["+i.colors[r][0]+"m"+t+"["+i.colors[r][1]+"m":t}function a(t,e){return t}function f(t){var e={};return t.forEach(function(t,r){e[t]=!0}),e}function s(t,r,n){if(t.customInspect&&r&&k(r.inspect)&&r.inspect!==e.inspect&&(!r.constructor||r.constructor.prototype!==r)){var i=r.inspect(n,t);return g(i)||(i=s(t,i,n)),i}var o=u(t,r);if(o)return o;var a=Object.keys(r),b=f(a);if(t.showHidden&&(a=Object.getOwnPropertyNames(r)),A(r)&&(a.indexOf("message")>=0||a.indexOf("description")>=0))return h(r);if(0===a.length){if(k(r)){var v=r.name?": "+r.name:"";return t.stylize("[Function"+v+"]","special")}if(M(r))return t.stylize(RegExp.prototype.toString.call(r),"regexp");if(E(r))return t.stylize(Date.prototype.toString.call(r),"date");if(A(r))return h(r)}var y="",m=!1,w=["{","}"];if(p(r)&&(m=!0,w=["[","]"]),k(r)){var _=r.name?": "+r.name:"";y=" [Function"+_+"]"}if(M(r)&&(y=" "+RegExp.prototype.toString.call(r)),E(r)&&(y=" "+Date.prototype.toUTCString.call(r)),A(r)&&(y=" "+h(r)),0===a.length&&(!m||0==r.length))return w[0]+y+w[1];if(n<0)return M(r)?t.stylize(RegExp.prototype.toString.call(r),"regexp"):t.stylize("[Object]","special");t.seen.push(r);var S;return S=m?c(t,r,n,b,a):a.map(function(e){return d(t,r,n,b,e,m)}),t.seen.pop(),l(S,y,w)}function u(t,e){if(_(e))return t.stylize("undefined","undefined");if(g(e)){var r="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(r,"string")}return m(e)?t.stylize(""+e,"number"):b(e)?t.stylize(""+e,"boolean"):v(e)?t.stylize("null","null"):void 0}function h(t){return"["+Error.prototype.toString.call(t)+"]"}function c(t,e,r,n,i){for(var o=[],a=0,f=e.length;a-1&&(f=o?f.split("\n").map(function(t){return" "+t}).join("\n").substr(2):"\n"+f.split("\n").map(function(t){return" "+t}).join("\n"))):f=t.stylize("[Circular]","special")),_(a)){if(o&&i.match(/^\d+$/))return f;a=JSON.stringify(""+i),a.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=t.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=t.stylize(a,"string"))}return a+": "+f}function l(t,e,r){var n=0,i=t.reduce(function(t,e){return n++,e.indexOf("\n")>=0&&n++,t+e.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?r[0]+(""===e?"":e+"\n ")+" "+t.join(",\n ")+" "+r[1]:r[0]+e+" "+t.join(", ")+" "+r[1]}function p(t){return Array.isArray(t)}function b(t){return"boolean"==typeof t}function v(t){return null===t}function y(t){return null==t}function m(t){return"number"==typeof t}function g(t){return"string"==typeof t}function w(t){return"symbol"==typeof t}function _(t){return void 0===t}function M(t){return S(t)&&"[object RegExp]"===I(t)}function S(t){return"object"==typeof t&&null!==t}function E(t){return S(t)&&"[object Date]"===I(t)}function A(t){return S(t)&&("[object Error]"===I(t)||t instanceof Error)}function k(t){return"function"==typeof t}function x(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"==typeof t||"undefined"==typeof t}function I(t){return Object.prototype.toString.call(t)}function B(t){return t<10?"0"+t.toString(10):t.toString(10)}function O(){var t=new Date,e=[B(t.getHours()),B(t.getMinutes()),B(t.getSeconds())].join(":");return[t.getDate(),C[t.getMonth()],e].join(" ")}function R(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var P=/%[sdj%]/g;e.format=function(t){if(!g(t)){for(var e=[],r=0;r=o)return t;switch(t){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 t}}),f=n[r];r 2 && arguments[2] !== undefined ? arguments[2] : null; var outputs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; var inputs = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; var tx = makeTransactionTemplate(); tx.operation = operation; tx.asset = asset; tx.metadata = metadata; tx.inputs = inputs; tx.outputs = outputs; // Hashing must be done after, as the hash is of the Transaction (up to now) tx.id = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__hashTransaction__["a" /* default */])(tx); return tx; } /***/ }), /* 7 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = serializeTransactionIntoCanonicalString; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_json_stable_stringify__ = __webpack_require__(85); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_json_stable_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_json_stable_stringify__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_clone__ = __webpack_require__(18); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_clone___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_clone__); /** * @public * Canonically serializes a transaction into a string by sorting the keys * @param {object} (transaction) * @return {string} a canonically serialized Transaction */ function serializeTransactionIntoCanonicalString(transaction) { // BigchainDB signs fulfillments by serializing transactions into a "canonical" format where var tx = __WEBPACK_IMPORTED_MODULE_1_clone___default()(transaction); // TODO: set fulfillments to null // Sort the keys return __WEBPACK_IMPORTED_MODULE_0_json_stable_stringify___default()(tx, function (a, b) { return a.key > b.key ? 1 : -1; }); } /***/ }), /* 8 */ /***/ (function(module, exports) { var core = module.exports = {version: '2.4.0'}; if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { // Thank's IE8 for his funny defineProperty module.exports = !__webpack_require__(22)(function(){ return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; }); /***/ }), /* 10 */ /***/ (function(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 /***/ }), /* 11 */ /***/ (function(module, exports) { module.exports = function(it){ return typeof it === 'object' ? it !== null : typeof it === 'function'; }; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { // to indexed object, toObject with fallback for non-array-like ES3 strings var IObject = __webpack_require__(65) , defined = __webpack_require__(59); module.exports = function(it){ return IObject(defined(it)); }; /***/ }), /* 13 */ /***/ (function(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; 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); } } } 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; } 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); } }; // 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 = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return [] } 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; }; /***/ }), /* 14 */ /***/ (function(module, exports) { var g; // This works in non-strict mode g = (function() { return this; })(); try { // This works if eval is allowed (see CSP) g = g || Function("return this")() || (1,eval)("this"); } catch(e) { // This works if the window reference is available if(typeof window === "object") g = window; } // g can still be undefined, but nothing to do about it... // We return undefined, instead of nothing here, so it's // easier to handle this case. if(!global) { ...} module.exports = g; /***/ }), /* 15 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = getStatus; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getApiUrls__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(1); /** * @public * @param tx_id * @param API_PATH */ function getStatus(tx_id, API_PATH) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__request__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getApiUrls__["a" /* default */])(API_PATH)['statuses'], { query: { tx_id: tx_id } }); } /***/ }), /* 16 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = getTransaction; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getApiUrls__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(1); /** * @public * @param txId * @param API_PATH */ function getTransaction(txId, API_PATH) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__request__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getApiUrls__["a" /* default */])(API_PATH)['transactions_detail'], { urlTemplateSpec: { txId: txId } }); } /***/ }), /* 17 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = makeInputTemplate; function makeInputTemplate() { var publicKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var fulfills = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var fulfillment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; return { fulfillment: fulfillment, fulfills: fulfills, 'owners_before': publicKeys }; } /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {var clone = (function() { 'use strict'; function _instanceof(obj, type) { return type != null && obj instanceof type; } var nativeMap; try { nativeMap = Map; } catch(_) { // maybe a reference error because no `Map`. Give it a dummy value that no // value will ever be an instanceof. nativeMap = function() {}; } var nativeSet; try { nativeSet = Set; } catch(_) { nativeSet = function() {}; } var nativePromise; try { nativePromise = Promise; } catch(_) { nativePromise = function() {}; } /** * Clones (copies) an Object using deep copying. * * This function supports circular references by default, but if you are certain * there are no circular references in your object, you can save some CPU time * by calling clone(obj, false). * * Caution: if `circular` is false and `parent` contains circular references, * your program may enter an infinite loop and crash. * * @param `parent` - the object to be cloned * @param `circular` - set to true if the object to be cloned may contain * circular references. (optional - true by default) * @param `depth` - set to a number if the object is only to be cloned to * a particular depth. (optional - defaults to Infinity) * @param `prototype` - sets the prototype to be used when cloning an object. * (optional - defaults to parent prototype). * @param `includeNonEnumerable` - set to true if the non-enumerable properties * should be cloned as well. Non-enumerable properties on the prototype * chain will be ignored. (optional - false by default) */ function clone(parent, circular, depth, prototype, includeNonEnumerable) { if (typeof circular === 'object') { depth = circular.depth; prototype = circular.prototype; includeNonEnumerable = circular.includeNonEnumerable; circular = circular.circular; } // maintain two arrays for circular references, where corresponding parents // and children have the same index var allParents = []; var allChildren = []; var useBuffer = typeof Buffer != 'undefined'; if (typeof circular == 'undefined') circular = true; if (typeof depth == 'undefined') depth = Infinity; // recurse this function so we don't reset allParents and allChildren function _clone(parent, depth) { // cloning null always returns null if (parent === null) return null; if (depth === 0) return parent; var child; var proto; if (typeof parent != 'object') { return parent; } if (_instanceof(parent, nativeMap)) { child = new nativeMap(); } else if (_instanceof(parent, nativeSet)) { child = new nativeSet(); } else if (_instanceof(parent, nativePromise)) { child = new nativePromise(function (resolve, reject) { parent.then(function(value) { resolve(_clone(value, depth - 1)); }, function(err) { reject(_clone(err, depth - 1)); }); }); } else if (clone.__isArray(parent)) { child = []; } else if (clone.__isRegExp(parent)) { child = new RegExp(parent.source, __getRegExpFlags(parent)); if (parent.lastIndex) child.lastIndex = parent.lastIndex; } else if (clone.__isDate(parent)) { child = new Date(parent.getTime()); } else if (useBuffer && Buffer.isBuffer(parent)) { child = new Buffer(parent.length); parent.copy(child); return child; } else if (_instanceof(parent, Error)) { child = Object.create(parent); } else { if (typeof prototype == 'undefined') { proto = Object.getPrototypeOf(parent); child = Object.create(proto); } else { child = Object.create(prototype); proto = prototype; } } if (circular) { var index = allParents.indexOf(parent); if (index != -1) { return allChildren[index]; } allParents.push(parent); allChildren.push(child); } if (_instanceof(parent, nativeMap)) { parent.forEach(function(value, key) { var keyChild = _clone(key, depth - 1); var valueChild = _clone(value, depth - 1); child.set(keyChild, valueChild); }); } if (_instanceof(parent, nativeSet)) { parent.forEach(function(value) { var entryChild = _clone(value, depth - 1); child.add(entryChild); }); } for (var i in parent) { var attrs; if (proto) { attrs = Object.getOwnPropertyDescriptor(proto, i); } if (attrs && attrs.set == null) { continue; } child[i] = _clone(parent[i], depth - 1); } if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(parent); for (var i = 0; i < symbols.length; i++) { // Don't need to worry about cloning a symbol because it is a primitive, // like a number or string. var symbol = symbols[i]; var descriptor = Object.getOwnPropertyDescriptor(parent, symbol); if (descriptor && !descriptor.enumerable && !includeNonEnumerable) { continue; } child[symbol] = _clone(parent[symbol], depth - 1); if (!descriptor.enumerable) { Object.defineProperty(child, symbol, { enumerable: false }); } } } if (includeNonEnumerable) { var allPropertyNames = Object.getOwnPropertyNames(parent); for (var i = 0; i < allPropertyNames.length; i++) { var propertyName = allPropertyNames[i]; var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName); if (descriptor && descriptor.enumerable) { continue; } child[propertyName] = _clone(parent[propertyName], depth - 1); Object.defineProperty(child, propertyName, { enumerable: false }); } } return child; } return _clone(parent, depth); } /** * Simple flat clone using prototype, accepts only objects, usefull for property * override on FLAT configuration object (no nested props). * * USE WITH CAUTION! This may not behave as you wish if you do not know how this * works. */ clone.clonePrototype = function clonePrototype(parent) { if (parent === null) return null; var c = function () {}; c.prototype = parent; return new c(); }; // private utility functions function __objToStr(o) { return Object.prototype.toString.call(o); } clone.__objToStr = __objToStr; function __isDate(o) { return typeof o === 'object' && __objToStr(o) === '[object Date]'; } clone.__isDate = __isDate; function __isArray(o) { return typeof o === 'object' && __objToStr(o) === '[object Array]'; } clone.__isArray = __isArray; function __isRegExp(o) { return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; } clone.__isRegExp = __isRegExp; function __getRegExpFlags(re) { var flags = ''; if (re.global) flags += 'g'; if (re.ignoreCase) flags += 'i'; if (re.multiline) flags += 'm'; return flags; } clone.__getRegExpFlags = __getRegExpFlags; return clone; })(); if (typeof module === 'object' && module.exports) { module.exports = clone; } /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer)) /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(79); module.exports = __webpack_require__(8).Object.entries; /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { // false -> Array#indexOf // true -> Array#includes var toIObject = __webpack_require__(12) , toLength = __webpack_require__(75) , toIndex = __webpack_require__(74); 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; }; }; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(10) , core = __webpack_require__(8) , ctx = __webpack_require__(58) , hide = __webpack_require__(63) , PROTOTYPE = 'prototype'; 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 , IS_WRAP = type & $export.W , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) , expProto = exports[PROTOTYPE] , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] , key, own, out; if(IS_GLOBAL)source = name; for(key in source){ // contains in native own = !IS_FORCED && target && target[key] !== undefined; if(own && key in exports)continue; // export native or passed out = own ? target[key] : source[key]; // prevent global pollution for namespaces exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] // bind timers to global for call from export context : IS_BIND && own ? ctx(out, global) // wrap global constructors for prevent change them in library : IS_WRAP && target[key] == out ? (function(C){ var F = function(a, b, c){ if(this instanceof C){ switch(arguments.length){ case 0: return new C; case 1: return new C(a); case 2: return new C(a, b); } return new C(a, b, c); } return C.apply(this, arguments); }; F[PROTOTYPE] = C[PROTOTYPE]; return F; // make static versions for prototype methods })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% if(IS_PROTO){ (exports.virtual || (exports.virtual = {}))[key] = out; // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out); } } }; // 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; /***/ }), /* 22 */ /***/ (function(module, exports) { module.exports = function(exec){ try { return !!exec(); } catch(e){ return true; } }; /***/ }), /* 23 */ /***/ (function(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); }; /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(process, global) {/** * [js-sha3]{@link https://github.com/emn178/js-sha3} * * @version 0.5.7 * @author Chen, Yi-Cyuan [emn178@gmail.com] * @copyright Chen, Yi-Cyuan 2015-2016 * @license MIT */ /*jslint bitwise: true */ (function () { 'use strict'; var root = typeof window === 'object' ? window : {}; var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; if (NODE_JS) { root = global; } var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module === 'object' && module.exports; var HEX_CHARS = '0123456789abcdef'.split(''); var SHAKE_PADDING = [31, 7936, 2031616, 520093696]; var KECCAK_PADDING = [1, 256, 65536, 16777216]; var PADDING = [6, 1536, 393216, 100663296]; var SHIFT = [0, 8, 16, 24]; var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648]; var BITS = [224, 256, 384, 512]; var SHAKE_BITS = [128, 256]; var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array']; var createOutputMethod = function (bits, padding, outputType) { return function (message) { return new Keccak(bits, padding, bits).update(message)[outputType](); }; }; var createShakeOutputMethod = function (bits, padding, outputType) { return function (message, outputBits) { return new Keccak(bits, padding, outputBits).update(message)[outputType](); }; }; var createMethod = function (bits, padding) { var method = createOutputMethod(bits, padding, 'hex'); method.create = function () { return new Keccak(bits, padding, bits); }; method.update = function (message) { return method.create().update(message); }; for (var i = 0; i < OUTPUT_TYPES.length; ++i) { var type = OUTPUT_TYPES[i]; method[type] = createOutputMethod(bits, padding, type); } return method; }; var createShakeMethod = function (bits, padding) { var method = createShakeOutputMethod(bits, padding, 'hex'); method.create = function (outputBits) { return new Keccak(bits, padding, outputBits); }; method.update = function (message, outputBits) { return method.create(outputBits).update(message); }; for (var i = 0; i < OUTPUT_TYPES.length; ++i) { var type = OUTPUT_TYPES[i]; method[type] = createShakeOutputMethod(bits, padding, type); } return method; }; var algorithms = [ {name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod}, {name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod}, {name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod} ]; var methods = {}, methodNames = []; for (var i = 0; i < algorithms.length; ++i) { var algorithm = algorithms[i]; var bits = algorithm.bits; for (var j = 0; j < bits.length; ++j) { var methodName = algorithm.name +'_' + bits[j]; methodNames.push(methodName); methods[methodName] = algorithm.createMethod(bits[j], algorithm.padding); } } function Keccak(bits, padding, outputBits) { this.blocks = []; this.s = []; this.padding = padding; this.outputBits = outputBits; this.reset = true; this.block = 0; this.start = 0; this.blockCount = (1600 - (bits << 1)) >> 5; this.byteCount = this.blockCount << 2; this.outputBlocks = outputBits >> 5; this.extraBytes = (outputBits & 31) >> 3; for (var i = 0; i < 50; ++i) { this.s[i] = 0; } } Keccak.prototype.update = function (message) { var notString = typeof message !== 'string'; if (notString && message.constructor === ArrayBuffer) { message = new Uint8Array(message); } var length = message.length, blocks = this.blocks, byteCount = this.byteCount, blockCount = this.blockCount, index = 0, s = this.s, i, code; while (index < length) { if (this.reset) { this.reset = false; blocks[0] = this.block; for (i = 1; i < blockCount + 1; ++i) { blocks[i] = 0; } } if (notString) { for (i = this.start; index < length && i < byteCount; ++index) { blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; } } else { for (i = this.start; index < length && i < byteCount; ++index) { code = message.charCodeAt(index); if (code < 0x80) { blocks[i >> 2] |= code << SHIFT[i++ & 3]; } else if (code < 0x800) { blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; } else if (code < 0xd800 || code >= 0xe000) { blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; } else { code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; } } } this.lastByteIndex = i; if (i >= byteCount) { this.start = i - byteCount; this.block = blocks[blockCount]; for (i = 0; i < blockCount; ++i) { s[i] ^= blocks[i]; } f(s); this.reset = true; } else { this.start = i; } } return this; }; Keccak.prototype.finalize = function () { var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s; blocks[i >> 2] |= this.padding[i & 3]; if (this.lastByteIndex === this.byteCount) { blocks[0] = blocks[blockCount]; for (i = 1; i < blockCount + 1; ++i) { blocks[i] = 0; } } blocks[blockCount - 1] |= 0x80000000; for (i = 0; i < blockCount; ++i) { s[i] ^= blocks[i]; } f(s); }; Keccak.prototype.toString = Keccak.prototype.hex = function () { this.finalize(); var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i = 0, j = 0; var hex = '', block; while (j < outputBlocks) { for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { block = s[i]; hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] + HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] + HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] + HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F]; } if (j % blockCount === 0) { f(s); i = 0; } } if (extraBytes) { block = s[i]; if (extraBytes > 0) { hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F]; } if (extraBytes > 1) { hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F]; } if (extraBytes > 2) { hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F]; } } return hex; }; Keccak.prototype.arrayBuffer = function () { this.finalize(); var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i = 0, j = 0; var bytes = this.outputBits >> 3; var buffer; if (extraBytes) { buffer = new ArrayBuffer((outputBlocks + 1) << 2); } else { buffer = new ArrayBuffer(bytes); } var array = new Uint32Array(buffer); while (j < outputBlocks) { for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { array[j] = s[i]; } if (j % blockCount === 0) { f(s); } } if (extraBytes) { array[i] = s[i]; buffer = buffer.slice(0, bytes); } return buffer; }; Keccak.prototype.buffer = Keccak.prototype.arrayBuffer; Keccak.prototype.digest = Keccak.prototype.array = function () { this.finalize(); var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i = 0, j = 0; var array = [], offset, block; while (j < outputBlocks) { for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { offset = j << 2; block = s[i]; array[offset] = block & 0xFF; array[offset + 1] = (block >> 8) & 0xFF; array[offset + 2] = (block >> 16) & 0xFF; array[offset + 3] = (block >> 24) & 0xFF; } if (j % blockCount === 0) { f(s); } } if (extraBytes) { offset = j << 2; block = s[i]; if (extraBytes > 0) { array[offset] = block & 0xFF; } if (extraBytes > 1) { array[offset + 1] = (block >> 8) & 0xFF; } if (extraBytes > 2) { array[offset + 2] = (block >> 16) & 0xFF; } } return array; }; var f = function (s) { var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49; for (n = 0; n < 48; n += 2) { c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49]; h = c8 ^ ((c2 << 1) | (c3 >>> 31)); l = c9 ^ ((c3 << 1) | (c2 >>> 31)); s[0] ^= h; s[1] ^= l; s[10] ^= h; s[11] ^= l; s[20] ^= h; s[21] ^= l; s[30] ^= h; s[31] ^= l; s[40] ^= h; s[41] ^= l; h = c0 ^ ((c4 << 1) | (c5 >>> 31)); l = c1 ^ ((c5 << 1) | (c4 >>> 31)); s[2] ^= h; s[3] ^= l; s[12] ^= h; s[13] ^= l; s[22] ^= h; s[23] ^= l; s[32] ^= h; s[33] ^= l; s[42] ^= h; s[43] ^= l; h = c2 ^ ((c6 << 1) | (c7 >>> 31)); l = c3 ^ ((c7 << 1) | (c6 >>> 31)); s[4] ^= h; s[5] ^= l; s[14] ^= h; s[15] ^= l; s[24] ^= h; s[25] ^= l; s[34] ^= h; s[35] ^= l; s[44] ^= h; s[45] ^= l; h = c4 ^ ((c8 << 1) | (c9 >>> 31)); l = c5 ^ ((c9 << 1) | (c8 >>> 31)); s[6] ^= h; s[7] ^= l; s[16] ^= h; s[17] ^= l; s[26] ^= h; s[27] ^= l; s[36] ^= h; s[37] ^= l; s[46] ^= h; s[47] ^= l; h = c6 ^ ((c0 << 1) | (c1 >>> 31)); l = c7 ^ ((c1 << 1) | (c0 >>> 31)); s[8] ^= h; s[9] ^= l; s[18] ^= h; s[19] ^= l; s[28] ^= h; s[29] ^= l; s[38] ^= h; s[39] ^= l; s[48] ^= h; s[49] ^= l; b0 = s[0]; b1 = s[1]; b32 = (s[11] << 4) | (s[10] >>> 28); b33 = (s[10] << 4) | (s[11] >>> 28); b14 = (s[20] << 3) | (s[21] >>> 29); b15 = (s[21] << 3) | (s[20] >>> 29); b46 = (s[31] << 9) | (s[30] >>> 23); b47 = (s[30] << 9) | (s[31] >>> 23); b28 = (s[40] << 18) | (s[41] >>> 14); b29 = (s[41] << 18) | (s[40] >>> 14); b20 = (s[2] << 1) | (s[3] >>> 31); b21 = (s[3] << 1) | (s[2] >>> 31); b2 = (s[13] << 12) | (s[12] >>> 20); b3 = (s[12] << 12) | (s[13] >>> 20); b34 = (s[22] << 10) | (s[23] >>> 22); b35 = (s[23] << 10) | (s[22] >>> 22); b16 = (s[33] << 13) | (s[32] >>> 19); b17 = (s[32] << 13) | (s[33] >>> 19); b48 = (s[42] << 2) | (s[43] >>> 30); b49 = (s[43] << 2) | (s[42] >>> 30); b40 = (s[5] << 30) | (s[4] >>> 2); b41 = (s[4] << 30) | (s[5] >>> 2); b22 = (s[14] << 6) | (s[15] >>> 26); b23 = (s[15] << 6) | (s[14] >>> 26); b4 = (s[25] << 11) | (s[24] >>> 21); b5 = (s[24] << 11) | (s[25] >>> 21); b36 = (s[34] << 15) | (s[35] >>> 17); b37 = (s[35] << 15) | (s[34] >>> 17); b18 = (s[45] << 29) | (s[44] >>> 3); b19 = (s[44] << 29) | (s[45] >>> 3); b10 = (s[6] << 28) | (s[7] >>> 4); b11 = (s[7] << 28) | (s[6] >>> 4); b42 = (s[17] << 23) | (s[16] >>> 9); b43 = (s[16] << 23) | (s[17] >>> 9); b24 = (s[26] << 25) | (s[27] >>> 7); b25 = (s[27] << 25) | (s[26] >>> 7); b6 = (s[36] << 21) | (s[37] >>> 11); b7 = (s[37] << 21) | (s[36] >>> 11); b38 = (s[47] << 24) | (s[46] >>> 8); b39 = (s[46] << 24) | (s[47] >>> 8); b30 = (s[8] << 27) | (s[9] >>> 5); b31 = (s[9] << 27) | (s[8] >>> 5); b12 = (s[18] << 20) | (s[19] >>> 12); b13 = (s[19] << 20) | (s[18] >>> 12); b44 = (s[29] << 7) | (s[28] >>> 25); b45 = (s[28] << 7) | (s[29] >>> 25); b26 = (s[38] << 8) | (s[39] >>> 24); b27 = (s[39] << 8) | (s[38] >>> 24); b8 = (s[48] << 14) | (s[49] >>> 18); b9 = (s[49] << 14) | (s[48] >>> 18); s[0] = b0 ^ (~b2 & b4); s[1] = b1 ^ (~b3 & b5); s[10] = b10 ^ (~b12 & b14); s[11] = b11 ^ (~b13 & b15); s[20] = b20 ^ (~b22 & b24); s[21] = b21 ^ (~b23 & b25); s[30] = b30 ^ (~b32 & b34); s[31] = b31 ^ (~b33 & b35); s[40] = b40 ^ (~b42 & b44); s[41] = b41 ^ (~b43 & b45); s[2] = b2 ^ (~b4 & b6); s[3] = b3 ^ (~b5 & b7); s[12] = b12 ^ (~b14 & b16); s[13] = b13 ^ (~b15 & b17); s[22] = b22 ^ (~b24 & b26); s[23] = b23 ^ (~b25 & b27); s[32] = b32 ^ (~b34 & b36); s[33] = b33 ^ (~b35 & b37); s[42] = b42 ^ (~b44 & b46); s[43] = b43 ^ (~b45 & b47); s[4] = b4 ^ (~b6 & b8); s[5] = b5 ^ (~b7 & b9); s[14] = b14 ^ (~b16 & b18); s[15] = b15 ^ (~b17 & b19); s[24] = b24 ^ (~b26 & b28); s[25] = b25 ^ (~b27 & b29); s[34] = b34 ^ (~b36 & b38); s[35] = b35 ^ (~b37 & b39); s[44] = b44 ^ (~b46 & b48); s[45] = b45 ^ (~b47 & b49); s[6] = b6 ^ (~b8 & b0); s[7] = b7 ^ (~b9 & b1); s[16] = b16 ^ (~b18 & b10); s[17] = b17 ^ (~b19 & b11); s[26] = b26 ^ (~b28 & b20); s[27] = b27 ^ (~b29 & b21); s[36] = b36 ^ (~b38 & b30); s[37] = b37 ^ (~b39 & b31); s[46] = b46 ^ (~b48 & b40); s[47] = b47 ^ (~b49 & b41); s[8] = b8 ^ (~b0 & b2); s[9] = b9 ^ (~b1 & b3); s[18] = b18 ^ (~b10 & b12); s[19] = b19 ^ (~b11 & b13); s[28] = b28 ^ (~b20 & b22); s[29] = b29 ^ (~b21 & b23); s[38] = b38 ^ (~b30 & b32); s[39] = b39 ^ (~b31 & b33); s[48] = b48 ^ (~b40 & b42); s[49] = b49 ^ (~b41 & b43); s[0] ^= RC[n]; s[1] ^= RC[n + 1]; } }; if (COMMON_JS) { module.exports = methods; } else { for (var i = 0; i < methodNames.length; ++i) { root[methodNames[i]] = methods[methodNames[i]]; } } })(); /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13), __webpack_require__(14))) /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_RESULT__;/* globals window, exports, define */ (function(window) { 'use strict' var re = { not_string: /[^s]/, not_bool: /[^t]/, not_type: /[^T]/, not_primitive: /[^v]/, number: /[diefg]/, numeric_arg: /[bcdiefguxX]/, json: /[j]/, not_json: /[^j]/, text: /^[^\x25]+/, modulo: /^\x25{2}/, placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, key: /^([a-z_][a-z_\d]*)/i, key_access: /^\.([a-z_][a-z_\d]*)/i, index_access: /^\[(\d+)\]/, sign: /^[\+\-]/ } function sprintf() { var key = arguments[0], cache = sprintf.cache if (!(cache[key])) { cache[key] = sprintf.parse(key) } return sprintf.format.call(null, cache[key], arguments) } sprintf.format = function(parse_tree, argv) { var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = '' for (i = 0; i < tree_length; i++) { node_type = get_type(parse_tree[i]) if (node_type === 'string') { output[output.length] = parse_tree[i] } else if (node_type === 'array') { match = parse_tree[i] // convenience purposes only if (match[2]) { // keyword argument arg = argv[cursor] for (k = 0; k < match[2].length; k++) { if (!arg.hasOwnProperty(match[2][k])) { throw new Error(sprintf('[sprintf] property "%s" does not exist', match[2][k])) } arg = arg[match[2][k]] } } else if (match[1]) { // positional argument (explicit) arg = argv[match[1]] } else { // positional argument (implicit) arg = argv[cursor++] } if (re.not_type.test(match[8]) && re.not_primitive.test(match[8]) && get_type(arg) == 'function') { arg = arg() } if (re.numeric_arg.test(match[8]) && (get_type(arg) != 'number' && isNaN(arg))) { throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg))) } if (re.number.test(match[8])) { is_positive = arg >= 0 } switch (match[8]) { case 'b': arg = parseInt(arg, 10).toString(2) break case 'c': arg = String.fromCharCode(parseInt(arg, 10)) break case 'd': case 'i': arg = parseInt(arg, 10) break case 'j': arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0) break case 'e': arg = match[7] ? parseFloat(arg).toExponential(match[7]) : parseFloat(arg).toExponential() break case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg) break case 'g': arg = match[7] ? parseFloat(arg).toPrecision(match[7]) : parseFloat(arg) break case 'o': arg = arg.toString(8) break case 's': arg = String(arg) arg = (match[7] ? arg.substring(0, match[7]) : arg) break case 't': arg = String(!!arg) arg = (match[7] ? arg.substring(0, match[7]) : arg) break case 'T': arg = get_type(arg) arg = (match[7] ? arg.substring(0, match[7]) : arg) break case 'u': arg = parseInt(arg, 10) >>> 0 break case 'v': arg = arg.valueOf() arg = (match[7] ? arg.substring(0, match[7]) : arg) break case 'x': arg = parseInt(arg, 10).toString(16) break case 'X': arg = parseInt(arg, 10).toString(16).toUpperCase() break } if (re.json.test(match[8])) { output[output.length] = arg } else { if (re.number.test(match[8]) && (!is_positive || match[3])) { sign = is_positive ? '+' : '-' arg = arg.toString().replace(re.sign, '') } else { sign = '' } pad_character = match[4] ? match[4] === '0' ? '0' : match[4].charAt(1) : ' ' pad_length = match[6] - (sign + arg).length pad = match[6] ? (pad_length > 0 ? str_repeat(pad_character, pad_length) : '') : '' output[output.length] = match[5] ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg) } } } return output.join('') } sprintf.cache = Object.create(null) sprintf.parse = function(fmt) { var _fmt = fmt, match = [], parse_tree = [], arg_names = 0 while (_fmt) { if ((match = re.text.exec(_fmt)) !== null) { parse_tree[parse_tree.length] = match[0] } else if ((match = re.modulo.exec(_fmt)) !== null) { parse_tree[parse_tree.length] = '%' } else if ((match = re.placeholder.exec(_fmt)) !== null) { if (match[2]) { arg_names |= 1 var field_list = [], replacement_field = match[2], field_match = [] if ((field_match = re.key.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { if ((field_match = re.key_access.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] } else if ((field_match = re.index_access.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] } else { throw new SyntaxError("[sprintf] failed to parse named argument key") } } } else { throw new SyntaxError("[sprintf] failed to parse named argument key") } match[2] = field_list } else { arg_names |= 2 } if (arg_names === 3) { throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported") } parse_tree[parse_tree.length] = match } else { throw new SyntaxError("[sprintf] unexpected placeholder") } _fmt = _fmt.substring(match[0].length) } return parse_tree } var vsprintf = function(fmt, argv, _argv) { _argv = (argv || []).slice(0) _argv.splice(0, 0, fmt) return sprintf.apply(null, _argv) } /** * helpers */ function get_type(variable) { if (typeof variable === 'number') { return 'number' } else if (typeof variable === 'string') { return 'string' } else { return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase() } } var preformattedPadding = { '0': ['', '0', '00', '000', '0000', '00000', '000000', '0000000'], ' ': ['', ' ', ' ', ' ', ' ', ' ', ' ', ' '], '_': ['', '_', '__', '___', '____', '_____', '______', '_______'], } function str_repeat(input, multiplier) { if (multiplier >= 0 && multiplier <= 7 && preformattedPadding[input]) { return preformattedPadding[input][multiplier] } return Array(multiplier + 1).join(input) } /** * export to either browser or node.js */ if (true) { exports.sprintf = sprintf exports.vsprintf = vsprintf } if (typeof window !== 'undefined') { window.sprintf = sprintf window.vsprintf = vsprintf if (true) { !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { return { sprintf: sprintf, vsprintf: vsprintf } }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) } } })(typeof window === 'undefined' ? this : window); /***/ }), /* 26 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Ed25519Keypair__ = __webpack_require__(27); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Ed25519Keypair", function() { return __WEBPACK_IMPORTED_MODULE_0__Ed25519Keypair__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__transaction__ = __webpack_require__(42); /* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "Transaction", function() { return __WEBPACK_IMPORTED_MODULE_1__transaction__; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__connection__ = __webpack_require__(30); /* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "Connection", function() { return __WEBPACK_IMPORTED_MODULE_2__connection__; }); /***/ }), /* 27 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = Ed25519Keypair; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_bs58__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_bs58___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_bs58__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_tweetnacl__ = __webpack_require__(92); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_tweetnacl___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_tweetnacl__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_js_sha3__ = __webpack_require__(24); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_js_sha3___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_js_sha3__); /** * @public * @class Keypair Ed25519 keypair in base58 (as BigchainDB expects base58 keys) * @type {Object} * @param {number} [secret] A seed that will be used as a key derivation function * @property {string} publicKey * @property {string} privateKey */ function Ed25519Keypair(secret) { var keyPair = void 0; if (secret) { // Quick and dirty: use key derivation function instead var secretHash = __WEBPACK_IMPORTED_MODULE_2_js_sha3___default.a.sha3_256.create().update(secret).array(); keyPair = __WEBPACK_IMPORTED_MODULE_1_tweetnacl___default.a.sign.keyPair.fromSeed(new Uint8Array(secretHash)); } else { keyPair = __WEBPACK_IMPORTED_MODULE_1_tweetnacl___default.a.sign.keyPair(); } this.publicKey = __WEBPACK_IMPORTED_MODULE_0_bs58___default.a.encode(keyPair.publicKey); // tweetnacl's generated secret key is the secret key + public key (resulting in a 64-byte buffer) this.privateKey = __WEBPACK_IMPORTED_MODULE_0_bs58___default.a.encode(keyPair.secretKey.slice(0, 32)); } /***/ }), /* 28 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(process) {/* harmony export (immutable) */ __webpack_exports__["a"] = baseRequest; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_es6_promise__ = __webpack_require__(81); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_es6_promise___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_es6_promise__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_fetch_ponyfill__ = __webpack_require__(82); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_fetch_ponyfill___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_fetch_ponyfill__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_sprintf_js__ = __webpack_require__(25); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_sprintf_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_sprintf_js__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__format_text__ = __webpack_require__(37); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__stringify_as_query_param__ = __webpack_require__(40); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } var fetch = __WEBPACK_IMPORTED_MODULE_1_fetch_ponyfill___default()(__WEBPACK_IMPORTED_MODULE_0_es6_promise__["Promise"]); /** * imported from https://github.com/bigchaindb/js-utility-belt/ * * Global fetch wrapper that adds some basic error handling and ease of use enhancements. * Considers any non-2xx response as an error. * * For more information on fetch, see https://developer.mozilla.org/en-US/docs/Web/API/GlobalFetch/fetch. * * Expects fetch to already be available (either in a ES6 environment, bundled through webpack, or * injected through a polyfill). * * @param {string} url Url to request. Can be specified as a sprintf format string (see * https://github.com/alexei/sprintf.js) that will be resolved using * `config.urlTemplateSpec`. * @param {object} config Additional configuration, mostly passed to fetch as its 'init' config * (see https://developer.mozilla.org/en-US/docs/Web/API/GlobalFetch/fetch#Parameters). * @param {*} config.jsonBody Json payload to the request. Will automatically be * JSON.stringify()-ed and override `config.body`. * @param {string|object} config.query Query parameter to append to the end of the url. * If specified as an object, keys will be * decamelized into snake case first. * @param {*[]|object} config.urlTemplateSpec Format spec to use to expand the url (see sprintf). * @param {*} config.* All other options are passed through to fetch. * * @return {Promise} Promise that will resolve with the response if its status was 2xx; * otherwise rejects with the response */ function baseRequest(url) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var jsonBody = _ref.jsonBody, query = _ref.query, urlTemplateSpec = _ref.urlTemplateSpec, fetchConfig = _objectWithoutProperties(_ref, ['jsonBody', 'query', 'urlTemplateSpec']); var expandedUrl = url; if (urlTemplateSpec != null) { if (Array.isArray(urlTemplateSpec) && urlTemplateSpec.length) { // Use vsprintf for the array call signature expandedUrl = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2_sprintf_js__["vsprintf"])(url, urlTemplateSpec); } else if (urlTemplateSpec && (typeof urlTemplateSpec === 'undefined' ? 'undefined' : _typeof(urlTemplateSpec)) === 'object' && Object.keys(urlTemplateSpec).length) { expandedUrl = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__format_text__["a" /* default */])(url, urlTemplateSpec); } else if (process.env.NODE_ENV !== 'production') { // eslint-disable-next-line no-console console.warn('Supplied urlTemplateSpec was not an array or object. Ignoring...'); } } if (query != null) { if (typeof query === 'string') { expandedUrl += query; } else if (query && (typeof query === 'undefined' ? 'undefined' : _typeof(query)) === 'object') { expandedUrl += __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__stringify_as_query_param__["a" /* default */])(query); } else if (process.env.NODE_ENV !== 'production') { // eslint-disable-next-line no-console console.warn('Supplied query was not a string or object. Ignoring...'); } } if (jsonBody != null) { fetchConfig.body = JSON.stringify(jsonBody); } return fetch.fetch(expandedUrl, fetchConfig).then(function (res) { // If status is not a 2xx (based on Response.ok), assume it's an error // See https://developer.mozilla.org/en-US/docs/Web/API/GlobalFetch/fetch if (!(res && res.ok)) { throw res; } return res; }); } /* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(13))) /***/ }), /* 29 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = getBlock; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getApiUrls__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(1); /** * @public * @param blockId * @param API_PATH */ function getBlock(blockId, API_PATH) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__request__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getApiUrls__["a" /* default */])(API_PATH)['blocks_detail'], { urlTemplateSpec: { blockId: blockId } }); } /***/ }), /* 30 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getBlock__ = __webpack_require__(29); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "getBlock", function() { return __WEBPACK_IMPORTED_MODULE_0__getBlock__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__getTransaction__ = __webpack_require__(16); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "getTransaction", function() { return __WEBPACK_IMPORTED_MODULE_1__getTransaction__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__getStatus__ = __webpack_require__(15); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "getStatus", function() { return __WEBPACK_IMPORTED_MODULE_2__getStatus__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__listBlocks__ = __webpack_require__(31); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "listBlocks", function() { return __WEBPACK_IMPORTED_MODULE_3__listBlocks__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__listOutputs__ = __webpack_require__(32); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "listOutputs", function() { return __WEBPACK_IMPORTED_MODULE_4__listOutputs__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__listTransactions__ = __webpack_require__(33); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "listTransactions", function() { return __WEBPACK_IMPORTED_MODULE_5__listTransactions__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__listVotes__ = __webpack_require__(34); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "listVotes", function() { return __WEBPACK_IMPORTED_MODULE_6__listVotes__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__pollStatusAndFetchTransaction__ = __webpack_require__(35); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "pollStatusAndFetchTransaction", function() { return __WEBPACK_IMPORTED_MODULE_7__pollStatusAndFetchTransaction__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__postTransaction__ = __webpack_require__(36); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "postTransaction", function() { return __WEBPACK_IMPORTED_MODULE_8__postTransaction__["a"]; }); /***/ }), /* 31 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = listBlocks; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getApiUrls__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(1); /** * @public * @param tx_id * @param status * @param API_PATH */ function listBlocks(_ref, API_PATH) { var tx_id = _ref.tx_id, status = _ref.status; return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__request__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getApiUrls__["a" /* default */])(API_PATH)['blocks'], { query: { tx_id: tx_id, status: status } }); } /***/ }), /* 32 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = listOutputs; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getApiUrls__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(1); /** * @public * @param public_key * @param unspent * @param API_PATH * @param onlyJsonResponse */ function listOutputs(_ref, API_PATH) { var public_key = _ref.public_key, unspent = _ref.unspent; var onlyJsonResponse = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__request__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getApiUrls__["a" /* default */])(API_PATH)['outputs'], { query: { public_key: public_key, unspent: unspent } }, onlyJsonResponse); } /***/ }), /* 33 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = listTransactions; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getApiUrls__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(1); /** * @public * @param asset_id * @param operation * @param API_PATH */ function listTransactions(_ref, API_PATH) { var asset_id = _ref.asset_id, operation = _ref.operation; return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__request__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getApiUrls__["a" /* default */])(API_PATH)['transactions'], { query: { asset_id: asset_id, operation: operation } }); } /***/ }), /* 34 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = listVotes; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getApiUrls__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(1); /** * @public * @param block_id * @param API_PATH */ function listVotes(block_id, API_PATH) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__request__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getApiUrls__["a" /* default */])(API_PATH)['votes'], { query: { block_id: block_id } }); } /***/ }), /* 35 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getTransaction__ = __webpack_require__(16); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__getStatus__ = __webpack_require__(15); /** * @public * @param tx_id * @param API_PATH * @return {Promise} */ /* harmony default export */ __webpack_exports__["a"] = (function (tx_id, API_PATH) { return new Promise(function (resolve, reject) { var timer = setInterval(function () { __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__getStatus__["a" /* default */])(tx_id, API_PATH).then(function (res) { console.log('Fetched transaction status:', res); if (res.status === 'valid') { clearInterval(timer); __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getTransaction__["a" /* default */])(tx_id, API_PATH).then(function (res) { console.log('Fetched transaction:', res); resolve(res); }); } }).catch(function (err) { clearInterval(timer); reject(err); }); }, 500); }); }); /***/ }), /* 36 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = postTransaction; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__getApiUrls__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(1); /** * @public * * @param transaction * @param API_PATH */ function postTransaction(transaction, API_PATH) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__request__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__getApiUrls__["a" /* default */])(API_PATH)['transactions'], { method: 'POST', jsonBody: transaction }); } /***/ }), /* 37 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = formatText; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_sprintf_js__ = __webpack_require__(25); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_sprintf_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_sprintf_js__); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; // Regexes taken from or inspired by sprintf-js var Regex = { TEMPLATE_LITERAL: /\${([^\)]+?)}/g, KEY: /^([a-z_][a-z_\d]*)/i, KEY_ACCESS: /^\.([a-z_][a-z_\d]*)/i, INDEX_ACCESS: /^\[(\d+)\]/ }; /** * imported from https://github.com/bigchaindb/js-utility-belt/ * * Formats strings similarly to C's sprintf, with the addition of '${...}' formats. * * Makes a first pass replacing '${...}' formats before passing the expanded string and other * arguments to sprintf-js. For more information on what sprintf can do, see * https://github.com/alexei/sprintf.js. * * Examples: * formatText('Hi there ${dimi}!', { dimi: 'Dimi' }) * => 'Hi there Dimi!' * * formatText('${database} is %(status)s', { database: 'BigchainDB', status: 'big' }) * => 'BigchainDB is big' * * Like sprintf-js, string interpolation for keywords and indexes is supported too: * formatText('Berlin is best known for its ${berlin.topKnownFor[0].name}', { * berlin: { * topKnownFor: [{ * name: 'Currywurst' * }, ... * ] * } * }) * => 'Berlin is best known for its Currywurst' */ function formatText(s) { var expandedFormatStr = s; // Try to replace formats of the form '${...}' if named replacement fields are used for (var _len = arguments.length, argv = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { argv[_key - 1] = arguments[_key]; } if (s && argv.length === 1 && _typeof(argv[0]) === 'object') { var templateSpecObj = argv[0]; expandedFormatStr = s.replace(Regex.TEMPLATE_LITERAL, function (match, replacement) { var interpolationLeft = replacement; /** * Interpolation algorithm inspired by sprintf-js. * * Goes through the replacement string getting the left-most key or index to interpolate * on each pass. `value` at each step holds the last interpolation result, `curMatch` is * the current property match, and `interpolationLeft` is the portion of the replacement * string still to be interpolated. * * It's useful to note that RegExp.exec() returns with an array holding: * [0]: Full string matched * [1+]: Matching groups * * And that in the regexes defined, the first matching group always corresponds to the * property matched. */ var value = void 0; var curMatch = Regex.KEY.exec(interpolationLeft); if (curMatch !== null) { value = templateSpecObj[curMatch[1]]; // Assigning in the conditionals here makes the code less bloated /* eslint-disable no-cond-assign */ while ((interpolationLeft = interpolationLeft.substring(curMatch[0].length)) && value != null) { if (curMatch = Regex.KEY_ACCESS.exec(interpolationLeft)) { value = value[curMatch[1]]; } else if (curMatch = Regex.INDEX_ACCESS.exec(interpolationLeft)) { value = value[curMatch[1]]; } else { break; } } /* eslint-enable no-cond-assign */ } // If there's anything left to interpolate by the end then we've failed to interpolate // the entire replacement string. if (interpolationLeft.length) { throw new SyntaxError('[formatText] failed to parse named argument key: ' + replacement); } return value; }); } return __WEBPACK_IMPORTED_MODULE_0_sprintf_js__["sprintf"].apply(undefined, [expandedFormatStr].concat(argv)); } /***/ }), /* 38 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = sanitize; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_array_includes__ = __webpack_require__(53); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_array_includes___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_array_includes__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_core_js_library_fn_object_entries__ = __webpack_require__(19); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_core_js_library_fn_object_entries___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_core_js_library_fn_object_entries__); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /** * Abstraction for selectFromObject and omitFromObject for DRYness. * Set isInclusion to true if the filter should be for including the filtered items (ie. selecting * only them vs omitting only them). */ function filterFromObject(obj, filter) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref$isInclusion = _ref.isInclusion, isInclusion = _ref$isInclusion === undefined ? true : _ref$isInclusion; if (filter && Array.isArray(filter)) { return applyFilterOnObject(obj, isInclusion ? function (_, key) { return __WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_array_includes___default()(filter, key); } : function (_, key) { return !__WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_array_includes___default()(filter, key); }); } else if (filter && typeof filter === 'function') { // Flip the filter fn's return if it's for inclusion return applyFilterOnObject(obj, isInclusion ? filter : function () { return !filter.apply(undefined, arguments); }); } else { throw new Error('The given filter is not an array or function. Exclude aborted'); } } /** * Returns a filtered copy of the given object's own enumerable properties (no inherited * properties), keeping any keys that pass the given filter function. */ function applyFilterOnObject(obj, filterFn) { if (filterFn == null) { return _extends({}, obj); } var filteredObj = {}; __WEBPACK_IMPORTED_MODULE_1_core_js_library_fn_object_entries___default()(obj).forEach(function (_ref2) { var _ref3 = _slicedToArray(_ref2, 2), key = _ref3[0], val = _ref3[1]; if (filterFn(val, key)) { filteredObj[key] = val; } }); return filteredObj; } /** * Similar to lodash's _.pick(), this returns a copy of the given object's * own and inherited enumerable properties, selecting only the keys in * the given array or whose value pass the given filter function. * @param {object} obj Source object * @param {array|function} filter Array of key names to select or function to invoke per iteration * @return {object} The new object */ function selectFromObject(obj, filter) { return filterFromObject(obj, filter); } /** * Glorified selectFromObject. Takes an object and returns a filtered shallow copy that strips out * any properties that are falsy (including coercions, ie. undefined, null, '', 0, ...). * Does not modify the passed in object. * * @param {object} obj Javascript object * @return {object} Sanitized Javascript object */ function sanitize(obj) { return selectFromObject(obj, function (val) { return !!val; }); } /***/ }), /* 39 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = sha256Hash; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_js_sha3__ = __webpack_require__(24); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_js_sha3___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_js_sha3__); function sha256Hash(data) { return __WEBPACK_IMPORTED_MODULE_0_js_sha3___default.a.sha3_256.create().update(data).hex(); } /***/ }), /* 40 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = stringifyAsQueryParam; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_object_entries__ = __webpack_require__(19); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_object_entries___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_object_entries__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_decamelize__ = __webpack_require__(80); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_decamelize___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_decamelize__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_query_string__ = __webpack_require__(90); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_query_string___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_query_string__); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /** * imported from https://github.com/bigchaindb/js-utility-belt/ * * Takes a key-value dictionary (ie. object) and converts it to a query-parameter string that you * can directly append into a URL. * * Extends queryString.stringify by allowing you to specify a `transform` function that will be * invoked on each of the dictionary's keys before being stringified into the query-parameter * string. * * By default `transform` is `decamelize`, so a dictionary of the form: * * { * page: 1, * pageSize: 10 * } * * will be converted to a string like: * * ?page=1&page_size=10 * * @param {object} obj Query params dictionary * @param {function} [transform=decamelize] Transform function for each of the param keys * @return {string} Query param string */ function stringifyAsQueryParam(obj) { var transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : __WEBPACK_IMPORTED_MODULE_1_decamelize___default.a; if (!obj || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || !Object.keys(obj).length) { return ''; } var transformedKeysObj = __WEBPACK_IMPORTED_MODULE_0_core_js_library_fn_object_entries___default()(obj).reduce(function (paramsObj, _ref) { var _ref2 = _slicedToArray(_ref, 2), key = _ref2[0], value = _ref2[1]; paramsObj[transform(key)] = value; return paramsObj; }, {}); return '?' + __WEBPACK_IMPORTED_MODULE_2_query_string___default.a.stringify(transformedKeysObj); } /***/ }), /* 41 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = hashTransaction; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__serializeTransactionIntoCanonicalString__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__sha256Hash__ = __webpack_require__(39); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; function hashTransaction(transaction) { // Safely remove any tx id from the given transaction for hashing var tx = _extends({}, transaction); delete tx.id; return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__sha256Hash__["a" /* default */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__serializeTransactionIntoCanonicalString__["a" /* default */])(tx)); } /***/ }), /* 42 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__makeEd25519Condition__ = __webpack_require__(44); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "makeEd25519Condition", function() { return __WEBPACK_IMPORTED_MODULE_0__makeEd25519Condition__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__makeSha256Condition__ = __webpack_require__(46); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "makeSha256Condition", function() { return __WEBPACK_IMPORTED_MODULE_1__makeSha256Condition__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__makeThresholdCondition__ = __webpack_require__(47); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "makeThresholdCondition", function() { return __WEBPACK_IMPORTED_MODULE_2__makeThresholdCondition__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__makeCreateTransaction__ = __webpack_require__(43); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "makeCreateTransaction", function() { return __WEBPACK_IMPORTED_MODULE_3__makeCreateTransaction__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__makeOutput__ = __webpack_require__(45); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "makeOutput", function() { return __WEBPACK_IMPORTED_MODULE_4__makeOutput__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__makeTransaction__ = __webpack_require__(6); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "makeTransaction", function() { return __WEBPACK_IMPORTED_MODULE_5__makeTransaction__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__makeTransferTransaction__ = __webpack_require__(48); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "makeTransferTransaction", function() { return __WEBPACK_IMPORTED_MODULE_6__makeTransferTransaction__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__serializeTransactionIntoCanonicalString__ = __webpack_require__(7); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "serializeTransactionIntoCanonicalString", function() { return __WEBPACK_IMPORTED_MODULE_7__serializeTransactionIntoCanonicalString__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__signTransaction__ = __webpack_require__(49); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "signTransaction", function() { return __WEBPACK_IMPORTED_MODULE_8__signTransaction__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__utils_ccJsonLoad__ = __webpack_require__(50); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ccJsonLoad", function() { return __WEBPACK_IMPORTED_MODULE_9__utils_ccJsonLoad__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__utils_ccJsonify__ = __webpack_require__(5); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ccJsonify", function() { return __WEBPACK_IMPORTED_MODULE_10__utils_ccJsonify__["a"]; }); /***/ }), /* 43 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = makeCreateTransaction; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__makeInputTemplate__ = __webpack_require__(17); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__makeTransaction__ = __webpack_require__(6); /** * @public * Generate a `CREATE` transaction holding the `asset`, `metadata`, and `outputs`, to be signed by * the `issuers`. * @param {object} asset Created asset's data * @param {object} metadata Metadata for the Transaction * @param {object[]} outputs Array of Output objects to add to the Transaction. * Think of these as the recipients of the asset after the transaction. * For `CREATE` Transactions, this should usually just be a list of * Outputs wrapping Ed25519 Conditions generated from the issuers' public * keys (so that the issuers are the recipients of the created asset). * @param {...string[]} issuers Public key of one or more issuers to the asset being created by this * Transaction. * Note: Each of the private keys corresponding to the given public * keys MUST be used later (and in the same order) when signing the * Transaction (`signTransaction()`). * @returns {object} Unsigned transaction -- make sure to call signTransaction() on it before * sending it off! */ function makeCreateTransaction(asset, metadata, outputs) { var assetDefinition = { 'data': asset || null }; for (var _len = arguments.length, issuers = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { issuers[_key - 3] = arguments[_key]; } var inputs = issuers.map(function (issuer) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__makeInputTemplate__["a" /* default */])([issuer]); }); return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__makeTransaction__["a" /* default */])('CREATE', assetDefinition, metadata, outputs, inputs); } /***/ }), /* 44 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = makeEd25519Condition; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_buffer__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_buffer___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_buffer__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_bs58__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_bs58___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_bs58__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_five_bells_condition__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_five_bells_condition___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_five_bells_condition__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_ccJsonify__ = __webpack_require__(5); /** * @public * Create an Ed25519 Cryptocondition from an Ed25519 public key to put into an Output of a Transaction * @param {string} publicKey base58 encoded Ed25519 public key for the recipient of the Transaction * @param {boolean} [json=true] If true returns a json object otherwise a crypto-condition type * @returns {object} Ed25519 Condition (that will need to wrapped in an Output) */ function makeEd25519Condition(publicKey) { var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var publicKeyBuffer = new __WEBPACK_IMPORTED_MODULE_0_buffer__["Buffer"](__WEBPACK_IMPORTED_MODULE_1_bs58___default.a.decode(publicKey)); var ed25519Fulfillment = new __WEBPACK_IMPORTED_MODULE_2_five_bells_condition___default.a.Ed25519(); ed25519Fulfillment.setPublicKey(publicKeyBuffer); if (json) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__utils_ccJsonify__["a" /* default */])(ed25519Fulfillment); } return ed25519Fulfillment; } /***/ }), /* 45 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = makeOutput; /** * @public * Create an Output from a Condition. * Note: Assumes the given Condition was generated from a single public key (e.g. a Ed25519 Condition) * @param {object} condition Condition (e.g. a Ed25519 Condition from `makeEd25519Condition()`) * @param {number} amount Amount of the output * @returns {object} An Output usable in a Transaction */ function makeOutput(condition) { var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; return { amount: amount, condition: condition, 'public_keys': condition.details.hasOwnProperty('public_key') ? [condition.details.public_key] : [] }; } /***/ }), /* 46 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = makeSha256Condition; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_buffer__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_buffer___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_buffer__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_five_bells_condition__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_five_bells_condition___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_five_bells_condition__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_ccJsonify__ = __webpack_require__(5); /** * @public * Create a Preimage-Sha256 Cryptocondition from a secret to put into an Output of a Transaction * @param {string} preimage Preimage to be hashed and wrapped in a crypto-condition * @param {boolean} [json=true] If true returns a json object otherwise a crypto-condition type * @returns {object} Preimage-Sha256 Condition (that will need to wrapped in an Output) */ function makeSha256Condition(preimage) { var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var sha256Fulfillment = new __WEBPACK_IMPORTED_MODULE_1_five_bells_condition___default.a.PreimageSha256(); sha256Fulfillment.preimage = new __WEBPACK_IMPORTED_MODULE_0_buffer__["Buffer"](preimage); if (json) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__utils_ccJsonify__["a" /* default */])(sha256Fulfillment); } return sha256Fulfillment; } /***/ }), /* 47 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = makeThresholdCondition; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_five_bells_condition__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_five_bells_condition___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_five_bells_condition__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__utils_ccJsonify__ = __webpack_require__(5); /** * @public * Create an Sha256 Threshold Cryptocondition from threshold to put into an Output of a Transaction * @param {number} threshold * @param {Array} [subconditions=[]] * @param {boolean} [json=true] If true returns a json object otherwise a crypto-condition type * @returns {object} Sha256 Threshold Condition (that will need to wrapped in an Output) */ function makeThresholdCondition(threshold) { var subconditions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var json = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var thresholdCondition = new __WEBPACK_IMPORTED_MODULE_0_five_bells_condition___default.a.ThresholdSha256(); thresholdCondition.threshold = threshold; subconditions.forEach(function (subcondition) { // TODO: add support for Condition and URIs thresholdCondition.addSubfulfillment(subcondition); }); if (json) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__utils_ccJsonify__["a" /* default */])(thresholdCondition); } return thresholdCondition; } /***/ }), /* 48 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = makeTransferTransaction; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__makeInputTemplate__ = __webpack_require__(17); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__makeTransaction__ = __webpack_require__(6); /** * @public * Generate a `TRANSFER` transaction holding the `asset`, `metadata`, and `outputs`, that fulfills * the `fulfilledOutputs` of `unspentTransaction`. * @param {object} unspentTransaction Previous Transaction you have control over (i.e. can fulfill * its Output Condition) * @param {object} metadata Metadata for the Transaction * @param {object[]} outputs Array of Output objects to add to the Transaction. * Think of these as the recipients of the asset after the transaction. * For `TRANSFER` Transactions, this should usually just be a list of * Outputs wrapping Ed25519 Conditions generated from the public keys of * the recipients. * @param {...number} fulfilledOutputs Indices of the Outputs in `unspentTransaction` that this * Transaction fulfills. * Note that the public keys listed in the fulfilled Outputs * must be used (and in the same order) to sign the Transaction * (`signTransaction()`). * @returns {object} Unsigned transaction -- make sure to call signTransaction() on it before * sending it off! */ function makeTransferTransaction(unspentTransaction, metadata, outputs) { for (var _len = arguments.length, fulfilledOutputs = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { fulfilledOutputs[_key - 3] = arguments[_key]; } var inputs = fulfilledOutputs.map(function (outputIndex) { var fulfilledOutput = unspentTransaction.outputs[outputIndex]; var transactionLink = { 'output': outputIndex, 'txid': unspentTransaction.id }; return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__makeInputTemplate__["a" /* default */])(fulfilledOutput.public_keys, transactionLink); }); var assetLink = { 'id': unspentTransaction.operation === 'CREATE' ? unspentTransaction.id : unspentTransaction.asset.id }; return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__makeTransaction__["a" /* default */])('TRANSFER', assetLink, metadata, outputs, inputs); } /***/ }), /* 49 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = signTransaction; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_buffer__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_buffer___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_buffer__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_bs58__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_bs58___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_bs58__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_five_bells_condition__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_five_bells_condition___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_five_bells_condition__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_clone__ = __webpack_require__(18); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_clone___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_clone__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__serializeTransactionIntoCanonicalString__ = __webpack_require__(7); /** * @public * Sign the given `transaction` with the given `privateKey`s, returning a new copy of `transaction` * that's been signed. * Note: Only generates Ed25519 Fulfillments. Thresholds and other types of Fulfillments are left as * an exercise for the user. * @param {object} transaction Transaction to sign. `transaction` is not modified. * @param {...string} privateKeys Private keys associated with the issuers of the `transaction`. * Looped through to iteratively sign any Input Fulfillments found in * the `transaction`. * @returns {object} The signed version of `transaction`. */ function signTransaction(transaction) { for (var _len = arguments.length, privateKeys = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { privateKeys[_key - 1] = arguments[_key]; } var signedTx = __WEBPACK_IMPORTED_MODULE_3_clone___default()(transaction); signedTx.inputs.forEach(function (input, index) { var privateKey = privateKeys[index]; var privateKeyBuffer = new __WEBPACK_IMPORTED_MODULE_0_buffer__["Buffer"](__WEBPACK_IMPORTED_MODULE_1_bs58___default.a.decode(privateKey)); var serializedTransaction = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__serializeTransactionIntoCanonicalString__["a" /* default */])(transaction); var ed25519Fulfillment = new __WEBPACK_IMPORTED_MODULE_2_five_bells_condition___default.a.Ed25519(); ed25519Fulfillment.sign(new __WEBPACK_IMPORTED_MODULE_0_buffer__["Buffer"](serializedTransaction), privateKeyBuffer); var fulfillmentUri = ed25519Fulfillment.serializeUri(); input.fulfillment = fulfillmentUri; }); return signedTx; } /***/ }), /* 50 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (immutable) */ __webpack_exports__["a"] = ccJsonLoad; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_bs58__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_bs58___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_bs58__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_five_bells_condition__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_five_bells_condition___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_five_bells_condition__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_buffer__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_buffer___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_buffer__); /** * @public * Loads a crypto-condition class (Fulfillment or Condition) from a BigchainDB JSON object * @param {object} conditionJson * @returns {cc.Condition} Ed25519 Condition (that will need to wrapped in an Output) */ function ccJsonLoad(conditionJson) { if ('hash' in conditionJson) { var condition = new __WEBPACK_IMPORTED_MODULE_1_five_bells_condition___default.a.Condition(); condition.type = conditionJson.type_id; condition.bitmask = conditionJson.bitmask; condition.hash = new __WEBPACK_IMPORTED_MODULE_2_buffer__["Buffer"](__WEBPACK_IMPORTED_MODULE_0_bs58___default.a.decode(conditionJson.hash)); condition.maxFulfillmentLength = parseInt(conditionJson.max_fulfillment_length, 10); return condition; } else { var fulfillment = void 0; if (conditionJson.type_id === 2) { fulfillment = new __WEBPACK_IMPORTED_MODULE_1_five_bells_condition___default.a.ThresholdSha256(); fulfillment.threshold = conditionJson.threshold; conditionJson.subfulfillments.forEach(function (subfulfillment) { subfulfillment = ccJsonLoad(subfulfillment); if ('getConditionUri' in subfulfillment) fulfillment.addSubfulfillment(subfulfillment);else if ('serializeUri' in subfulfillment) fulfillment.addSubcondition(subfulfillment); }); } if (conditionJson.type_id === 0) { fulfillment = new __WEBPACK_IMPORTED_MODULE_1_five_bells_condition___default.a.PreimageSha256(); fulfillment.preimage = new __WEBPACK_IMPORTED_MODULE_2_buffer__["Buffer"](conditionJson.preimage); } if (conditionJson.type_id === 4) { fulfillment = new __WEBPACK_IMPORTED_MODULE_1_five_bells_condition___default.a.Ed25519(); fulfillment.publicKey = new __WEBPACK_IMPORTED_MODULE_2_buffer__["Buffer"](__WEBPACK_IMPORTED_MODULE_0_bs58___default.a.decode(conditionJson.public_key)); if (conditionJson.signature) fulfillment.signature = new __WEBPACK_IMPORTED_MODULE_2_buffer__["Buffer"](__WEBPACK_IMPORTED_MODULE_0_bs58___default.a.decode(conditionJson.signature)); } return fulfillment; } } /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {// base-x encoding // Forked from https://github.com/cryptocoinjs/bs58 // Originally written by Mike Hearn for BitcoinJ // Copyright (c) 2011 Google Inc // Ported to JavaScript by Stefan Thomas // Merged Buffer refactorings from base58-native by Stephen Pair // Copyright (c) 2013 BitPay Inc module.exports = function base (ALPHABET) { var ALPHABET_MAP = {} var BASE = ALPHABET.length var LEADER = ALPHABET.charAt(0) // pre-compute lookup table for (var z = 0; z < ALPHABET.length; z++) { var x = ALPHABET.charAt(z) if (ALPHABET_MAP[x] !== undefined) throw new TypeError(x + ' is ambiguous') ALPHABET_MAP[x] = z } function encode (source) { if (source.length === 0) return '' var digits = [0] for (var i = 0; i < source.length; ++i) { for (var j = 0, carry = source[i]; j < digits.length; ++j) { carry += digits[j] << 8 digits[j] = carry % BASE carry = (carry / BASE) | 0 } while (carry > 0) { digits.push(carry % BASE) carry = (carry / BASE) | 0 } } var string = '' // deal with leading zeros for (var k = 0; source[k] === 0 && k < source.length - 1; ++k) string += ALPHABET[0] // convert digits to a string for (var q = digits.length - 1; q >= 0; --q) string += ALPHABET[digits[q]] return string } function decodeUnsafe (string) { if (string.length === 0) return new Buffer(0) var bytes = [0] for (var i = 0; i < string.length; i++) { var value = ALPHABET_MAP[string[i]] if (value === undefined) return for (var j = 0, carry = value; j < bytes.length; ++j) { carry += bytes[j] * BASE bytes[j] = carry & 0xff carry >>= 8 } while (carry > 0) { bytes.push(carry & 0xff) carry >>= 8 } } // deal with leading zeros for (var k = 0; string[k] === LEADER && k < string.length - 1; ++k) { bytes.push(0) } return new Buffer(bytes.reverse()) } function decode (string) { var buffer = decodeUnsafe(string) if (buffer) return buffer throw new Error('Non-base' + BASE + ' character') } return { encode: encode, decodeUnsafe: decodeUnsafe, decode: decode } } /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer)) /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { "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('') } /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(78); module.exports = __webpack_require__(8).Array.includes; /***/ }), /* 54 */ /***/ (function(module, exports) { module.exports = function(it){ if(typeof it != 'function')throw TypeError(it + ' is not a function!'); return it; }; /***/ }), /* 55 */ /***/ (function(module, exports) { module.exports = function(){ /* empty */ }; /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(11); module.exports = function(it){ if(!isObject(it))throw TypeError(it + ' is not an object!'); return it; }; /***/ }), /* 57 */ /***/ (function(module, exports) { var toString = {}.toString; module.exports = function(it){ return toString.call(it).slice(8, -1); }; /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { // optional / simple context binding var aFunction = __webpack_require__(54); 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); }; }; /***/ }), /* 59 */ /***/ (function(module, exports) { // 7.2.1 RequireObjectCoercible(argument) module.exports = function(it){ if(it == undefined)throw TypeError("Can't call method on " + it); return it; }; /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(11) , document = __webpack_require__(10).document // in old IE typeof document.createElement is 'object' , is = isObject(document) && isObject(document.createElement); module.exports = function(it){ return is ? document.createElement(it) : {}; }; /***/ }), /* 61 */ /***/ (function(module, exports) { // IE 8- don't enum bug keys module.exports = ( 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' ).split(','); /***/ }), /* 62 */ /***/ (function(module, exports) { var hasOwnProperty = {}.hasOwnProperty; module.exports = function(it, key){ return hasOwnProperty.call(it, key); }; /***/ }), /* 63 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(66) , createDesc = __webpack_require__(71); module.exports = __webpack_require__(9) ? function(object, key, value){ return dP.f(object, key, createDesc(1, value)); } : function(object, key, value){ object[key] = value; return object; }; /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { module.exports = !__webpack_require__(9) && !__webpack_require__(22)(function(){ return Object.defineProperty(__webpack_require__(60)('div'), 'a', {get: function(){ return 7; }}).a != 7; }); /***/ }), /* 65 */ /***/ (function(module, exports, __webpack_require__) { // fallback for non-array-like ES3 and non-enumerable old V8 strings var cof = __webpack_require__(57); module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ return cof(it) == 'String' ? it.split('') : Object(it); }; /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { var anObject = __webpack_require__(56) , IE8_DOM_DEFINE = __webpack_require__(64) , toPrimitive = __webpack_require__(76) , dP = Object.defineProperty; exports.f = __webpack_require__(9) ? 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; }; /***/ }), /* 67 */ /***/ (function(module, exports, __webpack_require__) { var has = __webpack_require__(62) , toIObject = __webpack_require__(12) , arrayIndexOf = __webpack_require__(20)(false) , IE_PROTO = __webpack_require__(72)('IE_PROTO'); 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; }; /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 / 15.2.3.14 Object.keys(O) var $keys = __webpack_require__(67) , enumBugKeys = __webpack_require__(61); module.exports = Object.keys || function keys(O){ return $keys(O, enumBugKeys); }; /***/ }), /* 69 */ /***/ (function(module, exports) { exports.f = {}.propertyIsEnumerable; /***/ }), /* 70 */ /***/ (function(module, exports, __webpack_require__) { var getKeys = __webpack_require__(68) , toIObject = __webpack_require__(12) , isEnum = __webpack_require__(69).f; module.exports = function(isEntries){ return function(it){ var O = toIObject(it) , keys = getKeys(O) , length = keys.length , i = 0 , result = [] , key; while(length > i)if(isEnum.call(O, key = keys[i++])){ result.push(isEntries ? [key, O[key]] : O[key]); } return result; }; }; /***/ }), /* 71 */ /***/ (function(module, exports) { module.exports = function(bitmap, value){ return { enumerable : !(bitmap & 1), configurable: !(bitmap & 2), writable : !(bitmap & 4), value : value }; }; /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { var shared = __webpack_require__(73)('keys') , uid = __webpack_require__(77); module.exports = function(key){ return shared[key] || (shared[key] = uid(key)); }; /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(10) , SHARED = '__core-js_shared__' , store = global[SHARED] || (global[SHARED] = {}); module.exports = function(key){ return store[key] || (store[key] = {}); }; /***/ }), /* 74 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(23) , max = Math.max , min = Math.min; module.exports = function(index, length){ index = toInteger(index); return index < 0 ? max(index + length, 0) : min(index, length); }; /***/ }), /* 75 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.15 ToLength var toInteger = __webpack_require__(23) , min = Math.min; module.exports = function(it){ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 }; /***/ }), /* 76 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.1 ToPrimitive(input [, PreferredType]) var isObject = __webpack_require__(11); // 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"); }; /***/ }), /* 77 */ /***/ (function(module, exports) { var id = 0 , px = Math.random(); module.exports = function(key){ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); }; /***/ }), /* 78 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/Array.prototype.includes var $export = __webpack_require__(21) , $includes = __webpack_require__(20)(true); $export($export.P, 'Array', { includes: function includes(el /*, fromIndex = 0 */){ return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); } }); __webpack_require__(55)('includes'); /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-object-values-entries var $export = __webpack_require__(21) , $entries = __webpack_require__(70)(true); $export($export.S, 'Object', { entries: function entries(it){ return $entries(it); } }); /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (str, sep) { if (typeof str !== 'string') { throw new TypeError('Expected a string'); } sep = typeof sep === 'undefined' ? '_' : sep; return str .replace(/([a-z\d])([A-Z])/g, '$1' + sep + '$2') .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + sep + '$2') .toLowerCase(); }; /***/ }), /* 81 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(process, global) {var require;/*! * @overview es6-promise - a tiny implementation of Promises/A+. * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) * @license Licensed under MIT license * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE * @version 4.1.0 */ (function (global, factory) { true ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.ES6Promise = factory()); }(this, (function () { 'use strict'; function objectOrFunction(x) { return typeof x === 'function' || typeof x === 'object' && x !== null; } function isFunction(x) { return typeof x === 'function'; } var _isArray = undefined; if (!Array.isArray) { _isArray = function (x) { return Object.prototype.toString.call(x) === '[object Array]'; }; } else { _isArray = Array.isArray; } var isArray = _isArray; var len = 0; var vertxNext = undefined; var customSchedulerFn = undefined; var asap = function asap(callback, arg) { queue[len] = callback; queue[len + 1] = arg; len += 2; if (len === 2) { // If len is 2, that means that we need to schedule an async flush. // If additional callbacks are queued before the queue is flushed, they // will be processed by this flush that we are scheduling. if (customSchedulerFn) { customSchedulerFn(flush); } else { scheduleFlush(); } } }; function setScheduler(scheduleFn) { customSchedulerFn = scheduleFn; } function setAsap(asapFn) { asap = asapFn; } var browserWindow = typeof window !== 'undefined' ? window : undefined; var browserGlobal = browserWindow || {}; var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]'; // test for web worker but not in IE10 var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; // node function useNextTick() { // node version 0.10.x displays a deprecation warning when nextTick is used recursively // see https://github.com/cujojs/when/issues/410 for details return function () { return process.nextTick(flush); }; } // vertx function useVertxTimer() { if (typeof vertxNext !== 'undefined') { return function () { vertxNext(flush); }; } return useSetTimeout(); } function useMutationObserver() { var iterations = 0; var observer = new BrowserMutationObserver(flush); var node = document.createTextNode(''); observer.observe(node, { characterData: true }); return function () { node.data = iterations = ++iterations % 2; }; } // web worker function useMessageChannel() { var channel = new MessageChannel(); channel.port1.onmessage = flush; return function () { return channel.port2.postMessage(0); }; } function useSetTimeout() { // Store setTimeout reference so es6-promise will be unaffected by // other code modifying setTimeout (like sinon.useFakeTimers()) var globalSetTimeout = setTimeout; return function () { return globalSetTimeout(flush, 1); }; } var queue = new Array(1000); function flush() { for (var i = 0; i < len; i += 2) { var callback = queue[i]; var arg = queue[i + 1]; callback(arg); queue[i] = undefined; queue[i + 1] = undefined; } len = 0; } function attemptVertx() { try { var r = require; var vertx = __webpack_require__(93); vertxNext = vertx.runOnLoop || vertx.runOnContext; return useVertxTimer(); } catch (e) { return useSetTimeout(); } } var scheduleFlush = undefined; // Decide what async method to use to triggering processing of queued callbacks: if (isNode) { scheduleFlush = useNextTick(); } else if (BrowserMutationObserver) { scheduleFlush = useMutationObserver(); } else if (isWorker) { scheduleFlush = useMessageChannel(); } else if (browserWindow === undefined && "function" === 'function') { scheduleFlush = attemptVertx(); } else { scheduleFlush = useSetTimeout(); } function then(onFulfillment, onRejection) { var _arguments = arguments; var parent = this; var child = new this.constructor(noop); if (child[PROMISE_ID] === undefined) { makePromise(child); } var _state = parent._state; if (_state) { (function () { var callback = _arguments[_state - 1]; asap(function () { return invokeCallback(_state, child, callback, parent._result); }); })(); } else { subscribe(parent, child, onFulfillment, onRejection); } return child; } /** `Promise.resolve` returns a promise that will become resolved with the passed `value`. It is shorthand for the following: ```javascript let promise = new Promise(function(resolve, reject){ resolve(1); }); promise.then(function(value){ // value === 1 }); ``` Instead of writing the above, your code now simply becomes the following: ```javascript let promise = Promise.resolve(1); promise.then(function(value){ // value === 1 }); ``` @method resolve @static @param {Any} value value that the returned promise will be resolved with Useful for tooling. @return {Promise} a promise that will become fulfilled with the given `value` */ function resolve(object) { /*jshint validthis:true */ var Constructor = this; if (object && typeof object === 'object' && object.constructor === Constructor) { return object; } var promise = new Constructor(noop); _resolve(promise, object); return promise; } var PROMISE_ID = Math.random().toString(36).substring(16); function noop() {} var PENDING = void 0; var FULFILLED = 1; var REJECTED = 2; var GET_THEN_ERROR = new ErrorObject(); function selfFulfillment() { return new TypeError("You cannot resolve a promise with itself"); } function cannotReturnOwn() { return new TypeError('A promises callback cannot return that same promise.'); } function getThen(promise) { try { return promise.then; } catch (error) { GET_THEN_ERROR.error = error; return GET_THEN_ERROR; } } function tryThen(then, value, fulfillmentHandler, rejectionHandler) { try { then.call(value, fulfillmentHandler, rejectionHandler); } catch (e) { return e; } } function handleForeignThenable(promise, thenable, then) { asap(function (promise) { var sealed = false; var error = tryThen(then, thenable, function (value) { if (sealed) { return; } sealed = true; if (thenable !== value) { _resolve(promise, value); } else { fulfill(promise, value); } }, function (reason) { if (sealed) { return; } sealed = true; _reject(promise, reason); }, 'Settle: ' + (promise._label || ' unknown promise')); if (!sealed && error) { sealed = true; _reject(promise, error); } }, promise); } function handleOwnThenable(promise, thenable) { if (thenable._state === FULFILLED) { fulfill(promise, thenable._result); } else if (thenable._state === REJECTED) { _reject(promise, thenable._result); } else { subscribe(thenable, undefined, function (value) { return _resolve(promise, value); }, function (reason) { return _reject(promise, reason); }); } } function handleMaybeThenable(promise, maybeThenable, then$$) { if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) { handleOwnThenable(promise, maybeThenable); } else { if (then$$ === GET_THEN_ERROR) { _reject(promise, GET_THEN_ERROR.error); GET_THEN_ERROR.error = null; } else if (then$$ === undefined) { fulfill(promise, maybeThenable); } else if (isFunction(then$$)) { handleForeignThenable(promise, maybeThenable, then$$); } else { fulfill(promise, maybeThenable); } } } function _resolve(promise, value) { if (promise === value) { _reject(promise, selfFulfillment()); } else if (objectOrFunction(value)) { handleMaybeThenable(promise, value, getThen(value)); } else { fulfill(promise, value); } } function publishRejection(promise) { if (promise._onerror) { promise._onerror(promise._result); } publish(promise); } function fulfill(promise, value) { if (promise._state !== PENDING) { return; } promise._result = value; promise._state = FULFILLED; if (promise._subscribers.length !== 0) { asap(publish, promise); } } function _reject(promise, reason) { if (promise._state !== PENDING) { return; } promise._state = REJECTED; promise._result = reason; asap(publishRejection, promise); } function subscribe(parent, child, onFulfillment, onRejection) { var _subscribers = parent._subscribers; var length = _subscribers.length; parent._onerror = null; _subscribers[length] = child; _subscribers[length + FULFILLED] = onFulfillment; _subscribers[length + REJECTED] = onRejection; if (length === 0 && parent._state) { asap(publish, parent); } } function publish(promise) { var subscribers = promise._subscribers; var settled = promise._state; if (subscribers.length === 0) { return; } var child = undefined, callback = undefined, detail = promise._result; for (var i = 0; i < subscribers.length; i += 3) { child = subscribers[i]; callback = subscribers[i + settled]; if (child) { invokeCallback(settled, child, callback, detail); } else { callback(detail); } } promise._subscribers.length = 0; } function ErrorObject() { this.error = null; } var TRY_CATCH_ERROR = new ErrorObject(); function tryCatch(callback, detail) { try { return callback(detail); } catch (e) { TRY_CATCH_ERROR.error = e; return TRY_CATCH_ERROR; } } function invokeCallback(settled, promise, callback, detail) { var hasCallback = isFunction(callback), value = undefined, error = undefined, succeeded = undefined, failed = undefined; if (hasCallback) { value = tryCatch(callback, detail); if (value === TRY_CATCH_ERROR) { failed = true; error = value.error; value.error = null; } else { succeeded = true; } if (promise === value) { _reject(promise, cannotReturnOwn()); return; } } else { value = detail; succeeded = true; } if (promise._state !== PENDING) { // noop } else if (hasCallback && succeeded) { _resolve(promise, value); } else if (failed) { _reject(promise, error); } else if (settled === FULFILLED) { fulfill(promise, value); } else if (settled === REJECTED) { _reject(promise, value); } } function initializePromise(promise, resolver) { try { resolver(function resolvePromise(value) { _resolve(promise, value); }, function rejectPromise(reason) { _reject(promise, reason); }); } catch (e) { _reject(promise, e); } } var id = 0; function nextId() { return id++; } function makePromise(promise) { promise[PROMISE_ID] = id++; promise._state = undefined; promise._result = undefined; promise._subscribers = []; } function Enumerator(Constructor, input) { this._instanceConstructor = Constructor; this.promise = new Constructor(noop); if (!this.promise[PROMISE_ID]) { makePromise(this.promise); } if (isArray(input)) { this._input = input; this.length = input.length; this._remaining = input.length; this._result = new Array(this.length); if (this.length === 0) { fulfill(this.promise, this._result); } else { this.length = this.length || 0; this._enumerate(); if (this._remaining === 0) { fulfill(this.promise, this._result); } } } else { _reject(this.promise, validationError()); } } function validationError() { return new Error('Array Methods must be provided an Array'); }; Enumerator.prototype._enumerate = function () { var length = this.length; var _input = this._input; for (var i = 0; this._state === PENDING && i < length; i++) { this._eachEntry(_input[i], i); } }; Enumerator.prototype._eachEntry = function (entry, i) { var c = this._instanceConstructor; var resolve$$ = c.resolve; if (resolve$$ === resolve) { var _then = getThen(entry); if (_then === then && entry._state !== PENDING) { this._settledAt(entry._state, i, entry._result); } else if (typeof _then !== 'function') { this._remaining--; this._result[i] = entry; } else if (c === Promise) { var promise = new c(noop); handleMaybeThenable(promise, entry, _then); this._willSettleAt(promise, i); } else { this._willSettleAt(new c(function (resolve$$) { return resolve$$(entry); }), i); } } else { this._willSettleAt(resolve$$(entry), i); } }; Enumerator.prototype._settledAt = function (state, i, value) { var promise = this.promise; if (promise._state === PENDING) { this._remaining--; if (state === REJECTED) { _reject(promise, value); } else { this._result[i] = value; } } if (this._remaining === 0) { fulfill(promise, this._result); } }; Enumerator.prototype._willSettleAt = function (promise, i) { var enumerator = this; subscribe(promise, undefined, function (value) { return enumerator._settledAt(FULFILLED, i, value); }, function (reason) { return enumerator._settledAt(REJECTED, i, reason); }); }; /** `Promise.all` accepts an array of promises, and returns a new promise which is fulfilled with an array of fulfillment values for the passed promises, or rejected with the reason of the first passed promise to be rejected. It casts all elements of the passed iterable to promises as it runs this algorithm. Example: ```javascript let promise1 = resolve(1); let promise2 = resolve(2); let promise3 = resolve(3); let promises = [ promise1, promise2, promise3 ]; Promise.all(promises).then(function(array){ // The array here would be [ 1, 2, 3 ]; }); ``` If any of the `promises` given to `all` are rejected, the first promise that is rejected will be given as an argument to the returned promises's rejection handler. For example: Example: ```javascript let promise1 = resolve(1); let promise2 = reject(new Error("2")); let promise3 = reject(new Error("3")); let promises = [ promise1, promise2, promise3 ]; Promise.all(promises).then(function(array){ // Code here never runs because there are rejected promises! }, function(error) { // error.message === "2" }); ``` @method all @static @param {Array} entries array of promises @param {String} label optional string for labeling the promise. Useful for tooling. @return {Promise} promise that is fulfilled when all `promises` have been fulfilled, or rejected if any of them become rejected. @static */ function all(entries) { return new Enumerator(this, entries).promise; } /** `Promise.race` returns a new promise which is settled in the same way as the first passed promise to settle. Example: ```javascript let promise1 = new Promise(function(resolve, reject){ setTimeout(function(){ resolve('promise 1'); }, 200); }); let promise2 = new Promise(function(resolve, reject){ setTimeout(function(){ resolve('promise 2'); }, 100); }); Promise.race([promise1, promise2]).then(function(result){ // result === 'promise 2' because it was resolved before promise1 // was resolved. }); ``` `Promise.race` is deterministic in that only the state of the first settled promise matters. For example, even if other promises given to the `promises` array argument are resolved, but the first settled promise has become rejected before the other promises became fulfilled, the returned promise will become rejected: ```javascript let promise1 = new Promise(function(resolve, reject){ setTimeout(function(){ resolve('promise 1'); }, 200); }); let promise2 = new Promise(function(resolve, reject){ setTimeout(function(){ reject(new Error('promise 2')); }, 100); }); Promise.race([promise1, promise2]).then(function(result){ // Code here never runs }, function(reason){ // reason.message === 'promise 2' because promise 2 became rejected before // promise 1 became fulfilled }); ``` An example real-world use case is implementing timeouts: ```javascript Promise.race([ajax('foo.json'), timeout(5000)]) ``` @method race @static @param {Array} promises array of promises to observe Useful for tooling. @return {Promise} a promise which settles in the same way as the first passed promise to settle. */ function race(entries) { /*jshint validthis:true */ var Constructor = this; if (!isArray(entries)) { return new Constructor(function (_, reject) { return reject(new TypeError('You must pass an array to race.')); }); } else { return new Constructor(function (resolve, reject) { var length = entries.length; for (var i = 0; i < length; i++) { Constructor.resolve(entries[i]).then(resolve, reject); } }); } } /** `Promise.reject` returns a promise rejected with the passed `reason`. It is shorthand for the following: ```javascript let promise = new Promise(function(resolve, reject){ reject(new Error('WHOOPS')); }); promise.then(function(value){ // Code here doesn't run because the promise is rejected! }, function(reason){ // reason.message === 'WHOOPS' }); ``` Instead of writing the above, your code now simply becomes the following: ```javascript let promise = Promise.reject(new Error('WHOOPS')); promise.then(function(value){ // Code here doesn't run because the promise is rejected! }, function(reason){ // reason.message === 'WHOOPS' }); ``` @method reject @static @param {Any} reason value that the returned promise will be rejected with. Useful for tooling. @return {Promise} a promise rejected with the given `reason`. */ function reject(reason) { /*jshint validthis:true */ var Constructor = this; var promise = new Constructor(noop); _reject(promise, reason); return promise; } function needsResolver() { throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); } function needsNew() { throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); } /** Promise objects represent the eventual result of an asynchronous operation. The primary way of interacting with a promise is through its `then` method, which registers callbacks to receive either a promise's eventual value or the reason why the promise cannot be fulfilled. Terminology ----------- - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - `thenable` is an object or function that defines a `then` method. - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - `exception` is a value that is thrown using the throw statement. - `reason` is a value that indicates why a promise was rejected. - `settled` the final resting state of a promise, fulfilled or rejected. A promise can be in one of three states: pending, fulfilled, or rejected. Promises that are fulfilled have a fulfillment value and are in the fulfilled state. Promises that are rejected have a rejection reason and are in the rejected state. A fulfillment value is never a thenable. Promises can also be said to *resolve* a value. If this value is also a promise, then the original promise's settled state will match the value's settled state. So a promise that *resolves* a promise that rejects will itself reject, and a promise that *resolves* a promise that fulfills will itself fulfill. Basic Usage: ------------ ```js let promise = new Promise(function(resolve, reject) { // on success resolve(value); // on failure reject(reason); }); promise.then(function(value) { // on fulfillment }, function(reason) { // on rejection }); ``` Advanced Usage: --------------- Promises shine when abstracting away asynchronous interactions such as `XMLHttpRequest`s. ```js function getJSON(url) { return new Promise(function(resolve, reject){ let xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onreadystatechange = handler; xhr.responseType = 'json'; xhr.setRequestHeader('Accept', 'application/json'); xhr.send(); function handler() { if (this.readyState === this.DONE) { if (this.status === 200) { resolve(this.response); } else { reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); } } }; }); } getJSON('/posts.json').then(function(json) { // on fulfillment }, function(reason) { // on rejection }); ``` Unlike callbacks, promises are great composable primitives. ```js Promise.all([ getJSON('/posts'), getJSON('/comments') ]).then(function(values){ values[0] // => postsJSON values[1] // => commentsJSON return values; }); ``` @class Promise @param {function} resolver Useful for tooling. @constructor */ function Promise(resolver) { this[PROMISE_ID] = nextId(); this._result = this._state = undefined; this._subscribers = []; if (noop !== resolver) { typeof resolver !== 'function' && needsResolver(); this instanceof Promise ? initializePromise(this, resolver) : needsNew(); } } Promise.all = all; Promise.race = race; Promise.resolve = resolve; Promise.reject = reject; Promise._setScheduler = setScheduler; Promise._setAsap = setAsap; Promise._asap = asap; Promise.prototype = { constructor: Promise, /** The primary way of interacting with a promise is through its `then` method, which registers callbacks to receive either a promise's eventual value or the reason why the promise cannot be fulfilled. ```js findUser().then(function(user){ // user is available }, function(reason){ // user is unavailable, and you are given the reason why }); ``` Chaining -------- The return value of `then` is itself a promise. This second, 'downstream' promise is resolved with the return value of the first promise's fulfillment or rejection handler, or rejected if the handler throws an exception. ```js findUser().then(function (user) { return user.name; }, function (reason) { return 'default name'; }).then(function (userName) { // If `findUser` fulfilled, `userName` will be the user's name, otherwise it // will be `'default name'` }); findUser().then(function (user) { throw new Error('Found user, but still unhappy'); }, function (reason) { throw new Error('`findUser` rejected and we're unhappy'); }).then(function (value) { // never reached }, function (reason) { // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. }); ``` If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. ```js findUser().then(function (user) { throw new PedagogicalException('Upstream error'); }).then(function (value) { // never reached }).then(function (value) { // never reached }, function (reason) { // The `PedgagocialException` is propagated all the way down to here }); ``` Assimilation ------------ Sometimes the value you want to propagate to a downstream promise can only be retrieved asynchronously. This can be achieved by returning a promise in the fulfillment or rejection handler. The downstream promise will then be pending until the returned promise is settled. This is called *assimilation*. ```js findUser().then(function (user) { return findCommentsByAuthor(user); }).then(function (comments) { // The user's comments are now available }); ``` If the assimliated promise rejects, then the downstream promise will also reject. ```js findUser().then(function (user) { return findCommentsByAuthor(user); }).then(function (comments) { // If `findCommentsByAuthor` fulfills, we'll have the value here }, function (reason) { // If `findCommentsByAuthor` rejects, we'll have the reason here }); ``` Simple Example -------------- Synchronous Example ```javascript let result; try { result = findResult(); // success } catch(reason) { // failure } ``` Errback Example ```js findResult(function(result, err){ if (err) { // failure } else { // success } }); ``` Promise Example; ```javascript findResult().then(function(result){ // success }, function(reason){ // failure }); ``` Advanced Example -------------- Synchronous Example ```javascript let author, books; try { author = findAuthor(); books = findBooksByAuthor(author); // success } catch(reason) { // failure } ``` Errback Example ```js function foundBooks(books) { } function failure(reason) { } findAuthor(function(author, err){ if (err) { failure(err); // failure } else { try { findBoooksByAuthor(author, function(books, err) { if (err) { failure(err); } else { try { foundBooks(books); } catch(reason) { failure(reason); } } }); } catch(error) { failure(err); } // success } }); ``` Promise Example; ```javascript findAuthor(). then(findBooksByAuthor). then(function(books){ // found books }).catch(function(reason){ // something went wrong }); ``` @method then @param {Function} onFulfilled @param {Function} onRejected Useful for tooling. @return {Promise} */ then: then, /** `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same as the catch block of a try/catch statement. ```js function findAuthor(){ throw new Error('couldn't find that author'); } // synchronous try { findAuthor(); } catch(reason) { // something went wrong } // async with promises findAuthor().catch(function(reason){ // something went wrong }); ``` @method catch @param {Function} onRejection Useful for tooling. @return {Promise} */ 'catch': function _catch(onRejection) { return this.then(null, onRejection); } }; function polyfill() { var local = undefined; if (typeof global !== 'undefined') { local = global; } else if (typeof self !== 'undefined') { local = self; } else { try { local = Function('return this')(); } catch (e) { throw new Error('polyfill failed because global object is unavailable in this environment'); } } var P = local.Promise; if (P) { var promiseToString = null; try { promiseToString = Object.prototype.toString.call(P.resolve()); } catch (e) { // silently ignored } if (promiseToString === '[object Promise]' && !P.cast) { return; } } local.Promise = Promise; } // Strange compat.. Promise.polyfill = polyfill; Promise.Promise = Promise; return Promise; }))); //# sourceMappingURL=es6-promise.map /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(13), __webpack_require__(14))) /***/ }), /* 82 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_RESULT__;(function (self) { 'use strict'; function fetchPonyfill(options) { var Promise = options && options.Promise || self.Promise; var XMLHttpRequest = options && options.XMLHttpRequest || self.XMLHttpRequest; var global = self; return (function () { var self = Object.create(global, { fetch: { value: undefined, writable: true } }); (function(self) { 'use strict'; if (self.fetch) { return } var support = { searchParams: 'URLSearchParams' in self, iterable: 'Symbol' in self && 'iterator' in Symbol, blob: 'FileReader' in self && 'Blob' in self && (function() { try { new Blob() return true } catch(e) { return false } })(), formData: 'FormData' in self, arrayBuffer: 'ArrayBuffer' in self } if (support.arrayBuffer) { var viewClasses = [ '[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]' ] var isDataView = function(obj) { return obj && DataView.prototype.isPrototypeOf(obj) } var isArrayBufferView = ArrayBuffer.isView || function(obj) { return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 } } function normalizeName(name) { if (typeof name !== 'string') { name = String(name) } if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { throw new TypeError('Invalid character in header field name') } return name.toLowerCase() } function normalizeValue(value) { if (typeof value !== 'string') { value = String(value) } return value } // Build a destructive iterator for the value list function iteratorFor(items) { var iterator = { next: function() { var value = items.shift() return {done: value === undefined, value: value} } } if (support.iterable) { iterator[Symbol.iterator] = function() { return iterator } } return iterator } function Headers(headers) { this.map = {} if (headers instanceof Headers) { headers.forEach(function(value, name) { this.append(name, value) }, this) } else if (headers) { Object.getOwnPropertyNames(headers).forEach(function(name) { this.append(name, headers[name]) }, this) } } Headers.prototype.append = function(name, value) { name = normalizeName(name) value = normalizeValue(value) var oldValue = this.map[name] this.map[name] = oldValue ? oldValue+','+value : value } Headers.prototype['delete'] = function(name) { delete this.map[normalizeName(name)] } Headers.prototype.get = function(name) { name = normalizeName(name) return this.has(name) ? this.map[name] : null } Headers.prototype.has = function(name) { return this.map.hasOwnProperty(normalizeName(name)) } Headers.prototype.set = function(name, value) { this.map[normalizeName(name)] = normalizeValue(value) } Headers.prototype.forEach = function(callback, thisArg) { for (var name in this.map) { if (this.map.hasOwnProperty(name)) { callback.call(thisArg, this.map[name], name, this) } } } Headers.prototype.keys = function() { var items = [] this.forEach(function(value, name) { items.push(name) }) return iteratorFor(items) } Headers.prototype.values = function() { var items = [] this.forEach(function(value) { items.push(value) }) return iteratorFor(items) } Headers.prototype.entries = function() { var items = [] this.forEach(function(value, name) { items.push([name, value]) }) return iteratorFor(items) } if (support.iterable) { Headers.prototype[Symbol.iterator] = Headers.prototype.entries } function consumed(body) { if (body.bodyUsed) { return Promise.reject(new TypeError('Already read')) } body.bodyUsed = true } function fileReaderReady(reader) { return new Promise(function(resolve, reject) { reader.onload = function() { resolve(reader.result) } reader.onerror = function() { reject(reader.error) } }) } function readBlobAsArrayBuffer(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) reader.readAsArrayBuffer(blob) return promise } function readBlobAsText(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) reader.readAsText(blob) return promise } function readArrayBufferAsText(buf) { var view = new Uint8Array(buf) var chars = new Array(view.length) for (var i = 0; i < view.length; i++) { chars[i] = String.fromCharCode(view[i]) } return chars.join('') } function bufferClone(buf) { if (buf.slice) { return buf.slice(0) } else { var view = new Uint8Array(buf.byteLength) view.set(new Uint8Array(buf)) return view.buffer } } function Body() { this.bodyUsed = false this._initBody = function(body) { this._bodyInit = body if (!body) { this._bodyText = '' } else if (typeof body === 'string') { this._bodyText = body } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { this._bodyBlob = body } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { this._bodyFormData = body } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this._bodyText = body.toString() } else if (support.arrayBuffer && support.blob && isDataView(body)) { this._bodyArrayBuffer = bufferClone(body.buffer) // IE 10-11 can't handle a DataView body. this._bodyInit = new Blob([this._bodyArrayBuffer]) } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { this._bodyArrayBuffer = bufferClone(body) } else { throw new Error('unsupported BodyInit type') } if (!this.headers.get('content-type')) { if (typeof body === 'string') { this.headers.set('content-type', 'text/plain;charset=UTF-8') } else if (this._bodyBlob && this._bodyBlob.type) { this.headers.set('content-type', this._bodyBlob.type) } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8') } } } if (support.blob) { this.blob = function() { var rejected = consumed(this) if (rejected) { return rejected } if (this._bodyBlob) { return Promise.resolve(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(new Blob([this._bodyArrayBuffer])) } else if (this._bodyFormData) { throw new Error('could not read FormData body as blob') } else { return Promise.resolve(new Blob([this._bodyText])) } } this.arrayBuffer = function() { if (this._bodyArrayBuffer) { return consumed(this) || Promise.resolve(this._bodyArrayBuffer) } else { return this.blob().then(readBlobAsArrayBuffer) } } } this.text = function() { var rejected = consumed(this) if (rejected) { return rejected } if (this._bodyBlob) { return readBlobAsText(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) } else if (this._bodyFormData) { throw new Error('could not read FormData body as text') } else { return Promise.resolve(this._bodyText) } } if (support.formData) { this.formData = function() { return this.text().then(decode) } } this.json = function() { return this.text().then(JSON.parse) } return this } // HTTP methods whose capitalization should be normalized var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] function normalizeMethod(method) { var upcased = method.toUpperCase() return (methods.indexOf(upcased) > -1) ? upcased : method } function Request(input, options) { options = options || {} var body = options.body if (input instanceof Request) { if (input.bodyUsed) { throw new TypeError('Already read') } this.url = input.url this.credentials = input.credentials if (!options.headers) { this.headers = new Headers(input.headers) } this.method = input.method this.mode = input.mode if (!body && input._bodyInit != null) { body = input._bodyInit input.bodyUsed = true } } else { this.url = String(input) } this.credentials = options.credentials || this.credentials || 'omit' if (options.headers || !this.headers) { this.headers = new Headers(options.headers) } this.method = normalizeMethod(options.method || this.method || 'GET') this.mode = options.mode || this.mode || null this.referrer = null if ((this.method === 'GET' || this.method === 'HEAD') && body) { throw new TypeError('Body not allowed for GET or HEAD requests') } this._initBody(body) } Request.prototype.clone = function() { return new Request(this, { body: this._bodyInit }) } function decode(body) { var form = new FormData() body.trim().split('&').forEach(function(bytes) { if (bytes) { var split = bytes.split('=') var name = split.shift().replace(/\+/g, ' ') var value = split.join('=').replace(/\+/g, ' ') form.append(decodeURIComponent(name), decodeURIComponent(value)) } }) return form } function parseHeaders(rawHeaders) { var headers = new Headers() rawHeaders.split(/\r?\n/).forEach(function(line) { var parts = line.split(':') var key = parts.shift().trim() if (key) { var value = parts.join(':').trim() headers.append(key, value) } }) return headers } Body.call(Request.prototype) function Response(bodyInit, options) { if (!options) { options = {} } this.type = 'default' this.status = 'status' in options ? options.status : 200 this.ok = this.status >= 200 && this.status < 300 this.statusText = 'statusText' in options ? options.statusText : 'OK' this.headers = new Headers(options.headers) this.url = options.url || '' this._initBody(bodyInit) } Body.call(Response.prototype) Response.prototype.clone = function() { return new Response(this._bodyInit, { status: this.status, statusText: this.statusText, headers: new Headers(this.headers), url: this.url }) } Response.error = function() { var response = new Response(null, {status: 0, statusText: ''}) response.type = 'error' return response } var redirectStatuses = [301, 302, 303, 307, 308] Response.redirect = function(url, status) { if (redirectStatuses.indexOf(status) === -1) { throw new RangeError('Invalid status code') } return new Response(null, {status: status, headers: {location: url}}) } self.Headers = Headers self.Request = Request self.Response = Response self.fetch = function(input, init) { return new Promise(function(resolve, reject) { var request = new Request(input, init) var xhr = new XMLHttpRequest() xhr.onload = function() { var options = { status: xhr.status, statusText: xhr.statusText, headers: parseHeaders(xhr.getAllResponseHeaders() || '') } options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL') var body = 'response' in xhr ? xhr.response : xhr.responseText resolve(new Response(body, options)) } xhr.onerror = function() { reject(new TypeError('Network request failed')) } xhr.ontimeout = function() { reject(new TypeError('Network request failed')) } xhr.open(request.method, request.url, true) if (request.credentials === 'include') { xhr.withCredentials = true } if ('responseType' in xhr && support.blob) { xhr.responseType = 'blob' } request.headers.forEach(function(value, name) { xhr.setRequestHeader(name, value) }) xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) }) } self.fetch.polyfill = true })(typeof self !== 'undefined' ? self : this); return { fetch: self.fetch, Headers: self.Headers, Request: self.Request, Response: self.Response }; }()); } if (true) { !(__WEBPACK_AMD_DEFINE_RESULT__ = function () { return fetchPonyfill; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else if (typeof exports === 'object') { module.exports = fetchPonyfill; } else { self.fetchPonyfill = fetchPonyfill; } }(typeof self === 'undefined' ? this : self)); /***/ }), /* 83 */ /***/ (function(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 } /***/ }), /* 84 */ /***/ (function(module, exports) { var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; /***/ }), /* 85 */ /***/ (function(module, exports, __webpack_require__) { var json = typeof JSON !== 'undefined' ? JSON : __webpack_require__(86); module.exports = function (obj, opts) { if (!opts) opts = {}; if (typeof opts === 'function') opts = { cmp: opts }; var space = opts.space || ''; if (typeof space === 'number') space = Array(space+1).join(' '); var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false; var replacer = opts.replacer || function(key, value) { return value; }; var cmp = opts.cmp && (function (f) { return function (node) { return function (a, b) { var aobj = { key: a, value: node[a] }; var bobj = { key: b, value: node[b] }; return f(aobj, bobj); }; }; })(opts.cmp); var seen = []; return (function stringify (parent, key, node, level) { var indent = space ? ('\n' + new Array(level + 1).join(space)) : ''; var colonSeparator = space ? ': ' : ':'; if (node && node.toJSON && typeof node.toJSON === 'function') { node = node.toJSON(); } node = replacer.call(parent, key, node); if (node === undefined) { return; } if (typeof node !== 'object' || node === null) { return json.stringify(node); } if (isArray(node)) { var out = []; for (var i = 0; i < node.length; i++) { var item = stringify(node, i, node[i], level+1) || json.stringify(null); out.push(indent + space + item); } return '[' + out.join(',') + indent + ']'; } else { if (seen.indexOf(node) !== -1) { if (cycles) return json.stringify('__cycle__'); throw new TypeError('Converting circular structure to JSON'); } else seen.push(node); var keys = objectKeys(node).sort(cmp && cmp(node)); var out = []; for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = stringify(node, key, node[key], level+1); if(!value) continue; var keyValue = json.stringify(key) + colonSeparator + value; ; out.push(indent + space + keyValue); } seen.splice(seen.indexOf(node), 1); return '{' + out.join(',') + indent + '}'; } })({ '': obj }, '', obj, 0); }; var isArray = Array.isArray || function (x) { return {}.toString.call(x) === '[object Array]'; }; var objectKeys = Object.keys || function (obj) { var has = Object.prototype.hasOwnProperty || function () { return true }; var keys = []; for (var key in obj) { if (has.call(obj, key)) keys.push(key); } return keys; }; /***/ }), /* 86 */ /***/ (function(module, exports, __webpack_require__) { exports.parse = __webpack_require__(87); exports.stringify = __webpack_require__(88); /***/ }), /* 87 */ /***/ (function(module, exports) { var at, // The index of the current character ch, // The current character escapee = { '"': '"', '\\': '\\', '/': '/', b: '\b', f: '\f', n: '\n', r: '\r', t: '\t' }, text, error = function (m) { // Call error when something is wrong. throw { name: 'SyntaxError', message: m, at: at, text: text }; }, next = function (c) { // If a c parameter is provided, verify that it matches the current character. if (c && c !== ch) { error("Expected '" + c + "' instead of '" + ch + "'"); } // Get the next character. When there are no more characters, // return the empty string. ch = text.charAt(at); at += 1; return ch; }, number = function () { // Parse a number value. var number, string = ''; if (ch === '-') { string = '-'; next('-'); } while (ch >= '0' && ch <= '9') { string += ch; next(); } if (ch === '.') { string += '.'; while (next() && ch >= '0' && ch <= '9') { string += ch; } } if (ch === 'e' || ch === 'E') { string += ch; next(); if (ch === '-' || ch === '+') { string += ch; next(); } while (ch >= '0' && ch <= '9') { string += ch; next(); } } number = +string; if (!isFinite(number)) { error("Bad number"); } else { return number; } }, string = function () { // Parse a string value. var hex, i, string = '', uffff; // When parsing for string values, we must look for " and \ characters. if (ch === '"') { while (next()) { if (ch === '"') { next(); return string; } else if (ch === '\\') { next(); if (ch === 'u') { uffff = 0; for (i = 0; i < 4; i += 1) { hex = parseInt(next(), 16); if (!isFinite(hex)) { break; } uffff = uffff * 16 + hex; } string += String.fromCharCode(uffff); } else if (typeof escapee[ch] === 'string') { string += escapee[ch]; } else { break; } } else { string += ch; } } } error("Bad string"); }, white = function () { // Skip whitespace. while (ch && ch <= ' ') { next(); } }, word = function () { // true, false, or null. switch (ch) { case 't': next('t'); next('r'); next('u'); next('e'); return true; case 'f': next('f'); next('a'); next('l'); next('s'); next('e'); return false; case 'n': next('n'); next('u'); next('l'); next('l'); return null; } error("Unexpected '" + ch + "'"); }, value, // Place holder for the value function. array = function () { // Parse an array value. var array = []; if (ch === '[') { next('['); white(); if (ch === ']') { next(']'); return array; // empty array } while (ch) { array.push(value()); white(); if (ch === ']') { next(']'); return array; } next(','); white(); } } error("Bad array"); }, object = function () { // Parse an object value. var key, object = {}; if (ch === '{') { next('{'); white(); if (ch === '}') { next('}'); return object; // empty object } while (ch) { key = string(); white(); next(':'); if (Object.hasOwnProperty.call(object, key)) { error('Duplicate key "' + key + '"'); } object[key] = value(); white(); if (ch === '}') { next('}'); return object; } next(','); white(); } } error("Bad object"); }; value = function () { // Parse a JSON value. It could be an object, an array, a string, a number, // or a word. white(); switch (ch) { case '{': return object(); case '[': return array(); case '"': return string(); case '-': return number(); default: return ch >= '0' && ch <= '9' ? number() : word(); } }; // Return the json_parse function. It will have access to all of the above // functions and variables. module.exports = function (source, reviver) { var result; text = source; at = 0; ch = ' '; result = value(); white(); if (ch) { error("Syntax error"); } // If there is a reviver function, we recursively walk the new structure, // passing each name/value pair to the reviver function for possible // transformation, starting with a temporary root object that holds the result // in an empty key. If there is not a reviver function, we simply return the // result. return typeof reviver === 'function' ? (function walk(holder, key) { var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); }({'': result}, '')) : result; }; /***/ }), /* 88 */ /***/ (function(module, exports) { var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { // table of character substitutions '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, rep; function quote(string) { // If the string contains no control characters, no quote characters, and no // backslash characters, then we can safely slap some quotes around it. // Otherwise we must also replace the offending characters with safe escape // sequences. escapable.lastIndex = 0; return escapable.test(string) ? '"' + string.replace(escapable, function (a) { var c = meta[a]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } function str(key, holder) { // Produce a string from holder[key]. var i, // The loop counter. k, // The member key. v, // The member value. length, mind = gap, partial, value = holder[key]; // If the value has a toJSON method, call it to obtain a replacement value. if (value && typeof value === 'object' && typeof value.toJSON === 'function') { value = value.toJSON(key); } // If we were called with a replacer function, then call the replacer to // obtain a replacement value. if (typeof rep === 'function') { value = rep.call(holder, key, value); } // What happens next depends on the value's type. switch (typeof value) { case 'string': return quote(value); case 'number': // JSON numbers must be finite. Encode non-finite numbers as null. return isFinite(value) ? String(value) : 'null'; case 'boolean': case 'null': // If the value is a boolean or null, convert it to a string. Note: // typeof null does not produce 'null'. The case is included here in // the remote chance that this gets fixed someday. return String(value); case 'object': if (!value) return 'null'; gap += indent; partial = []; // Array.isArray if (Object.prototype.toString.apply(value) === '[object Array]') { length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || 'null'; } // Join all of the elements together, separated with commas, and // wrap them in brackets. v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; gap = mind; return v; } // If the replacer is an array, use it to select the members to be // stringified. if (rep && typeof rep === 'object') { length = rep.length; for (i = 0; i < length; i += 1) { k = rep[i]; if (typeof k === 'string') { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } else { // Otherwise, iterate through all of the keys in the object. for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } // Join all of the member texts together, separated with commas, // and wrap them in braces. v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; gap = mind; return v; } } module.exports = function (value, replacer, space) { var i; gap = ''; indent = ''; // If the space parameter is a number, make an indent string containing that // many spaces. if (typeof space === 'number') { for (i = 0; i < space; i += 1) { indent += ' '; } } // If the space parameter is a string, it will be used as the indent string. else if (typeof space === 'string') { indent = space; } // If there is a replacer, it must be a function or an array. // Otherwise, throw an error. rep = replacer; if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { throw new Error('JSON.stringify'); } // Make a fake root object containing our value under the key of ''. // Return the result of stringifying the value. return str('', {'': value}); }; /***/ }), /* 89 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* object-assign (c) Sindre Sorhus @license MIT */ /* eslint-disable no-unused-vars */ var getOwnPropertySymbols = Object.getOwnPropertySymbols; var hasOwnProperty = Object.prototype.hasOwnProperty; var propIsEnumerable = Object.prototype.propertyIsEnumerable; function toObject(val) { if (val === null || val === undefined) { throw new TypeError('Object.assign cannot be called with null or undefined'); } return Object(val); } function shouldUseNative() { try { if (!Object.assign) { return false; } // Detect buggy property enumeration order in older V8 versions. // https://bugs.chromium.org/p/v8/issues/detail?id=4118 var test1 = new String('abc'); // eslint-disable-line no-new-wrappers test1[5] = 'de'; if (Object.getOwnPropertyNames(test1)[0] === '5') { return false; } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 var test2 = {}; for (var i = 0; i < 10; i++) { test2['_' + String.fromCharCode(i)] = i; } var order2 = Object.getOwnPropertyNames(test2).map(function (n) { return test2[n]; }); if (order2.join('') !== '0123456789') { return false; } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 var test3 = {}; 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { test3[letter] = letter; }); if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { return false; } return true; } catch (err) { // We don't expect any of the above to throw, but better to be safe. return false; } } module.exports = shouldUseNative() ? Object.assign : function (target, source) { var from; var to = toObject(target); var symbols; for (var s = 1; s < arguments.length; s++) { from = Object(arguments[s]); for (var key in from) { if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } if (getOwnPropertySymbols) { symbols = getOwnPropertySymbols(from); for (var i = 0; i < symbols.length; i++) { if (propIsEnumerable.call(from, symbols[i])) { to[symbols[i]] = from[symbols[i]]; } } } } return to; }; /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var strictUriEncode = __webpack_require__(91); var objectAssign = __webpack_require__(89); function encoderForArrayFormat(opts) { switch (opts.arrayFormat) { case 'index': return function (key, value, index) { return value === null ? [ encode(key, opts), '[', index, ']' ].join('') : [ encode(key, opts), '[', encode(index, opts), ']=', encode(value, opts) ].join(''); }; case 'bracket': return function (key, value) { return value === null ? encode(key, opts) : [ encode(key, opts), '[]=', encode(value, opts) ].join(''); }; default: return function (key, value) { return value === null ? encode(key, opts) : [ encode(key, opts), '=', encode(value, opts) ].join(''); }; } } function parserForArrayFormat(opts) { var result; switch (opts.arrayFormat) { case 'index': return function (key, value, accumulator) { result = /\[(\d*)\]$/.exec(key); key = key.replace(/\[\d*\]$/, ''); if (!result) { accumulator[key] = value; return; } if (accumulator[key] === undefined) { accumulator[key] = {}; } accumulator[key][result[1]] = value; }; case 'bracket': return function (key, value, accumulator) { result = /(\[\])$/.exec(key); key = key.replace(/\[\]$/, ''); if (!result) { accumulator[key] = value; return; } else if (accumulator[key] === undefined) { accumulator[key] = [value]; return; } accumulator[key] = [].concat(accumulator[key], value); }; default: return function (key, value, accumulator) { if (accumulator[key] === undefined) { accumulator[key] = value; return; } accumulator[key] = [].concat(accumulator[key], value); }; } } function encode(value, opts) { if (opts.encode) { return opts.strict ? strictUriEncode(value) : encodeURIComponent(value); } return value; } function keysSorter(input) { if (Array.isArray(input)) { return input.sort(); } else if (typeof input === 'object') { return keysSorter(Object.keys(input)).sort(function (a, b) { return Number(a) - Number(b); }).map(function (key) { return input[key]; }); } return input; } exports.extract = function (str) { return str.split('?')[1] || ''; }; exports.parse = function (str, opts) { opts = objectAssign({arrayFormat: 'none'}, opts); var formatter = parserForArrayFormat(opts); // Create an object with no prototype // https://github.com/sindresorhus/query-string/issues/47 var ret = Object.create(null); if (typeof str !== 'string') { return ret; } str = str.trim().replace(/^(\?|#|&)/, ''); if (!str) { return ret; } str.split('&').forEach(function (param) { var parts = param.replace(/\+/g, ' ').split('='); // Firefox (pre 40) decodes `%3D` to `=` // https://github.com/sindresorhus/query-string/pull/37 var key = parts.shift(); var val = parts.length > 0 ? parts.join('=') : undefined; // missing `=` should be `null`: // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters val = val === undefined ? null : decodeURIComponent(val); formatter(decodeURIComponent(key), val, ret); }); return Object.keys(ret).sort().reduce(function (result, key) { var val = ret[key]; if (Boolean(val) && typeof val === 'object' && !Array.isArray(val)) { // Sort object keys, not values result[key] = keysSorter(val); } else { result[key] = val; } return result; }, Object.create(null)); }; exports.stringify = function (obj, opts) { var defaults = { encode: true, strict: true, arrayFormat: 'none' }; opts = objectAssign(defaults, opts); var formatter = encoderForArrayFormat(opts); return obj ? Object.keys(obj).sort().map(function (key) { var val = obj[key]; if (val === undefined) { return ''; } if (val === null) { return encode(key, opts); } if (Array.isArray(val)) { var result = []; val.slice().forEach(function (val2) { if (val2 === undefined) { return; } result.push(formatter(key, val2, result.length)); }); return result.join('&'); } return encode(key, opts) + '=' + encode(val, opts); }).filter(function (x) { return x.length > 0; }).join('&') : ''; }; /***/ }), /* 91 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = function (str) { return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { return '%' + c.charCodeAt(0).toString(16).toUpperCase(); }); }; /***/ }), /* 92 */ /***/ (function(module, exports, __webpack_require__) { (function(nacl) { 'use strict'; // Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. // Public domain. // // Implementation derived from TweetNaCl version 20140427. // See for details: http://tweetnacl.cr.yp.to/ var gf = function(init) { var i, r = new Float64Array(16); if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; return r; }; // Pluggable, initialized in high-level API below. var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; var _0 = new Uint8Array(16); var _9 = new Uint8Array(32); _9[0] = 9; var gf0 = gf(), gf1 = gf([1]), _121665 = gf([0xdb41, 1]), D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); function ts64(x, i, h, l) { x[i] = (h >> 24) & 0xff; x[i+1] = (h >> 16) & 0xff; x[i+2] = (h >> 8) & 0xff; x[i+3] = h & 0xff; x[i+4] = (l >> 24) & 0xff; x[i+5] = (l >> 16) & 0xff; x[i+6] = (l >> 8) & 0xff; x[i+7] = l & 0xff; } function vn(x, xi, y, yi, n) { var i,d = 0; for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; return (1 & ((d - 1) >>> 8)) - 1; } function crypto_verify_16(x, xi, y, yi) { return vn(x,xi,y,yi,16); } function crypto_verify_32(x, xi, y, yi) { return vn(x,xi,y,yi,32); } function core_salsa20(o, p, k, c) { var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15, u; for (var i = 0; i < 20; i += 2) { u = x0 + x12 | 0; x4 ^= u<<7 | u>>>(32-7); u = x4 + x0 | 0; x8 ^= u<<9 | u>>>(32-9); u = x8 + x4 | 0; x12 ^= u<<13 | u>>>(32-13); u = x12 + x8 | 0; x0 ^= u<<18 | u>>>(32-18); u = x5 + x1 | 0; x9 ^= u<<7 | u>>>(32-7); u = x9 + x5 | 0; x13 ^= u<<9 | u>>>(32-9); u = x13 + x9 | 0; x1 ^= u<<13 | u>>>(32-13); u = x1 + x13 | 0; x5 ^= u<<18 | u>>>(32-18); u = x10 + x6 | 0; x14 ^= u<<7 | u>>>(32-7); u = x14 + x10 | 0; x2 ^= u<<9 | u>>>(32-9); u = x2 + x14 | 0; x6 ^= u<<13 | u>>>(32-13); u = x6 + x2 | 0; x10 ^= u<<18 | u>>>(32-18); u = x15 + x11 | 0; x3 ^= u<<7 | u>>>(32-7); u = x3 + x15 | 0; x7 ^= u<<9 | u>>>(32-9); u = x7 + x3 | 0; x11 ^= u<<13 | u>>>(32-13); u = x11 + x7 | 0; x15 ^= u<<18 | u>>>(32-18); u = x0 + x3 | 0; x1 ^= u<<7 | u>>>(32-7); u = x1 + x0 | 0; x2 ^= u<<9 | u>>>(32-9); u = x2 + x1 | 0; x3 ^= u<<13 | u>>>(32-13); u = x3 + x2 | 0; x0 ^= u<<18 | u>>>(32-18); u = x5 + x4 | 0; x6 ^= u<<7 | u>>>(32-7); u = x6 + x5 | 0; x7 ^= u<<9 | u>>>(32-9); u = x7 + x6 | 0; x4 ^= u<<13 | u>>>(32-13); u = x4 + x7 | 0; x5 ^= u<<18 | u>>>(32-18); u = x10 + x9 | 0; x11 ^= u<<7 | u>>>(32-7); u = x11 + x10 | 0; x8 ^= u<<9 | u>>>(32-9); u = x8 + x11 | 0; x9 ^= u<<13 | u>>>(32-13); u = x9 + x8 | 0; x10 ^= u<<18 | u>>>(32-18); u = x15 + x14 | 0; x12 ^= u<<7 | u>>>(32-7); u = x12 + x15 | 0; x13 ^= u<<9 | u>>>(32-9); u = x13 + x12 | 0; x14 ^= u<<13 | u>>>(32-13); u = x14 + x13 | 0; x15 ^= u<<18 | u>>>(32-18); } x0 = x0 + j0 | 0; x1 = x1 + j1 | 0; x2 = x2 + j2 | 0; x3 = x3 + j3 | 0; x4 = x4 + j4 | 0; x5 = x5 + j5 | 0; x6 = x6 + j6 | 0; x7 = x7 + j7 | 0; x8 = x8 + j8 | 0; x9 = x9 + j9 | 0; x10 = x10 + j10 | 0; x11 = x11 + j11 | 0; x12 = x12 + j12 | 0; x13 = x13 + j13 | 0; x14 = x14 + j14 | 0; x15 = x15 + j15 | 0; o[ 0] = x0 >>> 0 & 0xff; o[ 1] = x0 >>> 8 & 0xff; o[ 2] = x0 >>> 16 & 0xff; o[ 3] = x0 >>> 24 & 0xff; o[ 4] = x1 >>> 0 & 0xff; o[ 5] = x1 >>> 8 & 0xff; o[ 6] = x1 >>> 16 & 0xff; o[ 7] = x1 >>> 24 & 0xff; o[ 8] = x2 >>> 0 & 0xff; o[ 9] = x2 >>> 8 & 0xff; o[10] = x2 >>> 16 & 0xff; o[11] = x2 >>> 24 & 0xff; o[12] = x3 >>> 0 & 0xff; o[13] = x3 >>> 8 & 0xff; o[14] = x3 >>> 16 & 0xff; o[15] = x3 >>> 24 & 0xff; o[16] = x4 >>> 0 & 0xff; o[17] = x4 >>> 8 & 0xff; o[18] = x4 >>> 16 & 0xff; o[19] = x4 >>> 24 & 0xff; o[20] = x5 >>> 0 & 0xff; o[21] = x5 >>> 8 & 0xff; o[22] = x5 >>> 16 & 0xff; o[23] = x5 >>> 24 & 0xff; o[24] = x6 >>> 0 & 0xff; o[25] = x6 >>> 8 & 0xff; o[26] = x6 >>> 16 & 0xff; o[27] = x6 >>> 24 & 0xff; o[28] = x7 >>> 0 & 0xff; o[29] = x7 >>> 8 & 0xff; o[30] = x7 >>> 16 & 0xff; o[31] = x7 >>> 24 & 0xff; o[32] = x8 >>> 0 & 0xff; o[33] = x8 >>> 8 & 0xff; o[34] = x8 >>> 16 & 0xff; o[35] = x8 >>> 24 & 0xff; o[36] = x9 >>> 0 & 0xff; o[37] = x9 >>> 8 & 0xff; o[38] = x9 >>> 16 & 0xff; o[39] = x9 >>> 24 & 0xff; o[40] = x10 >>> 0 & 0xff; o[41] = x10 >>> 8 & 0xff; o[42] = x10 >>> 16 & 0xff; o[43] = x10 >>> 24 & 0xff; o[44] = x11 >>> 0 & 0xff; o[45] = x11 >>> 8 & 0xff; o[46] = x11 >>> 16 & 0xff; o[47] = x11 >>> 24 & 0xff; o[48] = x12 >>> 0 & 0xff; o[49] = x12 >>> 8 & 0xff; o[50] = x12 >>> 16 & 0xff; o[51] = x12 >>> 24 & 0xff; o[52] = x13 >>> 0 & 0xff; o[53] = x13 >>> 8 & 0xff; o[54] = x13 >>> 16 & 0xff; o[55] = x13 >>> 24 & 0xff; o[56] = x14 >>> 0 & 0xff; o[57] = x14 >>> 8 & 0xff; o[58] = x14 >>> 16 & 0xff; o[59] = x14 >>> 24 & 0xff; o[60] = x15 >>> 0 & 0xff; o[61] = x15 >>> 8 & 0xff; o[62] = x15 >>> 16 & 0xff; o[63] = x15 >>> 24 & 0xff; } function core_hsalsa20(o,p,k,c) { var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15, u; for (var i = 0; i < 20; i += 2) { u = x0 + x12 | 0; x4 ^= u<<7 | u>>>(32-7); u = x4 + x0 | 0; x8 ^= u<<9 | u>>>(32-9); u = x8 + x4 | 0; x12 ^= u<<13 | u>>>(32-13); u = x12 + x8 | 0; x0 ^= u<<18 | u>>>(32-18); u = x5 + x1 | 0; x9 ^= u<<7 | u>>>(32-7); u = x9 + x5 | 0; x13 ^= u<<9 | u>>>(32-9); u = x13 + x9 | 0; x1 ^= u<<13 | u>>>(32-13); u = x1 + x13 | 0; x5 ^= u<<18 | u>>>(32-18); u = x10 + x6 | 0; x14 ^= u<<7 | u>>>(32-7); u = x14 + x10 | 0; x2 ^= u<<9 | u>>>(32-9); u = x2 + x14 | 0; x6 ^= u<<13 | u>>>(32-13); u = x6 + x2 | 0; x10 ^= u<<18 | u>>>(32-18); u = x15 + x11 | 0; x3 ^= u<<7 | u>>>(32-7); u = x3 + x15 | 0; x7 ^= u<<9 | u>>>(32-9); u = x7 + x3 | 0; x11 ^= u<<13 | u>>>(32-13); u = x11 + x7 | 0; x15 ^= u<<18 | u>>>(32-18); u = x0 + x3 | 0; x1 ^= u<<7 | u>>>(32-7); u = x1 + x0 | 0; x2 ^= u<<9 | u>>>(32-9); u = x2 + x1 | 0; x3 ^= u<<13 | u>>>(32-13); u = x3 + x2 | 0; x0 ^= u<<18 | u>>>(32-18); u = x5 + x4 | 0; x6 ^= u<<7 | u>>>(32-7); u = x6 + x5 | 0; x7 ^= u<<9 | u>>>(32-9); u = x7 + x6 | 0; x4 ^= u<<13 | u>>>(32-13); u = x4 + x7 | 0; x5 ^= u<<18 | u>>>(32-18); u = x10 + x9 | 0; x11 ^= u<<7 | u>>>(32-7); u = x11 + x10 | 0; x8 ^= u<<9 | u>>>(32-9); u = x8 + x11 | 0; x9 ^= u<<13 | u>>>(32-13); u = x9 + x8 | 0; x10 ^= u<<18 | u>>>(32-18); u = x15 + x14 | 0; x12 ^= u<<7 | u>>>(32-7); u = x12 + x15 | 0; x13 ^= u<<9 | u>>>(32-9); u = x13 + x12 | 0; x14 ^= u<<13 | u>>>(32-13); u = x14 + x13 | 0; x15 ^= u<<18 | u>>>(32-18); } o[ 0] = x0 >>> 0 & 0xff; o[ 1] = x0 >>> 8 & 0xff; o[ 2] = x0 >>> 16 & 0xff; o[ 3] = x0 >>> 24 & 0xff; o[ 4] = x5 >>> 0 & 0xff; o[ 5] = x5 >>> 8 & 0xff; o[ 6] = x5 >>> 16 & 0xff; o[ 7] = x5 >>> 24 & 0xff; o[ 8] = x10 >>> 0 & 0xff; o[ 9] = x10 >>> 8 & 0xff; o[10] = x10 >>> 16 & 0xff; o[11] = x10 >>> 24 & 0xff; o[12] = x15 >>> 0 & 0xff; o[13] = x15 >>> 8 & 0xff; o[14] = x15 >>> 16 & 0xff; o[15] = x15 >>> 24 & 0xff; o[16] = x6 >>> 0 & 0xff; o[17] = x6 >>> 8 & 0xff; o[18] = x6 >>> 16 & 0xff; o[19] = x6 >>> 24 & 0xff; o[20] = x7 >>> 0 & 0xff; o[21] = x7 >>> 8 & 0xff; o[22] = x7 >>> 16 & 0xff; o[23] = x7 >>> 24 & 0xff; o[24] = x8 >>> 0 & 0xff; o[25] = x8 >>> 8 & 0xff; o[26] = x8 >>> 16 & 0xff; o[27] = x8 >>> 24 & 0xff; o[28] = x9 >>> 0 & 0xff; o[29] = x9 >>> 8 & 0xff; o[30] = x9 >>> 16 & 0xff; o[31] = x9 >>> 24 & 0xff; } function crypto_core_salsa20(out,inp,k,c) { core_salsa20(out,inp,k,c); } function crypto_core_hsalsa20(out,inp,k,c) { core_hsalsa20(out,inp,k,c); } var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); // "expand 32-byte k" function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { var z = new Uint8Array(16), x = new Uint8Array(64); var u, i; for (i = 0; i < 16; i++) z[i] = 0; for (i = 0; i < 8; i++) z[i] = n[i]; while (b >= 64) { crypto_core_salsa20(x,z,k,sigma); for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i]; u = 1; for (i = 8; i < 16; i++) { u = u + (z[i] & 0xff) | 0; z[i] = u & 0xff; u >>>= 8; } b -= 64; cpos += 64; mpos += 64; } if (b > 0) { crypto_core_salsa20(x,z,k,sigma); for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i]; } return 0; } function crypto_stream_salsa20(c,cpos,b,n,k) { var z = new Uint8Array(16), x = new Uint8Array(64); var u, i; for (i = 0; i < 16; i++) z[i] = 0; for (i = 0; i < 8; i++) z[i] = n[i]; while (b >= 64) { crypto_core_salsa20(x,z,k,sigma); for (i = 0; i < 64; i++) c[cpos+i] = x[i]; u = 1; for (i = 8; i < 16; i++) { u = u + (z[i] & 0xff) | 0; z[i] = u & 0xff; u >>>= 8; } b -= 64; cpos += 64; } if (b > 0) { crypto_core_salsa20(x,z,k,sigma); for (i = 0; i < b; i++) c[cpos+i] = x[i]; } return 0; } function crypto_stream(c,cpos,d,n,k) { var s = new Uint8Array(32); crypto_core_hsalsa20(s,n,k,sigma); var sn = new Uint8Array(8); for (var i = 0; i < 8; i++) sn[i] = n[i+16]; return crypto_stream_salsa20(c,cpos,d,sn,s); } function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { var s = new Uint8Array(32); crypto_core_hsalsa20(s,n,k,sigma); var sn = new Uint8Array(8); for (var i = 0; i < 8; i++) sn[i] = n[i+16]; return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s); } /* * Port of Andrew Moon's Poly1305-donna-16. Public domain. * https://github.com/floodyberry/poly1305-donna */ var poly1305 = function(key) { this.buffer = new Uint8Array(16); this.r = new Uint16Array(10); this.h = new Uint16Array(10); this.pad = new Uint16Array(8); this.leftover = 0; this.fin = 0; var t0, t1, t2, t3, t4, t5, t6, t7; t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff; t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; this.r[5] = ((t4 >>> 1)) & 0x1ffe; t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; this.r[9] = ((t7 >>> 5)) & 0x007f; this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; }; poly1305.prototype.blocks = function(m, mpos, bytes) { var hibit = this.fin ? 0 : (1 << 11); var t0, t1, t2, t3, t4, t5, t6, t7, c; var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; var h0 = this.h[0], h1 = this.h[1], h2 = this.h[2], h3 = this.h[3], h4 = this.h[4], h5 = this.h[5], h6 = this.h[6], h7 = this.h[7], h8 = this.h[8], h9 = this.h[9]; var r0 = this.r[0], r1 = this.r[1], r2 = this.r[2], r3 = this.r[3], r4 = this.r[4], r5 = this.r[5], r6 = this.r[6], r7 = this.r[7], r8 = this.r[8], r9 = this.r[9]; while (bytes >= 16) { t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff; t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; h5 += ((t4 >>> 1)) & 0x1fff; t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; h9 += ((t7 >>> 5)) | hibit; c = 0; d0 = c; d0 += h0 * r0; d0 += h1 * (5 * r9); d0 += h2 * (5 * r8); d0 += h3 * (5 * r7); d0 += h4 * (5 * r6); c = (d0 >>> 13); d0 &= 0x1fff; d0 += h5 * (5 * r5); d0 += h6 * (5 * r4); d0 += h7 * (5 * r3); d0 += h8 * (5 * r2); d0 += h9 * (5 * r1); c += (d0 >>> 13); d0 &= 0x1fff; d1 = c; d1 += h0 * r1; d1 += h1 * r0; d1 += h2 * (5 * r9); d1 += h3 * (5 * r8); d1 += h4 * (5 * r7); c = (d1 >>> 13); d1 &= 0x1fff; d1 += h5 * (5 * r6); d1 += h6 * (5 * r5); d1 += h7 * (5 * r4); d1 += h8 * (5 * r3); d1 += h9 * (5 * r2); c += (d1 >>> 13); d1 &= 0x1fff; d2 = c; d2 += h0 * r2; d2 += h1 * r1; d2 += h2 * r0; d2 += h3 * (5 * r9); d2 += h4 * (5 * r8); c = (d2 >>> 13); d2 &= 0x1fff; d2 += h5 * (5 * r7); d2 += h6 * (5 * r6); d2 += h7 * (5 * r5); d2 += h8 * (5 * r4); d2 += h9 * (5 * r3); c += (d2 >>> 13); d2 &= 0x1fff; d3 = c; d3 += h0 * r3; d3 += h1 * r2; d3 += h2 * r1; d3 += h3 * r0; d3 += h4 * (5 * r9); c = (d3 >>> 13); d3 &= 0x1fff; d3 += h5 * (5 * r8); d3 += h6 * (5 * r7); d3 += h7 * (5 * r6); d3 += h8 * (5 * r5); d3 += h9 * (5 * r4); c += (d3 >>> 13); d3 &= 0x1fff; d4 = c; d4 += h0 * r4; d4 += h1 * r3; d4 += h2 * r2; d4 += h3 * r1; d4 += h4 * r0; c = (d4 >>> 13); d4 &= 0x1fff; d4 += h5 * (5 * r9); d4 += h6 * (5 * r8); d4 += h7 * (5 * r7); d4 += h8 * (5 * r6); d4 += h9 * (5 * r5); c += (d4 >>> 13); d4 &= 0x1fff; d5 = c; d5 += h0 * r5; d5 += h1 * r4; d5 += h2 * r3; d5 += h3 * r2; d5 += h4 * r1; c = (d5 >>> 13); d5 &= 0x1fff; d5 += h5 * r0; d5 += h6 * (5 * r9); d5 += h7 * (5 * r8); d5 += h8 * (5 * r7); d5 += h9 * (5 * r6); c += (d5 >>> 13); d5 &= 0x1fff; d6 = c; d6 += h0 * r6; d6 += h1 * r5; d6 += h2 * r4; d6 += h3 * r3; d6 += h4 * r2; c = (d6 >>> 13); d6 &= 0x1fff; d6 += h5 * r1; d6 += h6 * r0; d6 += h7 * (5 * r9); d6 += h8 * (5 * r8); d6 += h9 * (5 * r7); c += (d6 >>> 13); d6 &= 0x1fff; d7 = c; d7 += h0 * r7; d7 += h1 * r6; d7 += h2 * r5; d7 += h3 * r4; d7 += h4 * r3; c = (d7 >>> 13); d7 &= 0x1fff; d7 += h5 * r2; d7 += h6 * r1; d7 += h7 * r0; d7 += h8 * (5 * r9); d7 += h9 * (5 * r8); c += (d7 >>> 13); d7 &= 0x1fff; d8 = c; d8 += h0 * r8; d8 += h1 * r7; d8 += h2 * r6; d8 += h3 * r5; d8 += h4 * r4; c = (d8 >>> 13); d8 &= 0x1fff; d8 += h5 * r3; d8 += h6 * r2; d8 += h7 * r1; d8 += h8 * r0; d8 += h9 * (5 * r9); c += (d8 >>> 13); d8 &= 0x1fff; d9 = c; d9 += h0 * r9; d9 += h1 * r8; d9 += h2 * r7; d9 += h3 * r6; d9 += h4 * r5; c = (d9 >>> 13); d9 &= 0x1fff; d9 += h5 * r4; d9 += h6 * r3; d9 += h7 * r2; d9 += h8 * r1; d9 += h9 * r0; c += (d9 >>> 13); d9 &= 0x1fff; c = (((c << 2) + c)) | 0; c = (c + d0) | 0; d0 = c & 0x1fff; c = (c >>> 13); d1 += c; h0 = d0; h1 = d1; h2 = d2; h3 = d3; h4 = d4; h5 = d5; h6 = d6; h7 = d7; h8 = d8; h9 = d9; mpos += 16; bytes -= 16; } this.h[0] = h0; this.h[1] = h1; this.h[2] = h2; this.h[3] = h3; this.h[4] = h4; this.h[5] = h5; this.h[6] = h6; this.h[7] = h7; this.h[8] = h8; this.h[9] = h9; }; poly1305.prototype.finish = function(mac, macpos) { var g = new Uint16Array(10); var c, mask, f, i; if (this.leftover) { i = this.leftover; this.buffer[i++] = 1; for (; i < 16; i++) this.buffer[i] = 0; this.fin = 1; this.blocks(this.buffer, 0, 16); } c = this.h[1] >>> 13; this.h[1] &= 0x1fff; for (i = 2; i < 10; i++) { this.h[i] += c; c = this.h[i] >>> 13; this.h[i] &= 0x1fff; } this.h[0] += (c * 5); c = this.h[0] >>> 13; this.h[0] &= 0x1fff; this.h[1] += c; c = this.h[1] >>> 13; this.h[1] &= 0x1fff; this.h[2] += c; g[0] = this.h[0] + 5; c = g[0] >>> 13; g[0] &= 0x1fff; for (i = 1; i < 10; i++) { g[i] = this.h[i] + c; c = g[i] >>> 13; g[i] &= 0x1fff; } g[9] -= (1 << 13); mask = (c ^ 1) - 1; for (i = 0; i < 10; i++) g[i] &= mask; mask = ~mask; for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff; this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff; this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff; this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff; this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff; this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff; this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff; f = this.h[0] + this.pad[0]; this.h[0] = f & 0xffff; for (i = 1; i < 8; i++) { f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; this.h[i] = f & 0xffff; } mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff; mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff; mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff; mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff; mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff; mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff; mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff; mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff; mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff; mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff; mac[macpos+10] = (this.h[5] >>> 0) & 0xff; mac[macpos+11] = (this.h[5] >>> 8) & 0xff; mac[macpos+12] = (this.h[6] >>> 0) & 0xff; mac[macpos+13] = (this.h[6] >>> 8) & 0xff; mac[macpos+14] = (this.h[7] >>> 0) & 0xff; mac[macpos+15] = (this.h[7] >>> 8) & 0xff; }; poly1305.prototype.update = function(m, mpos, bytes) { var i, want; if (this.leftover) { want = (16 - this.leftover); if (want > bytes) want = bytes; for (i = 0; i < want; i++) this.buffer[this.leftover + i] = m[mpos+i]; bytes -= want; mpos += want; this.leftover += want; if (this.leftover < 16) return; this.blocks(this.buffer, 0, 16); this.leftover = 0; } if (bytes >= 16) { want = bytes - (bytes % 16); this.blocks(m, mpos, want); mpos += want; bytes -= want; } if (bytes) { for (i = 0; i < bytes; i++) this.buffer[this.leftover + i] = m[mpos+i]; this.leftover += bytes; } }; function crypto_onetimeauth(out, outpos, m, mpos, n, k) { var s = new poly1305(k); s.update(m, mpos, n); s.finish(out, outpos); return 0; } function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { var x = new Uint8Array(16); crypto_onetimeauth(x,0,m,mpos,n,k); return crypto_verify_16(h,hpos,x,0); } function crypto_secretbox(c,m,d,n,k) { var i; if (d < 32) return -1; crypto_stream_xor(c,0,m,0,d,n,k); crypto_onetimeauth(c, 16, c, 32, d - 32, c); for (i = 0; i < 16; i++) c[i] = 0; return 0; } function crypto_secretbox_open(m,c,d,n,k) { var i; var x = new Uint8Array(32); if (d < 32) return -1; crypto_stream(x,0,32,n,k); if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; crypto_stream_xor(m,0,c,0,d,n,k); for (i = 0; i < 32; i++) m[i] = 0; return 0; } function set25519(r, a) { var i; for (i = 0; i < 16; i++) r[i] = a[i]|0; } function car25519(o) { var i, v, c = 1; for (i = 0; i < 16; i++) { v = o[i] + c + 65535; c = Math.floor(v / 65536); o[i] = v - c * 65536; } o[0] += c-1 + 37 * (c-1); } function sel25519(p, q, b) { var t, c = ~(b-1); for (var i = 0; i < 16; i++) { t = c & (p[i] ^ q[i]); p[i] ^= t; q[i] ^= t; } } function pack25519(o, n) { var i, j, b; var m = gf(), t = gf(); for (i = 0; i < 16; i++) t[i] = n[i]; car25519(t); car25519(t); car25519(t); for (j = 0; j < 2; j++) { m[0] = t[0] - 0xffed; for (i = 1; i < 15; i++) { m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); m[i-1] &= 0xffff; } m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); b = (m[15]>>16) & 1; m[14] &= 0xffff; sel25519(t, m, 1-b); } for (i = 0; i < 16; i++) { o[2*i] = t[i] & 0xff; o[2*i+1] = t[i]>>8; } } function neq25519(a, b) { var c = new Uint8Array(32), d = new Uint8Array(32); pack25519(c, a); pack25519(d, b); return crypto_verify_32(c, 0, d, 0); } function par25519(a) { var d = new Uint8Array(32); pack25519(d, a); return d[0] & 1; } function unpack25519(o, n) { var i; for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); o[15] &= 0x7fff; } function A(o, a, b) { for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; } function Z(o, a, b) { for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; } function M(o, a, b) { var v, c, t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11], b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; v = a[0]; t0 += v * b0; t1 += v * b1; t2 += v * b2; t3 += v * b3; t4 += v * b4; t5 += v * b5; t6 += v * b6; t7 += v * b7; t8 += v * b8; t9 += v * b9; t10 += v * b10; t11 += v * b11; t12 += v * b12; t13 += v * b13; t14 += v * b14; t15 += v * b15; v = a[1]; t1 += v * b0; t2 += v * b1; t3 += v * b2; t4 += v * b3; t5 += v * b4; t6 += v * b5; t7 += v * b6; t8 += v * b7; t9 += v * b8; t10 += v * b9; t11 += v * b10; t12 += v * b11; t13 += v * b12; t14 += v * b13; t15 += v * b14; t16 += v * b15; v = a[2]; t2 += v * b0; t3 += v * b1; t4 += v * b2; t5 += v * b3; t6 += v * b4; t7 += v * b5; t8 += v * b6; t9 += v * b7; t10 += v * b8; t11 += v * b9; t12 += v * b10; t13 += v * b11; t14 += v * b12; t15 += v * b13; t16 += v * b14; t17 += v * b15; v = a[3]; t3 += v * b0; t4 += v * b1; t5 += v * b2; t6 += v * b3; t7 += v * b4; t8 += v * b5; t9 += v * b6; t10 += v * b7; t11 += v * b8; t12 += v * b9; t13 += v * b10; t14 += v * b11; t15 += v * b12; t16 += v * b13; t17 += v * b14; t18 += v * b15; v = a[4]; t4 += v * b0; t5 += v * b1; t6 += v * b2; t7 += v * b3; t8 += v * b4; t9 += v * b5; t10 += v * b6; t11 += v * b7; t12 += v * b8; t13 += v * b9; t14 += v * b10; t15 += v * b11; t16 += v * b12; t17 += v * b13; t18 += v * b14; t19 += v * b15; v = a[5]; t5 += v * b0; t6 += v * b1; t7 += v * b2; t8 += v * b3; t9 += v * b4; t10 += v * b5; t11 += v * b6; t12 += v * b7; t13 += v * b8; t14 += v * b9; t15 += v * b10; t16 += v * b11; t17 += v * b12; t18 += v * b13; t19 += v * b14; t20 += v * b15; v = a[6]; t6 += v * b0; t7 += v * b1; t8 += v * b2; t9 += v * b3; t10 += v * b4; t11 += v * b5; t12 += v * b6; t13 += v * b7; t14 += v * b8; t15 += v * b9; t16 += v * b10; t17 += v * b11; t18 += v * b12; t19 += v * b13; t20 += v * b14; t21 += v * b15; v = a[7]; t7 += v * b0; t8 += v * b1; t9 += v * b2; t10 += v * b3; t11 += v * b4; t12 += v * b5; t13 += v * b6; t14 += v * b7; t15 += v * b8; t16 += v * b9; t17 += v * b10; t18 += v * b11; t19 += v * b12; t20 += v * b13; t21 += v * b14; t22 += v * b15; v = a[8]; t8 += v * b0; t9 += v * b1; t10 += v * b2; t11 += v * b3; t12 += v * b4; t13 += v * b5; t14 += v * b6; t15 += v * b7; t16 += v * b8; t17 += v * b9; t18 += v * b10; t19 += v * b11; t20 += v * b12; t21 += v * b13; t22 += v * b14; t23 += v * b15; v = a[9]; t9 += v * b0; t10 += v * b1; t11 += v * b2; t12 += v * b3; t13 += v * b4; t14 += v * b5; t15 += v * b6; t16 += v * b7; t17 += v * b8; t18 += v * b9; t19 += v * b10; t20 += v * b11; t21 += v * b12; t22 += v * b13; t23 += v * b14; t24 += v * b15; v = a[10]; t10 += v * b0; t11 += v * b1; t12 += v * b2; t13 += v * b3; t14 += v * b4; t15 += v * b5; t16 += v * b6; t17 += v * b7; t18 += v * b8; t19 += v * b9; t20 += v * b10; t21 += v * b11; t22 += v * b12; t23 += v * b13; t24 += v * b14; t25 += v * b15; v = a[11]; t11 += v * b0; t12 += v * b1; t13 += v * b2; t14 += v * b3; t15 += v * b4; t16 += v * b5; t17 += v * b6; t18 += v * b7; t19 += v * b8; t20 += v * b9; t21 += v * b10; t22 += v * b11; t23 += v * b12; t24 += v * b13; t25 += v * b14; t26 += v * b15; v = a[12]; t12 += v * b0; t13 += v * b1; t14 += v * b2; t15 += v * b3; t16 += v * b4; t17 += v * b5; t18 += v * b6; t19 += v * b7; t20 += v * b8; t21 += v * b9; t22 += v * b10; t23 += v * b11; t24 += v * b12; t25 += v * b13; t26 += v * b14; t27 += v * b15; v = a[13]; t13 += v * b0; t14 += v * b1; t15 += v * b2; t16 += v * b3; t17 += v * b4; t18 += v * b5; t19 += v * b6; t20 += v * b7; t21 += v * b8; t22 += v * b9; t23 += v * b10; t24 += v * b11; t25 += v * b12; t26 += v * b13; t27 += v * b14; t28 += v * b15; v = a[14]; t14 += v * b0; t15 += v * b1; t16 += v * b2; t17 += v * b3; t18 += v * b4; t19 += v * b5; t20 += v * b6; t21 += v * b7; t22 += v * b8; t23 += v * b9; t24 += v * b10; t25 += v * b11; t26 += v * b12; t27 += v * b13; t28 += v * b14; t29 += v * b15; v = a[15]; t15 += v * b0; t16 += v * b1; t17 += v * b2; t18 += v * b3; t19 += v * b4; t20 += v * b5; t21 += v * b6; t22 += v * b7; t23 += v * b8; t24 += v * b9; t25 += v * b10; t26 += v * b11; t27 += v * b12; t28 += v * b13; t29 += v * b14; t30 += v * b15; t0 += 38 * t16; t1 += 38 * t17; t2 += 38 * t18; t3 += 38 * t19; t4 += 38 * t20; t5 += 38 * t21; t6 += 38 * t22; t7 += 38 * t23; t8 += 38 * t24; t9 += 38 * t25; t10 += 38 * t26; t11 += 38 * t27; t12 += 38 * t28; t13 += 38 * t29; t14 += 38 * t30; // t15 left as is // first car c = 1; v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; t0 += c-1 + 37 * (c-1); // second car c = 1; v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; t0 += c-1 + 37 * (c-1); o[ 0] = t0; o[ 1] = t1; o[ 2] = t2; o[ 3] = t3; o[ 4] = t4; o[ 5] = t5; o[ 6] = t6; o[ 7] = t7; o[ 8] = t8; o[ 9] = t9; o[10] = t10; o[11] = t11; o[12] = t12; o[13] = t13; o[14] = t14; o[15] = t15; } function S(o, a) { M(o, a, a); } function inv25519(o, i) { var c = gf(); var a; for (a = 0; a < 16; a++) c[a] = i[a]; for (a = 253; a >= 0; a--) { S(c, c); if(a !== 2 && a !== 4) M(c, c, i); } for (a = 0; a < 16; a++) o[a] = c[a]; } function pow2523(o, i) { var c = gf(); var a; for (a = 0; a < 16; a++) c[a] = i[a]; for (a = 250; a >= 0; a--) { S(c, c); if(a !== 1) M(c, c, i); } for (a = 0; a < 16; a++) o[a] = c[a]; } function crypto_scalarmult(q, n, p) { var z = new Uint8Array(32); var x = new Float64Array(80), r, i; var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(); for (i = 0; i < 31; i++) z[i] = n[i]; z[31]=(n[31]&127)|64; z[0]&=248; unpack25519(x,p); for (i = 0; i < 16; i++) { b[i]=x[i]; d[i]=a[i]=c[i]=0; } a[0]=d[0]=1; for (i=254; i>=0; --i) { r=(z[i>>>3]>>>(i&7))&1; sel25519(a,b,r); sel25519(c,d,r); A(e,a,c); Z(a,a,c); A(c,b,d); Z(b,b,d); S(d,e); S(f,a); M(a,c,a); M(c,b,e); A(e,a,c); Z(a,a,c); S(b,a); Z(c,d,f); M(a,c,_121665); A(a,a,d); M(c,c,a); M(a,d,f); M(d,b,x); S(b,e); sel25519(a,b,r); sel25519(c,d,r); } for (i = 0; i < 16; i++) { x[i+16]=a[i]; x[i+32]=c[i]; x[i+48]=b[i]; x[i+64]=d[i]; } var x32 = x.subarray(32); var x16 = x.subarray(16); inv25519(x32,x32); M(x16,x16,x32); pack25519(q,x16); return 0; } function crypto_scalarmult_base(q, n) { return crypto_scalarmult(q, n, _9); } function crypto_box_keypair(y, x) { randombytes(x, 32); return crypto_scalarmult_base(y, x); } function crypto_box_beforenm(k, y, x) { var s = new Uint8Array(32); crypto_scalarmult(s, x, y); return crypto_core_hsalsa20(k, _0, s, sigma); } var crypto_box_afternm = crypto_secretbox; var crypto_box_open_afternm = crypto_secretbox_open; function crypto_box(c, m, d, n, y, x) { var k = new Uint8Array(32); crypto_box_beforenm(k, y, x); return crypto_box_afternm(c, m, d, n, k); } function crypto_box_open(m, c, d, n, y, x) { var k = new Uint8Array(32); crypto_box_beforenm(k, y, x); return crypto_box_open_afternm(m, c, d, n, k); } var K = [ 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 ]; function crypto_hashblocks_hl(hh, hl, m, n) { var wh = new Int32Array(16), wl = new Int32Array(16), bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, th, tl, i, j, h, l, a, b, c, d; var ah0 = hh[0], ah1 = hh[1], ah2 = hh[2], ah3 = hh[3], ah4 = hh[4], ah5 = hh[5], ah6 = hh[6], ah7 = hh[7], al0 = hl[0], al1 = hl[1], al2 = hl[2], al3 = hl[3], al4 = hl[4], al5 = hl[5], al6 = hl[6], al7 = hl[7]; var pos = 0; while (n >= 128) { for (i = 0; i < 16; i++) { j = 8 * i + pos; wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3]; wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7]; } for (i = 0; i < 80; i++) { bh0 = ah0; bh1 = ah1; bh2 = ah2; bh3 = ah3; bh4 = ah4; bh5 = ah5; bh6 = ah6; bh7 = ah7; bl0 = al0; bl1 = al1; bl2 = al2; bl3 = al3; bl4 = al4; bl5 = al5; bl6 = al6; bl7 = al7; // add h = ah7; l = al7; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; // Sigma1 h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32)))); l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32)))); a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; // Ch h = (ah4 & ah5) ^ (~ah4 & ah6); l = (al4 & al5) ^ (~al4 & al6); a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; // K h = K[i*2]; l = K[i*2+1]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; // w h = wh[i%16]; l = wl[i%16]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; th = c & 0xffff | d << 16; tl = a & 0xffff | b << 16; // add h = th; l = tl; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; // Sigma0 h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32)))); l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32)))); a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; // Maj h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2); l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2); a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; bh7 = (c & 0xffff) | (d << 16); bl7 = (a & 0xffff) | (b << 16); // add h = bh3; l = bl3; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = th; l = tl; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; bh3 = (c & 0xffff) | (d << 16); bl3 = (a & 0xffff) | (b << 16); ah1 = bh0; ah2 = bh1; ah3 = bh2; ah4 = bh3; ah5 = bh4; ah6 = bh5; ah7 = bh6; ah0 = bh7; al1 = bl0; al2 = bl1; al3 = bl2; al4 = bl3; al5 = bl4; al6 = bl5; al7 = bl6; al0 = bl7; if (i%16 === 15) { for (j = 0; j < 16; j++) { // add h = wh[j]; l = wl[j]; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = wh[(j+9)%16]; l = wl[(j+9)%16]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; // sigma0 th = wh[(j+1)%16]; tl = wl[(j+1)%16]; h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7); l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7))); a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; // sigma1 th = wh[(j+14)%16]; tl = wl[(j+14)%16]; h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6); l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6))); a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; wh[j] = (c & 0xffff) | (d << 16); wl[j] = (a & 0xffff) | (b << 16); } } } // add h = ah0; l = al0; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = hh[0]; l = hl[0]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[0] = ah0 = (c & 0xffff) | (d << 16); hl[0] = al0 = (a & 0xffff) | (b << 16); h = ah1; l = al1; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = hh[1]; l = hl[1]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[1] = ah1 = (c & 0xffff) | (d << 16); hl[1] = al1 = (a & 0xffff) | (b << 16); h = ah2; l = al2; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = hh[2]; l = hl[2]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[2] = ah2 = (c & 0xffff) | (d << 16); hl[2] = al2 = (a & 0xffff) | (b << 16); h = ah3; l = al3; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = hh[3]; l = hl[3]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[3] = ah3 = (c & 0xffff) | (d << 16); hl[3] = al3 = (a & 0xffff) | (b << 16); h = ah4; l = al4; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = hh[4]; l = hl[4]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[4] = ah4 = (c & 0xffff) | (d << 16); hl[4] = al4 = (a & 0xffff) | (b << 16); h = ah5; l = al5; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = hh[5]; l = hl[5]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[5] = ah5 = (c & 0xffff) | (d << 16); hl[5] = al5 = (a & 0xffff) | (b << 16); h = ah6; l = al6; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = hh[6]; l = hl[6]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[6] = ah6 = (c & 0xffff) | (d << 16); hl[6] = al6 = (a & 0xffff) | (b << 16); h = ah7; l = al7; a = l & 0xffff; b = l >>> 16; c = h & 0xffff; d = h >>> 16; h = hh[7]; l = hl[7]; a += l & 0xffff; b += l >>> 16; c += h & 0xffff; d += h >>> 16; b += a >>> 16; c += b >>> 16; d += c >>> 16; hh[7] = ah7 = (c & 0xffff) | (d << 16); hl[7] = al7 = (a & 0xffff) | (b << 16); pos += 128; n -= 128; } return n; } function crypto_hash(out, m, n) { var hh = new Int32Array(8), hl = new Int32Array(8), x = new Uint8Array(256), i, b = n; hh[0] = 0x6a09e667; hh[1] = 0xbb67ae85; hh[2] = 0x3c6ef372; hh[3] = 0xa54ff53a; hh[4] = 0x510e527f; hh[5] = 0x9b05688c; hh[6] = 0x1f83d9ab; hh[7] = 0x5be0cd19; hl[0] = 0xf3bcc908; hl[1] = 0x84caa73b; hl[2] = 0xfe94f82b; hl[3] = 0x5f1d36f1; hl[4] = 0xade682d1; hl[5] = 0x2b3e6c1f; hl[6] = 0xfb41bd6b; hl[7] = 0x137e2179; crypto_hashblocks_hl(hh, hl, m, n); n %= 128; for (i = 0; i < n; i++) x[i] = m[b-n+i]; x[n] = 128; n = 256-128*(n<112?1:0); x[n-9] = 0; ts64(x, n-8, (b / 0x20000000) | 0, b << 3); crypto_hashblocks_hl(hh, hl, x, n); for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]); return 0; } function add(p, q) { var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(), g = gf(), h = gf(), t = gf(); Z(a, p[1], p[0]); Z(t, q[1], q[0]); M(a, a, t); A(b, p[0], p[1]); A(t, q[0], q[1]); M(b, b, t); M(c, p[3], q[3]); M(c, c, D2); M(d, p[2], q[2]); A(d, d, d); Z(e, b, a); Z(f, d, c); A(g, d, c); A(h, b, a); M(p[0], e, f); M(p[1], h, g); M(p[2], g, f); M(p[3], e, h); } function cswap(p, q, b) { var i; for (i = 0; i < 4; i++) { sel25519(p[i], q[i], b); } } function pack(r, p) { var tx = gf(), ty = gf(), zi = gf(); inv25519(zi, p[2]); M(tx, p[0], zi); M(ty, p[1], zi); pack25519(r, ty); r[31] ^= par25519(tx) << 7; } function scalarmult(p, q, s) { var b, i; set25519(p[0], gf0); set25519(p[1], gf1); set25519(p[2], gf1); set25519(p[3], gf0); for (i = 255; i >= 0; --i) { b = (s[(i/8)|0] >> (i&7)) & 1; cswap(p, q, b); add(q, p); add(p, p); cswap(p, q, b); } } function scalarbase(p, s) { var q = [gf(), gf(), gf(), gf()]; set25519(q[0], X); set25519(q[1], Y); set25519(q[2], gf1); M(q[3], X, Y); scalarmult(p, q, s); } function crypto_sign_keypair(pk, sk, seeded) { var d = new Uint8Array(64); var p = [gf(), gf(), gf(), gf()]; var i; if (!seeded) randombytes(sk, 32); crypto_hash(d, sk, 32); d[0] &= 248; d[31] &= 127; d[31] |= 64; scalarbase(p, d); pack(pk, p); for (i = 0; i < 32; i++) sk[i+32] = pk[i]; return 0; } var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); function modL(r, x) { var carry, i, j, k; for (i = 63; i >= 32; --i) { carry = 0; for (j = i - 32, k = i - 12; j < k; ++j) { x[j] += carry - 16 * x[i] * L[j - (i - 32)]; carry = (x[j] + 128) >> 8; x[j] -= carry * 256; } x[j] += carry; x[i] = 0; } carry = 0; for (j = 0; j < 32; j++) { x[j] += carry - (x[31] >> 4) * L[j]; carry = x[j] >> 8; x[j] &= 255; } for (j = 0; j < 32; j++) x[j] -= carry * L[j]; for (i = 0; i < 32; i++) { x[i+1] += x[i] >> 8; r[i] = x[i] & 255; } } function reduce(r) { var x = new Float64Array(64), i; for (i = 0; i < 64; i++) x[i] = r[i]; for (i = 0; i < 64; i++) r[i] = 0; modL(r, x); } // Note: difference from C - smlen returned, not passed as argument. function crypto_sign(sm, m, n, sk) { var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); var i, j, x = new Float64Array(64); var p = [gf(), gf(), gf(), gf()]; crypto_hash(d, sk, 32); d[0] &= 248; d[31] &= 127; d[31] |= 64; var smlen = n + 64; for (i = 0; i < n; i++) sm[64 + i] = m[i]; for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; crypto_hash(r, sm.subarray(32), n+32); reduce(r); scalarbase(p, r); pack(sm, p); for (i = 32; i < 64; i++) sm[i] = sk[i]; crypto_hash(h, sm, n + 64); reduce(h); for (i = 0; i < 64; i++) x[i] = 0; for (i = 0; i < 32; i++) x[i] = r[i]; for (i = 0; i < 32; i++) { for (j = 0; j < 32; j++) { x[i+j] += h[i] * d[j]; } } modL(sm.subarray(32), x); return smlen; } function unpackneg(r, p) { var t = gf(), chk = gf(), num = gf(), den = gf(), den2 = gf(), den4 = gf(), den6 = gf(); set25519(r[2], gf1); unpack25519(r[1], p); S(num, r[1]); M(den, num, D); Z(num, num, r[2]); A(den, r[2], den); S(den2, den); S(den4, den2); M(den6, den4, den2); M(t, den6, num); M(t, t, den); pow2523(t, t); M(t, t, num); M(t, t, den); M(t, t, den); M(r[0], t, den); S(chk, r[0]); M(chk, chk, den); if (neq25519(chk, num)) M(r[0], r[0], I); S(chk, r[0]); M(chk, chk, den); if (neq25519(chk, num)) return -1; if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); M(r[3], r[0], r[1]); return 0; } function crypto_sign_open(m, sm, n, pk) { var i, mlen; var t = new Uint8Array(32), h = new Uint8Array(64); var p = [gf(), gf(), gf(), gf()], q = [gf(), gf(), gf(), gf()]; mlen = -1; if (n < 64) return -1; if (unpackneg(q, pk)) return -1; for (i = 0; i < n; i++) m[i] = sm[i]; for (i = 0; i < 32; i++) m[i+32] = pk[i]; crypto_hash(h, m, n); reduce(h); scalarmult(p, q, h); scalarbase(q, sm.subarray(32)); add(p, q); pack(t, p); n -= 64; if (crypto_verify_32(sm, 0, t, 0)) { for (i = 0; i < n; i++) m[i] = 0; return -1; } for (i = 0; i < n; i++) m[i] = sm[i + 64]; mlen = n; return mlen; } var crypto_secretbox_KEYBYTES = 32, crypto_secretbox_NONCEBYTES = 24, crypto_secretbox_ZEROBYTES = 32, crypto_secretbox_BOXZEROBYTES = 16, crypto_scalarmult_BYTES = 32, crypto_scalarmult_SCALARBYTES = 32, crypto_box_PUBLICKEYBYTES = 32, crypto_box_SECRETKEYBYTES = 32, crypto_box_BEFORENMBYTES = 32, crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, crypto_sign_BYTES = 64, crypto_sign_PUBLICKEYBYTES = 32, crypto_sign_SECRETKEYBYTES = 64, crypto_sign_SEEDBYTES = 32, crypto_hash_BYTES = 64; nacl.lowlevel = { crypto_core_hsalsa20: crypto_core_hsalsa20, crypto_stream_xor: crypto_stream_xor, crypto_stream: crypto_stream, crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, crypto_stream_salsa20: crypto_stream_salsa20, crypto_onetimeauth: crypto_onetimeauth, crypto_onetimeauth_verify: crypto_onetimeauth_verify, crypto_verify_16: crypto_verify_16, crypto_verify_32: crypto_verify_32, crypto_secretbox: crypto_secretbox, crypto_secretbox_open: crypto_secretbox_open, crypto_scalarmult: crypto_scalarmult, crypto_scalarmult_base: crypto_scalarmult_base, crypto_box_beforenm: crypto_box_beforenm, crypto_box_afternm: crypto_box_afternm, crypto_box: crypto_box, crypto_box_open: crypto_box_open, crypto_box_keypair: crypto_box_keypair, crypto_hash: crypto_hash, crypto_sign: crypto_sign, crypto_sign_keypair: crypto_sign_keypair, crypto_sign_open: crypto_sign_open, crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, crypto_sign_BYTES: crypto_sign_BYTES, crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, crypto_hash_BYTES: crypto_hash_BYTES }; /* High-level API */ function checkLengths(k, n) { if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); } function checkBoxLengths(pk, sk) { if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); } function checkArrayTypes() { var t, i; for (i = 0; i < arguments.length; i++) { if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') throw new TypeError('unexpected type ' + t + ', use Uint8Array'); } } function cleanup(arr) { for (var i = 0; i < arr.length; i++) arr[i] = 0; } // TODO: Completely remove this in v0.15. if (!nacl.util) { nacl.util = {}; nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); }; } nacl.randomBytes = function(n) { var b = new Uint8Array(n); randombytes(b, n); return b; }; nacl.secretbox = function(msg, nonce, key) { checkArrayTypes(msg, nonce, key); checkLengths(key, nonce); var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); var c = new Uint8Array(m.length); for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; crypto_secretbox(c, m, m.length, nonce, key); return c.subarray(crypto_secretbox_BOXZEROBYTES); }; nacl.secretbox.open = function(box, nonce, key) { checkArrayTypes(box, nonce, key); checkLengths(key, nonce); var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); var m = new Uint8Array(c.length); for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; if (c.length < 32) return false; if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; return m.subarray(crypto_secretbox_ZEROBYTES); }; nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; nacl.scalarMult = function(n, p) { checkArrayTypes(n, p); if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); var q = new Uint8Array(crypto_scalarmult_BYTES); crypto_scalarmult(q, n, p); return q; }; nacl.scalarMult.base = function(n) { checkArrayTypes(n); if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); var q = new Uint8Array(crypto_scalarmult_BYTES); crypto_scalarmult_base(q, n); return q; }; nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; nacl.box = function(msg, nonce, publicKey, secretKey) { var k = nacl.box.before(publicKey, secretKey); return nacl.secretbox(msg, nonce, k); }; nacl.box.before = function(publicKey, secretKey) { checkArrayTypes(publicKey, secretKey); checkBoxLengths(publicKey, secretKey); var k = new Uint8Array(crypto_box_BEFORENMBYTES); crypto_box_beforenm(k, publicKey, secretKey); return k; }; nacl.box.after = nacl.secretbox; nacl.box.open = function(msg, nonce, publicKey, secretKey) { var k = nacl.box.before(publicKey, secretKey); return nacl.secretbox.open(msg, nonce, k); }; nacl.box.open.after = nacl.secretbox.open; nacl.box.keyPair = function() { var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); crypto_box_keypair(pk, sk); return {publicKey: pk, secretKey: sk}; }; nacl.box.keyPair.fromSecretKey = function(secretKey) { checkArrayTypes(secretKey); if (secretKey.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); crypto_scalarmult_base(pk, secretKey); return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; }; nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; nacl.box.nonceLength = crypto_box_NONCEBYTES; nacl.box.overheadLength = nacl.secretbox.overheadLength; nacl.sign = function(msg, secretKey) { checkArrayTypes(msg, secretKey); if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error('bad secret key size'); var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); crypto_sign(signedMsg, msg, msg.length, secretKey); return signedMsg; }; nacl.sign.open = function(signedMsg, publicKey) { if (arguments.length !== 2) throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); checkArrayTypes(signedMsg, publicKey); if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error('bad public key size'); var tmp = new Uint8Array(signedMsg.length); var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); if (mlen < 0) return null; var m = new Uint8Array(mlen); for (var i = 0; i < m.length; i++) m[i] = tmp[i]; return m; }; nacl.sign.detached = function(msg, secretKey) { var signedMsg = nacl.sign(msg, secretKey); var sig = new Uint8Array(crypto_sign_BYTES); for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; return sig; }; nacl.sign.detached.verify = function(msg, sig, publicKey) { checkArrayTypes(msg, sig, publicKey); if (sig.length !== crypto_sign_BYTES) throw new Error('bad signature size'); if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error('bad public key size'); var sm = new Uint8Array(crypto_sign_BYTES + msg.length); var m = new Uint8Array(crypto_sign_BYTES + msg.length); var i; for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); }; nacl.sign.keyPair = function() { var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); crypto_sign_keypair(pk, sk); return {publicKey: pk, secretKey: sk}; }; nacl.sign.keyPair.fromSecretKey = function(secretKey) { checkArrayTypes(secretKey); if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error('bad secret key size'); var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; }; nacl.sign.keyPair.fromSeed = function(seed) { checkArrayTypes(seed); if (seed.length !== crypto_sign_SEEDBYTES) throw new Error('bad seed size'); var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); for (var i = 0; i < 32; i++) sk[i] = seed[i]; crypto_sign_keypair(pk, sk, true); return {publicKey: pk, secretKey: sk}; }; nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; nacl.sign.seedLength = crypto_sign_SEEDBYTES; nacl.sign.signatureLength = crypto_sign_BYTES; nacl.hash = function(msg) { checkArrayTypes(msg); var h = new Uint8Array(crypto_hash_BYTES); crypto_hash(h, msg, msg.length); return h; }; nacl.hash.hashLength = crypto_hash_BYTES; nacl.verify = function(x, y) { checkArrayTypes(x, y); // Zero length arguments are considered not equal. if (x.length === 0 || y.length === 0) return false; if (x.length !== y.length) return false; return (vn(x, 0, y, 0, x.length) === 0) ? true : false; }; nacl.setPRNG = function(fn) { randombytes = fn; }; (function() { // Initialize PRNG if environment provides CSPRNG. // If not, methods calling randombytes will throw. var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; if (crypto && crypto.getRandomValues) { // Browsers. var QUOTA = 65536; nacl.setPRNG(function(x, n) { var i, v = new Uint8Array(n); for (i = 0; i < n; i += QUOTA) { crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); } for (i = 0; i < n; i++) x[i] = v[i]; cleanup(v); }); } else if (true) { // Node.js. crypto = __webpack_require__(94); if (crypto && crypto.randomBytes) { nacl.setPRNG(function(x, n) { var i, v = crypto.randomBytes(n); for (i = 0; i < n; i++) x[i] = v[i]; cleanup(v); }); } } })(); })(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); /***/ }), /* 93 */ /***/ (function(module, exports) { /* (ignored) */ /***/ }), /* 94 */ /***/ (function(module, exports) { /* (ignored) */ /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(26); /***/ }) /******/ ]); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA5MTdiODE0Y2E2M2Y2ODViMTY3YyIsIndlYnBhY2s6Ly8vLi9zcmMvY29ubmVjdGlvbi9nZXRBcGlVcmxzLmpzIiwid2VicGFjazovLy8uL3NyYy9yZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iczU4L2luZGV4LmpzIiwid2VicGFjazovLy8uL34vZml2ZS1iZWxscy1jb25kaXRpb24vZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdHJhbnNhY3Rpb24vdXRpbHMvY2NKc29uaWZ5LmpzIiwid2VicGFjazovLy8uL3NyYy90cmFuc2FjdGlvbi9tYWtlVHJhbnNhY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyYW5zYWN0aW9uL3NlcmlhbGl6ZVRyYW5zYWN0aW9uSW50b0Nhbm9uaWNhbFN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25uZWN0aW9uL2dldFN0YXR1cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29ubmVjdGlvbi9nZXRUcmFuc2FjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdHJhbnNhY3Rpb24vbWFrZUlucHV0VGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jbG9uZS9jbG9uZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19leHBvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2pzLXNoYTMvc3JjL3NoYTMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9zcHJpbnRmLWpzL3NyYy9zcHJpbnRmLmpzIiwid2VicGFjazovLy8uL3NyYy9FZDI1NTE5S2V5cGFpci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFzZVJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Nvbm5lY3Rpb24vZ2V0QmxvY2suanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Nvbm5lY3Rpb24vbGlzdEJsb2Nrcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29ubmVjdGlvbi9saXN0T3V0cHV0cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29ubmVjdGlvbi9saXN0VHJhbnNhY3Rpb25zLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25uZWN0aW9uL2xpc3RWb3Rlcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29ubmVjdGlvbi9wb2xsU3RhdHVzQW5kRmV0Y2hUcmFuc2FjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29ubmVjdGlvbi9wb3N0VHJhbnNhY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zvcm1hdF90ZXh0LmpzIiwid2VicGFjazovLy8uL3NyYy9zYW5pdGl6ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2hhMjU2SGFzaC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc3RyaW5naWZ5X2FzX3F1ZXJ5X3BhcmFtLmpzIiwid2VicGFjazovLy8uL3NyYy90cmFuc2FjdGlvbi9oYXNoVHJhbnNhY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyYW5zYWN0aW9uL21ha2VDcmVhdGVUcmFuc2FjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdHJhbnNhY3Rpb24vbWFrZUVkMjU1MTlDb25kaXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyYW5zYWN0aW9uL21ha2VPdXRwdXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyYW5zYWN0aW9uL21ha2VTaGEyNTZDb25kaXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyYW5zYWN0aW9uL21ha2VUaHJlc2hvbGRDb25kaXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyYW5zYWN0aW9uL21ha2VUcmFuc2ZlclRyYW5zYWN0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy90cmFuc2FjdGlvbi9zaWduVHJhbnNhY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyYW5zYWN0aW9uL3V0aWxzL2NjSnNvbkxvYWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYXNlLXgvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYXNlNjQtanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jdHguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0tYnVnLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hpZGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VpZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2RlY2FtZWxpemUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIiwid2VicGFjazovLy8uL34vZmV0Y2gtcG9ueWZpbGwvYnVpbGQvZmV0Y2gtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL34vanNvbi1zdGFibGUtc3RyaW5naWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL34vanNvbmlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2pzb25pZnkvbGliL3BhcnNlLmpzIiwid2VicGFjazovLy8uL34vanNvbmlmeS9saWIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovLy8uL34vb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3F1ZXJ5LXN0cmluZy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3N0cmljdC11cmktZW5jb2RlL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vdHdlZXRuYWNsL25hY2wtZmFzdC5qcyIsIndlYnBhY2s6Ly8vdmVydHggKGlnbm9yZWQpIiwid2VicGFjazovLy9jcnlwdG8gKGlnbm9yZWQpIl0sIm5hbWVzIjpbImdldEFwaVVybHMiLCJBUElfUEFUSCIsIkRFRkFVTFRfUkVRVUVTVF9DT05GSUciLCJjcmVkZW50aWFscyIsImhlYWRlcnMiLCJyZXF1ZXN0IiwidXJsIiwiY29uZmlnIiwib25seUpzb25SZXNwb25zZSIsInJlcXVlc3RDb25maWciLCJxdWVyeSIsInNhbml0aXplIiwiYXBpVXJsIiwianNvbkJvZHkiLCJQcm9taXNlIiwicmVqZWN0IiwiRXJyb3IiLCJiYXNlUmVxdWVzdCIsInRoZW4iLCJyZXMiLCJqc29uIiwiY2F0Y2giLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJjY0pzb25pZnkiLCJmdWxmaWxsbWVudCIsImNvbmRpdGlvblVyaSIsImdldENvbmRpdGlvblVyaSIsInNlcmlhbGl6ZVVyaSIsImdldFR5cGVJZCIsImRldGFpbHMiLCJ0eXBlX2lkIiwiYml0bWFzayIsInByZWltYWdlIiwidG9TdHJpbmciLCJ0eXBlIiwiZ2V0Qml0bWFzayIsInRocmVzaG9sZCIsInN1YmNvbmRpdGlvbnMiLCJtYXAiLCJzdWJjb25kaXRpb24iLCJzdWJjb25kaXRpb25Kc29uIiwiYm9keSIsIndlaWdodCIsInNpZ25hdHVyZSIsInB1YmxpY19rZXkiLCJiYXNlNTgiLCJlbmNvZGUiLCJwdWJsaWNLZXkiLCJoYXNoIiwibWF4X2Z1bGZpbGxtZW50X2xlbmd0aCIsIm1heEZ1bGZpbGxtZW50TGVuZ3RoIiwibWFrZVRyYW5zYWN0aW9uVGVtcGxhdGUiLCJtYWtlVHJhbnNhY3Rpb24iLCJvcGVyYXRpb24iLCJhc3NldCIsIm1ldGFkYXRhIiwib3V0cHV0cyIsImlucHV0cyIsInR4IiwiaWQiLCJoYXNoVHJhbnNhY3Rpb24iLCJzZXJpYWxpemVUcmFuc2FjdGlvbkludG9DYW5vbmljYWxTdHJpbmciLCJ0cmFuc2FjdGlvbiIsImNsb25lIiwic3RhYmxlU3RyaW5naWZ5IiwiYSIsImIiLCJrZXkiLCJnZXRTdGF0dXMiLCJ0eF9pZCIsImdldFRyYW5zYWN0aW9uIiwidHhJZCIsInVybFRlbXBsYXRlU3BlYyIsIm1ha2VJbnB1dFRlbXBsYXRlIiwicHVibGljS2V5cyIsImZ1bGZpbGxzIiwiRWQyNTUxOUtleXBhaXIiLCJzZWNyZXQiLCJrZXlQYWlyIiwic2VjcmV0SGFzaCIsInNoYTMiLCJzaGEzXzI1NiIsImNyZWF0ZSIsInVwZGF0ZSIsImFycmF5IiwibmFjbCIsInNpZ24iLCJmcm9tU2VlZCIsIlVpbnQ4QXJyYXkiLCJwcml2YXRlS2V5Iiwic2VjcmV0S2V5Iiwic2xpY2UiLCJmZXRjaCIsImZldGNoUG9ueWZpbGwiLCJmZXRjaENvbmZpZyIsImV4cGFuZGVkVXJsIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwidnNwcmludGYiLCJPYmplY3QiLCJrZXlzIiwiZm9ybWF0VGV4dCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIndhcm4iLCJzdHJpbmdpZnlBc1F1ZXJ5UGFyYW0iLCJKU09OIiwic3RyaW5naWZ5Iiwib2siLCJnZXRCbG9jayIsImJsb2NrSWQiLCJsaXN0QmxvY2tzIiwic3RhdHVzIiwibGlzdE91dHB1dHMiLCJ1bnNwZW50IiwibGlzdFRyYW5zYWN0aW9ucyIsImFzc2V0X2lkIiwibGlzdFZvdGVzIiwiYmxvY2tfaWQiLCJyZXNvbHZlIiwidGltZXIiLCJzZXRJbnRlcnZhbCIsImxvZyIsImNsZWFySW50ZXJ2YWwiLCJwb3N0VHJhbnNhY3Rpb24iLCJtZXRob2QiLCJSZWdleCIsIlRFTVBMQVRFX0xJVEVSQUwiLCJLRVkiLCJLRVlfQUNDRVNTIiwiSU5ERVhfQUNDRVNTIiwicyIsImV4cGFuZGVkRm9ybWF0U3RyIiwiYXJndiIsInRlbXBsYXRlU3BlY09iaiIsInJlcGxhY2UiLCJtYXRjaCIsInJlcGxhY2VtZW50IiwiaW50ZXJwb2xhdGlvbkxlZnQiLCJ2YWx1ZSIsImN1ck1hdGNoIiwiZXhlYyIsInN1YnN0cmluZyIsIlN5bnRheEVycm9yIiwic3ByaW50ZiIsImZpbHRlckZyb21PYmplY3QiLCJvYmoiLCJmaWx0ZXIiLCJpc0luY2x1c2lvbiIsImFwcGx5RmlsdGVyT25PYmplY3QiLCJfIiwiY29yZUluY2x1ZGVzIiwiZmlsdGVyRm4iLCJmaWx0ZXJlZE9iaiIsImNvcmVPYmplY3RFbnRyaWVzIiwiZm9yRWFjaCIsInZhbCIsInNlbGVjdEZyb21PYmplY3QiLCJzaGEyNTZIYXNoIiwiZGF0YSIsImhleCIsInRyYW5zZm9ybSIsInRyYW5zZm9ybWVkS2V5c09iaiIsInJlZHVjZSIsInBhcmFtc09iaiIsInF1ZXJ5U3RyaW5nIiwibWFrZUNyZWF0ZVRyYW5zYWN0aW9uIiwiYXNzZXREZWZpbml0aW9uIiwiaXNzdWVycyIsImlzc3VlciIsIm1ha2VFZDI1NTE5Q29uZGl0aW9uIiwicHVibGljS2V5QnVmZmVyIiwiZGVjb2RlIiwiZWQyNTUxOUZ1bGZpbGxtZW50IiwiY2MiLCJFZDI1NTE5Iiwic2V0UHVibGljS2V5IiwibWFrZU91dHB1dCIsImNvbmRpdGlvbiIsImFtb3VudCIsImhhc093blByb3BlcnR5IiwibWFrZVNoYTI1NkNvbmRpdGlvbiIsInNoYTI1NkZ1bGZpbGxtZW50IiwiUHJlaW1hZ2VTaGEyNTYiLCJtYWtlVGhyZXNob2xkQ29uZGl0aW9uIiwidGhyZXNob2xkQ29uZGl0aW9uIiwiVGhyZXNob2xkU2hhMjU2IiwiYWRkU3ViZnVsZmlsbG1lbnQiLCJtYWtlVHJhbnNmZXJUcmFuc2FjdGlvbiIsInVuc3BlbnRUcmFuc2FjdGlvbiIsImZ1bGZpbGxlZE91dHB1dHMiLCJvdXRwdXRJbmRleCIsImZ1bGZpbGxlZE91dHB1dCIsInRyYW5zYWN0aW9uTGluayIsInB1YmxpY19rZXlzIiwiYXNzZXRMaW5rIiwic2lnblRyYW5zYWN0aW9uIiwicHJpdmF0ZUtleXMiLCJzaWduZWRUeCIsImlucHV0IiwiaW5kZXgiLCJwcml2YXRlS2V5QnVmZmVyIiwic2VyaWFsaXplZFRyYW5zYWN0aW9uIiwiZnVsZmlsbG1lbnRVcmkiLCJjY0pzb25Mb2FkIiwiY29uZGl0aW9uSnNvbiIsIkNvbmRpdGlvbiIsInBhcnNlSW50Iiwic3ViZnVsZmlsbG1lbnRzIiwic3ViZnVsZmlsbG1lbnQiLCJhZGRTdWJjb25kaXRpb24iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7OztBQ2hFZSxTQUFTQSxVQUFULENBQW9CQyxRQUFwQixFQUE4QjtBQUN6QyxXQUFPO0FBQ0gsa0JBQVVBLFdBQVcsUUFEbEI7QUFFSCx5QkFBaUJBLFdBQVcsb0JBRnpCO0FBR0gsbUJBQVdBLFdBQVcsU0FIbkI7QUFJSCxvQkFBWUEsV0FBVyxVQUpwQjtBQUtILHdCQUFnQkEsV0FBVyxjQUx4QjtBQU1ILCtCQUF1QkEsV0FBVyx1QkFOL0I7QUFPSCxpQkFBU0EsV0FBVztBQVBqQixLQUFQO0FBU0gsQzs7Ozs7Ozs7Ozs7O0FDVkQ7QUFDQTs7QUFHQSxJQUFNQyx5QkFBeUI7QUFDM0JDLGlCQUFhLFNBRGM7QUFFM0JDLGFBQVM7QUFDTCxrQkFBVTtBQURMO0FBRmtCLENBQS9COztBQU9BOzs7O0FBSWUsU0FBU0MsT0FBVCxDQUFpQkMsR0FBakIsRUFBMEQ7QUFBQSxRQUFwQ0MsTUFBb0MsdUVBQTNCLEVBQTJCO0FBQUEsUUFBdkJDLGdCQUF1Qix1RUFBTixJQUFNOztBQUNyRTtBQUNBLFFBQU1DLGdCQUFnQixTQUFjLEVBQWQsRUFBa0JQLHNCQUFsQixFQUEwQ0ssTUFBMUMsRUFBa0Q7QUFDcEVHLGVBQU9ILE9BQU9HLEtBQVAsSUFBZ0IsaUZBQUFDLENBQVNKLE9BQU9HLEtBQWhCO0FBRDZDLEtBQWxELENBQXRCO0FBR0EsUUFBSUUsU0FBU04sR0FBYjs7QUFFQSxRQUFJRyxjQUFjSSxRQUFsQixFQUE0QjtBQUN4Qkosc0JBQWNMLE9BQWQsR0FBd0IsU0FBYyxFQUFkLEVBQWtCSyxjQUFjTCxPQUFoQyxFQUF5QztBQUM3RCw0QkFBZ0I7QUFENkMsU0FBekMsQ0FBeEI7QUFHSDtBQUNELFFBQUksQ0FBQ0UsR0FBTCxFQUFVO0FBQ04sZUFBT1EsUUFBUUMsTUFBUixDQUFlLElBQUlDLEtBQUosQ0FBVSw4QkFBVixDQUFmLENBQVA7QUFDSDs7QUFFRCxXQUFPLG9GQUFBQyxDQUFZTCxNQUFaLEVBQW9CSCxhQUFwQixFQUNGUyxJQURFLENBQ0csVUFBQ0MsR0FBRCxFQUFTO0FBQ1gsZUFBT1gsbUJBQW1CVyxJQUFJQyxJQUFKLEVBQW5CLEdBQ0g7QUFDSUEsa0JBQU1ELElBQUlDLElBQUosRUFEVjtBQUVJZCxpQkFBS2EsSUFBSWI7QUFGYixTQURKO0FBS0gsS0FQRSxFQVFGZSxLQVJFLENBUUksVUFBQ0MsR0FBRCxFQUFTO0FBQ1pDLGdCQUFRQyxLQUFSLENBQWNGLEdBQWQ7QUFDQSxjQUFNQSxHQUFOO0FBQ0gsS0FYRSxDQUFQO0FBWUgsQzs7Ozs7OztBQzNDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtREFBbUQ7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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Z0IsQ0FBaEIsR0FBb0IsQ0FBQyxDQUFoQztBQUFBLEdBQXBCLENBQVA7QUFDSCxDOzs7Ozs7QUNoQkQsNkJBQTZCO0FBQzdCLHFDQUFxQyxnQzs7Ozs7O0FDRHJDO0FBQ0E7QUFDQSxpQ0FBaUMsUUFBUSxnQkFBZ0IsVUFBVSxHQUFHO0FBQ3RFLENBQUMsRTs7Ozs7O0FDSEQ7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdDOzs7Ozs7QUNIdkM7QUFDQTtBQUNBLEU7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFOzs7Ozs7QUNMQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVOzs7Ozs7O0FDdkx0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1Qzs7Ozs7Ozs7Ozs7QUNwQkE7QUFDQTs7QUFFQTs7Ozs7QUFLZSxTQUFTQyxTQUFULENBQW1CQyxLQUFuQixFQUEwQnRFLFFBQTFCLEVBQW9DO0FBQy9DLFdBQU8sZ0ZBQUFJLENBQVEsbUZBQUFMLENBQVdDLFFBQVgsRUFBcUIsVUFBckIsQ0FBUixFQUEwQztBQUN6Q1MsZUFBTztBQUNINkQ7QUFERztBQURrQyxLQUExQyxDQUFQO0FBS0gsQzs7Ozs7Ozs7OztBQ2REO0FBQ0E7O0FBRUE7Ozs7O0FBS2UsU0FBU0MsY0FBVCxDQUF3QkMsSUFBeEIsRUFBOEJ4RSxRQUE5QixFQUF3QztBQUNuRCxXQUFPLGdGQUFBSSxDQUFRLG1GQUFBTCxDQUFXQyxRQUFYLEVBQXFCLHFCQUFyQixDQUFSLEVBQXFEO0FBQ3BEeUUseUJBQWlCO0FBQ2JEO0FBRGE7QUFEbUMsS0FBckQsQ0FBUDtBQUtILEM7Ozs7Ozs7O0FDZGMsU0FBU0UsaUJBQVQsR0FBaUY7QUFBQSxRQUF0REMsVUFBc0QsdUVBQXpDLEVBQXlDO0FBQUEsUUFBckNDLFFBQXFDLHVFQUExQixJQUEwQjtBQUFBLFFBQXBCbkQsV0FBb0IsdUVBQU4sSUFBTTs7QUFDNUYsV0FBTztBQUNIQSxnQ0FERztBQUVIbUQsMEJBRkc7QUFHSCx5QkFBaUJEO0FBSGQsS0FBUDtBQUtILEM7Ozs7OztBQ05EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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O0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxJQUFJO0FBQ2Q7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLHdCQUF3QjtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQix1Q0FBdUM7QUFDeEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxVQUFVLE1BQU07QUFDaEIsVUFBVSxPQUFPO0FBQ2pCO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsTUFBTTtBQUNoQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBLHFCQUFxQixZQUFZO0FBQ2pDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxJQUFJO0FBQ2Q7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EsVUFBVSxTQUFTO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLFlBQVksU0FBUztBQUNyQixZQUFZLFNBQVM7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQztBQUNEOzs7Ozs7OztBQ3JvQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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QTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0Isb0JBQW9COztBQUUxQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsRUFBRTtBQUNGOzs7Ozs7OztBQzVNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7Ozs7OztBQ0xBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCLGlCQUFpQjtBQUN4QztBQUNBOztBQUVBO0FBQ0Esd0NBQXdDLDRCQUE0Qjs7QUFFcEU7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsUUFBUTtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFROztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCOztBQUVBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRCxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQiwyQkFBMkI7QUFDakQsc0JBQXNCLDJCQUEyQjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCO0FBQ3JCLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBOztBQUVBLHNCQUFzQjtBQUN0QixzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7QUFDdEIsc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCO0FBQ3RCLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBOztBQUVBLHNCQUFzQjtBQUN0QixzQkFBc0I7O0FBRXRCO0FBQ0E7QUFD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O0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0EsZ0NBQWdDLE9BQU87QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7O0FBRUEsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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Q0E7QUFDQSxDQUFDOztBQUVELENBQUMsaUdBQWlHOzs7Ozs7O0FDbjFFbEcsZTs7Ozs7O0FDQUEsZSIsImZpbGUiOiJidW5kbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJqcy1iaWdjaGFpbmRiLWRyaXZlclwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJqcy1iaWdjaGFpbmRiLWRyaXZlclwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDk1KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA5MTdiODE0Y2E2M2Y2ODViMTY3YyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFwaVVybHMoQVBJX1BBVEgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAnYmxvY2tzJzogQVBJX1BBVEggKyAnYmxvY2tzJyxcbiAgICAgICAgJ2Jsb2Nrc19kZXRhaWwnOiBBUElfUEFUSCArICdibG9ja3MvJShibG9ja0lkKXMnLFxuICAgICAgICAnb3V0cHV0cyc6IEFQSV9QQVRIICsgJ291dHB1dHMnLFxuICAgICAgICAnc3RhdHVzZXMnOiBBUElfUEFUSCArICdzdGF0dXNlcycsXG4gICAgICAgICd0cmFuc2FjdGlvbnMnOiBBUElfUEFUSCArICd0cmFuc2FjdGlvbnMnLFxuICAgICAgICAndHJhbnNhY3Rpb25zX2RldGFpbCc6IEFQSV9QQVRIICsgJ3RyYW5zYWN0aW9ucy8lKHR4SWQpcycsXG4gICAgICAgICd2b3Rlcyc6IEFQSV9QQVRIICsgJ3ZvdGVzJ1xuICAgIH07XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Nvbm5lY3Rpb24vZ2V0QXBpVXJscy5qcyIsImltcG9ydCBiYXNlUmVxdWVzdCBmcm9tICcuL2Jhc2VSZXF1ZXN0JztcbmltcG9ydCBzYW5pdGl6ZSBmcm9tICcuL3Nhbml0aXplJztcblxuXG5jb25zdCBERUZBVUxUX1JFUVVFU1RfQ09ORklHID0ge1xuICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgaGVhZGVyczoge1xuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgfVxufTtcblxuLyoqXG4gKiBTbWFsbCB3cmFwcGVyIGFyb3VuZCBqcy11dGlsaXR5LWJlbHQncyByZXF1ZXN0IHRoYXQgcHJvdmlkZXMgdXJsIHJlc29sdmluZywgZGVmYXVsdCBzZXR0aW5ncywgYW5kXG4gKiByZXNwb25zZSBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVxdWVzdCh1cmwsIGNvbmZpZyA9IHt9LCBvbmx5SnNvblJlc3BvbnNlPXRydWUpIHtcbiAgICAvLyBMb2FkIGRlZmF1bHQgZmV0Y2ggY29uZmlndXJhdGlvbiBhbmQgcmVtb3ZlIGFueSBmYWxzeSBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfUkVRVUVTVF9DT05GSUcsIGNvbmZpZywge1xuICAgICAgICBxdWVyeTogY29uZmlnLnF1ZXJ5ICYmIHNhbml0aXplKGNvbmZpZy5xdWVyeSlcbiAgICB9KTtcbiAgICBsZXQgYXBpVXJsID0gdXJsO1xuXG4gICAgaWYgKHJlcXVlc3RDb25maWcuanNvbkJvZHkpIHtcbiAgICAgICAgcmVxdWVzdENvbmZpZy5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcmVxdWVzdENvbmZpZy5oZWFkZXJzLCB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdSZXF1ZXN0IHdhcyBub3QgZ2l2ZW4gYSB1cmwuJykpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlUmVxdWVzdChhcGlVcmwsIHJlcXVlc3RDb25maWcpXG4gICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBvbmx5SnNvblJlc3BvbnNlID8gcmVzLmpzb24oKSA6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBqc29uOiByZXMuanNvbigpLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHJlcy51cmxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KTtcbn1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlcXVlc3QuanMiLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/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+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGJhc2V4ID0gcmVxdWlyZSgnYmFzZS14JylcbnZhciBBTFBIQUJFVCA9ICcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2V4KEFMUEhBQkVUKVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JzNTgvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoXCJGaXZlQmVsbHNDb25kaXRpb25cIixbXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLkZpdmVCZWxsc0NvbmRpdGlvbj1lKCk6dC5GaXZlQmVsbHNDb25kaXRpb249ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7aWYocltuXSlyZXR1cm4gcltuXS5leHBvcnRzO3ZhciBpPXJbbl09e2k6bixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W25dLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLGUpLGkubD0hMCxpLmV4cG9ydHN9dmFyIHI9e307cmV0dXJuIGUubT10LGUuYz1yLGUuaT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZS5kPWZ1bmN0aW9uKHQsZSxyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxlLm49ZnVuY3Rpb24odCl7dmFyIHI9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIGUuZChyLFwiYVwiLHIpLHJ9LGUubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sZS5wPVwiXCIsZShlLnM9NjEzKX0oW2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDQpLGk9cigzMiksbz1yKDE0KSxhPXIoMTUpLGY9cigzMykscz1cInByb3RvdHlwZVwiLHU9ZnVuY3Rpb24odCxlLHIpe3ZhciBoLGMsZCxsLHA9dCZ1LkYsYj10JnUuRyx2PXQmdS5TLHk9dCZ1LlAsbT10JnUuQixnPWI/bjp2P25bZV18fChuW2VdPXt9KToobltlXXx8e30pW3NdLHc9Yj9pOmlbZV18fChpW2VdPXt9KSxfPXdbc118fCh3W3NdPXt9KTtiJiYocj1lKTtmb3IoaCBpbiByKWM9IXAmJmcmJnZvaWQgMCE9PWdbaF0sZD0oYz9nOnIpW2hdLGw9bSYmYz9mKGQsbik6eSYmXCJmdW5jdGlvblwiPT10eXBlb2YgZD9mKEZ1bmN0aW9uLmNhbGwsZCk6ZCxnJiZhKGcsaCxkLHQmdS5VKSx3W2hdIT1kJiZvKHcsaCxsKSx5JiZfW2hdIT1kJiYoX1toXT1kKX07bi5jb3JlPWksdS5GPTEsdS5HPTIsdS5TPTQsdS5QPTgsdS5CPTE2LHUuVz0zMix1LlU9NjQsdS5SPTEyOCx0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiOyhmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGkoKXt0cnl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIHQuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX0sNDI9PT10LmZvbygpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnN1YmFycmF5JiYwPT09dC5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2godCl7cmV0dXJuITF9fWZ1bmN0aW9uIG8oKXtyZXR1cm4gdC5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBhKGUscil7aWYobygpPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aFwiKTtyZXR1cm4gdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHIpLGUuX19wcm90b19fPXQucHJvdG90eXBlKToobnVsbD09PWUmJihlPW5ldyB0KHIpKSxlLmxlbmd0aD1yKSxlfWZ1bmN0aW9uIHQoZSxyLG4pe2lmKCEodC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgdCkpcmV0dXJuIG5ldyB0KGUscixuKTtpZihcIm51bWJlclwiPT10eXBlb2YgZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHIpdGhyb3cgbmV3IEVycm9yKFwiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmdcIik7cmV0dXJuIGgodGhpcyxlKX1yZXR1cm4gZih0aGlzLGUscixuKX1mdW5jdGlvbiBmKHQsZSxyLG4pe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2wodCxlLHIsbik6XCJzdHJpbmdcIj09dHlwZW9mIGU/Yyh0LGUscik6cCh0LGUpfWZ1bmN0aW9uIHModCl7aWYoXCJudW1iZXJcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiB1KHQsZSxyLG4pe3JldHVybiBzKGUpLGU8PTA/YSh0LGUpOnZvaWQgMCE9PXI/XCJzdHJpbmdcIj09dHlwZW9mIG4/YSh0LGUpLmZpbGwocixuKTphKHQsZSkuZmlsbChyKTphKHQsZSl9ZnVuY3Rpb24gaChlLHIpe2lmKHMociksZT1hKGUscjwwPzA6MHxiKHIpKSwhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248cjsrK24pZVtuXT0wO3JldHVybiBlfWZ1bmN0aW9uIGMoZSxyLG4pe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBuJiZcIlwiIT09bnx8KG49XCJ1dGY4XCIpLCF0LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgaT0wfHkocixuKTtlPWEoZSxpKTt2YXIgbz1lLndyaXRlKHIsbik7cmV0dXJuIG8hPT1pJiYoZT1lLnNsaWNlKDAsbykpLGV9ZnVuY3Rpb24gZCh0LGUpe3ZhciByPWUubGVuZ3RoPDA/MDowfGIoZS5sZW5ndGgpO3Q9YSh0LHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKXRbbl09MjU1JmVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gbChlLHIsbixpKXtpZihyLmJ5dGVMZW5ndGgsbjwwfHxyLmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHNcIik7aWYoci5ieXRlTGVuZ3RoPG4rKGl8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKFwiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kc1wiKTtyZXR1cm4gcj12b2lkIDA9PT1uJiZ2b2lkIDA9PT1pP25ldyBVaW50OEFycmF5KHIpOnZvaWQgMD09PWk/bmV3IFVpbnQ4QXJyYXkocixuKTpuZXcgVWludDhBcnJheShyLG4saSksdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPXIsZS5fX3Byb3RvX189dC5wcm90b3R5cGUpOmU9ZChlLHIpLGV9ZnVuY3Rpb24gcChlLHIpe2lmKHQuaXNCdWZmZXIocikpe3ZhciBuPTB8YihyLmxlbmd0aCk7cmV0dXJuIGU9YShlLG4pLDA9PT1lLmxlbmd0aD9lOihyLmNvcHkoZSwwLDAsbiksZSl9aWYocil7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZyLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxcImxlbmd0aFwiaW4gcilyZXR1cm5cIm51bWJlclwiIT10eXBlb2Ygci5sZW5ndGh8fFooci5sZW5ndGgpP2EoZSwwKTpkKGUscik7aWYoXCJCdWZmZXJcIj09PXIudHlwZSYmUShyLmRhdGEpKXJldHVybiBkKGUsci5kYXRhKX10aHJvdyBuZXcgVHlwZUVycm9yKFwiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LlwiKX1mdW5jdGlvbiBiKHQpe2lmKHQ+PW8oKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHhcIitvKCkudG9TdHJpbmcoMTYpK1wiIGJ5dGVzXCIpO3JldHVybiAwfHR9ZnVuY3Rpb24gdihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksdC5hbGxvYygrZSl9ZnVuY3Rpb24geShlLHIpe2lmKHQuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmXCJmdW5jdGlvblwiPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7XCJzdHJpbmdcIiE9dHlwZW9mIGUmJihlPVwiXCIrZSk7dmFyIG49ZS5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIG47Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6Y2FzZSB2b2lkIDA6cmV0dXJuIFYoZSkubGVuZ3RoO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiAyKm47Y2FzZVwiaGV4XCI6cmV0dXJuIG4+Pj4xO2Nhc2VcImJhc2U2NFwiOnJldHVybiBZKGUpLmxlbmd0aDtkZWZhdWx0OmlmKGkpcmV0dXJuIFYoZSkubGVuZ3RoO3I9KFwiXCIrcikudG9Mb3dlckNhc2UoKSxpPSEwfX1mdW5jdGlvbiBtKHQsZSxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm5cIlwiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuXCJcIjtpZihyPj4+PTAsZT4+Pj0wLHI8PWUpcmV0dXJuXCJcIjtmb3IodHx8KHQ9XCJ1dGY4XCIpOzspc3dpdGNoKHQpe2Nhc2VcImhleFwiOnJldHVybiBUKHRoaXMsZSxyKTtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm4gQih0aGlzLGUscik7Y2FzZVwiYXNjaWlcIjpyZXR1cm4gUih0aGlzLGUscik7Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIFAodGhpcyxlLHIpO2Nhc2VcImJhc2U2NFwiOnJldHVybiBJKHRoaXMsZSxyKTtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gaih0aGlzLGUscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIit0KTt0PSh0K1wiXCIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gZyh0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWZ1bmN0aW9uIHcoZSxyLG4saSxvKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoXCJzdHJpbmdcIj09dHlwZW9mIG4/KGk9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPW8/MDplLmxlbmd0aC0xKSxuPDAmJihuPWUubGVuZ3RoK24pLG4+PWUubGVuZ3RoKXtpZihvKXJldHVybi0xO249ZS5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIW8pcmV0dXJuLTE7bj0wfWlmKFwic3RyaW5nXCI9PXR5cGVvZiByJiYocj10LmZyb20ocixpKSksdC5pc0J1ZmZlcihyKSlyZXR1cm4gMD09PXIubGVuZ3RoPy0xOl8oZSxyLG4saSxvKTtpZihcIm51bWJlclwiPT10eXBlb2YgcilyZXR1cm4gciY9MjU1LHQuVFlQRURfQVJSQVlfU1VQUE9SVCYmXCJmdW5jdGlvblwiPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9vP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHIsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHIsbik6XyhlLFtyXSxuLGksbyk7dGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlclwiKX1mdW5jdGlvbiBfKHQsZSxyLG4saSl7ZnVuY3Rpb24gbyh0LGUpe3JldHVybiAxPT09YT90W2VdOnQucmVhZFVJbnQxNkJFKGUqYSl9dmFyIGE9MSxmPXQubGVuZ3RoLHM9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCksXCJ1Y3MyXCI9PT1ufHxcInVjcy0yXCI9PT1ufHxcInV0ZjE2bGVcIj09PW58fFwidXRmLTE2bGVcIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO2E9MixmLz0yLHMvPTIsci89Mn12YXIgdTtpZihpKXt2YXIgaD0tMTtmb3IodT1yO3U8Zjt1KyspaWYobyh0LHUpPT09byhlLGg9PT0tMT8wOnUtaCkpe2lmKGg9PT0tMSYmKGg9dSksdS1oKzE9PT1zKXJldHVybiBoKmF9ZWxzZSBoIT09LTEmJih1LT11LWgpLGg9LTF9ZWxzZSBmb3IocitzPmYmJihyPWYtcyksdT1yO3U+PTA7dS0tKXtmb3IodmFyIGM9ITAsZD0wO2Q8cztkKyspaWYobyh0LHUrZCkhPT1vKGUsZCkpe2M9ITE7YnJlYWt9aWYoYylyZXR1cm4gdX1yZXR1cm4tMX1mdW5jdGlvbiBNKHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobiksbj5pJiYobj1pKSk6bj1pO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9PTApdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgaGV4IHN0cmluZ1wiKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIGE9MDthPG47KythKXt2YXIgZj1wYXJzZUludChlLnN1YnN0cigyKmEsMiksMTYpO2lmKGlzTmFOKGYpKXJldHVybiBhO3RbcithXT1mfXJldHVybiBhfWZ1bmN0aW9uIFModCxlLHIsbil7cmV0dXJuIFcoVihlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBFKHQsZSxyLG4pe3JldHVybiBXKEgoZSksdCxyLG4pfWZ1bmN0aW9uIEEodCxlLHIsbil7cmV0dXJuIEUodCxlLHIsbil9ZnVuY3Rpb24gayh0LGUscixuKXtyZXR1cm4gVyhZKGUpLHQscixuKX1mdW5jdGlvbiB4KHQsZSxyLG4pe3JldHVybiBXKFgoZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gSSh0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/Si5mcm9tQnl0ZUFycmF5KHQpOkouZnJvbUJ5dGVBcnJheSh0LnNsaWNlKGUscikpfWZ1bmN0aW9uIEIodCxlLHIpe3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9ZTtpPHI7KXt2YXIgbz10W2ldLGE9bnVsbCxmPW8+MjM5PzQ6bz4yMjM/MzpvPjE5MT8yOjE7aWYoaStmPD1yKXt2YXIgcyx1LGgsYztzd2l0Y2goZil7Y2FzZSAxOm88MTI4JiYoYT1vKTticmVhaztjYXNlIDI6cz10W2krMV0sMTI4PT09KDE5MiZzKSYmKGM9KDMxJm8pPDw2fDYzJnMsYz4xMjcmJihhPWMpKTticmVhaztjYXNlIDM6cz10W2krMV0sdT10W2krMl0sMTI4PT09KDE5MiZzKSYmMTI4PT09KDE5MiZ1KSYmKGM9KDE1Jm8pPDwxMnwoNjMmcyk8PDZ8NjMmdSxjPjIwNDcmJihjPDU1Mjk2fHxjPjU3MzQzKSYmKGE9YykpO2JyZWFrO2Nhc2UgNDpzPXRbaSsxXSx1PXRbaSsyXSxoPXRbaSszXSwxMjg9PT0oMTkyJnMpJiYxMjg9PT0oMTkyJnUpJiYxMjg9PT0oMTkyJmgpJiYoYz0oMTUmbyk8PDE4fCg2MyZzKTw8MTJ8KDYzJnUpPDw2fDYzJmgsYz42NTUzNSYmYzwxMTE0MTEyJiYoYT1jKSl9fW51bGw9PT1hPyhhPTY1NTMzLGY9MSk6YT42NTUzNSYmKGEtPTY1NTM2LG4ucHVzaChhPj4+MTAmMTAyM3w1NTI5NiksYT01NjMyMHwxMDIzJmEpLG4ucHVzaChhKSxpKz1mfXJldHVybiBPKG4pfWZ1bmN0aW9uIE8odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9dHQpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO2Zvcih2YXIgcj1cIlwiLG49MDtuPGU7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UobixuKz10dCkpO3JldHVybiByfWZ1bmN0aW9uIFIodCxlLHIpe3ZhciBuPVwiXCI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFAodCxlLHIpe3ZhciBuPVwiXCI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUodFtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gVCh0LGUscil7dmFyIG49dC5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPVwiXCIsbz1lO288cjsrK28paSs9Ryh0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiBqKHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9XCJcIixvPTA7bzxuLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUobltvXSsyNTYqbltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBDKHQsZSxyKXtpZih0JTEhPT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvZmZzZXQgaXMgbm90IHVpbnRcIik7aWYodCtlPnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoXCIpfWZ1bmN0aW9uIE4oZSxyLG4saSxvLGEpe2lmKCF0LmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHI+b3x8cjxhKXRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4raT5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKX1mdW5jdGlvbiBMKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBVKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPG87KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIHoodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIil9ZnVuY3Rpb24gRCh0LGUscixuLGkpe3JldHVybiBpfHx6KHQsZSxyLDQsMy40MDI4MjM0NjYzODUyODg2ZTM4LC0zLjQwMjgyMzQ2NjM4NTI4ODZlMzgpLCQud3JpdGUodCxlLHIsbiwyMyw0KSxyKzR9ZnVuY3Rpb24gcSh0LGUscixuLGkpe3JldHVybiBpfHx6KHQsZSxyLDgsMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCwtMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCksJC53cml0ZSh0LGUscixuLDUyLDgpLHIrOH1mdW5jdGlvbiBGKHQpe2lmKHQ9Syh0KS5yZXBsYWNlKGV0LFwiXCIpLHQubGVuZ3RoPDIpcmV0dXJuXCJcIjtmb3IoO3QubGVuZ3RoJTQhPT0wOyl0Kz1cIj1cIjtyZXR1cm4gdH1mdW5jdGlvbiBLKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLFwiXCIpfWZ1bmN0aW9uIEcodCl7cmV0dXJuIHQ8MTY/XCIwXCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gVih0LGUpe2U9ZXx8MS8wO2Zvcih2YXIgcixuPXQubGVuZ3RoLGk9bnVsbCxvPVtdLGE9MDthPG47KythKXtpZihyPXQuY2hhckNvZGVBdChhKSxyPjU1Mjk1JiZyPDU3MzQ0KXtpZighaSl7aWYocj41NjMxOSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGErMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPShpLTU1Mjk2PDwxMHxyLTU2MzIwKSs2NTUzNn1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHI+PjZ8MTkyLDYzJnJ8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsNjMmcnwxMjgpfWVsc2V7aWYoIShyPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29kZSBwb2ludFwiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIEgodCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQubGVuZ3RoOysrcillLnB1c2goMjU1JnQuY2hhckNvZGVBdChyKSk7cmV0dXJuIGV9ZnVuY3Rpb24gWCh0LGUpe2Zvcih2YXIgcixuLGksbz1bXSxhPTA7YTx0Lmxlbmd0aCYmISgoZS09Mik8MCk7KythKXI9dC5jaGFyQ29kZUF0KGEpLG49cj4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99ZnVuY3Rpb24gWSh0KXtyZXR1cm4gSi50b0J5dGVBcnJheShGKHQpKX1mdW5jdGlvbiBXKHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIFoodCl7cmV0dXJuIHQhPT10fXZhciBKPXIoNDkwKSwkPXIoNDkxKSxRPXIoNDkyKTtlLkJ1ZmZlcj10LGUuU2xvd0J1ZmZlcj12LGUuSU5TUEVDVF9NQVhfQllURVM9NTAsdC5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMCE9PW4uVFlQRURfQVJSQVlfU1VQUE9SVD9uLlRZUEVEX0FSUkFZX1NVUFBPUlQ6aSgpLGUua01heExlbmd0aD1vKCksdC5wb29sU2l6ZT04MTkyLHQuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19fPXQucHJvdG90eXBlLGV9LHQuZnJvbT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGYobnVsbCx0LGUscil9LHQuVFlQRURfQVJSQVlfU1VQUE9SVCYmKHQucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSx0Ll9fcHJvdG9fXz1VaW50OEFycmF5LFwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5zcGVjaWVzJiZ0W1N5bWJvbC5zcGVjaWVzXT09PXQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH0pKSx0LmFsbG9jPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdShudWxsLHQsZSxyKX0sdC5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gaChudWxsLHQpfSx0LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gaChudWxsLHQpfSx0LmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX0sdC5jb21wYXJlPWZ1bmN0aW9uKGUscil7aWYoIXQuaXNCdWZmZXIoZSl8fCF0LmlzQnVmZmVyKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzXCIpO2lmKGU9PT1yKXJldHVybiAwO2Zvcih2YXIgbj1lLmxlbmd0aCxpPXIubGVuZ3RoLG89MCxhPU1hdGgubWluKG4saSk7bzxhOysrbylpZihlW29dIT09cltvXSl7bj1lW29dLGk9cltvXTticmVha31yZXR1cm4gbjxpPy0xOmk8bj8xOjB9LHQuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LHQuY29uY2F0PWZ1bmN0aW9uKGUscil7aWYoIVEoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PWUubGVuZ3RoKXJldHVybiB0LmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PXIpZm9yKHI9MCxuPTA7bjxlLmxlbmd0aDsrK24pcis9ZVtuXS5sZW5ndGg7dmFyIGk9dC5hbGxvY1Vuc2FmZShyKSxvPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7dmFyIGE9ZVtuXTtpZighdC5pc0J1ZmZlcihhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTthLmNvcHkoaSxvKSxvKz1hLmxlbmd0aH1yZXR1cm4gaX0sdC5ieXRlTGVuZ3RoPXksdC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLHQucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0c1wiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9MilnKHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHNcIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpZyh0aGlzLGUsZSszKSxnKHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0c1wiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OClnKHRoaXMsZSxlKzcpLGcodGhpcyxlKzEsZSs2KSxnKHRoaXMsZSsyLGUrNSksZyh0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10P1wiXCI6MD09PWFyZ3VtZW50cy5sZW5ndGg/Qih0aGlzLDAsdCk6bS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighdC5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlclwiKTtyZXR1cm4gdGhpcz09PWV8fDA9PT10LmNvbXBhcmUodGhpcyxlKX0sdC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PVwiXCIscj1lLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKFwiaGV4XCIsMCxyKS5tYXRjaCgvLnsyfS9nKS5qb2luKFwiIFwiKSx0aGlzLmxlbmd0aD5yJiYodCs9XCIgLi4uIFwiKSksXCI8QnVmZmVyIFwiK3QrXCI+XCJ9LHQucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSxyLG4saSxvKXtpZighdC5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlclwiKTtpZih2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1uJiYobj1lP2UubGVuZ3RoOjApLHZvaWQgMD09PWkmJihpPTApLHZvaWQgMD09PW8mJihvPXRoaXMubGVuZ3RoKSxyPDB8fG4+ZS5sZW5ndGh8fGk8MHx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBpbmRleFwiKTtpZihpPj1vJiZyPj1uKXJldHVybiAwO2lmKGk+PW8pcmV0dXJuLTE7aWYocj49bilyZXR1cm4gMTtpZihyPj4+PTAsbj4+Pj0wLGk+Pj49MCxvPj4+PTAsdGhpcz09PWUpcmV0dXJuIDA7Zm9yKHZhciBhPW8taSxmPW4tcixzPU1hdGgubWluKGEsZiksdT10aGlzLnNsaWNlKGksbyksaD1lLnNsaWNlKHIsbiksYz0wO2M8czsrK2MpaWYodVtjXSE9PWhbY10pe2E9dVtjXSxmPWhbY107YnJlYWt9cmV0dXJuIGE8Zj8tMTpmPGE/MTowfSx0LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRoaXMuaW5kZXhPZih0LGUscikhPT0tMX0sdC5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHcodGhpcyx0LGUsciwhMCl9LHQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdyh0aGlzLHQsZSxyLCExKX0sdC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIsbil7aWYodm9pZCAwPT09ZSluPVwidXRmOFwiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmXCJzdHJpbmdcIj09dHlwZW9mIGUpbj1lLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcihcIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkXCIpO2V8PTAsaXNGaW5pdGUocik/KHJ8PTAsdm9pZCAwPT09biYmKG49XCJ1dGY4XCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHNcIik7bnx8KG49XCJ1dGY4XCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChuKXtjYXNlXCJoZXhcIjpyZXR1cm4gTSh0aGlzLHQsZSxyKTtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm4gUyh0aGlzLHQsZSxyKTtjYXNlXCJhc2NpaVwiOnJldHVybiBFKHRoaXMsdCxlLHIpO2Nhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiBBKHRoaXMsdCxlLHIpO2Nhc2VcImJhc2U2NFwiOnJldHVybiBrKHRoaXMsdCxlLHIpO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiB4KHRoaXMsdCxlLHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrbik7bj0oXCJcIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSx0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTpcIkJ1ZmZlclwiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIHR0PTQwOTY7dC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSxyKXt2YXIgbj10aGlzLmxlbmd0aDtlPX5+ZSxyPXZvaWQgMD09PXI/bjp+fnIsZTwwPyhlKz1uLGU8MCYmKGU9MCkpOmU+biYmKGU9bikscjwwPyhyKz1uLHI8MCYmKHI9MCkpOnI+biYmKHI9bikscjxlJiYocj1lKTt2YXIgaTtpZih0LlRZUEVEX0FSUkFZX1NVUFBPUlQpaT10aGlzLnN1YmFycmF5KGUsciksaS5fX3Byb3RvX189dC5wcm90b3R5cGU7ZWxzZXt2YXIgbz1yLWU7aT1uZXcgdChvLHZvaWQgMCk7Zm9yKHZhciBhPTA7YTxvOysrYSlpW2FdPXRoaXNbYStlXX1yZXR1cm4gaX0sdC5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEModCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG59LHQucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdCstLWVdLGk9MTtlPjAmJihpKj0yNTYpOyluKz10aGlzW3QrLS1lXSppO3JldHVybiBufSx0LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Qyh0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LHQucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LHQucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LHQucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDKHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sdC5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEModCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSx0LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBpKj0xMjgsbj49aSYmKG4tPU1hdGgucG93KDIsOCplKSksbn0sdC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Qyh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj1lLGk9MSxvPXRoaXNbdCstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbdCstLW5dKmk7cmV0dXJuIGkqPTEyOCxvPj1pJiYoby09TWF0aC5wb3coMiw4KmUpKSxvfSx0LnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0/KDI1NS10aGlzW3RdKzEpKi0xOnRoaXNbdF19LHQucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Qyh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSx0LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fEModCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sdC5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Qyh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sdC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Qyh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sdC5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Qyh0LDQsdGhpcy5sZW5ndGgpLCQucmVhZCh0aGlzLHQsITAsMjMsNCl9LHQucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEModCw0LHRoaXMubGVuZ3RoKSwkLnJlYWQodGhpcyx0LCExLDIzLDQpfSx0LnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Qyh0LDgsdGhpcy5sZW5ndGgpLCQucmVhZCh0aGlzLHQsITAsNTIsOCl9LHQucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDKHQsOCx0aGlzLmxlbmd0aCksJC5yZWFkKHRoaXMsdCwhMSw1Miw4KX0sdC5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLHJ8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyKS0xO04odGhpcyx0LGUscixpLDApfXZhciBvPTEsYT0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrYTxyJiYobyo9MjU2KTspdGhpc1tlK2FdPXQvbyYyNTU7cmV0dXJuIGUrcn0sdC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLHJ8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyKS0xO04odGhpcyx0LGUscixpLDApfXZhciBvPXItMSxhPTE7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihhKj0yNTYpOyl0aGlzW2Urb109dC9hJjI1NTtyZXR1cm4gZStyfSx0LnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZT0rZSxyfD0wLG58fE4odGhpcyxlLHIsMSwyNTUsMCksdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3JdPTI1NSZlLHIrMX0sdC5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbihlLHIsbil7cmV0dXJuIGU9K2Uscnw9MCxufHxOKHRoaXMsZSxyLDIsNjU1MzUsMCksdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3JdPTI1NSZlLHRoaXNbcisxXT1lPj4+OCk6TCh0aGlzLGUsciwhMCkscisyfSx0LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZT0rZSxyfD0wLG58fE4odGhpcyxlLHIsMiw2NTUzNSwwKSx0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbcl09ZT4+PjgsdGhpc1tyKzFdPTI1NSZlKTpMKHRoaXMsZSxyLCExKSxyKzJ9LHQucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlPStlLHJ8PTAsbnx8Tih0aGlzLGUsciw0LDQyOTQ5NjcyOTUsMCksdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3IrM109ZT4+PjI0LHRoaXNbcisyXT1lPj4+MTYsdGhpc1tyKzFdPWU+Pj44LHRoaXNbcl09MjU1JmUpOlUodGhpcyxlLHIsITApLHIrNH0sdC5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbihlLHIsbil7cmV0dXJuIGU9K2Uscnw9MCxufHxOKHRoaXMsZSxyLDQsNDI5NDk2NzI5NSwwKSx0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbcl09ZT4+PjI0LHRoaXNbcisxXT1lPj4+MTYsdGhpc1tyKzJdPWU+Pj44LHRoaXNbciszXT0yNTUmZSk6VSh0aGlzLGUsciwhMSkscis0fSx0LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Tih0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89MCxhPTEsZj0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYoYSo9MjU2KTspdDwwJiYwPT09ZiYmMCE9PXRoaXNbZStvLTFdJiYoZj0xKSx0aGlzW2Urb109KHQvYT4+MCktZiYyNTU7cmV0dXJuIGUrcn0sdC5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO04odGhpcyx0LGUscixpLTEsLWkpfXZhciBvPXItMSxhPTEsZj0wO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYoYSo9MjU2KTspdDwwJiYwPT09ZiYmMCE9PXRoaXNbZStvKzFdJiYoZj0xKSx0aGlzW2Urb109KHQvYT4+MCktZiYyNTU7cmV0dXJuIGUrcn0sdC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZT0rZSxyfD0wLG58fE4odGhpcyxlLHIsMSwxMjcsLTEyOCksdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbcl09MjU1JmUscisxfSx0LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlPStlLHJ8PTAsbnx8Tih0aGlzLGUsciwyLDMyNzY3LC0zMjc2OCksdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3JdPTI1NSZlLHRoaXNbcisxXT1lPj4+OCk6TCh0aGlzLGUsciwhMCkscisyfSx0LnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlPStlLHJ8PTAsbnx8Tih0aGlzLGUsciwyLDMyNzY3LC0zMjc2OCksdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3JdPWU+Pj44LHRoaXNbcisxXT0yNTUmZSk6TCh0aGlzLGUsciwhMSkscisyfSx0LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlPStlLHJ8PTAsbnx8Tih0aGlzLGUsciw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tyXT0yNTUmZSx0aGlzW3IrMV09ZT4+PjgsdGhpc1tyKzJdPWU+Pj4xNix0aGlzW3IrM109ZT4+PjI0KTpVKHRoaXMsZSxyLCEwKSxyKzR9LHQucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHIsbil7cmV0dXJuIGU9K2Uscnw9MCxufHxOKHRoaXMsZSxyLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSksdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3JdPWU+Pj4yNCx0aGlzW3IrMV09ZT4+PjE2LHRoaXNbcisyXT1lPj4+OCx0aGlzW3IrM109MjU1JmUpOlUodGhpcyxlLHIsITEpLHIrNH0sdC5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gRCh0aGlzLHQsZSwhMCxyKX0sdC5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gRCh0aGlzLHQsZSwhMSxyKX0sdC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHEodGhpcyx0LGUsITAscil9LHQucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBxKHRoaXMsdCxlLCExLHIpfSx0LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUscixuLGkpe2lmKG58fChuPTApLGl8fDA9PT1pfHwoaT10aGlzLmxlbmd0aCkscj49ZS5sZW5ndGgmJihyPWUubGVuZ3RoKSxyfHwocj0wKSxpPjAmJmk8biYmKGk9biksaT09PW4pcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kc1wiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kc1wiKTtpZihpPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kc1wiKTtpPnRoaXMubGVuZ3RoJiYoaT10aGlzLmxlbmd0aCksZS5sZW5ndGgtcjxpLW4mJihpPWUubGVuZ3RoLXIrbik7dmFyIG8sYT1pLW47aWYodGhpcz09PWUmJm48ciYmcjxpKWZvcihvPWEtMTtvPj0wOy0tbyllW28rcl09dGhpc1tvK25dO2Vsc2UgaWYoYTwxZTN8fCF0LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKG89MDtvPGE7KytvKWVbbytyXT10aGlzW28rbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChlLHRoaXMuc3ViYXJyYXkobixuK2EpLHIpO3JldHVybiBhfSx0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUscixuLGkpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKXtpZihcInN0cmluZ1wiPT10eXBlb2Ygcj8oaT1yLHI9MCxuPXRoaXMubGVuZ3RoKTpcInN0cmluZ1wiPT10eXBlb2YgbiYmKGk9bixuPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBvPWUuY2hhckNvZGVBdCgwKTtvPDI1NiYmKGU9byl9aWYodm9pZCAwIT09aSYmXCJzdHJpbmdcIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcihcImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmdcIik7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkmJiF0LmlzRW5jb2RpbmcoaSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK2kpfWVsc2VcIm51bWJlclwiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYocjwwfHx0aGlzLmxlbmd0aDxyfHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKFwiT3V0IG9mIHJhbmdlIGluZGV4XCIpO2lmKG48PXIpcmV0dXJuIHRoaXM7cj4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKTt2YXIgYTtpZihcIm51bWJlclwiPT10eXBlb2YgZSlmb3IoYT1yO2E8bjsrK2EpdGhpc1thXT1lO2Vsc2V7dmFyIGY9dC5pc0J1ZmZlcihlKT9lOlYobmV3IHQoZSxpKS50b1N0cmluZygpKSxzPWYubGVuZ3RoO2ZvcihhPTA7YTxuLXI7KythKXRoaXNbYStyXT1mW2Elc119cmV0dXJuIHRoaXN9O3ZhciBldD0vW14rXFwvMC05QS1aYS16LV9dL2d9KS5jYWxsKGUscigxKS5CdWZmZXIscigzOSkpfSxmdW5jdGlvbih0LGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighbih0KSl0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgYW4gb2JqZWN0IVwiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5leHBvcnRzPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5NYXRoPT1NYXRoP3dpbmRvdzpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1wibnVtYmVyXCI9PXR5cGVvZiBfX2cmJihfX2c9cil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdD9udWxsIT09dDpcImZ1bmN0aW9uXCI9PXR5cGVvZiB0fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoODcpKFwid2tzXCIpLGk9cig0OCksbz1yKDQpLlN5bWJvbCxhPVwiZnVuY3Rpb25cIj09dHlwZW9mIG8sZj10LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG5bdF18fChuW3RdPWEmJm9bdF18fChhP286aSkoXCJTeW1ib2wuXCIrdCkpfTtmLnN0b3JlPW59LGZ1bmN0aW9uKHQsZSxyKXt0LmV4cG9ydHM9IXIoNSkoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDMpLGk9cigxNzQpLG89cigyOSksYT1PYmplY3QuZGVmaW5lUHJvcGVydHk7ZS5mPXIoOCk/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKHQsZSxyKXtpZihuKHQpLGU9byhlLCEwKSxuKHIpLGkpdHJ5e3JldHVybiBhKHQsZSxyKX1jYXRjaCh0KXt9aWYoXCJnZXRcImluIHJ8fFwic2V0XCJpbiByKXRocm93IFR5cGVFcnJvcihcIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIVwiKTtyZXR1cm5cInZhbHVlXCJpbiByJiYodFtlXT1yLnZhbHVlKSx0fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMzgpLGk9TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/aShuKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qobih0KSl9fSxmdW5jdGlvbih0LGUpe3ZhciByPXt9Lmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmNhbGwodCxlKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgZnVuY3Rpb24hXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoOSksaT1yKDM3KTt0LmV4cG9ydHM9cig4KT9mdW5jdGlvbih0LGUscil7cmV0dXJuIG4uZih0LGUsaSgxLHIpKX06ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0W2VdPXIsdH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDQpLGk9cigxNCksbz1yKDEyKSxhPXIoNDgpKFwic3JjXCIpLGY9XCJ0b1N0cmluZ1wiLHM9RnVuY3Rpb25bZl0sdT0oXCJcIitzKS5zcGxpdChmKTtyKDMyKS5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBzLmNhbGwodCl9LCh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIsZil7dmFyIHM9XCJmdW5jdGlvblwiPT10eXBlb2YgcjtzJiYobyhyLFwibmFtZVwiKXx8aShyLFwibmFtZVwiLGUpKSx0W2VdIT09ciYmKHMmJihvKHIsYSl8fGkocixhLHRbZV0/XCJcIit0W2VdOnUuam9pbihTdHJpbmcoZSkpKSksdD09PW4/dFtlXT1yOmY/dFtlXT90W2VdPXI6aSh0LGUscik6KGRlbGV0ZSB0W2VdLGkodCxlLHIpKSl9KShGdW5jdGlvbi5wcm90b3R5cGUsZixmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMmJnRoaXNbYV18fHMuY2FsbCh0aGlzKX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoNSksbz1yKDI0KSxhPS9cIi9nLGY9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9U3RyaW5nKG8odCkpLGY9XCI8XCIrZTtyZXR1cm5cIlwiIT09ciYmKGYrPVwiIFwiK3IrJz1cIicrU3RyaW5nKG4pLnJlcGxhY2UoYSxcIiZxdW90O1wiKSsnXCInKSxmK1wiPlwiK2krXCI8L1wiK2UrXCI+XCJ9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciByPXt9O3JbdF09ZShmKSxuKG4uUCtuLkYqaShmdW5jdGlvbigpe3ZhciBlPVwiXCJbdF0oJ1wiJyk7cmV0dXJuIGUhPT1lLnRvTG93ZXJDYXNlKCl8fGUuc3BsaXQoJ1wiJykubGVuZ3RoPjN9KSxcIlN0cmluZ1wiLHIpfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNjUpLGk9cigyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuKGkodCkpfX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fFwiQXNzZXJ0aW9uIGZhaWxlZFwiKX1mdW5jdGlvbiBpKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiBvKHQsZSxyKXtyZXR1cm4gby5pc0JOKHQpP3Q6KHRoaXMubmVnYXRpdmU9MCx0aGlzLndvcmRzPW51bGwsdGhpcy5sZW5ndGg9MCx0aGlzLnJlZD1udWxsLHZvaWQobnVsbCE9PXQmJihcImxlXCIhPT1lJiZcImJlXCIhPT1lfHwocj1lLGU9MTApLHRoaXMuX2luaXQodHx8MCxlfHwxMCxyfHxcImJlXCIpKSkpfWZ1bmN0aW9uIGEodCxlLHIpe2Zvcih2YXIgbj0wLGk9TWF0aC5taW4odC5sZW5ndGgsciksbz1lO288aTtvKyspe3ZhciBhPXQuY2hhckNvZGVBdChvKS00ODtuPDw9NCxufD1hPj00OSYmYTw9NTQ/YS00OSsxMDphPj0xNyYmYTw9MjI/YS0xNysxMDoxNSZhfXJldHVybiBufWZ1bmN0aW9uIGYodCxlLHIsbil7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aCxyKSxhPWU7YTxvO2ErKyl7dmFyIGY9dC5jaGFyQ29kZUF0KGEpLTQ4O2kqPW4saSs9Zj49NDk/Zi00OSsxMDpmPj0xNz9mLTE3KzEwOmZ9cmV0dXJuIGl9ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQuYml0TGVuZ3RoKCkpLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ci8yNnwwLGk9ciUyNjtlW3JdPSh0LndvcmRzW25dJjE8PGkpPj4+aX1yZXR1cm4gZX1mdW5jdGlvbiB1KHQsZSxyKXtyLm5lZ2F0aXZlPWUubmVnYXRpdmVedC5uZWdhdGl2ZTt2YXIgbj10Lmxlbmd0aCtlLmxlbmd0aHwwO3IubGVuZ3RoPW4sbj1uLTF8MDt2YXIgaT0wfHQud29yZHNbMF0sbz0wfGUud29yZHNbMF0sYT1pKm8sZj02NzEwODg2MyZhLHM9YS82NzEwODg2NHwwO3Iud29yZHNbMF09Zjtmb3IodmFyIHU9MTt1PG47dSsrKXtmb3IodmFyIGg9cz4+PjI2LGM9NjcxMDg4NjMmcyxkPU1hdGgubWluKHUsZS5sZW5ndGgtMSksbD1NYXRoLm1heCgwLHUtdC5sZW5ndGgrMSk7bDw9ZDtsKyspe3ZhciBwPXUtbHwwO2k9MHx0LndvcmRzW3BdLG89MHxlLndvcmRzW2xdLGE9aSpvK2MsaCs9YS82NzEwODg2NHwwLGM9NjcxMDg4NjMmYX1yLndvcmRzW3VdPTB8YyxzPTB8aH1yZXR1cm4gMCE9PXM/ci53b3Jkc1t1XT0wfHM6ci5sZW5ndGgtLSxyLnN0cmlwKCl9ZnVuY3Rpb24gaCh0LGUscil7ci5uZWdhdGl2ZT1lLm5lZ2F0aXZlXnQubmVnYXRpdmUsci5sZW5ndGg9dC5sZW5ndGgrZS5sZW5ndGg7Zm9yKHZhciBuPTAsaT0wLG89MDtvPHIubGVuZ3RoLTE7bysrKXt2YXIgYT1pO2k9MDtmb3IodmFyIGY9NjcxMDg4NjMmbixzPU1hdGgubWluKG8sZS5sZW5ndGgtMSksdT1NYXRoLm1heCgwLG8tdC5sZW5ndGgrMSk7dTw9czt1Kyspe3ZhciBoPW8tdSxjPTB8dC53b3Jkc1toXSxkPTB8ZS53b3Jkc1t1XSxsPWMqZCxwPTY3MTA4ODYzJmw7YT1hKyhsLzY3MTA4ODY0fDApfDAscD1wK2Z8MCxmPTY3MTA4ODYzJnAsYT1hKyhwPj4+MjYpfDAsaSs9YT4+PjI2LGEmPTY3MTA4ODYzfXIud29yZHNbb109ZixuPWEsYT1pfXJldHVybiAwIT09bj9yLndvcmRzW29dPW46ci5sZW5ndGgtLSxyLnN0cmlwKCl9ZnVuY3Rpb24gYyh0LGUscil7dmFyIG49bmV3IGQ7cmV0dXJuIG4ubXVscCh0LGUscil9ZnVuY3Rpb24gZCh0LGUpe3RoaXMueD10LHRoaXMueT1lfWZ1bmN0aW9uIGwodCxlKXt0aGlzLm5hbWU9dCx0aGlzLnA9bmV3IG8oZSwxNiksdGhpcy5uPXRoaXMucC5iaXRMZW5ndGgoKSx0aGlzLms9bmV3IG8oMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApLHRoaXMudG1wPXRoaXMuX3RtcCgpfWZ1bmN0aW9uIHAoKXtsLmNhbGwodGhpcyxcImsyNTZcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmXCIpfWZ1bmN0aW9uIGIoKXtsLmNhbGwodGhpcyxcInAyMjRcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxXCIpfWZ1bmN0aW9uIHYoKXtsLmNhbGwodGhpcyxcInAxOTJcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmXCIpfWZ1bmN0aW9uIHkoKXtsLmNhbGwodGhpcyxcIjI1NTE5XCIsXCI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkXCIpfWZ1bmN0aW9uIG0odCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciBlPW8uX3ByaW1lKHQpO3RoaXMubT1lLnAsdGhpcy5wcmltZT1lfWVsc2Ugbih0Lmd0bigxKSxcIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMVwiKSx0aGlzLm09dCx0aGlzLnByaW1lPW51bGx9ZnVuY3Rpb24gZyh0KXttLmNhbGwodGhpcyx0KSx0aGlzLnNoaWZ0PXRoaXMubS5iaXRMZW5ndGgoKSx0aGlzLnNoaWZ0JTI2IT09MCYmKHRoaXMuc2hpZnQrPTI2LXRoaXMuc2hpZnQlMjYpLHRoaXMucj1uZXcgbygxKS5pdXNobG4odGhpcy5zaGlmdCksdGhpcy5yMj10aGlzLmltb2QodGhpcy5yLnNxcigpKSx0aGlzLnJpbnY9dGhpcy5yLl9pbnZtcCh0aGlzLm0pLHRoaXMubWludj10aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSksdGhpcy5taW52PXRoaXMubWludi51bW9kKHRoaXMuciksdGhpcy5taW52PXRoaXMuci5zdWIodGhpcy5taW52KX1cIm9iamVjdFwiPT10eXBlb2YgdD90LmV4cG9ydHM9bzplLkJOPW8sby5CTj1vLG8ud29yZFNpemU9MjY7dmFyIHc7dHJ5e3c9cigxKS5CdWZmZXJ9Y2F0Y2godCl7fW8uaXNCTj1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG98fG51bGwhPT10JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3Rvci53b3JkU2l6ZT09PW8ud29yZFNpemUmJkFycmF5LmlzQXJyYXkodC53b3Jkcyl9LG8ubWF4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY21wKGUpPjA/dDplfSxvLm1pbj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNtcChlKTwwP3Q6ZX0sby5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLHIpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXJldHVybiB0aGlzLl9pbml0TnVtYmVyKHQsZSxyKTtpZihcIm9iamVjdFwiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5faW5pdEFycmF5KHQsZSxyKTtcImhleFwiPT09ZSYmKGU9MTYpLG4oZT09PSgwfGUpJiZlPj0yJiZlPD0zNiksdD10LnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBpPTA7XCItXCI9PT10WzBdJiZpKyssMTY9PT1lP3RoaXMuX3BhcnNlSGV4KHQsaSk6dGhpcy5fcGFyc2VCYXNlKHQsZSxpKSxcIi1cIj09PXRbMF0mJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKSxcImxlXCI9PT1yJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksZSxyKX0sby5wcm90b3R5cGUuX2luaXROdW1iZXI9ZnVuY3Rpb24odCxlLHIpe3Q8MCYmKHRoaXMubmVnYXRpdmU9MSx0PS10KSx0PDY3MTA4ODY0Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZ0XSx0aGlzLmxlbmd0aD0xKTp0PDQ1MDM1OTk2MjczNzA0OTY/KHRoaXMud29yZHM9WzY3MTA4ODYzJnQsdC82NzEwODg2NCY2NzEwODg2M10sdGhpcy5sZW5ndGg9Mik6KG4odDw5MDA3MTk5MjU0NzQwOTkyKSx0aGlzLndvcmRzPVs2NzEwODg2MyZ0LHQvNjcxMDg4NjQmNjcxMDg4NjMsMV0sdGhpcy5sZW5ndGg9MyksXCJsZVwiPT09ciYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUscil9LG8ucHJvdG90eXBlLl9pbml0QXJyYXk9ZnVuY3Rpb24odCxlLHIpe2lmKG4oXCJudW1iZXJcIj09dHlwZW9mIHQubGVuZ3RoKSx0Lmxlbmd0aDw9MClyZXR1cm4gdGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MSx0aGlzO3RoaXMubGVuZ3RoPU1hdGguY2VpbCh0Lmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciBvLGEsZj0wO2lmKFwiYmVcIj09PXIpZm9yKGk9dC5sZW5ndGgtMSxvPTA7aT49MDtpLT0zKWE9dFtpXXx0W2ktMV08PDh8dFtpLTJdPDwxNix0aGlzLndvcmRzW29dfD1hPDxmJjY3MTA4ODYzLHRoaXMud29yZHNbbysxXT1hPj4+MjYtZiY2NzEwODg2MyxmKz0yNCxmPj0yNiYmKGYtPTI2LG8rKyk7ZWxzZSBpZihcImxlXCI9PT1yKWZvcihpPTAsbz0wO2k8dC5sZW5ndGg7aSs9MylhPXRbaV18dFtpKzFdPDw4fHRbaSsyXTw8MTYsdGhpcy53b3Jkc1tvXXw9YTw8ZiY2NzEwODg2Myx0aGlzLndvcmRzW28rMV09YT4+PjI2LWYmNjcxMDg4NjMsZis9MjQsZj49MjYmJihmLT0yNixvKyspO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl9wYXJzZUhleD1mdW5jdGlvbih0LGUpe3RoaXMubGVuZ3RoPU1hdGguY2VpbCgodC5sZW5ndGgtZSkvNiksdGhpcy53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgcj0wO3I8dGhpcy5sZW5ndGg7cisrKXRoaXMud29yZHNbcl09MDt2YXIgbixpLG89MDtmb3Iocj10Lmxlbmd0aC02LG49MDtyPj1lO3ItPTYpaT1hKHQscixyKzYpLHRoaXMud29yZHNbbl18PWk8PG8mNjcxMDg4NjMsdGhpcy53b3Jkc1tuKzFdfD1pPj4+MjYtbyY0MTk0MzAzLG8rPTI0LG8+PTI2JiYoby09MjYsbisrKTtyKzYhPT1lJiYoaT1hKHQsZSxyKzYpLHRoaXMud29yZHNbbl18PWk8PG8mNjcxMDg4NjMsdGhpcy53b3Jkc1tuKzFdfD1pPj4+MjYtbyY0MTk0MzAzKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl9wYXJzZUJhc2U9ZnVuY3Rpb24odCxlLHIpe3RoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTE7Zm9yKHZhciBuPTAsaT0xO2k8PTY3MTA4ODYzO2kqPWUpbisrO24tLSxpPWkvZXwwO2Zvcih2YXIgbz10Lmxlbmd0aC1yLGE9byVuLHM9TWF0aC5taW4obyxvLWEpK3IsdT0wLGg9cjtoPHM7aCs9bil1PWYodCxoLGgrbixlKSx0aGlzLmltdWxuKGkpLHRoaXMud29yZHNbMF0rdTw2NzEwODg2ND90aGlzLndvcmRzWzBdKz11OnRoaXMuX2lhZGRuKHUpO2lmKDAhPT1hKXt2YXIgYz0xO2Zvcih1PWYodCxoLHQubGVuZ3RoLGUpLGg9MDtoPGE7aCsrKWMqPWU7dGhpcy5pbXVsbihjKSx0aGlzLndvcmRzWzBdK3U8NjcxMDg4NjQ/dGhpcy53b3Jkc1swXSs9dTp0aGlzLl9pYWRkbih1KX19LG8ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCl7dC53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXQud29yZHNbZV09dGhpcy53b3Jkc1tlXTt0Lmxlbmd0aD10aGlzLmxlbmd0aCx0Lm5lZ2F0aXZlPXRoaXMubmVnYXRpdmUsdC5yZWQ9dGhpcy5yZWR9LG8ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG8obnVsbCk7cmV0dXJuIHRoaXMuY29weSh0KSx0fSxvLnByb3RvdHlwZS5fZXhwYW5kPWZ1bmN0aW9uKHQpe2Zvcig7dGhpcy5sZW5ndGg8dDspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS5zdHJpcD1mdW5jdGlvbigpe2Zvcig7dGhpcy5sZW5ndGg+MSYmMD09PXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV07KXRoaXMubGVuZ3RoLS07cmV0dXJuIHRoaXMuX25vcm1TaWduKCl9LG8ucHJvdG90eXBlLl9ub3JtU2lnbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdJiYodGhpcy5uZWdhdGl2ZT0wKSx0aGlzfSxvLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMucmVkP1wiPEJOLVI6IFwiOlwiPEJOOiBcIikrdGhpcy50b1N0cmluZygxNikrXCI+XCJ9O3ZhciBfPVtcIlwiLFwiMFwiLFwiMDBcIixcIjAwMFwiLFwiMDAwMFwiLFwiMDAwMDBcIixcIjAwMDAwMFwiLFwiMDAwMDAwMFwiLFwiMDAwMDAwMDBcIixcIjAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiXSxNPVswLDAsMjUsMTYsMTIsMTEsMTAsOSw4LDgsNyw3LDcsNyw2LDYsNiw2LDYsNiw2LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDVdLFM9WzAsMCwzMzU1NDQzMiw0MzA0NjcyMSwxNjc3NzIxNiw0ODgyODEyNSw2MDQ2NjE3Niw0MDM1MzYwNywxNjc3NzIxNiw0MzA0NjcyMSwxZTcsMTk0ODcxNzEsMzU4MzE4MDgsNjI3NDg1MTcsNzUyOTUzNiwxMTM5MDYyNSwxNjc3NzIxNiwyNDEzNzU2OSwzNDAxMjIyNCw0NzA0NTg4MSw2NGU2LDQwODQxMDEsNTE1MzYzMiw2NDM2MzQzLDc5NjI2MjQsOTc2NTYyNSwxMTg4MTM3NiwxNDM0ODkwNywxNzIxMDM2OCwyMDUxMTE0OSwyNDNlNSwyODYyOTE1MSwzMzU1NDQzMiwzOTEzNTM5Myw0NTQzNTQyNCw1MjUyMTg3NSw2MDQ2NjE3Nl07by5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24odCxlKXt0PXR8fDEwLGU9MHxlfHwxO3ZhciByO2lmKDE2PT09dHx8XCJoZXhcIj09PXQpe3I9XCJcIjtmb3IodmFyIGk9MCxvPTAsYT0wO2E8dGhpcy5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLndvcmRzW2FdLHM9KDE2Nzc3MjE1JihmPDxpfG8pKS50b1N0cmluZygxNik7bz1mPj4+MjQtaSYxNjc3NzIxNSxyPTAhPT1vfHxhIT09dGhpcy5sZW5ndGgtMT9fWzYtcy5sZW5ndGhdK3MrcjpzK3IsaSs9MixpPj0yNiYmKGktPTI2LGEtLSl9Zm9yKDAhPT1vJiYocj1vLnRvU3RyaW5nKDE2KStyKTtyLmxlbmd0aCVlIT09MDspcj1cIjBcIityO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKHI9XCItXCIrcikscn1pZih0PT09KDB8dCkmJnQ+PTImJnQ8PTM2KXt2YXIgdT1NW3RdLGg9U1t0XTtyPVwiXCI7dmFyIGM9dGhpcy5jbG9uZSgpO2ZvcihjLm5lZ2F0aXZlPTA7IWMuaXNaZXJvKCk7KXt2YXIgZD1jLm1vZG4oaCkudG9TdHJpbmcodCk7Yz1jLmlkaXZuKGgpLHI9Yy5pc1plcm8oKT9kK3I6X1t1LWQubGVuZ3RoXStkK3J9Zm9yKHRoaXMuaXNaZXJvKCkmJihyPVwiMFwiK3IpO3IubGVuZ3RoJWUhPT0wOylyPVwiMFwiK3I7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlJiYocj1cIi1cIityKSxyfW4oITEsXCJCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpfSxvLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMud29yZHNbMF07cmV0dXJuIDI9PT10aGlzLmxlbmd0aD90Kz02NzEwODg2NCp0aGlzLndvcmRzWzFdOjM9PT10aGlzLmxlbmd0aCYmMT09PXRoaXMud29yZHNbMl0/dCs9NDUwMzU5OTYyNzM3MDQ5Nis2NzEwODg2NCp0aGlzLndvcmRzWzFdOnRoaXMubGVuZ3RoPjImJm4oITEsXCJOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHNcIiksMCE9PXRoaXMubmVnYXRpdmU/LXQ6dH0sby5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpfSxvLnByb3RvdHlwZS50b0J1ZmZlcj1mdW5jdGlvbih0LGUpe3JldHVybiBuKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3KSx0aGlzLnRvQXJyYXlMaWtlKHcsdCxlKX0sby5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LHQsZSl9LG8ucHJvdG90eXBlLnRvQXJyYXlMaWtlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT10aGlzLmJ5dGVMZW5ndGgoKSxvPXJ8fE1hdGgubWF4KDEsaSk7bihpPD1vLFwiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aFwiKSxuKG8+MCxcIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMFwiKSx0aGlzLnN0cmlwKCk7dmFyIGEsZixzPVwibGVcIj09PWUsdT1uZXcgdChvKSxoPXRoaXMuY2xvbmUoKTtpZihzKXtmb3IoZj0wOyFoLmlzWmVybygpO2YrKylhPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSx1W2ZdPWE7Zm9yKDtmPG87ZisrKXVbZl09MH1lbHNle2ZvcihmPTA7ZjxvLWk7ZisrKXVbZl09MDtmb3IoZj0wOyFoLmlzWmVybygpO2YrKylhPWguYW5kbG4oMjU1KSxcbmguaXVzaHJuKDgpLHVbby1mLTFdPWF9cmV0dXJuIHV9LE1hdGguY2x6MzI/by5wcm90b3R5cGUuX2NvdW50Qml0cz1mdW5jdGlvbih0KXtyZXR1cm4gMzItTWF0aC5jbHozMih0KX06by5wcm90b3R5cGUuX2NvdW50Qml0cz1mdW5jdGlvbih0KXt2YXIgZT10LHI9MDtyZXR1cm4gZT49NDA5NiYmKHIrPTEzLGU+Pj49MTMpLGU+PTY0JiYocis9NyxlPj4+PTcpLGU+PTgmJihyKz00LGU+Pj49NCksZT49MiYmKHIrPTIsZT4+Pj0yKSxyK2V9LG8ucHJvdG90eXBlLl96ZXJvQml0cz1mdW5jdGlvbih0KXtpZigwPT09dClyZXR1cm4gMjY7dmFyIGU9dCxyPTA7cmV0dXJuIDA9PT0oODE5MSZlKSYmKHIrPTEzLGU+Pj49MTMpLDA9PT0oMTI3JmUpJiYocis9NyxlPj4+PTcpLDA9PT0oMTUmZSkmJihyKz00LGU+Pj49NCksMD09PSgzJmUpJiYocis9MixlPj4+PTIpLDA9PT0oMSZlKSYmcisrLHJ9LG8ucHJvdG90eXBlLmJpdExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0sZT10aGlzLl9jb3VudEJpdHModCk7cmV0dXJuIDI2Kih0aGlzLmxlbmd0aC0xKStlfSxvLnByb3RvdHlwZS56ZXJvQml0cz1mdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIDA7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXt2YXIgcj10aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2VdKTtpZih0Kz1yLDI2IT09cilicmVha31yZXR1cm4gdH0sby5wcm90b3R5cGUuYnl0ZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKS84KX0sby5wcm90b3R5cGUudG9Ud29zPWZ1bmN0aW9uKHQpe3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZT90aGlzLmFicygpLmlub3RuKHQpLmlhZGRuKDEpOnRoaXMuY2xvbmUoKX0sby5wcm90b3R5cGUuZnJvbVR3b3M9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGVzdG4odC0xKT90aGlzLm5vdG4odCkuaWFkZG4oMSkuaW5lZygpOnRoaXMuY2xvbmUoKX0sby5wcm90b3R5cGUuaXNOZWc9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmV9LG8ucHJvdG90eXBlLm5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuaW5lZygpfSxvLnByb3RvdHlwZS5pbmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNaZXJvKCl8fCh0aGlzLm5lZ2F0aXZlXj0xKSx0aGlzfSxvLnByb3RvdHlwZS5pdW9yPWZ1bmN0aW9uKHQpe2Zvcig7dGhpcy5sZW5ndGg8dC5sZW5ndGg7KXRoaXMud29yZHNbdGhpcy5sZW5ndGgrK109MDtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLndvcmRzW2VdPXRoaXMud29yZHNbZV18dC53b3Jkc1tlXTtyZXR1cm4gdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5pb3I9ZnVuY3Rpb24odCl7cmV0dXJuIG4oMD09PSh0aGlzLm5lZ2F0aXZlfHQubmVnYXRpdmUpKSx0aGlzLml1b3IodCl9LG8ucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaW9yKHQpOnQuY2xvbmUoKS5pb3IodGhpcyl9LG8ucHJvdG90eXBlLnVvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLml1b3IodCk6dC5jbG9uZSgpLml1b3IodGhpcyl9LG8ucHJvdG90eXBlLml1YW5kPWZ1bmN0aW9uKHQpe3ZhciBlO2U9dGhpcy5sZW5ndGg+dC5sZW5ndGg/dDp0aGlzO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXRoaXMud29yZHNbcl09dGhpcy53b3Jkc1tyXSZ0LndvcmRzW3JdO3JldHVybiB0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4oMD09PSh0aGlzLm5lZ2F0aXZlfHQubmVnYXRpdmUpKSx0aGlzLml1YW5kKHQpfSxvLnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYW5kKHQpOnQuY2xvbmUoKS5pYW5kKHRoaXMpfSxvLnByb3RvdHlwZS51YW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXVhbmQodCk6dC5jbG9uZSgpLml1YW5kKHRoaXMpfSxvLnByb3RvdHlwZS5pdXhvcj1mdW5jdGlvbih0KXt2YXIgZSxyO3RoaXMubGVuZ3RoPnQubGVuZ3RoPyhlPXRoaXMscj10KTooZT10LHI9dGhpcyk7Zm9yKHZhciBuPTA7bjxyLmxlbmd0aDtuKyspdGhpcy53b3Jkc1tuXT1lLndvcmRzW25dXnIud29yZHNbbl07aWYodGhpcyE9PWUpZm9yKDtuPGUubGVuZ3RoO24rKyl0aGlzLndvcmRzW25dPWUud29yZHNbbl07cmV0dXJuIHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXhvcj1mdW5jdGlvbih0KXtyZXR1cm4gbigwPT09KHRoaXMubmVnYXRpdmV8dC5uZWdhdGl2ZSkpLHRoaXMuaXV4b3IodCl9LG8ucHJvdG90eXBlLnhvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLml4b3IodCk6dC5jbG9uZSgpLml4b3IodGhpcyl9LG8ucHJvdG90eXBlLnV4b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdXhvcih0KTp0LmNsb25lKCkuaXV4b3IodGhpcyl9LG8ucHJvdG90eXBlLmlub3RuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPTB8TWF0aC5jZWlsKHQvMjYpLHI9dCUyNjt0aGlzLl9leHBhbmQoZSkscj4wJiZlLS07Zm9yKHZhciBpPTA7aTxlO2krKyl0aGlzLndvcmRzW2ldPTY3MTA4ODYzJn50aGlzLndvcmRzW2ldO3JldHVybiByPjAmJih0aGlzLndvcmRzW2ldPX50aGlzLndvcmRzW2ldJjY3MTA4ODYzPj4yNi1yKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLm5vdG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih0KX0sby5wcm90b3R5cGUuc2V0bj1mdW5jdGlvbih0LGUpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciByPXQvMjZ8MCxpPXQlMjY7cmV0dXJuIHRoaXMuX2V4cGFuZChyKzEpLGU/dGhpcy53b3Jkc1tyXT10aGlzLndvcmRzW3JdfDE8PGk6dGhpcy53b3Jkc1tyXT10aGlzLndvcmRzW3JdJn4oMTw8aSksdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5pYWRkPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09dC5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLGU9dGhpcy5pc3ViKHQpLHRoaXMubmVnYXRpdmVePTEsdGhpcy5fbm9ybVNpZ24oKTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmMCE9PXQubmVnYXRpdmUpcmV0dXJuIHQubmVnYXRpdmU9MCxlPXRoaXMuaXN1Yih0KSx0Lm5lZ2F0aXZlPTEsZS5fbm9ybVNpZ24oKTt2YXIgcixuO3RoaXMubGVuZ3RoPnQubGVuZ3RoPyhyPXRoaXMsbj10KToocj10LG49dGhpcyk7Zm9yKHZhciBpPTAsbz0wO288bi5sZW5ndGg7bysrKWU9KDB8ci53b3Jkc1tvXSkrKDB8bi53b3Jkc1tvXSkraSx0aGlzLndvcmRzW29dPTY3MTA4ODYzJmUsaT1lPj4+MjY7Zm9yKDswIT09aSYmbzxyLmxlbmd0aDtvKyspZT0oMHxyLndvcmRzW29dKStpLHRoaXMud29yZHNbb109NjcxMDg4NjMmZSxpPWU+Pj4yNjtpZih0aGlzLmxlbmd0aD1yLmxlbmd0aCwwIT09aSl0aGlzLndvcmRzW3RoaXMubGVuZ3RoXT1pLHRoaXMubGVuZ3RoKys7ZWxzZSBpZihyIT09dGhpcylmb3IoO288ci5sZW5ndGg7bysrKXRoaXMud29yZHNbb109ci53b3Jkc1tvXTtyZXR1cm4gdGhpc30sby5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiAwIT09dC5uZWdhdGl2ZSYmMD09PXRoaXMubmVnYXRpdmU/KHQubmVnYXRpdmU9MCxlPXRoaXMuc3ViKHQpLHQubmVnYXRpdmVePTEsZSk6MD09PXQubmVnYXRpdmUmJjAhPT10aGlzLm5lZ2F0aXZlPyh0aGlzLm5lZ2F0aXZlPTAsZT10LnN1Yih0aGlzKSx0aGlzLm5lZ2F0aXZlPTEsZSk6dGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlhZGQodCk6dC5jbG9uZSgpLmlhZGQodGhpcyl9LG8ucHJvdG90eXBlLmlzdWI9ZnVuY3Rpb24odCl7aWYoMCE9PXQubmVnYXRpdmUpe3QubmVnYXRpdmU9MDt2YXIgZT10aGlzLmlhZGQodCk7cmV0dXJuIHQubmVnYXRpdmU9MSxlLl9ub3JtU2lnbigpfWlmKDAhPT10aGlzLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5pYWRkKHQpLHRoaXMubmVnYXRpdmU9MSx0aGlzLl9ub3JtU2lnbigpO3ZhciByPXRoaXMuY21wKHQpO2lmKDA9PT1yKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5sZW5ndGg9MSx0aGlzLndvcmRzWzBdPTAsdGhpczt2YXIgbixpO3I+MD8obj10aGlzLGk9dCk6KG49dCxpPXRoaXMpO2Zvcih2YXIgbz0wLGE9MDthPGkubGVuZ3RoO2ErKyllPSgwfG4ud29yZHNbYV0pLSgwfGkud29yZHNbYV0pK28sbz1lPj4yNix0aGlzLndvcmRzW2FdPTY3MTA4ODYzJmU7Zm9yKDswIT09byYmYTxuLmxlbmd0aDthKyspZT0oMHxuLndvcmRzW2FdKStvLG89ZT4+MjYsdGhpcy53b3Jkc1thXT02NzEwODg2MyZlO2lmKDA9PT1vJiZhPG4ubGVuZ3RoJiZuIT09dGhpcylmb3IoO2E8bi5sZW5ndGg7YSsrKXRoaXMud29yZHNbYV09bi53b3Jkc1thXTtyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgsYSksbiE9PXRoaXMmJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXN1Yih0KX07dmFyIEU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksbyxhPXQud29yZHMsZj1lLndvcmRzLHM9ci53b3Jkcyx1PTAsaD0wfGFbMF0sYz04MTkxJmgsZD1oPj4+MTMsbD0wfGFbMV0scD04MTkxJmwsYj1sPj4+MTMsdj0wfGFbMl0seT04MTkxJnYsbT12Pj4+MTMsZz0wfGFbM10sdz04MTkxJmcsXz1nPj4+MTMsTT0wfGFbNF0sUz04MTkxJk0sRT1NPj4+MTMsQT0wfGFbNV0saz04MTkxJkEseD1BPj4+MTMsST0wfGFbNl0sQj04MTkxJkksTz1JPj4+MTMsUj0wfGFbN10sUD04MTkxJlIsVD1SPj4+MTMsaj0wfGFbOF0sQz04MTkxJmosTj1qPj4+MTMsTD0wfGFbOV0sVT04MTkxJkwsej1MPj4+MTMsRD0wfGZbMF0scT04MTkxJkQsRj1EPj4+MTMsSz0wfGZbMV0sRz04MTkxJkssVj1LPj4+MTMsSD0wfGZbMl0sWD04MTkxJkgsWT1IPj4+MTMsVz0wfGZbM10sWj04MTkxJlcsSj1XPj4+MTMsJD0wfGZbNF0sUT04MTkxJiQsdHQ9JD4+PjEzLGV0PTB8Zls1XSxydD04MTkxJmV0LG50PWV0Pj4+MTMsaXQ9MHxmWzZdLG90PTgxOTEmaXQsYXQ9aXQ+Pj4xMyxmdD0wfGZbN10sc3Q9ODE5MSZmdCx1dD1mdD4+PjEzLGh0PTB8Zls4XSxjdD04MTkxJmh0LGR0PWh0Pj4+MTMsbHQ9MHxmWzldLHB0PTgxOTEmbHQsYnQ9bHQ+Pj4xMztyLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxyLmxlbmd0aD0xOSxuPU1hdGguaW11bChjLHEpLGk9TWF0aC5pbXVsKGMsRiksaT1pK01hdGguaW11bChkLHEpfDAsbz1NYXRoLmltdWwoZCxGKTt2YXIgdnQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKHZ0Pj4+MjYpfDAsdnQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKHAscSksaT1NYXRoLmltdWwocCxGKSxpPWkrTWF0aC5pbXVsKGIscSl8MCxvPU1hdGguaW11bChiLEYpLG49bitNYXRoLmltdWwoYyxHKXwwLGk9aStNYXRoLmltdWwoYyxWKXwwLGk9aStNYXRoLmltdWwoZCxHKXwwLG89bytNYXRoLmltdWwoZCxWKXwwO3ZhciB5dD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoeXQ+Pj4yNil8MCx5dCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoeSxxKSxpPU1hdGguaW11bCh5LEYpLGk9aStNYXRoLmltdWwobSxxKXwwLG89TWF0aC5pbXVsKG0sRiksbj1uK01hdGguaW11bChwLEcpfDAsaT1pK01hdGguaW11bChwLFYpfDAsaT1pK01hdGguaW11bChiLEcpfDAsbz1vK01hdGguaW11bChiLFYpfDAsbj1uK01hdGguaW11bChjLFgpfDAsaT1pK01hdGguaW11bChjLFkpfDAsaT1pK01hdGguaW11bChkLFgpfDAsbz1vK01hdGguaW11bChkLFkpfDA7dmFyIG10PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhtdD4+PjI2KXwwLG10Jj02NzEwODg2MyxuPU1hdGguaW11bCh3LHEpLGk9TWF0aC5pbXVsKHcsRiksaT1pK01hdGguaW11bChfLHEpfDAsbz1NYXRoLmltdWwoXyxGKSxuPW4rTWF0aC5pbXVsKHksRyl8MCxpPWkrTWF0aC5pbXVsKHksVil8MCxpPWkrTWF0aC5pbXVsKG0sRyl8MCxvPW8rTWF0aC5pbXVsKG0sVil8MCxuPW4rTWF0aC5pbXVsKHAsWCl8MCxpPWkrTWF0aC5pbXVsKHAsWSl8MCxpPWkrTWF0aC5pbXVsKGIsWCl8MCxvPW8rTWF0aC5pbXVsKGIsWSl8MCxuPW4rTWF0aC5pbXVsKGMsWil8MCxpPWkrTWF0aC5pbXVsKGMsSil8MCxpPWkrTWF0aC5pbXVsKGQsWil8MCxvPW8rTWF0aC5pbXVsKGQsSil8MDt2YXIgZ3Q9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKGd0Pj4+MjYpfDAsZ3QmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFMscSksaT1NYXRoLmltdWwoUyxGKSxpPWkrTWF0aC5pbXVsKEUscSl8MCxvPU1hdGguaW11bChFLEYpLG49bitNYXRoLmltdWwodyxHKXwwLGk9aStNYXRoLmltdWwodyxWKXwwLGk9aStNYXRoLmltdWwoXyxHKXwwLG89bytNYXRoLmltdWwoXyxWKXwwLG49bitNYXRoLmltdWwoeSxYKXwwLGk9aStNYXRoLmltdWwoeSxZKXwwLGk9aStNYXRoLmltdWwobSxYKXwwLG89bytNYXRoLmltdWwobSxZKXwwLG49bitNYXRoLmltdWwocCxaKXwwLGk9aStNYXRoLmltdWwocCxKKXwwLGk9aStNYXRoLmltdWwoYixaKXwwLG89bytNYXRoLmltdWwoYixKKXwwLG49bitNYXRoLmltdWwoYyxRKXwwLGk9aStNYXRoLmltdWwoYyx0dCl8MCxpPWkrTWF0aC5pbXVsKGQsUSl8MCxvPW8rTWF0aC5pbXVsKGQsdHQpfDA7dmFyIHd0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyh3dD4+PjI2KXwwLHd0Jj02NzEwODg2MyxuPU1hdGguaW11bChrLHEpLGk9TWF0aC5pbXVsKGssRiksaT1pK01hdGguaW11bCh4LHEpfDAsbz1NYXRoLmltdWwoeCxGKSxuPW4rTWF0aC5pbXVsKFMsRyl8MCxpPWkrTWF0aC5pbXVsKFMsVil8MCxpPWkrTWF0aC5pbXVsKEUsRyl8MCxvPW8rTWF0aC5pbXVsKEUsVil8MCxuPW4rTWF0aC5pbXVsKHcsWCl8MCxpPWkrTWF0aC5pbXVsKHcsWSl8MCxpPWkrTWF0aC5pbXVsKF8sWCl8MCxvPW8rTWF0aC5pbXVsKF8sWSl8MCxuPW4rTWF0aC5pbXVsKHksWil8MCxpPWkrTWF0aC5pbXVsKHksSil8MCxpPWkrTWF0aC5pbXVsKG0sWil8MCxvPW8rTWF0aC5pbXVsKG0sSil8MCxuPW4rTWF0aC5pbXVsKHAsUSl8MCxpPWkrTWF0aC5pbXVsKHAsdHQpfDAsaT1pK01hdGguaW11bChiLFEpfDAsbz1vK01hdGguaW11bChiLHR0KXwwLG49bitNYXRoLmltdWwoYyxydCl8MCxpPWkrTWF0aC5pbXVsKGMsbnQpfDAsaT1pK01hdGguaW11bChkLHJ0KXwwLG89bytNYXRoLmltdWwoZCxudCl8MDt2YXIgX3Q9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKF90Pj4+MjYpfDAsX3QmPTY3MTA4ODYzLG49TWF0aC5pbXVsKEIscSksaT1NYXRoLmltdWwoQixGKSxpPWkrTWF0aC5pbXVsKE8scSl8MCxvPU1hdGguaW11bChPLEYpLG49bitNYXRoLmltdWwoayxHKXwwLGk9aStNYXRoLmltdWwoayxWKXwwLGk9aStNYXRoLmltdWwoeCxHKXwwLG89bytNYXRoLmltdWwoeCxWKXwwLG49bitNYXRoLmltdWwoUyxYKXwwLGk9aStNYXRoLmltdWwoUyxZKXwwLGk9aStNYXRoLmltdWwoRSxYKXwwLG89bytNYXRoLmltdWwoRSxZKXwwLG49bitNYXRoLmltdWwodyxaKXwwLGk9aStNYXRoLmltdWwodyxKKXwwLGk9aStNYXRoLmltdWwoXyxaKXwwLG89bytNYXRoLmltdWwoXyxKKXwwLG49bitNYXRoLmltdWwoeSxRKXwwLGk9aStNYXRoLmltdWwoeSx0dCl8MCxpPWkrTWF0aC5pbXVsKG0sUSl8MCxvPW8rTWF0aC5pbXVsKG0sdHQpfDAsbj1uK01hdGguaW11bChwLHJ0KXwwLGk9aStNYXRoLmltdWwocCxudCl8MCxpPWkrTWF0aC5pbXVsKGIscnQpfDAsbz1vK01hdGguaW11bChiLG50KXwwLG49bitNYXRoLmltdWwoYyxvdCl8MCxpPWkrTWF0aC5pbXVsKGMsYXQpfDAsaT1pK01hdGguaW11bChkLG90KXwwLG89bytNYXRoLmltdWwoZCxhdCl8MDt2YXIgTXQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKE10Pj4+MjYpfDAsTXQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFAscSksaT1NYXRoLmltdWwoUCxGKSxpPWkrTWF0aC5pbXVsKFQscSl8MCxvPU1hdGguaW11bChULEYpLG49bitNYXRoLmltdWwoQixHKXwwLGk9aStNYXRoLmltdWwoQixWKXwwLGk9aStNYXRoLmltdWwoTyxHKXwwLG89bytNYXRoLmltdWwoTyxWKXwwLG49bitNYXRoLmltdWwoayxYKXwwLGk9aStNYXRoLmltdWwoayxZKXwwLGk9aStNYXRoLmltdWwoeCxYKXwwLG89bytNYXRoLmltdWwoeCxZKXwwLG49bitNYXRoLmltdWwoUyxaKXwwLGk9aStNYXRoLmltdWwoUyxKKXwwLGk9aStNYXRoLmltdWwoRSxaKXwwLG89bytNYXRoLmltdWwoRSxKKXwwLG49bitNYXRoLmltdWwodyxRKXwwLGk9aStNYXRoLmltdWwodyx0dCl8MCxpPWkrTWF0aC5pbXVsKF8sUSl8MCxvPW8rTWF0aC5pbXVsKF8sdHQpfDAsbj1uK01hdGguaW11bCh5LHJ0KXwwLGk9aStNYXRoLmltdWwoeSxudCl8MCxpPWkrTWF0aC5pbXVsKG0scnQpfDAsbz1vK01hdGguaW11bChtLG50KXwwLG49bitNYXRoLmltdWwocCxvdCl8MCxpPWkrTWF0aC5pbXVsKHAsYXQpfDAsaT1pK01hdGguaW11bChiLG90KXwwLG89bytNYXRoLmltdWwoYixhdCl8MCxuPW4rTWF0aC5pbXVsKGMsc3QpfDAsaT1pK01hdGguaW11bChjLHV0KXwwLGk9aStNYXRoLmltdWwoZCxzdCl8MCxvPW8rTWF0aC5pbXVsKGQsdXQpfDA7dmFyIFN0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhTdD4+PjI2KXwwLFN0Jj02NzEwODg2MyxuPU1hdGguaW11bChDLHEpLGk9TWF0aC5pbXVsKEMsRiksaT1pK01hdGguaW11bChOLHEpfDAsbz1NYXRoLmltdWwoTixGKSxuPW4rTWF0aC5pbXVsKFAsRyl8MCxpPWkrTWF0aC5pbXVsKFAsVil8MCxpPWkrTWF0aC5pbXVsKFQsRyl8MCxvPW8rTWF0aC5pbXVsKFQsVil8MCxuPW4rTWF0aC5pbXVsKEIsWCl8MCxpPWkrTWF0aC5pbXVsKEIsWSl8MCxpPWkrTWF0aC5pbXVsKE8sWCl8MCxvPW8rTWF0aC5pbXVsKE8sWSl8MCxuPW4rTWF0aC5pbXVsKGssWil8MCxpPWkrTWF0aC5pbXVsKGssSil8MCxpPWkrTWF0aC5pbXVsKHgsWil8MCxvPW8rTWF0aC5pbXVsKHgsSil8MCxuPW4rTWF0aC5pbXVsKFMsUSl8MCxpPWkrTWF0aC5pbXVsKFMsdHQpfDAsaT1pK01hdGguaW11bChFLFEpfDAsbz1vK01hdGguaW11bChFLHR0KXwwLG49bitNYXRoLmltdWwodyxydCl8MCxpPWkrTWF0aC5pbXVsKHcsbnQpfDAsaT1pK01hdGguaW11bChfLHJ0KXwwLG89bytNYXRoLmltdWwoXyxudCl8MCxuPW4rTWF0aC5pbXVsKHksb3QpfDAsaT1pK01hdGguaW11bCh5LGF0KXwwLGk9aStNYXRoLmltdWwobSxvdCl8MCxvPW8rTWF0aC5pbXVsKG0sYXQpfDAsbj1uK01hdGguaW11bChwLHN0KXwwLGk9aStNYXRoLmltdWwocCx1dCl8MCxpPWkrTWF0aC5pbXVsKGIsc3QpfDAsbz1vK01hdGguaW11bChiLHV0KXwwLG49bitNYXRoLmltdWwoYyxjdCl8MCxpPWkrTWF0aC5pbXVsKGMsZHQpfDAsaT1pK01hdGguaW11bChkLGN0KXwwLG89bytNYXRoLmltdWwoZCxkdCl8MDt2YXIgRXQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKEV0Pj4+MjYpfDAsRXQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUscSksaT1NYXRoLmltdWwoVSxGKSxpPWkrTWF0aC5pbXVsKHoscSl8MCxvPU1hdGguaW11bCh6LEYpLG49bitNYXRoLmltdWwoQyxHKXwwLGk9aStNYXRoLmltdWwoQyxWKXwwLGk9aStNYXRoLmltdWwoTixHKXwwLG89bytNYXRoLmltdWwoTixWKXwwLG49bitNYXRoLmltdWwoUCxYKXwwLGk9aStNYXRoLmltdWwoUCxZKXwwLGk9aStNYXRoLmltdWwoVCxYKXwwLG89bytNYXRoLmltdWwoVCxZKXwwLG49bitNYXRoLmltdWwoQixaKXwwLGk9aStNYXRoLmltdWwoQixKKXwwLGk9aStNYXRoLmltdWwoTyxaKXwwLG89bytNYXRoLmltdWwoTyxKKXwwLG49bitNYXRoLmltdWwoayxRKXwwLGk9aStNYXRoLmltdWwoayx0dCl8MCxpPWkrTWF0aC5pbXVsKHgsUSl8MCxvPW8rTWF0aC5pbXVsKHgsdHQpfDAsbj1uK01hdGguaW11bChTLHJ0KXwwLGk9aStNYXRoLmltdWwoUyxudCl8MCxpPWkrTWF0aC5pbXVsKEUscnQpfDAsbz1vK01hdGguaW11bChFLG50KXwwLG49bitNYXRoLmltdWwodyxvdCl8MCxpPWkrTWF0aC5pbXVsKHcsYXQpfDAsaT1pK01hdGguaW11bChfLG90KXwwLG89bytNYXRoLmltdWwoXyxhdCl8MCxuPW4rTWF0aC5pbXVsKHksc3QpfDAsaT1pK01hdGguaW11bCh5LHV0KXwwLGk9aStNYXRoLmltdWwobSxzdCl8MCxvPW8rTWF0aC5pbXVsKG0sdXQpfDAsbj1uK01hdGguaW11bChwLGN0KXwwLGk9aStNYXRoLmltdWwocCxkdCl8MCxpPWkrTWF0aC5pbXVsKGIsY3QpfDAsbz1vK01hdGguaW11bChiLGR0KXwwLG49bitNYXRoLmltdWwoYyxwdCl8MCxpPWkrTWF0aC5pbXVsKGMsYnQpfDAsaT1pK01hdGguaW11bChkLHB0KXwwLG89bytNYXRoLmltdWwoZCxidCl8MDt2YXIgQXQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKEF0Pj4+MjYpfDAsQXQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUsRyksaT1NYXRoLmltdWwoVSxWKSxpPWkrTWF0aC5pbXVsKHosRyl8MCxvPU1hdGguaW11bCh6LFYpLG49bitNYXRoLmltdWwoQyxYKXwwLGk9aStNYXRoLmltdWwoQyxZKXwwLGk9aStNYXRoLmltdWwoTixYKXwwLG89bytNYXRoLmltdWwoTixZKXwwLG49bitNYXRoLmltdWwoUCxaKXwwLGk9aStNYXRoLmltdWwoUCxKKXwwLGk9aStNYXRoLmltdWwoVCxaKXwwLG89bytNYXRoLmltdWwoVCxKKXwwLG49bitNYXRoLmltdWwoQixRKXwwLGk9aStNYXRoLmltdWwoQix0dCl8MCxpPWkrTWF0aC5pbXVsKE8sUSl8MCxvPW8rTWF0aC5pbXVsKE8sdHQpfDAsbj1uK01hdGguaW11bChrLHJ0KXwwLGk9aStNYXRoLmltdWwoayxudCl8MCxpPWkrTWF0aC5pbXVsKHgscnQpfDAsbz1vK01hdGguaW11bCh4LG50KXwwLG49bitNYXRoLmltdWwoUyxvdCl8MCxpPWkrTWF0aC5pbXVsKFMsYXQpfDAsaT1pK01hdGguaW11bChFLG90KXwwLG89bytNYXRoLmltdWwoRSxhdCl8MCxuPW4rTWF0aC5pbXVsKHcsc3QpfDAsaT1pK01hdGguaW11bCh3LHV0KXwwLGk9aStNYXRoLmltdWwoXyxzdCl8MCxvPW8rTWF0aC5pbXVsKF8sdXQpfDAsbj1uK01hdGguaW11bCh5LGN0KXwwLGk9aStNYXRoLmltdWwoeSxkdCl8MCxpPWkrTWF0aC5pbXVsKG0sY3QpfDAsbz1vK01hdGguaW11bChtLGR0KXwwLG49bitNYXRoLmltdWwocCxwdCl8MCxpPWkrTWF0aC5pbXVsKHAsYnQpfDAsaT1pK01hdGguaW11bChiLHB0KXwwLG89bytNYXRoLmltdWwoYixidCl8MDt2YXIga3Q9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKGt0Pj4+MjYpfDAsa3QmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUsWCksaT1NYXRoLmltdWwoVSxZKSxpPWkrTWF0aC5pbXVsKHosWCl8MCxvPU1hdGguaW11bCh6LFkpLG49bitNYXRoLmltdWwoQyxaKXwwLGk9aStNYXRoLmltdWwoQyxKKXwwLGk9aStNYXRoLmltdWwoTixaKXwwLG89bytNYXRoLmltdWwoTixKKXwwLG49bitNYXRoLmltdWwoUCxRKXwwLGk9aStNYXRoLmltdWwoUCx0dCl8MCxpPWkrTWF0aC5pbXVsKFQsUSl8MCxvPW8rTWF0aC5pbXVsKFQsdHQpfDAsbj1uK01hdGguaW11bChCLHJ0KXwwLGk9aStNYXRoLmltdWwoQixudCl8MCxpPWkrTWF0aC5pbXVsKE8scnQpfDAsbz1vK01hdGguaW11bChPLG50KXwwLG49bitNYXRoLmltdWwoayxvdCl8MCxpPWkrTWF0aC5pbXVsKGssYXQpfDAsaT1pK01hdGguaW11bCh4LG90KXwwLG89bytNYXRoLmltdWwoeCxhdCl8MCxuPW4rTWF0aC5pbXVsKFMsc3QpfDAsaT1pK01hdGguaW11bChTLHV0KXwwLGk9aStNYXRoLmltdWwoRSxzdCl8MCxvPW8rTWF0aC5pbXVsKEUsdXQpfDAsbj1uK01hdGguaW11bCh3LGN0KXwwLGk9aStNYXRoLmltdWwodyxkdCl8MCxpPWkrTWF0aC5pbXVsKF8sY3QpfDAsbz1vK01hdGguaW11bChfLGR0KXwwLG49bitNYXRoLmltdWwoeSxwdCl8MCxpPWkrTWF0aC5pbXVsKHksYnQpfDAsaT1pK01hdGguaW11bChtLHB0KXwwLG89bytNYXRoLmltdWwobSxidCl8MDt2YXIgeHQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKHh0Pj4+MjYpfDAseHQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUsWiksaT1NYXRoLmltdWwoVSxKKSxpPWkrTWF0aC5pbXVsKHosWil8MCxvPU1hdGguaW11bCh6LEopLG49bitNYXRoLmltdWwoQyxRKXwwLGk9aStNYXRoLmltdWwoQyx0dCl8MCxpPWkrTWF0aC5pbXVsKE4sUSl8MCxvPW8rTWF0aC5pbXVsKE4sdHQpfDAsbj1uK01hdGguaW11bChQLHJ0KXwwLGk9aStNYXRoLmltdWwoUCxudCl8MCxpPWkrTWF0aC5pbXVsKFQscnQpfDAsbz1vK01hdGguaW11bChULG50KXwwLG49bitNYXRoLmltdWwoQixvdCl8MCxpPWkrTWF0aC5pbXVsKEIsYXQpfDAsaT1pK01hdGguaW11bChPLG90KXwwLG89bytNYXRoLmltdWwoTyxhdCl8MCxuPW4rTWF0aC5pbXVsKGssc3QpfDAsaT1pK01hdGguaW11bChrLHV0KXwwLGk9aStNYXRoLmltdWwoeCxzdCl8MCxvPW8rTWF0aC5pbXVsKHgsdXQpfDAsbj1uK01hdGguaW11bChTLGN0KXwwLGk9aStNYXRoLmltdWwoUyxkdCl8MCxpPWkrTWF0aC5pbXVsKEUsY3QpfDAsbz1vK01hdGguaW11bChFLGR0KXwwLG49bitNYXRoLmltdWwodyxwdCl8MCxpPWkrTWF0aC5pbXVsKHcsYnQpfDAsaT1pK01hdGguaW11bChfLHB0KXwwLG89bytNYXRoLmltdWwoXyxidCl8MDt2YXIgSXQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKEl0Pj4+MjYpfDAsSXQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUsUSksaT1NYXRoLmltdWwoVSx0dCksaT1pK01hdGguaW11bCh6LFEpfDAsbz1NYXRoLmltdWwoeix0dCksbj1uK01hdGguaW11bChDLHJ0KXwwLGk9aStNYXRoLmltdWwoQyxudCl8MCxpPWkrTWF0aC5pbXVsKE4scnQpfDAsbz1vK01hdGguaW11bChOLG50KXwwLG49bitNYXRoLmltdWwoUCxvdCl8MCxpPWkrTWF0aC5pbXVsKFAsYXQpfDAsaT1pK01hdGguaW11bChULG90KXwwLG89bytNYXRoLmltdWwoVCxhdCl8MCxuPW4rTWF0aC5pbXVsKEIsc3QpfDAsaT1pK01hdGguaW11bChCLHV0KXwwLGk9aStNYXRoLmltdWwoTyxzdCl8MCxvPW8rTWF0aC5pbXVsKE8sdXQpfDAsbj1uK01hdGguaW11bChrLGN0KXwwLGk9aStNYXRoLmltdWwoayxkdCl8MCxpPWkrTWF0aC5pbXVsKHgsY3QpfDAsbz1vK01hdGguaW11bCh4LGR0KXwwLG49bitNYXRoLmltdWwoUyxwdCl8MCxpPWkrTWF0aC5pbXVsKFMsYnQpfDAsaT1pK01hdGguaW11bChFLHB0KXwwLG89bytNYXRoLmltdWwoRSxidCl8MDt2YXIgQnQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKEJ0Pj4+MjYpfDAsQnQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUscnQpLGk9TWF0aC5pbXVsKFUsbnQpLGk9aStNYXRoLmltdWwoeixydCl8MCxvPU1hdGguaW11bCh6LG50KSxuPW4rTWF0aC5pbXVsKEMsb3QpfDAsaT1pK01hdGguaW11bChDLGF0KXwwLGk9aStNYXRoLmltdWwoTixvdCl8MCxvPW8rTWF0aC5pbXVsKE4sYXQpfDAsbj1uK01hdGguaW11bChQLHN0KXwwLGk9aStNYXRoLmltdWwoUCx1dCl8MCxpPWkrTWF0aC5pbXVsKFQsc3QpfDAsbz1vK01hdGguaW11bChULHV0KXwwLG49bitNYXRoLmltdWwoQixjdCl8MCxpPWkrTWF0aC5pbXVsKEIsZHQpfDAsaT1pK01hdGguaW11bChPLGN0KXwwLG89bytNYXRoLmltdWwoTyxkdCl8MCxuPW4rTWF0aC5pbXVsKGsscHQpfDAsaT1pK01hdGguaW11bChrLGJ0KXwwLGk9aStNYXRoLmltdWwoeCxwdCl8MCxvPW8rTWF0aC5pbXVsKHgsYnQpfDA7dmFyIE90PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhPdD4+PjI2KXwwLE90Jj02NzEwODg2MyxuPU1hdGguaW11bChVLG90KSxpPU1hdGguaW11bChVLGF0KSxpPWkrTWF0aC5pbXVsKHosb3QpfDAsbz1NYXRoLmltdWwoeixhdCksbj1uK01hdGguaW11bChDLHN0KXwwLGk9aStNYXRoLmltdWwoQyx1dCl8MCxpPWkrTWF0aC5pbXVsKE4sc3QpfDAsbz1vK01hdGguaW11bChOLHV0KXwwLG49bitNYXRoLmltdWwoUCxjdCl8MCxpPWkrTWF0aC5pbXVsKFAsZHQpfDAsaT1pK01hdGguaW11bChULGN0KXwwLG89bytNYXRoLmltdWwoVCxkdCl8MCxuPW4rTWF0aC5pbXVsKEIscHQpfDAsaT1pK01hdGguaW11bChCLGJ0KXwwLGk9aStNYXRoLmltdWwoTyxwdCl8MCxvPW8rTWF0aC5pbXVsKE8sYnQpfDA7dmFyIFJ0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhSdD4+PjI2KXwwLFJ0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLHN0KSxpPU1hdGguaW11bChVLHV0KSxpPWkrTWF0aC5pbXVsKHosc3QpfDAsbz1NYXRoLmltdWwoeix1dCksbj1uK01hdGguaW11bChDLGN0KXwwLGk9aStNYXRoLmltdWwoQyxkdCl8MCxpPWkrTWF0aC5pbXVsKE4sY3QpfDAsbz1vK01hdGguaW11bChOLGR0KXwwLG49bitNYXRoLmltdWwoUCxwdCl8MCxpPWkrTWF0aC5pbXVsKFAsYnQpfDAsaT1pK01hdGguaW11bChULHB0KXwwLG89bytNYXRoLmltdWwoVCxidCl8MDt2YXIgUHQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKFB0Pj4+MjYpfDAsUHQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUsY3QpLGk9TWF0aC5pbXVsKFUsZHQpLGk9aStNYXRoLmltdWwoeixjdCl8MCxvPU1hdGguaW11bCh6LGR0KSxuPW4rTWF0aC5pbXVsKEMscHQpfDAsaT1pK01hdGguaW11bChDLGJ0KXwwLGk9aStNYXRoLmltdWwoTixwdCl8MCxvPW8rTWF0aC5pbXVsKE4sYnQpfDA7dmFyIFR0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhUdD4+PjI2KXwwLFR0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLHB0KSxpPU1hdGguaW11bChVLGJ0KSxpPWkrTWF0aC5pbXVsKHoscHQpfDAsbz1NYXRoLmltdWwoeixidCk7dmFyIGp0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDtyZXR1cm4gdT0obysoaT4+PjEzKXwwKSsoanQ+Pj4yNil8MCxqdCY9NjcxMDg4NjMsc1swXT12dCxzWzFdPXl0LHNbMl09bXQsc1szXT1ndCxzWzRdPXd0LHNbNV09X3Qsc1s2XT1NdCxzWzddPVN0LHNbOF09RXQsc1s5XT1BdCxzWzEwXT1rdCxzWzExXT14dCxzWzEyXT1JdCxzWzEzXT1CdCxzWzE0XT1PdCxzWzE1XT1SdCxzWzE2XT1QdCxzWzE3XT1UdCxzWzE4XT1qdCwwIT09dSYmKHNbMTldPXUsci5sZW5ndGgrKykscn07TWF0aC5pbXVsfHwoRT11KSxvLnByb3RvdHlwZS5tdWxUbz1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcy5sZW5ndGgrdC5sZW5ndGg7cmV0dXJuIHI9MTA9PT10aGlzLmxlbmd0aCYmMTA9PT10Lmxlbmd0aD9FKHRoaXMsdCxlKTpuPDYzP3UodGhpcyx0LGUpOm48MTAyND9oKHRoaXMsdCxlKTpjKHRoaXMsdCxlKX0sZC5wcm90b3R5cGUubWFrZVJCVD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLHI9by5wcm90b3R5cGUuX2NvdW50Qml0cyh0KS0xLG49MDtuPHQ7bisrKWVbbl09dGhpcy5yZXZCaW4obixyLHQpO3JldHVybiBlfSxkLnByb3RvdHlwZS5yZXZCaW49ZnVuY3Rpb24odCxlLHIpe2lmKDA9PT10fHx0PT09ci0xKXJldHVybiB0O2Zvcih2YXIgbj0wLGk9MDtpPGU7aSsrKW58PSgxJnQpPDxlLWktMSx0Pj49MTtyZXR1cm4gbn0sZC5wcm90b3R5cGUucGVybXV0ZT1mdW5jdGlvbih0LGUscixuLGksbyl7Zm9yKHZhciBhPTA7YTxvO2ErKyluW2FdPWVbdFthXV0saVthXT1yW3RbYV1dfSxkLnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIsbixpLG8pe3RoaXMucGVybXV0ZShvLHQsZSxyLG4saSk7Zm9yKHZhciBhPTE7YTxpO2E8PD0xKWZvcih2YXIgZj1hPDwxLHM9TWF0aC5jb3MoMipNYXRoLlBJL2YpLHU9TWF0aC5zaW4oMipNYXRoLlBJL2YpLGg9MDtoPGk7aCs9Zilmb3IodmFyIGM9cyxkPXUsbD0wO2w8YTtsKyspe3ZhciBwPXJbaCtsXSxiPW5baCtsXSx2PXJbaCtsK2FdLHk9bltoK2wrYV0sbT1jKnYtZCp5O3k9Yyp5K2Qqdix2PW0scltoK2xdPXArdixuW2grbF09Yit5LHJbaCtsK2FdPXAtdixuW2grbCthXT1iLXksbCE9PWYmJihtPXMqYy11KmQsZD1zKmQrdSpjLGM9bSl9fSxkLnByb3RvdHlwZS5ndWVzc0xlbjEzYj1mdW5jdGlvbih0LGUpe3ZhciByPTF8TWF0aC5tYXgoZSx0KSxuPTEmcixpPTA7Zm9yKHI9ci8yfDA7cjtyPj4+PTEpaSsrO3JldHVybiAxPDxpKzErbn0sZC5wcm90b3R5cGUuY29uanVnYXRlPWZ1bmN0aW9uKHQsZSxyKXtpZighKHI8PTEpKWZvcih2YXIgbj0wO248ci8yO24rKyl7dmFyIGk9dFtuXTt0W25dPXRbci1uLTFdLHRbci1uLTFdPWksaT1lW25dLGVbbl09LWVbci1uLTFdLGVbci1uLTFdPS1pfX0sZC5wcm90b3R5cGUubm9ybWFsaXplMTNiPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0wO248ZS8yO24rKyl7dmFyIGk9ODE5MipNYXRoLnJvdW5kKHRbMipuKzFdL2UpK01hdGgucm91bmQodFsyKm5dL2UpK3I7dFtuXT02NzEwODg2MyZpLHI9aTw2NzEwODg2ND8wOmkvNjcxMDg4NjR8MH1yZXR1cm4gdH0sZC5wcm90b3R5cGUuY29udmVydDEzYj1mdW5jdGlvbih0LGUscixpKXtmb3IodmFyIG89MCxhPTA7YTxlO2ErKylvKz0wfHRbYV0sclsyKmFdPTgxOTEmbyxvPj4+PTEzLHJbMiphKzFdPTgxOTEmbyxvPj4+PTEzO2ZvcihhPTIqZTthPGk7KythKXJbYV09MDtuKDA9PT1vKSxuKDA9PT0obyYtODE5MikpfSxkLnByb3RvdHlwZS5zdHViPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscj0wO3I8dDtyKyspZVtyXT0wO3JldHVybiBlfSxkLnByb3RvdHlwZS5tdWxwPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj0yKnRoaXMuZ3Vlc3NMZW4xM2IodC5sZW5ndGgsZS5sZW5ndGgpLGk9dGhpcy5tYWtlUkJUKG4pLG89dGhpcy5zdHViKG4pLGE9bmV3IEFycmF5KG4pLGY9bmV3IEFycmF5KG4pLHM9bmV3IEFycmF5KG4pLHU9bmV3IEFycmF5KG4pLGg9bmV3IEFycmF5KG4pLGM9bmV3IEFycmF5KG4pLGQ9ci53b3JkcztkLmxlbmd0aD1uLHRoaXMuY29udmVydDEzYih0LndvcmRzLHQubGVuZ3RoLGEsbiksdGhpcy5jb252ZXJ0MTNiKGUud29yZHMsZS5sZW5ndGgsdSxuKSx0aGlzLnRyYW5zZm9ybShhLG8sZixzLG4saSksdGhpcy50cmFuc2Zvcm0odSxvLGgsYyxuLGkpO2Zvcih2YXIgbD0wO2w8bjtsKyspe3ZhciBwPWZbbF0qaFtsXS1zW2xdKmNbbF07c1tsXT1mW2xdKmNbbF0rc1tsXSpoW2xdLGZbbF09cH1yZXR1cm4gdGhpcy5jb25qdWdhdGUoZixzLG4pLHRoaXMudHJhbnNmb3JtKGYscyxkLG8sbixpKSx0aGlzLmNvbmp1Z2F0ZShkLG8sbiksdGhpcy5ub3JtYWxpemUxM2IoZCxuKSxyLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxyLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aCxyLnN0cmlwKCl9LG8ucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHRoaXMubXVsVG8odCxlKX0sby5wcm90b3R5cGUubXVsZj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLGModGhpcyx0LGUpfSxvLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkubXVsVG8odCx0aGlzKX0sby5wcm90b3R5cGUuaW11bG49ZnVuY3Rpb24odCl7bihcIm51bWJlclwiPT10eXBlb2YgdCksbih0PDY3MTA4ODY0KTtmb3IodmFyIGU9MCxyPTA7cjx0aGlzLmxlbmd0aDtyKyspe3ZhciBpPSgwfHRoaXMud29yZHNbcl0pKnQsbz0oNjcxMDg4NjMmaSkrKDY3MTA4ODYzJmUpO2U+Pj0yNixlKz1pLzY3MTA4ODY0fDAsZSs9bz4+PjI2LHRoaXMud29yZHNbcl09NjcxMDg4NjMmb31yZXR1cm4gMCE9PWUmJih0aGlzLndvcmRzW3JdPWUsdGhpcy5sZW5ndGgrKyksdGhpc30sby5wcm90b3R5cGUubXVsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKHQpfSxvLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdWwodGhpcyl9LG8ucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSl9LG8ucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXt2YXIgZT1zKHQpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gbmV3IG8oMSk7Zm9yKHZhciByPXRoaXMsbj0wO248ZS5sZW5ndGgmJjA9PT1lW25dO24rKyxyPXIuc3FyKCkpO2lmKCsrbjxlLmxlbmd0aClmb3IodmFyIGk9ci5zcXIoKTtuPGUubGVuZ3RoO24rKyxpPWkuc3FyKCkpMCE9PWVbbl0mJihyPXIubXVsKGkpKTtyZXR1cm4gcn0sby5wcm90b3R5cGUuaXVzaGxuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlLHI9dCUyNixpPSh0LXIpLzI2LG89NjcxMDg4NjM+Pj4yNi1yPDwyNi1yO2lmKDAhPT1yKXt2YXIgYT0wO2ZvcihlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciBmPXRoaXMud29yZHNbZV0mbyxzPSgwfHRoaXMud29yZHNbZV0pLWY8PHI7dGhpcy53b3Jkc1tlXT1zfGEsYT1mPj4+MjYtcn1hJiYodGhpcy53b3Jkc1tlXT1hLHRoaXMubGVuZ3RoKyspfWlmKDAhPT1pKXtmb3IoZT10aGlzLmxlbmd0aC0xO2U+PTA7ZS0tKXRoaXMud29yZHNbZStpXT10aGlzLndvcmRzW2VdO2ZvcihlPTA7ZTxpO2UrKyl0aGlzLndvcmRzW2VdPTA7dGhpcy5sZW5ndGgrPWl9cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXNobG49ZnVuY3Rpb24odCl7cmV0dXJuIG4oMD09PXRoaXMubmVnYXRpdmUpLHRoaXMuaXVzaGxuKHQpfSxvLnByb3RvdHlwZS5pdXNocm49ZnVuY3Rpb24odCxlLHIpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBpO2k9ZT8oZS1lJTI2KS8yNjowO3ZhciBvPXQlMjYsYT1NYXRoLm1pbigodC1vKS8yNix0aGlzLmxlbmd0aCksZj02NzEwODg2M142NzEwODg2Mz4+Pm88PG8scz1yO2lmKGktPWEsaT1NYXRoLm1heCgwLGkpLHMpe2Zvcih2YXIgdT0wO3U8YTt1Kyspcy53b3Jkc1t1XT10aGlzLndvcmRzW3VdO3MubGVuZ3RoPWF9aWYoMD09PWEpO2Vsc2UgaWYodGhpcy5sZW5ndGg+YSlmb3IodGhpcy5sZW5ndGgtPWEsdT0wO3U8dGhpcy5sZW5ndGg7dSsrKXRoaXMud29yZHNbdV09dGhpcy53b3Jkc1t1K2FdO2Vsc2UgdGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTE7dmFyIGg9MDtmb3IodT10aGlzLmxlbmd0aC0xO3U+PTAmJigwIT09aHx8dT49aSk7dS0tKXt2YXIgYz0wfHRoaXMud29yZHNbdV07dGhpcy53b3Jkc1t1XT1oPDwyNi1vfGM+Pj5vLGg9YyZmfXJldHVybiBzJiYwIT09aCYmKHMud29yZHNbcy5sZW5ndGgrK109aCksMD09PXRoaXMubGVuZ3RoJiYodGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTEpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXNocm49ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuKDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hybih0LGUscil9LG8ucHJvdG90eXBlLnNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbih0KX0sby5wcm90b3R5cGUudXNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4odCl9LG8ucHJvdG90eXBlLnNocm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybih0KX0sby5wcm90b3R5cGUudXNocm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4odCl9LG8ucHJvdG90eXBlLnRlc3RuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPXQlMjYscj0odC1lKS8yNixpPTE8PGU7aWYodGhpcy5sZW5ndGg8PXIpcmV0dXJuITE7dmFyIG89dGhpcy53b3Jkc1tyXTtyZXR1cm4hIShvJmkpfSxvLnByb3RvdHlwZS5pbWFza249ZnVuY3Rpb24odCl7bihcIm51bWJlclwiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixyPSh0LWUpLzI2O2lmKG4oMD09PXRoaXMubmVnYXRpdmUsXCJpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnNcIiksdGhpcy5sZW5ndGg8PXIpcmV0dXJuIHRoaXM7aWYoMCE9PWUmJnIrKyx0aGlzLmxlbmd0aD1NYXRoLm1pbihyLHRoaXMubGVuZ3RoKSwwIT09ZSl7dmFyIGk9NjcxMDg4NjNeNjcxMDg4NjM+Pj5lPDxlO3RoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0mPWl9cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUubWFza249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24odCl9LG8ucHJvdG90eXBlLmlhZGRuPWZ1bmN0aW9uKHQpe3JldHVybiBuKFwibnVtYmVyXCI9PXR5cGVvZiB0KSxuKHQ8NjcxMDg4NjQpLHQ8MD90aGlzLmlzdWJuKC10KTowIT09dGhpcy5uZWdhdGl2ZT8xPT09dGhpcy5sZW5ndGgmJigwfHRoaXMud29yZHNbMF0pPHQ/KHRoaXMud29yZHNbMF09dC0oMHx0aGlzLndvcmRzWzBdKSx0aGlzLm5lZ2F0aXZlPTAsdGhpcyk6KHRoaXMubmVnYXRpdmU9MCx0aGlzLmlzdWJuKHQpLHRoaXMubmVnYXRpdmU9MSx0aGlzKTp0aGlzLl9pYWRkbih0KX0sby5wcm90b3R5cGUuX2lhZGRuPWZ1bmN0aW9uKHQpe3RoaXMud29yZHNbMF0rPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aCYmdGhpcy53b3Jkc1tlXT49NjcxMDg4NjQ7ZSsrKXRoaXMud29yZHNbZV0tPTY3MTA4ODY0LGU9PT10aGlzLmxlbmd0aC0xP3RoaXMud29yZHNbZSsxXT0xOnRoaXMud29yZHNbZSsxXSsrO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxlKzEpLHRoaXN9LG8ucHJvdG90eXBlLmlzdWJuPWZ1bmN0aW9uKHQpe2lmKG4oXCJudW1iZXJcIj09dHlwZW9mIHQpLG4odDw2NzEwODg2NCksdDwwKXJldHVybiB0aGlzLmlhZGRuKC10KTtpZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZG4odCksdGhpcy5uZWdhdGl2ZT0xLHRoaXM7aWYodGhpcy53b3Jkc1swXS09dCwxPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08MCl0aGlzLndvcmRzWzBdPS10aGlzLndvcmRzWzBdLHRoaXMubmVnYXRpdmU9MTtlbHNlIGZvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbZV08MDtlKyspdGhpcy53b3Jkc1tlXSs9NjcxMDg4NjQsdGhpcy53b3Jkc1tlKzFdLT0xO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmFkZG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbih0KX0sby5wcm90b3R5cGUuc3Vibj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKHQpfSxvLnByb3RvdHlwZS5pYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzfSxvLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKX0sby5wcm90b3R5cGUuX2lzaGxuc3VibXVsPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxvPXQubGVuZ3RoK3I7dGhpcy5fZXhwYW5kKG8pO3ZhciBhLGY9MDtmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKXthPSgwfHRoaXMud29yZHNbaStyXSkrZjt2YXIgcz0oMHx0LndvcmRzW2ldKSplO2EtPTY3MTA4ODYzJnMsZj0oYT4+MjYpLShzLzY3MTA4ODY0fDApLHRoaXMud29yZHNbaStyXT02NzEwODg2MyZhfWZvcig7aTx0aGlzLmxlbmd0aC1yO2krKylhPSgwfHRoaXMud29yZHNbaStyXSkrZixmPWE+PjI2LHRoaXMud29yZHNbaStyXT02NzEwODg2MyZhO2lmKDA9PT1mKXJldHVybiB0aGlzLnN0cmlwKCk7Zm9yKG4oZj09PS0xKSxmPTAsaT0wO2k8dGhpcy5sZW5ndGg7aSsrKWE9LSgwfHRoaXMud29yZHNbaV0pK2YsZj1hPj4yNix0aGlzLndvcmRzW2ldPTY3MTA4ODYzJmE7cmV0dXJuIHRoaXMubmVnYXRpdmU9MSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl93b3JkRGl2PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5sZW5ndGgtdC5sZW5ndGgsbj10aGlzLmNsb25lKCksaT10LGE9MHxpLndvcmRzW2kubGVuZ3RoLTFdLGY9dGhpcy5fY291bnRCaXRzKGEpO3I9MjYtZiwwIT09ciYmKGk9aS51c2hsbihyKSxuLml1c2hsbihyKSxhPTB8aS53b3Jkc1tpLmxlbmd0aC0xXSk7dmFyIHMsdT1uLmxlbmd0aC1pLmxlbmd0aDtpZihcIm1vZFwiIT09ZSl7cz1uZXcgbyhudWxsKSxzLmxlbmd0aD11KzEscy53b3Jkcz1uZXcgQXJyYXkocy5sZW5ndGgpO2Zvcih2YXIgaD0wO2g8cy5sZW5ndGg7aCsrKXMud29yZHNbaF09MH12YXIgYz1uLmNsb25lKCkuX2lzaGxuc3VibXVsKGksMSx1KTswPT09Yy5uZWdhdGl2ZSYmKG49YyxzJiYocy53b3Jkc1t1XT0xKSk7Zm9yKHZhciBkPXUtMTtkPj0wO2QtLSl7dmFyIGw9NjcxMDg4NjQqKDB8bi53b3Jkc1tpLmxlbmd0aCtkXSkrKDB8bi53b3Jkc1tpLmxlbmd0aCtkLTFdKTtmb3IobD1NYXRoLm1pbihsL2F8MCw2NzEwODg2Myksbi5faXNobG5zdWJtdWwoaSxsLGQpOzAhPT1uLm5lZ2F0aXZlOylsLS0sbi5uZWdhdGl2ZT0wLG4uX2lzaGxuc3VibXVsKGksMSxkKSxuLmlzWmVybygpfHwobi5uZWdhdGl2ZV49MSk7cyYmKHMud29yZHNbZF09bCl9cmV0dXJuIHMmJnMuc3RyaXAoKSxuLnN0cmlwKCksXCJkaXZcIiE9PWUmJjAhPT1yJiZuLml1c2hybihyKSx7ZGl2OnN8fG51bGwsbW9kOm59fSxvLnByb3RvdHlwZS5kaXZtb2Q9ZnVuY3Rpb24odCxlLHIpe2lmKG4oIXQuaXNaZXJvKCkpLHRoaXMuaXNaZXJvKCkpcmV0dXJue2RpdjpuZXcgbygwKSxtb2Q6bmV3IG8oMCl9O3ZhciBpLGEsZjtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmUmJjA9PT10Lm5lZ2F0aXZlPyhmPXRoaXMubmVnKCkuZGl2bW9kKHQsZSksXCJtb2RcIiE9PWUmJihpPWYuZGl2Lm5lZygpKSxcImRpdlwiIT09ZSYmKGE9Zi5tb2QubmVnKCksciYmMCE9PWEubmVnYXRpdmUmJmEuaWFkZCh0KSkse2RpdjppLG1vZDphfSk6MD09PXRoaXMubmVnYXRpdmUmJjAhPT10Lm5lZ2F0aXZlPyhmPXRoaXMuZGl2bW9kKHQubmVnKCksZSksXCJtb2RcIiE9PWUmJihpPWYuZGl2Lm5lZygpKSx7ZGl2OmksbW9kOmYubW9kfSk6MCE9PSh0aGlzLm5lZ2F0aXZlJnQubmVnYXRpdmUpPyhmPXRoaXMubmVnKCkuZGl2bW9kKHQubmVnKCksZSksXCJkaXZcIiE9PWUmJihhPWYubW9kLm5lZygpLHImJjAhPT1hLm5lZ2F0aXZlJiZhLmlzdWIodCkpLHtkaXY6Zi5kaXYsbW9kOmF9KTp0Lmxlbmd0aD50aGlzLmxlbmd0aHx8dGhpcy5jbXAodCk8MD97ZGl2Om5ldyBvKDApLG1vZDp0aGlzfToxPT09dC5sZW5ndGg/XCJkaXZcIj09PWU/e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm51bGx9OlwibW9kXCI9PT1lP3tkaXY6bnVsbCxtb2Q6bmV3IG8odGhpcy5tb2RuKHQud29yZHNbMF0pKX06e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm5ldyBvKHRoaXMubW9kbih0LndvcmRzWzBdKSl9OnRoaXMuX3dvcmREaXYodCxlKX0sby5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LFwiZGl2XCIsITEpLmRpdn0sby5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LFwibW9kXCIsITEpLm1vZH0sby5wcm90b3R5cGUudW1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXZtb2QodCxcIm1vZFwiLCEwKS5tb2R9LG8ucHJvdG90eXBlLmRpdlJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGl2bW9kKHQpO2lmKGUubW9kLmlzWmVybygpKXJldHVybiBlLmRpdjt2YXIgcj0wIT09ZS5kaXYubmVnYXRpdmU/ZS5tb2QuaXN1Yih0KTplLm1vZCxuPXQudXNocm4oMSksaT10LmFuZGxuKDEpLG89ci5jbXAobik7cmV0dXJuIG88MHx8MT09PWkmJjA9PT1vP2UuZGl2OjAhPT1lLmRpdi5uZWdhdGl2ZT9lLmRpdi5pc3VibigxKTplLmRpdi5pYWRkbigxKX0sby5wcm90b3R5cGUubW9kbj1mdW5jdGlvbih0KXtuKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9KDE8PDI2KSV0LHI9MCxpPXRoaXMubGVuZ3RoLTE7aT49MDtpLS0pcj0oZSpyKygwfHRoaXMud29yZHNbaV0pKSV0O3JldHVybiByfSxvLnByb3RvdHlwZS5pZGl2bj1mdW5jdGlvbih0KXtuKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBpPSgwfHRoaXMud29yZHNbcl0pKzY3MTA4ODY0KmU7dGhpcy53b3Jkc1tyXT1pL3R8MCxlPWkldH1yZXR1cm4gdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5kaXZuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaWRpdm4odCl9LG8ucHJvdG90eXBlLmVnY2Q9ZnVuY3Rpb24odCl7bigwPT09dC5uZWdhdGl2ZSksbighdC5pc1plcm8oKSk7dmFyIGU9dGhpcyxyPXQuY2xvbmUoKTtlPTAhPT1lLm5lZ2F0aXZlP2UudW1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciBpPW5ldyBvKDEpLGE9bmV3IG8oMCksZj1uZXcgbygwKSxzPW5ldyBvKDEpLHU9MDtlLmlzRXZlbigpJiZyLmlzRXZlbigpOyllLml1c2hybigxKSxyLml1c2hybigxKSwrK3U7Zm9yKHZhciBoPXIuY2xvbmUoKSxjPWUuY2xvbmUoKTshZS5pc1plcm8oKTspe2Zvcih2YXIgZD0wLGw9MTswPT09KGUud29yZHNbMF0mbCkmJmQ8MjY7KytkLGw8PD0xKTtpZihkPjApZm9yKGUuaXVzaHJuKGQpO2QtLSA+MDspKGkuaXNPZGQoKXx8YS5pc09kZCgpKSYmKGkuaWFkZChoKSxhLmlzdWIoYykpLGkuaXVzaHJuKDEpLGEuaXVzaHJuKDEpO2Zvcih2YXIgcD0wLGI9MTswPT09KHIud29yZHNbMF0mYikmJnA8MjY7KytwLGI8PD0xKTtpZihwPjApZm9yKHIuaXVzaHJuKHApO3AtLSA+MDspKGYuaXNPZGQoKXx8cy5pc09kZCgpKSYmKGYuaWFkZChoKSxzLmlzdWIoYykpLGYuaXVzaHJuKDEpLHMuaXVzaHJuKDEpO2UuY21wKHIpPj0wPyhlLmlzdWIociksaS5pc3ViKGYpLGEuaXN1YihzKSk6KHIuaXN1YihlKSxmLmlzdWIoaSkscy5pc3ViKGEpKX1yZXR1cm57YTpmLGI6cyxnY2Q6ci5pdXNobG4odSl9fSxvLnByb3RvdHlwZS5faW52bXA9ZnVuY3Rpb24odCl7bigwPT09dC5uZWdhdGl2ZSksbighdC5pc1plcm8oKSk7dmFyIGU9dGhpcyxyPXQuY2xvbmUoKTtlPTAhPT1lLm5lZ2F0aXZlP2UudW1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciBpPW5ldyBvKDEpLGE9bmV3IG8oMCksZj1yLmNsb25lKCk7ZS5jbXBuKDEpPjAmJnIuY21wbigxKT4wOyl7Zm9yKHZhciBzPTAsdT0xOzA9PT0oZS53b3Jkc1swXSZ1KSYmczwyNjsrK3MsdTw8PTEpO2lmKHM+MClmb3IoZS5pdXNocm4ocyk7cy0tID4wOylpLmlzT2RkKCkmJmkuaWFkZChmKSxpLml1c2hybigxKTtmb3IodmFyIGg9MCxjPTE7MD09PShyLndvcmRzWzBdJmMpJiZoPDI2OysraCxjPDw9MSk7aWYoaD4wKWZvcihyLml1c2hybihoKTtoLS0gPjA7KWEuaXNPZGQoKSYmYS5pYWRkKGYpLGEuaXVzaHJuKDEpO2UuY21wKHIpPj0wPyhlLmlzdWIociksaS5pc3ViKGEpKTooci5pc3ViKGUpLGEuaXN1YihpKSl9dmFyIGQ7cmV0dXJuIGQ9MD09PWUuY21wbigxKT9pOmEsZC5jbXBuKDApPDAmJmQuaWFkZCh0KSxkfSxvLnByb3RvdHlwZS5nY2Q9ZnVuY3Rpb24odCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdC5hYnMoKTtpZih0LmlzWmVybygpKXJldHVybiB0aGlzLmFicygpO3ZhciBlPXRoaXMuY2xvbmUoKSxyPXQuY2xvbmUoKTtlLm5lZ2F0aXZlPTAsci5uZWdhdGl2ZT0wO2Zvcih2YXIgbj0wO2UuaXNFdmVuKCkmJnIuaXNFdmVuKCk7bisrKWUuaXVzaHJuKDEpLHIuaXVzaHJuKDEpO2Zvcig7Oyl7Zm9yKDtlLmlzRXZlbigpOyllLml1c2hybigxKTtmb3IoO3IuaXNFdmVuKCk7KXIuaXVzaHJuKDEpO3ZhciBpPWUuY21wKHIpO2lmKGk8MCl7dmFyIG89ZTtlPXIscj1vfWVsc2UgaWYoMD09PWl8fDA9PT1yLmNtcG4oMSkpYnJlYWs7ZS5pc3ViKHIpfXJldHVybiByLml1c2hsbihuKX0sby5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZ2NkKHQpLmEudW1vZCh0KX0sby5wcm90b3R5cGUuaXNFdmVuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT0oMSZ0aGlzLndvcmRzWzBdKX0sby5wcm90b3R5cGUuaXNPZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PSgxJnRoaXMud29yZHNbMF0pfSxvLnByb3RvdHlwZS5hbmRsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53b3Jkc1swXSZ0fSxvLnByb3RvdHlwZS5iaW5jbj1mdW5jdGlvbih0KXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0KTt2YXIgZT10JTI2LHI9KHQtZSkvMjYsaT0xPDxlO2lmKHRoaXMubGVuZ3RoPD1yKXJldHVybiB0aGlzLl9leHBhbmQocisxKSx0aGlzLndvcmRzW3JdfD1pLHRoaXM7Zm9yKHZhciBvPWksYT1yOzAhPT1vJiZhPHRoaXMubGVuZ3RoO2ErKyl7dmFyIGY9MHx0aGlzLndvcmRzW2FdO2YrPW8sbz1mPj4+MjYsZiY9NjcxMDg4NjMsdGhpcy53b3Jkc1thXT1mfXJldHVybiAwIT09byYmKHRoaXMud29yZHNbYV09byx0aGlzLmxlbmd0aCsrKSx0aGlzfSxvLnByb3RvdHlwZS5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubGVuZ3RoJiYwPT09dGhpcy53b3Jkc1swXX0sby5wcm90b3R5cGUuY21wbj1mdW5jdGlvbih0KXt2YXIgZT10PDA7aWYoMCE9PXRoaXMubmVnYXRpdmUmJiFlKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiZlKXJldHVybiAxO3RoaXMuc3RyaXAoKTt2YXIgcjtpZih0aGlzLmxlbmd0aD4xKXI9MTtlbHNle2UmJih0PS10KSxuKHQ8PTY3MTA4ODYzLFwiTnVtYmVyIGlzIHRvbyBiaWdcIik7dmFyIGk9MHx0aGlzLndvcmRzWzBdO3I9aT09PXQ/MDppPHQ/LTE6MX1yZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/MHwtcjpyfSxvLnByb3RvdHlwZS5jbXA9ZnVuY3Rpb24odCl7aWYoMCE9PXRoaXMubmVnYXRpdmUmJjA9PT10Lm5lZ2F0aXZlKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZSlyZXR1cm4gMTt2YXIgZT10aGlzLnVjbXAodCk7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlPzB8LWU6ZX0sby5wcm90b3R5cGUudWNtcD1mdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD50Lmxlbmd0aClyZXR1cm4gMTtpZih0aGlzLmxlbmd0aDx0Lmxlbmd0aClyZXR1cm4tMTtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBuPTB8dGhpcy53b3Jkc1tyXSxpPTB8dC53b3Jkc1tyXTtpZihuIT09aSl7bjxpP2U9LTE6bj5pJiYoZT0xKTticmVha319cmV0dXJuIGV9LG8ucHJvdG90eXBlLmd0bj1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXRoaXMuY21wbih0KX0sby5wcm90b3R5cGUuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10aGlzLmNtcCh0KX0sby5wcm90b3R5cGUuZ3Rlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXBuKHQpPj0wfSxvLnByb3RvdHlwZS5ndGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPj0wfSxvLnByb3RvdHlwZS5sdG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wbih0KT09PS0xfSxvLnByb3RvdHlwZS5sdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk9PT0tMX0sby5wcm90b3R5cGUubHRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXBuKHQpPD0wfSxvLnByb3RvdHlwZS5sdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPD0wfSxvLnByb3RvdHlwZS5lcW49ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmNtcG4odCl9LG8ucHJvdG90eXBlLmVxPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5jbXAodCl9LG8ucmVkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbSh0KX0sby5wcm90b3R5cGUudG9SZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4oIXRoaXMucmVkLFwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSxuKDA9PT10aGlzLm5lZ2F0aXZlLFwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXNcIiksdC5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKHQpfSxvLnByb3RvdHlwZS5mcm9tUmVkPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0XCIpLHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpfSxvLnByb3RvdHlwZS5fZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVkPXQsdGhpc30sby5wcm90b3R5cGUuZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4oIXRoaXMucmVkLFwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSx0aGlzLl9mb3JjZVJlZCh0KX0sby5wcm90b3R5cGUucmVkQWRkPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5hZGQodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSUFkZD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLmlhZGQodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU3ViPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5zdWIodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSVN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLmlzdWIodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU2hsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5zaGwodGhpcyx0KX0sby5wcm90b3R5cGUucmVkTXVsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLm11bCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRJTXVsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLmltdWwodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcih0aGlzKX0sby5wcm90b3R5cGUucmVkSVNxcj1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaXNxcih0aGlzKX0sby5wcm90b3R5cGUucmVkU3FydD1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FydCh0aGlzKX0sby5wcm90b3R5cGUucmVkSW52bT1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaW52bSh0aGlzKX0sby5wcm90b3R5cGUucmVkTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLm5lZyh0aGlzKX0sby5wcm90b3R5cGUucmVkUG93PWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkJiYhdC5yZWQsXCJyZWRQb3cobm9ybWFsTnVtKVwiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5wb3codGhpcyx0KX07dmFyIEE9e2syNTY6bnVsbCxwMjI0Om51bGwscDE5MjpudWxsLHAyNTUxOTpudWxsfTtsLnByb3RvdHlwZS5fdG1wPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG8obnVsbCk7cmV0dXJuIHQud29yZHM9bmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4vMTMpKSx0fSxsLnByb3RvdHlwZS5pcmVkdWNlPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dDtkbyB0aGlzLnNwbGl0KHIsdGhpcy50bXApLHI9dGhpcy5pbXVsSyhyKSxyPXIuaWFkZCh0aGlzLnRtcCksZT1yLmJpdExlbmd0aCgpO3doaWxlKGU+dGhpcy5uKTt2YXIgbj1lPHRoaXMubj8tMTpyLnVjbXAodGhpcy5wKTtyZXR1cm4gMD09PW4/KHIud29yZHNbMF09MCxyLmxlbmd0aD0xKTpuPjA/ci5pc3ViKHRoaXMucCk6ci5zdHJpcCgpLHJ9LGwucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7dC5pdXNocm4odGhpcy5uLDAsZSl9LGwucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe3JldHVybiB0LmltdWwodGhpcy5rKX0saShwLGwpLHAucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTQxOTQzMDMsbj1NYXRoLm1pbih0Lmxlbmd0aCw5KSxpPTA7aTxuO2krKyllLndvcmRzW2ldPXQud29yZHNbaV07aWYoZS5sZW5ndGg9bix0Lmxlbmd0aDw9OSlyZXR1cm4gdC53b3Jkc1swXT0wLHZvaWQodC5sZW5ndGg9MSk7dmFyIG89dC53b3Jkc1s5XTtmb3IoZS53b3Jkc1tlLmxlbmd0aCsrXT1vJnIsaT0xMDtpPHQubGVuZ3RoO2krKyl7dmFyIGE9MHx0LndvcmRzW2ldO3Qud29yZHNbaS0xMF09KGEmcik8PDR8bz4+PjIyLG89YX1vPj4+PTIyLHQud29yZHNbaS0xMF09bywwPT09byYmdC5sZW5ndGg+MTA/dC5sZW5ndGgtPTEwOnQubGVuZ3RoLT05fSxwLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXt0LndvcmRzW3QubGVuZ3RoXT0wLHQud29yZHNbdC5sZW5ndGgrMV09MCx0Lmxlbmd0aCs9Mjtmb3IodmFyIGU9MCxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPTB8dC53b3Jkc1tyXTtlKz05Nzcqbix0LndvcmRzW3JdPTY3MTA4ODYzJmUsZT02NCpuKyhlLzY3MTA4ODY0fDApfXJldHVybiAwPT09dC53b3Jkc1t0Lmxlbmd0aC0xXSYmKHQubGVuZ3RoLS0sMD09PXQud29yZHNbdC5sZW5ndGgtMV0mJnQubGVuZ3RoLS0pLHR9LGkoYixsKSxpKHYsbCksaSh5LGwpLHkucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49MTkqKDB8dC53b3Jkc1tyXSkrZSxpPTY3MTA4ODYzJm47bj4+Pj0yNix0LndvcmRzW3JdPWksZT1ufXJldHVybiAwIT09ZSYmKHQud29yZHNbdC5sZW5ndGgrK109ZSksdH0sby5fcHJpbWU9ZnVuY3Rpb24gdChlKXtpZihBW2VdKXJldHVybiBBW2VdO3ZhciB0O2lmKFwiazI1NlwiPT09ZSl0PW5ldyBwO2Vsc2UgaWYoXCJwMjI0XCI9PT1lKXQ9bmV3IGI7ZWxzZSBpZihcInAxOTJcIj09PWUpdD1uZXcgdjtlbHNle2lmKFwicDI1NTE5XCIhPT1lKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gcHJpbWUgXCIrZSk7dD1uZXcgeX1yZXR1cm4gQVtlXT10LHR9LG0ucHJvdG90eXBlLl92ZXJpZnkxPWZ1bmN0aW9uKHQpe24oMD09PXQubmVnYXRpdmUsXCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlc1wiKSxuKHQucmVkLFwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKX0sbS5wcm90b3R5cGUuX3ZlcmlmeTI9ZnVuY3Rpb24odCxlKXtuKDA9PT0odC5uZWdhdGl2ZXxlLm5lZ2F0aXZlKSxcInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzXCIpLG4odC5yZWQmJnQucmVkPT09ZS5yZWQsXCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpfSxtLnByb3RvdHlwZS5pbW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnByaW1lP3RoaXMucHJpbWUuaXJlZHVjZSh0KS5fZm9yY2VSZWQodGhpcyk6dC51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNaZXJvKCk/dC5jbG9uZSgpOnRoaXMubS5zdWIodCkuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5hZGQoZSk7cmV0dXJuIHIuY21wKHRoaXMubSk+PTAmJnIuaXN1Yih0aGlzLm0pLHIuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5pYWRkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuaWFkZChlKTtcbnJldHVybiByLmNtcCh0aGlzLm0pPj0wJiZyLmlzdWIodGhpcy5tKSxyfSxtLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5zdWIoZSk7cmV0dXJuIHIuY21wbigwKTwwJiZyLmlhZGQodGhpcy5tKSxyLl9mb3JjZVJlZCh0aGlzKX0sbS5wcm90b3R5cGUuaXN1Yj1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgcj10LmlzdWIoZSk7cmV0dXJuIHIuY21wbigwKTwwJiZyLmlhZGQodGhpcy5tKSxyfSxtLnByb3RvdHlwZS5zaGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5MSh0KSx0aGlzLmltb2QodC51c2hsbihlKSl9LG0ucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5Mih0LGUpLHRoaXMuaW1vZCh0LmltdWwoZSkpfSxtLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5Mih0LGUpLHRoaXMuaW1vZCh0Lm11bChlKSl9LG0ucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW11bCh0LHQuY2xvbmUoKSl9LG0ucHJvdG90eXBlLnNxcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tdWwodCx0KX0sbS5wcm90b3R5cGUuc3FydD1mdW5jdGlvbih0KXtpZih0LmlzWmVybygpKXJldHVybiB0LmNsb25lKCk7dmFyIGU9dGhpcy5tLmFuZGxuKDMpO2lmKG4oZSUyPT09MSksMz09PWUpe3ZhciByPXRoaXMubS5hZGQobmV3IG8oMSkpLml1c2hybigyKTtyZXR1cm4gdGhpcy5wb3codCxyKX1mb3IodmFyIGk9dGhpcy5tLnN1Ym4oMSksYT0wOyFpLmlzWmVybygpJiYwPT09aS5hbmRsbigxKTspYSsrLGkuaXVzaHJuKDEpO24oIWkuaXNaZXJvKCkpO3ZhciBmPW5ldyBvKDEpLnRvUmVkKHRoaXMpLHM9Zi5yZWROZWcoKSx1PXRoaXMubS5zdWJuKDEpLml1c2hybigxKSxoPXRoaXMubS5iaXRMZW5ndGgoKTtmb3IoaD1uZXcgbygyKmgqaCkudG9SZWQodGhpcyk7MCE9PXRoaXMucG93KGgsdSkuY21wKHMpOyloLnJlZElBZGQocyk7Zm9yKHZhciBjPXRoaXMucG93KGgsaSksZD10aGlzLnBvdyh0LGkuYWRkbigxKS5pdXNocm4oMSkpLGw9dGhpcy5wb3codCxpKSxwPWE7MCE9PWwuY21wKGYpOyl7Zm9yKHZhciBiPWwsdj0wOzAhPT1iLmNtcChmKTt2KyspYj1iLnJlZFNxcigpO24odjxwKTt2YXIgeT10aGlzLnBvdyhjLG5ldyBvKDEpLml1c2hsbihwLXYtMSkpO2Q9ZC5yZWRNdWwoeSksYz15LnJlZFNxcigpLGw9bC5yZWRNdWwoYykscD12fXJldHVybiBkfSxtLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uKHQpe3ZhciBlPXQuX2ludm1wKHRoaXMubSk7cmV0dXJuIDAhPT1lLm5lZ2F0aXZlPyhlLm5lZ2F0aXZlPTAsdGhpcy5pbW9kKGUpLnJlZE5lZygpKTp0aGlzLmltb2QoZSl9LG0ucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0LGUpe2lmKGUuaXNaZXJvKCkpcmV0dXJuIG5ldyBvKDEpO2lmKDA9PT1lLmNtcG4oMSkpcmV0dXJuIHQuY2xvbmUoKTt2YXIgcj00LG49bmV3IEFycmF5KDE8PHIpO25bMF09bmV3IG8oMSkudG9SZWQodGhpcyksblsxXT10O2Zvcih2YXIgaT0yO2k8bi5sZW5ndGg7aSsrKW5baV09dGhpcy5tdWwobltpLTFdLHQpO3ZhciBhPW5bMF0sZj0wLHM9MCx1PWUuYml0TGVuZ3RoKCklMjY7Zm9yKDA9PT11JiYodT0yNiksaT1lLmxlbmd0aC0xO2k+PTA7aS0tKXtmb3IodmFyIGg9ZS53b3Jkc1tpXSxjPXUtMTtjPj0wO2MtLSl7dmFyIGQ9aD4+YyYxO2EhPT1uWzBdJiYoYT10aGlzLnNxcihhKSksMCE9PWR8fDAhPT1mPyhmPDw9MSxmfD1kLHMrKywocz09PXJ8fDA9PT1pJiYwPT09YykmJihhPXRoaXMubXVsKGEsbltmXSkscz0wLGY9MCkpOnM9MH11PTI2fXJldHVybiBhfSxtLnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24odCl7dmFyIGU9dC51bW9kKHRoaXMubSk7cmV0dXJuIGU9PT10P2UuY2xvbmUoKTplfSxtLnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbih0KXt2YXIgZT10LmNsb25lKCk7cmV0dXJuIGUucmVkPW51bGwsZX0sby5tb250PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZyh0KX0saShnLG0pLGcucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbW9kKHQudXNobG4odGhpcy5zaGlmdCkpfSxnLnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltb2QodC5tdWwodGhpcy5yaW52KSk7cmV0dXJuIGUucmVkPW51bGwsZX0sZy5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0LGUpe2lmKHQuaXNaZXJvKCl8fGUuaXNaZXJvKCkpcmV0dXJuIHQud29yZHNbMF09MCx0Lmxlbmd0aD0xLHQ7dmFyIHI9dC5pbXVsKGUpLG49ci5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksaT1yLmlzdWIobikuaXVzaHJuKHRoaXMuc2hpZnQpLG89aTtyZXR1cm4gaS5jbXAodGhpcy5tKT49MD9vPWkuaXN1Yih0aGlzLm0pOmkuY21wbigwKTwwJiYobz1pLmlhZGQodGhpcy5tKSksby5fZm9yY2VSZWQodGhpcyl9LGcucHJvdG90eXBlLm11bD1mdW5jdGlvbih0LGUpe2lmKHQuaXNaZXJvKCl8fGUuaXNaZXJvKCkpcmV0dXJuIG5ldyBvKDApLl9mb3JjZVJlZCh0aGlzKTt2YXIgcj10Lm11bChlKSxuPXIubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLGk9ci5pc3ViKG4pLml1c2hybih0aGlzLnNoaWZ0KSxhPWk7cmV0dXJuIGkuY21wKHRoaXMubSk+PTA/YT1pLmlzdWIodGhpcy5tKTppLmNtcG4oMCk8MCYmKGE9aS5pYWRkKHRoaXMubSkpLGEuX2ZvcmNlUmVkKHRoaXMpfSxnLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW1vZCh0Ll9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSk7cmV0dXJuIGUuX2ZvcmNlUmVkKHRoaXMpfX0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIHR8fHQsdGhpcyl9KS5jYWxsKGUscig5MikodCkpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZTtuLnZlcnNpb249cig0NjUpLnZlcnNpb24sbi51dGlscz1yKDUyMSksbi5yYW5kPXIoNTIyKSxuLmhtYWNEUkJHPXIoNTE5KSxuLmN1cnZlPXIoOTkpLG4uY3VydmVzPXIoNTEyKSxuLmVjPXIoNTEzKSxuLmVkZHNhPXIoNTE2KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNjYpLGk9cigzNyksbz1yKDE3KSxhPXIoMjkpLGY9cigxMikscz1yKDE3NCksdT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2UuZj1yKDgpP3U6ZnVuY3Rpb24odCxlKXtpZih0PW8odCksZT1hKGUsITApLHMpdHJ5e3JldHVybiB1KHQsZSl9Y2F0Y2godCl7fWlmKGYodCxlKSlyZXR1cm4gaSghbi5mLmNhbGwodCxlKSx0W2VdKX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDEyKSxpPXIoMTEpLG89cigxMzMpKFwiSUVfUFJPVE9cIiksYT1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1PYmplY3QuZ2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQpe3JldHVybiB0PWkodCksbih0LG8pP3Rbb106XCJmdW5jdGlvblwiPT10eXBlb2YgdC5jb25zdHJ1Y3RvciYmdCBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3I/dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIE9iamVjdD9hOm51bGx9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZTtuLnZlcnNpb249cig0NjcpLnZlcnNpb24sbi51dGlscz1yKDU1OCksbi5yYW5kPXIoNTU5KSxuLmhtYWNEUkJHPXIoNTU2KSxuLmN1cnZlPXIoMTA0KSxuLmN1cnZlcz1yKDU0OSksbi5lYz1yKDU1MCksbi5lZGRzYT1yKDU1Myl9LGZ1bmN0aW9uKHQsZSl7dmFyIHI9e30udG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByLmNhbGwodCkuc2xpY2UoOCwtMSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih2b2lkIDA9PXQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISF0JiZuKGZ1bmN0aW9uKCl7ZT90LmNhbGwobnVsbCxmdW5jdGlvbigpe30sMSk6dC5jYWxsKG51bGwpfSl9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aHJvdyBuZXcgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfWZ1bmN0aW9uIG4oKXt0aHJvdyBuZXcgRXJyb3IoXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIil9ZnVuY3Rpb24gaSh0KXtpZihoPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChoPT09cnx8IWgpJiZzZXRUaW1lb3V0KXJldHVybiBoPXNldFRpbWVvdXQsc2V0VGltZW91dCh0LDApO3RyeXtyZXR1cm4gaCh0LDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gaC5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gaC5jYWxsKHRoaXMsdCwwKX19fWZ1bmN0aW9uIG8odCl7aWYoYz09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KHQpO2lmKChjPT09bnx8IWMpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGM9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7cmV0dXJuIGModCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBjLmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gYy5jYWxsKHRoaXMsdCl9fX1mdW5jdGlvbiBhKCl7YiYmbCYmKGI9ITEsbC5sZW5ndGg/cD1sLmNvbmNhdChwKTp2PS0xLHAubGVuZ3RoJiZmKCkpfWZ1bmN0aW9uIGYoKXtpZighYil7dmFyIHQ9aShhKTtiPSEwO2Zvcih2YXIgZT1wLmxlbmd0aDtlOyl7Zm9yKGw9cCxwPVtdOysrdjxlOylsJiZsW3ZdLnJ1bigpO3Y9LTEsZT1wLmxlbmd0aH1sPW51bGwsYj0hMSxvKHQpfX1mdW5jdGlvbiBzKHQsZSl7dGhpcy5mdW49dCx0aGlzLmFycmF5PWV9ZnVuY3Rpb24gdSgpe312YXIgaCxjLGQ9dC5leHBvcnRzPXt9OyFmdW5jdGlvbigpe3RyeXtoPVwiZnVuY3Rpb25cIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpyfWNhdGNoKHQpe2g9cn10cnl7Yz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0Om59Y2F0Y2godCl7Yz1ufX0oKTt2YXIgbCxwPVtdLGI9ITEsdj0tMTtkLm5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWVbci0xXT1hcmd1bWVudHNbcl07cC5wdXNoKG5ldyBzKHQsZSkpLDEhPT1wLmxlbmd0aHx8Ynx8aShmKX0scy5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZC50aXRsZT1cImJyb3dzZXJcIixkLmJyb3dzZXI9ITAsZC5lbnY9e30sZC5hcmd2PVtdLGQudmVyc2lvbj1cIlwiLGQudmVyc2lvbnM9e30sZC5vbj11LGQuYWRkTGlzdGVuZXI9dSxkLm9uY2U9dSxkLm9mZj11LGQucmVtb3ZlTGlzdGVuZXI9dSxkLnJlbW92ZUFsbExpc3RlbmVycz11LGQuZW1pdD11LGQuYmluZGluZz1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKX0sZC5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn0sZC5jaGRpcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIil9LGQudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDMzKSxpPXIoNjUpLG89cigxMSksYT1yKDEwKSxmPXIoMjgzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgcj0xPT10LHM9Mj09dCx1PTM9PXQsaD00PT10LGM9Nj09dCxkPTU9PXR8fGMsbD1lfHxmO3JldHVybiBmdW5jdGlvbihlLGYscCl7Zm9yKHZhciBiLHYseT1vKGUpLG09aSh5KSxnPW4oZixwLDMpLHc9YShtLmxlbmd0aCksXz0wLE09cj9sKGUsdyk6cz9sKGUsMCk6dm9pZCAwO3c+XztfKyspaWYoKGR8fF8gaW4gbSkmJihiPW1bX10sdj1nKGIsXyx5KSx0KSlpZihyKU1bX109djtlbHNlIGlmKHYpc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIGI7Y2FzZSA2OnJldHVybiBfO2Nhc2UgMjpNLnB1c2goYil9ZWxzZSBpZihoKXJldHVybiExO3JldHVybiBjPy0xOnV8fGg/aDpNfX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigzMiksbz1yKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciByPShpLk9iamVjdHx8e30pW3RdfHxPYmplY3RbdF0sYT17fTthW3RdPWUociksbihuLlMrbi5GKm8oZnVuY3Rpb24oKXtyKDEpfSksXCJPYmplY3RcIixhKX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFuKHQpKXJldHVybiB0O3ZhciByLGk7aWYoZSYmXCJmdW5jdGlvblwiPT10eXBlb2Yocj10LnRvU3RyaW5nKSYmIW4oaT1yLmNhbGwodCkpKXJldHVybiBpO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mKHI9dC52YWx1ZU9mKSYmIW4oaT1yLmNhbGwodCkpKXJldHVybiBpO2lmKCFlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZihyPXQudG9TdHJpbmcpJiYhbihpPXIuY2FsbCh0KSkpcmV0dXJuIGk7dGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpfX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fFwiQXNzZXJ0aW9uIGZhaWxlZFwiKX1mdW5jdGlvbiBpKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiBvKHQsZSxyKXtyZXR1cm4gby5pc0JOKHQpP3Q6KHRoaXMubmVnYXRpdmU9MCx0aGlzLndvcmRzPW51bGwsdGhpcy5sZW5ndGg9MCx0aGlzLnJlZD1udWxsLHZvaWQobnVsbCE9PXQmJihcImxlXCIhPT1lJiZcImJlXCIhPT1lfHwocj1lLGU9MTApLHRoaXMuX2luaXQodHx8MCxlfHwxMCxyfHxcImJlXCIpKSkpfWZ1bmN0aW9uIGEodCxlLHIpe2Zvcih2YXIgbj0wLGk9TWF0aC5taW4odC5sZW5ndGgsciksbz1lO288aTtvKyspe3ZhciBhPXQuY2hhckNvZGVBdChvKS00ODtuPDw9NCxufD1hPj00OSYmYTw9NTQ/YS00OSsxMDphPj0xNyYmYTw9MjI/YS0xNysxMDoxNSZhfXJldHVybiBufWZ1bmN0aW9uIGYodCxlLHIsbil7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aCxyKSxhPWU7YTxvO2ErKyl7dmFyIGY9dC5jaGFyQ29kZUF0KGEpLTQ4O2kqPW4saSs9Zj49NDk/Zi00OSsxMDpmPj0xNz9mLTE3KzEwOmZ9cmV0dXJuIGl9ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQuYml0TGVuZ3RoKCkpLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ci8yNnwwLGk9ciUyNjtlW3JdPSh0LndvcmRzW25dJjE8PGkpPj4+aX1yZXR1cm4gZX1mdW5jdGlvbiB1KHQsZSxyKXtyLm5lZ2F0aXZlPWUubmVnYXRpdmVedC5uZWdhdGl2ZTt2YXIgbj10Lmxlbmd0aCtlLmxlbmd0aHwwO3IubGVuZ3RoPW4sbj1uLTF8MDt2YXIgaT0wfHQud29yZHNbMF0sbz0wfGUud29yZHNbMF0sYT1pKm8sZj02NzEwODg2MyZhLHM9YS82NzEwODg2NHwwO3Iud29yZHNbMF09Zjtmb3IodmFyIHU9MTt1PG47dSsrKXtmb3IodmFyIGg9cz4+PjI2LGM9NjcxMDg4NjMmcyxkPU1hdGgubWluKHUsZS5sZW5ndGgtMSksbD1NYXRoLm1heCgwLHUtdC5sZW5ndGgrMSk7bDw9ZDtsKyspe3ZhciBwPXUtbHwwO2k9MHx0LndvcmRzW3BdLG89MHxlLndvcmRzW2xdLGE9aSpvK2MsaCs9YS82NzEwODg2NHwwLGM9NjcxMDg4NjMmYX1yLndvcmRzW3VdPTB8YyxzPTB8aH1yZXR1cm4gMCE9PXM/ci53b3Jkc1t1XT0wfHM6ci5sZW5ndGgtLSxyLnN0cmlwKCl9ZnVuY3Rpb24gaCh0LGUscil7ci5uZWdhdGl2ZT1lLm5lZ2F0aXZlXnQubmVnYXRpdmUsci5sZW5ndGg9dC5sZW5ndGgrZS5sZW5ndGg7Zm9yKHZhciBuPTAsaT0wLG89MDtvPHIubGVuZ3RoLTE7bysrKXt2YXIgYT1pO2k9MDtmb3IodmFyIGY9NjcxMDg4NjMmbixzPU1hdGgubWluKG8sZS5sZW5ndGgtMSksdT1NYXRoLm1heCgwLG8tdC5sZW5ndGgrMSk7dTw9czt1Kyspe3ZhciBoPW8tdSxjPTB8dC53b3Jkc1toXSxkPTB8ZS53b3Jkc1t1XSxsPWMqZCxwPTY3MTA4ODYzJmw7YT1hKyhsLzY3MTA4ODY0fDApfDAscD1wK2Z8MCxmPTY3MTA4ODYzJnAsYT1hKyhwPj4+MjYpfDAsaSs9YT4+PjI2LGEmPTY3MTA4ODYzfXIud29yZHNbb109ZixuPWEsYT1pfXJldHVybiAwIT09bj9yLndvcmRzW29dPW46ci5sZW5ndGgtLSxyLnN0cmlwKCl9ZnVuY3Rpb24gYyh0LGUscil7dmFyIG49bmV3IGQ7cmV0dXJuIG4ubXVscCh0LGUscil9ZnVuY3Rpb24gZCh0LGUpe3RoaXMueD10LHRoaXMueT1lfWZ1bmN0aW9uIGwodCxlKXt0aGlzLm5hbWU9dCx0aGlzLnA9bmV3IG8oZSwxNiksdGhpcy5uPXRoaXMucC5iaXRMZW5ndGgoKSx0aGlzLms9bmV3IG8oMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApLHRoaXMudG1wPXRoaXMuX3RtcCgpfWZ1bmN0aW9uIHAoKXtsLmNhbGwodGhpcyxcImsyNTZcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmXCIpfWZ1bmN0aW9uIGIoKXtsLmNhbGwodGhpcyxcInAyMjRcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxXCIpfWZ1bmN0aW9uIHYoKXtsLmNhbGwodGhpcyxcInAxOTJcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmXCIpfWZ1bmN0aW9uIHkoKXtsLmNhbGwodGhpcyxcIjI1NTE5XCIsXCI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkXCIpfWZ1bmN0aW9uIG0odCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciBlPW8uX3ByaW1lKHQpO3RoaXMubT1lLnAsdGhpcy5wcmltZT1lfWVsc2Ugbih0Lmd0bigxKSxcIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMVwiKSx0aGlzLm09dCx0aGlzLnByaW1lPW51bGx9ZnVuY3Rpb24gZyh0KXttLmNhbGwodGhpcyx0KSx0aGlzLnNoaWZ0PXRoaXMubS5iaXRMZW5ndGgoKSx0aGlzLnNoaWZ0JTI2IT09MCYmKHRoaXMuc2hpZnQrPTI2LXRoaXMuc2hpZnQlMjYpLHRoaXMucj1uZXcgbygxKS5pdXNobG4odGhpcy5zaGlmdCksdGhpcy5yMj10aGlzLmltb2QodGhpcy5yLnNxcigpKSx0aGlzLnJpbnY9dGhpcy5yLl9pbnZtcCh0aGlzLm0pLHRoaXMubWludj10aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSksdGhpcy5taW52PXRoaXMubWludi51bW9kKHRoaXMuciksdGhpcy5taW52PXRoaXMuci5zdWIodGhpcy5taW52KX1cIm9iamVjdFwiPT10eXBlb2YgdD90LmV4cG9ydHM9bzplLkJOPW8sby5CTj1vLG8ud29yZFNpemU9MjY7dmFyIHc7dHJ5e3c9cigxKS5CdWZmZXJ9Y2F0Y2godCl7fW8uaXNCTj1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG98fG51bGwhPT10JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3Rvci53b3JkU2l6ZT09PW8ud29yZFNpemUmJkFycmF5LmlzQXJyYXkodC53b3Jkcyl9LG8ubWF4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY21wKGUpPjA/dDplfSxvLm1pbj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNtcChlKTwwP3Q6ZX0sby5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLHIpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXJldHVybiB0aGlzLl9pbml0TnVtYmVyKHQsZSxyKTtpZihcIm9iamVjdFwiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5faW5pdEFycmF5KHQsZSxyKTtcImhleFwiPT09ZSYmKGU9MTYpLG4oZT09PSgwfGUpJiZlPj0yJiZlPD0zNiksdD10LnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBpPTA7XCItXCI9PT10WzBdJiZpKyssMTY9PT1lP3RoaXMuX3BhcnNlSGV4KHQsaSk6dGhpcy5fcGFyc2VCYXNlKHQsZSxpKSxcIi1cIj09PXRbMF0mJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKSxcImxlXCI9PT1yJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksZSxyKX0sby5wcm90b3R5cGUuX2luaXROdW1iZXI9ZnVuY3Rpb24odCxlLHIpe3Q8MCYmKHRoaXMubmVnYXRpdmU9MSx0PS10KSx0PDY3MTA4ODY0Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZ0XSx0aGlzLmxlbmd0aD0xKTp0PDQ1MDM1OTk2MjczNzA0OTY/KHRoaXMud29yZHM9WzY3MTA4ODYzJnQsdC82NzEwODg2NCY2NzEwODg2M10sdGhpcy5sZW5ndGg9Mik6KG4odDw5MDA3MTk5MjU0NzQwOTkyKSx0aGlzLndvcmRzPVs2NzEwODg2MyZ0LHQvNjcxMDg4NjQmNjcxMDg4NjMsMV0sdGhpcy5sZW5ndGg9MyksXCJsZVwiPT09ciYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUscil9LG8ucHJvdG90eXBlLl9pbml0QXJyYXk9ZnVuY3Rpb24odCxlLHIpe2lmKG4oXCJudW1iZXJcIj09dHlwZW9mIHQubGVuZ3RoKSx0Lmxlbmd0aDw9MClyZXR1cm4gdGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MSx0aGlzO3RoaXMubGVuZ3RoPU1hdGguY2VpbCh0Lmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciBvLGEsZj0wO2lmKFwiYmVcIj09PXIpZm9yKGk9dC5sZW5ndGgtMSxvPTA7aT49MDtpLT0zKWE9dFtpXXx0W2ktMV08PDh8dFtpLTJdPDwxNix0aGlzLndvcmRzW29dfD1hPDxmJjY3MTA4ODYzLHRoaXMud29yZHNbbysxXT1hPj4+MjYtZiY2NzEwODg2MyxmKz0yNCxmPj0yNiYmKGYtPTI2LG8rKyk7ZWxzZSBpZihcImxlXCI9PT1yKWZvcihpPTAsbz0wO2k8dC5sZW5ndGg7aSs9MylhPXRbaV18dFtpKzFdPDw4fHRbaSsyXTw8MTYsdGhpcy53b3Jkc1tvXXw9YTw8ZiY2NzEwODg2Myx0aGlzLndvcmRzW28rMV09YT4+PjI2LWYmNjcxMDg4NjMsZis9MjQsZj49MjYmJihmLT0yNixvKyspO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl9wYXJzZUhleD1mdW5jdGlvbih0LGUpe3RoaXMubGVuZ3RoPU1hdGguY2VpbCgodC5sZW5ndGgtZSkvNiksdGhpcy53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgcj0wO3I8dGhpcy5sZW5ndGg7cisrKXRoaXMud29yZHNbcl09MDt2YXIgbixpLG89MDtmb3Iocj10Lmxlbmd0aC02LG49MDtyPj1lO3ItPTYpaT1hKHQscixyKzYpLHRoaXMud29yZHNbbl18PWk8PG8mNjcxMDg4NjMsdGhpcy53b3Jkc1tuKzFdfD1pPj4+MjYtbyY0MTk0MzAzLG8rPTI0LG8+PTI2JiYoby09MjYsbisrKTtyKzYhPT1lJiYoaT1hKHQsZSxyKzYpLHRoaXMud29yZHNbbl18PWk8PG8mNjcxMDg4NjMsdGhpcy53b3Jkc1tuKzFdfD1pPj4+MjYtbyY0MTk0MzAzKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl9wYXJzZUJhc2U9ZnVuY3Rpb24odCxlLHIpe3RoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTE7Zm9yKHZhciBuPTAsaT0xO2k8PTY3MTA4ODYzO2kqPWUpbisrO24tLSxpPWkvZXwwO2Zvcih2YXIgbz10Lmxlbmd0aC1yLGE9byVuLHM9TWF0aC5taW4obyxvLWEpK3IsdT0wLGg9cjtoPHM7aCs9bil1PWYodCxoLGgrbixlKSx0aGlzLmltdWxuKGkpLHRoaXMud29yZHNbMF0rdTw2NzEwODg2ND90aGlzLndvcmRzWzBdKz11OnRoaXMuX2lhZGRuKHUpO2lmKDAhPT1hKXt2YXIgYz0xO2Zvcih1PWYodCxoLHQubGVuZ3RoLGUpLGg9MDtoPGE7aCsrKWMqPWU7dGhpcy5pbXVsbihjKSx0aGlzLndvcmRzWzBdK3U8NjcxMDg4NjQ/dGhpcy53b3Jkc1swXSs9dTp0aGlzLl9pYWRkbih1KX19LG8ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCl7dC53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXQud29yZHNbZV09dGhpcy53b3Jkc1tlXTt0Lmxlbmd0aD10aGlzLmxlbmd0aCx0Lm5lZ2F0aXZlPXRoaXMubmVnYXRpdmUsdC5yZWQ9dGhpcy5yZWR9LG8ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG8obnVsbCk7cmV0dXJuIHRoaXMuY29weSh0KSx0fSxvLnByb3RvdHlwZS5fZXhwYW5kPWZ1bmN0aW9uKHQpe2Zvcig7dGhpcy5sZW5ndGg8dDspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS5zdHJpcD1mdW5jdGlvbigpe2Zvcig7dGhpcy5sZW5ndGg+MSYmMD09PXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV07KXRoaXMubGVuZ3RoLS07cmV0dXJuIHRoaXMuX25vcm1TaWduKCl9LG8ucHJvdG90eXBlLl9ub3JtU2lnbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdJiYodGhpcy5uZWdhdGl2ZT0wKSx0aGlzfSxvLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMucmVkP1wiPEJOLVI6IFwiOlwiPEJOOiBcIikrdGhpcy50b1N0cmluZygxNikrXCI+XCJ9O3ZhciBfPVtcIlwiLFwiMFwiLFwiMDBcIixcIjAwMFwiLFwiMDAwMFwiLFwiMDAwMDBcIixcIjAwMDAwMFwiLFwiMDAwMDAwMFwiLFwiMDAwMDAwMDBcIixcIjAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiXSxNPVswLDAsMjUsMTYsMTIsMTEsMTAsOSw4LDgsNyw3LDcsNyw2LDYsNiw2LDYsNiw2LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDVdLFM9WzAsMCwzMzU1NDQzMiw0MzA0NjcyMSwxNjc3NzIxNiw0ODgyODEyNSw2MDQ2NjE3Niw0MDM1MzYwNywxNjc3NzIxNiw0MzA0NjcyMSwxZTcsMTk0ODcxNzEsMzU4MzE4MDgsNjI3NDg1MTcsNzUyOTUzNiwxMTM5MDYyNSwxNjc3NzIxNiwyNDEzNzU2OSwzNDAxMjIyNCw0NzA0NTg4MSw2NGU2LDQwODQxMDEsNTE1MzYzMiw2NDM2MzQzLDc5NjI2MjQsOTc2NTYyNSwxMTg4MTM3NiwxNDM0ODkwNywxNzIxMDM2OCwyMDUxMTE0OSwyNDNlNSwyODYyOTE1MSwzMzU1NDQzMiwzOTEzNTM5Myw0NTQzNTQyNCw1MjUyMTg3NSw2MDQ2NjE3Nl07by5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24odCxlKXt0PXR8fDEwLGU9MHxlfHwxO3ZhciByO2lmKDE2PT09dHx8XCJoZXhcIj09PXQpe3I9XCJcIjtmb3IodmFyIGk9MCxvPTAsYT0wO2E8dGhpcy5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLndvcmRzW2FdLHM9KDE2Nzc3MjE1JihmPDxpfG8pKS50b1N0cmluZygxNik7bz1mPj4+MjQtaSYxNjc3NzIxNSxyPTAhPT1vfHxhIT09dGhpcy5sZW5ndGgtMT9fWzYtcy5sZW5ndGhdK3MrcjpzK3IsaSs9MixpPj0yNiYmKGktPTI2LGEtLSl9Zm9yKDAhPT1vJiYocj1vLnRvU3RyaW5nKDE2KStyKTtyLmxlbmd0aCVlIT09MDspcj1cIjBcIityO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKHI9XCItXCIrcikscn1pZih0PT09KDB8dCkmJnQ+PTImJnQ8PTM2KXt2YXIgdT1NW3RdLGg9U1t0XTtyPVwiXCI7dmFyIGM9dGhpcy5jbG9uZSgpO2ZvcihjLm5lZ2F0aXZlPTA7IWMuaXNaZXJvKCk7KXt2YXIgZD1jLm1vZG4oaCkudG9TdHJpbmcodCk7Yz1jLmlkaXZuKGgpLHI9Yy5pc1plcm8oKT9kK3I6X1t1LWQubGVuZ3RoXStkK3J9Zm9yKHRoaXMuaXNaZXJvKCkmJihyPVwiMFwiK3IpO3IubGVuZ3RoJWUhPT0wOylyPVwiMFwiK3I7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlJiYocj1cIi1cIityKSxyfW4oITEsXCJCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpfSxvLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMud29yZHNbMF07cmV0dXJuIDI9PT10aGlzLmxlbmd0aD90Kz02NzEwODg2NCp0aGlzLndvcmRzWzFdOjM9PT10aGlzLmxlbmd0aCYmMT09PXRoaXMud29yZHNbMl0/dCs9NDUwMzU5OTYyNzM3MDQ5Nis2NzEwODg2NCp0aGlzLndvcmRzWzFdOnRoaXMubGVuZ3RoPjImJm4oITEsXCJOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHNcIiksMCE9PXRoaXMubmVnYXRpdmU/LXQ6dH0sby5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpfSxvLnByb3RvdHlwZS50b0J1ZmZlcj1mdW5jdGlvbih0LGUpe3JldHVybiBuKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3KSx0aGlzLnRvQXJyYXlMaWtlKHcsdCxlKX0sby5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LHQsZSl9LG8ucHJvdG90eXBlLnRvQXJyYXlMaWtlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT10aGlzLmJ5dGVMZW5ndGgoKSxvPXJ8fE1hdGgubWF4KDEsaSk7bihpPD1vLFwiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aFwiKSxuKG8+MCxcIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMFwiKSx0aGlzLnN0cmlwKCk7dmFyIGEsZixzPVwibGVcIj09PWUsdT1uZXcgdChvKSxoPXRoaXMuY2xvbmUoKTtpZihzKXtmb3IoZj0wOyFoLmlzWmVybygpO2YrKylhPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSx1W2ZdPWE7Zm9yKDtmPG87ZisrKXVbZl09MH1lbHNle2ZvcihmPTA7ZjxvLWk7ZisrKXVbZl09MDtmb3IoZj0wOyFoLmlzWmVybygpO2YrKylhPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSx1W28tZi0xXT1hfXJldHVybiB1fSxNYXRoLmNsejMyP28ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDMyLU1hdGguY2x6MzIodCl9Om8ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7dmFyIGU9dCxyPTA7cmV0dXJuIGU+PTQwOTYmJihyKz0xMyxlPj4+PTEzKSxlPj02NCYmKHIrPTcsZT4+Pj03KSxlPj04JiYocis9NCxlPj4+PTQpLGU+PTImJihyKz0yLGU+Pj49MikscitlfSxvLnByb3RvdHlwZS5femVyb0JpdHM9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIDI2O3ZhciBlPXQscj0wO3JldHVybiAwPT09KDgxOTEmZSkmJihyKz0xMyxlPj4+PTEzKSwwPT09KDEyNyZlKSYmKHIrPTcsZT4+Pj03KSwwPT09KDE1JmUpJiYocis9NCxlPj4+PTQpLDA9PT0oMyZlKSYmKHIrPTIsZT4+Pj0yKSwwPT09KDEmZSkmJnIrKyxyfSxvLnByb3RvdHlwZS5iaXRMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdLGU9dGhpcy5fY291bnRCaXRzKHQpO3JldHVybiAyNioodGhpcy5sZW5ndGgtMSkrZX0sby5wcm90b3R5cGUuemVyb0JpdHM9ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiAwO2Zvcih2YXIgdD0wLGU9MDtlPHRoaXMubGVuZ3RoO2UrKyl7dmFyIHI9dGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tlXSk7aWYodCs9ciwyNiE9PXIpYnJlYWt9cmV0dXJuIHR9LG8ucHJvdG90eXBlLmJ5dGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkvOCl9LG8ucHJvdG90eXBlLnRvVHdvcz1mdW5jdGlvbih0KXtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/dGhpcy5hYnMoKS5pbm90bih0KS5pYWRkbigxKTp0aGlzLmNsb25lKCl9LG8ucHJvdG90eXBlLmZyb21Ud29zPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRlc3RuKHQtMSk/dGhpcy5ub3RuKHQpLmlhZGRuKDEpLmluZWcoKTp0aGlzLmNsb25lKCl9LG8ucHJvdG90eXBlLmlzTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlfSxvLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKX0sby5wcm90b3R5cGUuaW5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzWmVybygpfHwodGhpcy5uZWdhdGl2ZV49MSksdGhpc30sby5wcm90b3R5cGUuaXVvcj1mdW5jdGlvbih0KXtmb3IoO3RoaXMubGVuZ3RoPHQubGVuZ3RoOyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy53b3Jkc1tlXT10aGlzLndvcmRzW2VdfHQud29yZHNbZV07cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaW9yPWZ1bmN0aW9uKHQpe3JldHVybiBuKDA9PT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdW9yKHQpfSxvLnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlvcih0KTp0LmNsb25lKCkuaW9yKHRoaXMpfSxvLnByb3RvdHlwZS51b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdW9yKHQpOnQuY2xvbmUoKS5pdW9yKHRoaXMpfSxvLnByb3RvdHlwZS5pdWFuZD1mdW5jdGlvbih0KXt2YXIgZTtlPXRoaXMubGVuZ3RoPnQubGVuZ3RoP3Q6dGhpcztmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0aGlzLndvcmRzW3JdPXRoaXMud29yZHNbcl0mdC53b3Jkc1tyXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuKDA9PT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdWFuZCh0KX0sby5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaWFuZCh0KTp0LmNsb25lKCkuaWFuZCh0aGlzKX0sby5wcm90b3R5cGUudWFuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLml1YW5kKHQpOnQuY2xvbmUoKS5pdWFuZCh0aGlzKX0sby5wcm90b3R5cGUuaXV4b3I9ZnVuY3Rpb24odCl7dmFyIGUscjt0aGlzLmxlbmd0aD50Lmxlbmd0aD8oZT10aGlzLHI9dCk6KGU9dCxyPXRoaXMpO2Zvcih2YXIgbj0wO248ci5sZW5ndGg7bisrKXRoaXMud29yZHNbbl09ZS53b3Jkc1tuXV5yLndvcmRzW25dO2lmKHRoaXMhPT1lKWZvcig7bjxlLmxlbmd0aDtuKyspdGhpcy53b3Jkc1tuXT1lLndvcmRzW25dO3JldHVybiB0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLml4b3I9ZnVuY3Rpb24odCl7cmV0dXJuIG4oMD09PSh0aGlzLm5lZ2F0aXZlfHQubmVnYXRpdmUpKSx0aGlzLml1eG9yKHQpfSxvLnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5peG9yKHQpOnQuY2xvbmUoKS5peG9yKHRoaXMpfSxvLnByb3RvdHlwZS51eG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXV4b3IodCk6dC5jbG9uZSgpLml1eG9yKHRoaXMpfSxvLnByb3RvdHlwZS5pbm90bj1mdW5jdGlvbih0KXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZT0wfE1hdGguY2VpbCh0LzI2KSxyPXQlMjY7dGhpcy5fZXhwYW5kKGUpLHI+MCYmZS0tO2Zvcih2YXIgaT0wO2k8ZTtpKyspdGhpcy53b3Jkc1tpXT02NzEwODg2MyZ+dGhpcy53b3Jkc1tpXTtyZXR1cm4gcj4wJiYodGhpcy53b3Jkc1tpXT1+dGhpcy53b3Jkc1tpXSY2NzEwODg2Mz4+MjYtciksdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5ub3RuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaW5vdG4odCl9LG8ucHJvdG90eXBlLnNldG49ZnVuY3Rpb24odCxlKXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgcj10LzI2fDAsaT10JTI2O3JldHVybiB0aGlzLl9leHBhbmQocisxKSxlP3RoaXMud29yZHNbcl09dGhpcy53b3Jkc1tyXXwxPDxpOnRoaXMud29yZHNbcl09dGhpcy53b3Jkc1tyXSZ+KDE8PGkpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbih0KXt2YXIgZTtpZigwIT09dGhpcy5uZWdhdGl2ZSYmMD09PXQubmVnYXRpdmUpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCxlPXRoaXMuaXN1Yih0KSx0aGlzLm5lZ2F0aXZlXj0xLHRoaXMuX25vcm1TaWduKCk7aWYoMD09PXRoaXMubmVnYXRpdmUmJjAhPT10Lm5lZ2F0aXZlKXJldHVybiB0Lm5lZ2F0aXZlPTAsZT10aGlzLmlzdWIodCksdC5uZWdhdGl2ZT0xLGUuX25vcm1TaWduKCk7dmFyIHIsbjt0aGlzLmxlbmd0aD50Lmxlbmd0aD8ocj10aGlzLG49dCk6KHI9dCxuPXRoaXMpO2Zvcih2YXIgaT0wLG89MDtvPG4ubGVuZ3RoO28rKyllPSgwfHIud29yZHNbb10pKygwfG4ud29yZHNbb10pK2ksdGhpcy53b3Jkc1tvXT02NzEwODg2MyZlLGk9ZT4+PjI2O2Zvcig7MCE9PWkmJm88ci5sZW5ndGg7bysrKWU9KDB8ci53b3Jkc1tvXSkraSx0aGlzLndvcmRzW29dPTY3MTA4ODYzJmUsaT1lPj4+MjY7aWYodGhpcy5sZW5ndGg9ci5sZW5ndGgsMCE9PWkpdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF09aSx0aGlzLmxlbmd0aCsrO2Vsc2UgaWYociE9PXRoaXMpZm9yKDtvPHIubGVuZ3RoO28rKyl0aGlzLndvcmRzW29dPXIud29yZHNbb107cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMCE9PXQubmVnYXRpdmUmJjA9PT10aGlzLm5lZ2F0aXZlPyh0Lm5lZ2F0aXZlPTAsZT10aGlzLnN1Yih0KSx0Lm5lZ2F0aXZlXj0xLGUpOjA9PT10Lm5lZ2F0aXZlJiYwIT09dGhpcy5uZWdhdGl2ZT8odGhpcy5uZWdhdGl2ZT0wLGU9dC5zdWIodGhpcyksdGhpcy5uZWdhdGl2ZT0xLGUpOnRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKHQpOnQuY2xvbmUoKS5pYWRkKHRoaXMpfSxvLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQpe2lmKDAhPT10Lm5lZ2F0aXZlKXt0Lm5lZ2F0aXZlPTA7dmFyIGU9dGhpcy5pYWRkKHQpO3JldHVybiB0Lm5lZ2F0aXZlPTEsZS5fbm9ybVNpZ24oKX1pZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZCh0KSx0aGlzLm5lZ2F0aXZlPTEsdGhpcy5fbm9ybVNpZ24oKTt2YXIgcj10aGlzLmNtcCh0KTtpZigwPT09cilyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMubGVuZ3RoPTEsdGhpcy53b3Jkc1swXT0wLHRoaXM7dmFyIG4saTtyPjA/KG49dGhpcyxpPXQpOihuPXQsaT10aGlzKTtmb3IodmFyIG89MCxhPTA7YTxpLmxlbmd0aDthKyspZT0oMHxuLndvcmRzW2FdKS0oMHxpLndvcmRzW2FdKStvLG89ZT4+MjYsdGhpcy53b3Jkc1thXT02NzEwODg2MyZlO2Zvcig7MCE9PW8mJmE8bi5sZW5ndGg7YSsrKWU9KDB8bi53b3Jkc1thXSkrbyxvPWU+PjI2LHRoaXMud29yZHNbYV09NjcxMDg4NjMmZTtpZigwPT09byYmYTxuLmxlbmd0aCYmbiE9PXRoaXMpZm9yKDthPG4ubGVuZ3RoO2ErKyl0aGlzLndvcmRzW2FdPW4ud29yZHNbYV07cmV0dXJuIHRoaXMubGVuZ3RoPU1hdGgubWF4KHRoaXMubGVuZ3RoLGEpLG4hPT10aGlzJiYodGhpcy5uZWdhdGl2ZT0xKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIodCl9O3ZhciBFPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpLG8sYT10LndvcmRzLGY9ZS53b3JkcyxzPXIud29yZHMsdT0wLGg9MHxhWzBdLGM9ODE5MSZoLGQ9aD4+PjEzLGw9MHxhWzFdLHA9ODE5MSZsLGI9bD4+PjEzLHY9MHxhWzJdLHk9ODE5MSZ2LG09dj4+PjEzLGc9MHxhWzNdLHc9ODE5MSZnLF89Zz4+PjEzLE09MHxhWzRdLFM9ODE5MSZNLEU9TT4+PjEzLEE9MHxhWzVdLGs9ODE5MSZBLHg9QT4+PjEzLEk9MHxhWzZdLEI9ODE5MSZJLE89ST4+PjEzLFI9MHxhWzddLFA9ODE5MSZSLFQ9Uj4+PjEzLGo9MHxhWzhdLEM9ODE5MSZqLE49aj4+PjEzLEw9MHxhWzldLFU9ODE5MSZMLHo9TD4+PjEzLEQ9MHxmWzBdLHE9ODE5MSZELEY9RD4+PjEzLEs9MHxmWzFdLEc9ODE5MSZLLFY9Sz4+PjEzLEg9MHxmWzJdLFg9ODE5MSZILFk9SD4+PjEzLFc9MHxmWzNdLFo9ODE5MSZXLEo9Vz4+PjEzLCQ9MHxmWzRdLFE9ODE5MSYkLHR0PSQ+Pj4xMyxldD0wfGZbNV0scnQ9ODE5MSZldCxudD1ldD4+PjEzLGl0PTB8Zls2XSxvdD04MTkxJml0LGF0PWl0Pj4+MTMsZnQ9MHxmWzddLHN0PTgxOTEmZnQsdXQ9ZnQ+Pj4xMyxodD0wfGZbOF0sY3Q9ODE5MSZodCxkdD1odD4+PjEzLGx0PTB8Zls5XSxwdD04MTkxJmx0LGJ0PWx0Pj4+MTM7ci5uZWdhdGl2ZT10Lm5lZ2F0aXZlXmUubmVnYXRpdmUsci5sZW5ndGg9MTksbj1NYXRoLmltdWwoYyxxKSxpPU1hdGguaW11bChjLEYpLGk9aStNYXRoLmltdWwoZCxxKXwwLG89TWF0aC5pbXVsKGQsRik7dmFyIHZ0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyh2dD4+PjI2KXwwLHZ0Jj02NzEwODg2MyxuPU1hdGguaW11bChwLHEpLGk9TWF0aC5pbXVsKHAsRiksaT1pK01hdGguaW11bChiLHEpfDAsbz1NYXRoLmltdWwoYixGKSxuPW4rTWF0aC5pbXVsKGMsRyl8MCxpPWkrTWF0aC5pbXVsKGMsVil8MCxpPWkrTWF0aC5pbXVsKGQsRyl8MCxvPW8rTWF0aC5pbXVsKGQsVil8MDt2YXIgeXQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKHl0Pj4+MjYpfDAseXQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKHkscSksaT1NYXRoLmltdWwoeSxGKSxpPWkrTWF0aC5pbXVsKG0scSl8MCxvPU1hdGguaW11bChtLEYpLG49bitNYXRoLmltdWwocCxHKXwwLGk9aStNYXRoLmltdWwocCxWKXwwLGk9aStNYXRoLmltdWwoYixHKXwwLG89bytNYXRoLmltdWwoYixWKXwwLG49bitNYXRoLmltdWwoYyxYKXwwLGk9aStNYXRoLmltdWwoYyxZKXwwLGk9aStNYXRoLmltdWwoZCxYKXwwLG89bytNYXRoLmltdWwoZCxZKXwwO3ZhciBtdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsobXQ+Pj4yNil8MCxtdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwodyxxKSxpPU1hdGguaW11bCh3LEYpLGk9aStNYXRoLmltdWwoXyxxKXwwLG89TWF0aC5pbXVsKF8sRiksbj1uK01hdGguaW11bCh5LEcpfDAsaT1pK01hdGguaW11bCh5LFYpfDAsaT1pK01hdGguaW11bChtLEcpfDAsbz1vK01hdGguaW11bChtLFYpfDAsbj1uK01hdGguaW11bChwLFgpfDAsaT1pK01hdGguaW11bChwLFkpfDAsaT1pK01hdGguaW11bChiLFgpfDAsbz1vK01hdGguaW11bChiLFkpfDAsbj1uK01hdGguaW11bChjLFopfDAsaT1pK01hdGguaW11bChjLEopfDAsaT1pK01hdGguaW11bChkLFopfDAsbz1vK01hdGguaW11bChkLEopfDA7dmFyIGd0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhndD4+PjI2KXwwLGd0Jj02NzEwODg2MyxuPU1hdGguaW11bChTLHEpLGk9TWF0aC5pbXVsKFMsRiksaT1pK01hdGguaW11bChFLHEpfDAsbz1NYXRoLmltdWwoRSxGKSxuPW4rTWF0aC5pbXVsKHcsRyl8MCxpPWkrTWF0aC5pbXVsKHcsVil8MCxpPWkrTWF0aC5pbXVsKF8sRyl8MCxvPW8rTWF0aC5pbXVsKF8sVil8MCxuPW4rTWF0aC5pbXVsKHksWCl8MCxpPWkrTWF0aC5pbXVsKHksWSl8MCxpPWkrTWF0aC5pbXVsKG0sWCl8MCxvPW8rTWF0aC5pbXVsKG0sWSl8MCxuPW4rTWF0aC5pbXVsKHAsWil8MCxpPWkrTWF0aC5pbXVsKHAsSil8MCxpPWkrTWF0aC5pbXVsKGIsWil8MCxvPW8rTWF0aC5pbXVsKGIsSil8MCxuPW4rTWF0aC5pbXVsKGMsUSl8MCxpPWkrTWF0aC5pbXVsKGMsdHQpfDAsaT1pK01hdGguaW11bChkLFEpfDAsbz1vK01hdGguaW11bChkLHR0KXwwO3ZhciB3dD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsod3Q+Pj4yNil8MCx3dCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoayxxKSxpPU1hdGguaW11bChrLEYpLGk9aStNYXRoLmltdWwoeCxxKXwwLG89TWF0aC5pbXVsKHgsRiksbj1uK01hdGguaW11bChTLEcpfDAsaT1pK01hdGguaW11bChTLFYpfDAsaT1pK01hdGguaW11bChFLEcpfDAsbz1vK01hdGguaW11bChFLFYpfDAsbj1uK01hdGguaW11bCh3LFgpfDAsaT1pK01hdGguaW11bCh3LFkpfDAsaT1pK01hdGguaW11bChfLFgpfDAsbz1vK01hdGguaW11bChfLFkpfDAsbj1uK01hdGguaW11bCh5LFopfDAsaT1pK01hdGguaW11bCh5LEopfDAsaT1pK01hdGguaW11bChtLFopfDAsbz1vK01hdGguaW11bChtLEopfDAsbj1uK01hdGguaW11bChwLFEpfDAsaT1pK01hdGguaW11bChwLHR0KXwwLGk9aStNYXRoLmltdWwoYixRKXwwLG89bytNYXRoLmltdWwoYix0dCl8MCxuPW4rTWF0aC5pbXVsKGMscnQpfDAsaT1pK01hdGguaW11bChjLG50KXwwLGk9aStNYXRoLmltdWwoZCxydCl8MCxvPW8rTWF0aC5pbXVsKGQsbnQpfDA7dmFyIF90PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhfdD4+PjI2KXwwLF90Jj02NzEwODg2MyxuPU1hdGguaW11bChCLHEpLGk9TWF0aC5pbXVsKEIsRiksaT1pK01hdGguaW11bChPLHEpfDAsbz1NYXRoLmltdWwoTyxGKSxuPW4rTWF0aC5pbXVsKGssRyl8MCxpPWkrTWF0aC5pbXVsKGssVil8MCxpPWkrTWF0aC5pbXVsKHgsRyl8MCxvPW8rTWF0aC5pbXVsKHgsVil8MCxuPW4rTWF0aC5pbXVsKFMsWCl8MCxpPWkrTWF0aC5pbXVsKFMsWSl8MCxpPWkrTWF0aC5pbXVsKEUsWCl8MCxvPW8rTWF0aC5pbXVsKEUsWSl8MCxuPW4rTWF0aC5pbXVsKHcsWil8MCxpPWkrTWF0aC5pbXVsKHcsSil8MCxpPWkrTWF0aC5pbXVsKF8sWil8MCxvPW8rTWF0aC5pbXVsKF8sSil8MCxuPW4rTWF0aC5pbXVsKHksUSl8MCxpPWkrTWF0aC5pbXVsKHksdHQpfDAsaT1pK01hdGguaW11bChtLFEpfDAsbz1vK01hdGguaW11bChtLHR0KXwwLG49bitNYXRoLmltdWwocCxydCl8MCxpPWkrTWF0aC5pbXVsKHAsbnQpfDAsaT1pK01hdGguaW11bChiLHJ0KXwwLG89bytNYXRoLmltdWwoYixudCl8MCxuPW4rTWF0aC5pbXVsKGMsb3QpfDAsaT1pK01hdGguaW11bChjLGF0KXwwLGk9aStNYXRoLmltdWwoZCxvdCl8MCxvPW8rTWF0aC5pbXVsKGQsYXQpfDA7dmFyIE10PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhNdD4+PjI2KXwwLE10Jj02NzEwODg2MyxuPU1hdGguaW11bChQLHEpLGk9TWF0aC5pbXVsKFAsRiksaT1pK01hdGguaW11bChULHEpfDAsbz1NYXRoLmltdWwoVCxGKSxuPW4rTWF0aC5pbXVsKEIsRyl8MCxpPWkrTWF0aC5pbXVsKEIsVil8MCxpPWkrTWF0aC5pbXVsKE8sRyl8MCxvPW8rTWF0aC5pbXVsKE8sVil8MCxuPW4rTWF0aC5pbXVsKGssWCl8MCxpPWkrTWF0aC5pbXVsKGssWSl8MCxpPWkrTWF0aC5pbXVsKHgsWCl8MCxvPW8rTWF0aC5pbXVsKHgsWSl8MCxuPW4rTWF0aC5pbXVsKFMsWil8MCxpPWkrTWF0aC5pbXVsKFMsSil8MCxpPWkrTWF0aC5pbXVsKEUsWil8MCxvPW8rTWF0aC5pbXVsKEUsSil8MCxuPW4rTWF0aC5pbXVsKHcsUSl8MCxpPWkrTWF0aC5pbXVsKHcsdHQpfDAsaT1pK01hdGguaW11bChfLFEpfDAsbz1vK01hdGguaW11bChfLHR0KXwwLG49bitNYXRoLmltdWwoeSxydCl8MCxpPWkrTWF0aC5pbXVsKHksbnQpfDAsaT1pK01hdGguaW11bChtLHJ0KXwwLG89bytNYXRoLmltdWwobSxudCl8MCxuPW4rTWF0aC5pbXVsKHAsb3QpfDAsaT1pK01hdGguaW11bChwLGF0KXwwLGk9aStNYXRoLmltdWwoYixvdCl8MCxvPW8rTWF0aC5pbXVsKGIsYXQpfDAsbj1uK01hdGguaW11bChjLHN0KXwwLGk9aStNYXRoLmltdWwoYyx1dCl8MCxpPWkrTWF0aC5pbXVsKGQsc3QpfDAsbz1vK01hdGguaW11bChkLHV0KXwwO3ZhciBTdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoU3Q+Pj4yNil8MCxTdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoQyxxKSxpPU1hdGguaW11bChDLEYpLGk9aStNYXRoLmltdWwoTixxKXwwLG89TWF0aC5pbXVsKE4sRiksbj1uK01hdGguaW11bChQLEcpfDAsaT1pK01hdGguaW11bChQLFYpfDAsaT1pK01hdGguaW11bChULEcpfDAsbz1vK01hdGguaW11bChULFYpfDAsbj1uK01hdGguaW11bChCLFgpfDAsaT1pK01hdGguaW11bChCLFkpfDAsaT1pK01hdGguaW11bChPLFgpfDAsbz1vK01hdGguaW11bChPLFkpfDAsbj1uK01hdGguaW11bChrLFopfDAsaT1pK01hdGguaW11bChrLEopfDAsaT1pK01hdGguaW11bCh4LFopfDAsbz1vK01hdGguaW11bCh4LEopfDAsbj1uK01hdGguaW11bChTLFEpfDAsaT1pK01hdGguaW11bChTLHR0KXwwLGk9aStNYXRoLmltdWwoRSxRKXwwLG89bytNYXRoLmltdWwoRSx0dCl8MCxuPW4rTWF0aC5pbXVsKHcscnQpfDAsaT1pK01hdGguaW11bCh3LG50KXwwLGk9aStNYXRoLmltdWwoXyxydCl8MCxvPW8rTWF0aC5pbXVsKF8sbnQpfDAsbj1uK01hdGguaW11bCh5LG90KXwwLGk9aStNYXRoLmltdWwoeSxhdCl8MCxpPWkrTWF0aC5pbXVsKG0sb3QpfDAsbz1vK01hdGguaW11bChtLGF0KXwwLG49bitNYXRoLmltdWwocCxzdCl8MCxpPWkrTWF0aC5pbXVsKHAsdXQpfDAsaT1pK01hdGguaW11bChiLHN0KXwwLG89bytNYXRoLmltdWwoYix1dCl8MCxuPW4rTWF0aC5pbXVsKGMsY3QpfDAsaT1pK01hdGguaW11bChjLGR0KXwwLGk9aStNYXRoLmltdWwoZCxjdCl8MCxvPW8rTWF0aC5pbXVsKGQsZHQpfDA7dmFyIEV0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhFdD4+PjI2KXwwLEV0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLHEpLGk9TWF0aC5pbXVsKFUsRiksaT1pK01hdGguaW11bCh6LHEpfDAsbz1NYXRoLmltdWwoeixGKSxuPW4rTWF0aC5pbXVsKEMsRyl8MCxpPWkrTWF0aC5pbXVsKEMsVil8MCxpPWkrTWF0aC5pbXVsKE4sRyl8MCxvPW8rTWF0aC5pbXVsKE4sVil8MCxuPW4rTWF0aC5pbXVsKFAsWCl8MCxpPWkrTWF0aC5pbXVsKFAsWSl8MCxpPWkrTWF0aC5pbXVsKFQsWCl8MCxvPW8rTWF0aC5pbXVsKFQsWSl8MCxuPW4rTWF0aC5pbXVsKEIsWil8MCxpPWkrTWF0aC5pbXVsKEIsSil8MCxpPWkrTWF0aC5pbXVsKE8sWil8MCxvPW8rTWF0aC5pbXVsKE8sSil8MCxuPW4rTWF0aC5pbXVsKGssUSl8MCxpPWkrTWF0aC5pbXVsKGssdHQpfDAsaT1pK01hdGguaW11bCh4LFEpfDAsbz1vK01hdGguaW11bCh4LHR0KXwwLG49bitNYXRoLmltdWwoUyxydCl8MCxpPWkrTWF0aC5pbXVsKFMsbnQpfDAsaT1pK01hdGguaW11bChFLHJ0KXwwLG89bytNYXRoLmltdWwoRSxudCl8MCxuPW4rTWF0aC5pbXVsKHcsb3QpfDAsaT1pK01hdGguaW11bCh3LGF0KXwwLGk9aStNYXRoLmltdWwoXyxvdCl8MCxvPW8rTWF0aC5pbXVsKF8sYXQpfDAsbj1uK01hdGguaW11bCh5LHN0KXwwLGk9aStNYXRoLmltdWwoeSx1dCl8MCxpPWkrTWF0aC5pbXVsKG0sc3QpfDAsbz1vK01hdGguaW11bChtLHV0KXwwLG49bitNYXRoLmltdWwocCxjdCl8MCxpPWkrTWF0aC5pbXVsKHAsZHQpfDAsaT1pK01hdGguaW11bChiLGN0KXwwLG89bytNYXRoLmltdWwoYixkdCl8MCxuPW4rTWF0aC5pbXVsKGMscHQpfDAsaT1pK01hdGguaW11bChjLGJ0KXwwLGk9aStNYXRoLmltdWwoZCxwdCl8MCxvPW8rTWF0aC5pbXVsKGQsYnQpfDA7dmFyIEF0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhBdD4+PjI2KXwwLEF0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLEcpLGk9TWF0aC5pbXVsKFUsViksaT1pK01hdGguaW11bCh6LEcpfDAsbz1NYXRoLmltdWwoeixWKSxuPW4rTWF0aC5pbXVsKEMsWCl8MCxpPWkrTWF0aC5pbXVsKEMsWSl8MCxpPWkrTWF0aC5pbXVsKE4sWCl8MCxvPW8rTWF0aC5pbXVsKE4sWSl8MCxuPW4rTWF0aC5pbXVsKFAsWil8MCxpPWkrTWF0aC5pbXVsKFAsSil8MCxpPWkrTWF0aC5pbXVsKFQsWil8MCxvPW8rTWF0aC5pbXVsKFQsSil8MCxuPW4rTWF0aC5pbXVsKEIsUSl8MCxpPWkrTWF0aC5pbXVsKEIsdHQpfDAsaT1pK01hdGguaW11bChPLFEpfDAsbz1vK01hdGguaW11bChPLHR0KXwwLG49bitNYXRoLmltdWwoayxydCl8MCxpPWkrTWF0aC5pbXVsKGssbnQpfDAsaT1pK01hdGguaW11bCh4LHJ0KXwwLG89bytNYXRoLmltdWwoeCxudCl8MCxuPW4rTWF0aC5pbXVsKFMsb3QpfDAsaT1pK01hdGguaW11bChTLGF0KXwwLGk9aStNYXRoLmltdWwoRSxvdCl8MCxvPW8rTWF0aC5pbXVsKEUsYXQpfDAsbj1uK01hdGguaW11bCh3LHN0KXwwLGk9aStNYXRoLmltdWwodyx1dCl8MCxpPWkrTWF0aC5pbXVsKF8sc3QpfDAsbz1vK01hdGguaW11bChfLHV0KXwwLG49bitNYXRoLmltdWwoeSxjdCl8MCxpPWkrTWF0aC5pbXVsKHksZHQpfDAsaT1pK01hdGguaW11bChtLGN0KXwwLG89bytNYXRoLmltdWwobSxkdCl8MCxuPW4rTWF0aC5pbXVsKHAscHQpfDAsaT1pK01hdGguaW11bChwLGJ0KXwwLGk9aStNYXRoLmltdWwoYixwdCl8MCxvPW8rTWF0aC5pbXVsKGIsYnQpfDA7dmFyIGt0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhrdD4+PjI2KXwwLGt0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLFgpLGk9TWF0aC5pbXVsKFUsWSksaT1pK01hdGguaW11bCh6LFgpfDAsbz1NYXRoLmltdWwoeixZKSxuPW4rTWF0aC5pbXVsKEMsWil8MCxpPWkrTWF0aC5pbXVsKEMsSil8MCxpPWkrTWF0aC5pbXVsKE4sWil8MCxvPW8rTWF0aC5pbXVsKE4sSil8MCxuPW4rTWF0aC5pbXVsKFAsUSl8MCxpPWkrTWF0aC5pbXVsKFAsdHQpfDAsaT1pK01hdGguaW11bChULFEpfDAsbz1vK01hdGguaW11bChULHR0KXwwLG49bitNYXRoLmltdWwoQixydCl8MCxpPWkrTWF0aC5pbXVsKEIsbnQpfDAsaT1pK01hdGguaW11bChPLHJ0KXwwLG89bytNYXRoLmltdWwoTyxudCl8MCxuPW4rTWF0aC5pbXVsKGssb3QpfDAsaT1pK01hdGguaW11bChrLGF0KXwwLGk9aStNYXRoLmltdWwoeCxvdCl8MCxvPW8rTWF0aC5pbXVsKHgsYXQpfDAsbj1uK01hdGguaW11bChTLHN0KXwwLGk9aStNYXRoLmltdWwoUyx1dCl8MCxpPWkrTWF0aC5pbXVsKEUsc3QpfDAsbz1vK01hdGguaW11bChFLHV0KXwwLG49bitNYXRoLmltdWwodyxjdCl8MCxpPWkrTWF0aC5pbXVsKHcsZHQpfDAsaT1pK01hdGguaW11bChfLGN0KXwwLG89bytNYXRoLmltdWwoXyxkdCl8MCxuPW4rTWF0aC5pbXVsKHkscHQpfDAsaT1pK01hdGguaW11bCh5LGJ0KXwwLGk9aStNYXRoLmltdWwobSxwdCl8MCxvPW8rTWF0aC5pbXVsKG0sYnQpfDA7dmFyIHh0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyh4dD4+PjI2KXwwLHh0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLFopLGk9TWF0aC5pbXVsKFUsSiksaT1pK01hdGguaW11bCh6LFopfDAsbz1NYXRoLmltdWwoeixKKSxuPW4rTWF0aC5pbXVsKEMsUSl8MCxpPWkrTWF0aC5pbXVsKEMsdHQpfDAsaT1pK01hdGguaW11bChOLFEpfDAsbz1vK01hdGguaW11bChOLHR0KXwwLG49bitNYXRoLmltdWwoUCxydCl8MCxpPWkrTWF0aC5pbXVsKFAsbnQpfDAsaT1pK01hdGguaW11bChULHJ0KXwwLG89bytNYXRoLmltdWwoVCxudCl8MCxuPW4rTWF0aC5pbXVsKEIsb3QpfDAsaT1pK01hdGguaW11bChCLGF0KXwwLGk9aStNYXRoLmltdWwoTyxvdCl8MCxvPW8rTWF0aC5pbXVsKE8sYXQpfDAsbj1uK01hdGguaW11bChrLHN0KXwwLGk9aStNYXRoLmltdWwoayx1dCl8MCxpPWkrTWF0aC5pbXVsKHgsc3QpfDAsbz1vK01hdGguaW11bCh4LHV0KXwwLG49bitNYXRoLmltdWwoUyxjdCl8MCxpPWkrTWF0aC5pbXVsKFMsZHQpfDAsaT1pK01hdGguaW11bChFLGN0KXwwLG89bytNYXRoLmltdWwoRSxkdCl8MCxuPW4rTWF0aC5pbXVsKHcscHQpfDAsaT1pK01hdGguaW11bCh3LGJ0KXwwLGk9aStNYXRoLmltdWwoXyxwdCl8MCxvPW8rTWF0aC5pbXVsKF8sYnQpfDA7dmFyIEl0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhJdD4+PjI2KXwwLEl0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLFEpLGk9TWF0aC5pbXVsKFUsdHQpLGk9aStNYXRoLmltdWwoeixRKXwwLG89TWF0aC5pbXVsKHosdHQpLG49bitNYXRoLmltdWwoQyxydCl8MCxpPWkrTWF0aC5pbXVsKEMsbnQpfDAsaT1pK01hdGguaW11bChOLHJ0KXwwLG89bytNYXRoLmltdWwoTixudCl8MCxuPW4rTWF0aC5pbXVsKFAsb3QpfDAsaT1pK01hdGguaW11bChQLGF0KXwwLGk9aStNYXRoLmltdWwoVCxvdCl8MCxvPW8rTWF0aC5pbXVsKFQsYXQpfDAsbj1uK01hdGguaW11bChCLHN0KXwwLGk9aStNYXRoLmltdWwoQix1dCl8MCxpPWkrTWF0aC5pbXVsKE8sc3QpfDAsbz1vK01hdGguaW11bChPLHV0KXwwLG49bitNYXRoLmltdWwoayxjdCl8MCxpPWkrTWF0aC5pbXVsKGssZHQpfDAsaT1pK01hdGguaW11bCh4LGN0KXwwLG89bytNYXRoLmltdWwoeCxkdCl8MCxuPW4rTWF0aC5pbXVsKFMscHQpfDAsaT1pK01hdGguaW11bChTLGJ0KXwwLGk9aStNYXRoLmltdWwoRSxwdCl8MCxvPW8rTWF0aC5pbXVsKEUsYnQpfDA7dmFyIEJ0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhCdD4+PjI2KXwwLEJ0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLHJ0KSxpPU1hdGguaW11bChVLG50KSxpPWkrTWF0aC5pbXVsKHoscnQpfDAsbz1NYXRoLmltdWwoeixudCksbj1uK01hdGguaW11bChDLG90KXwwLGk9aStNYXRoLmltdWwoQyxhdCl8MCxpPWkrTWF0aC5pbXVsKE4sb3QpfDAsbz1vK01hdGguaW11bChOLGF0KXwwLG49bitNYXRoLmltdWwoUCxzdCl8MCxpPWkrTWF0aC5pbXVsKFAsdXQpfDAsaT1pK01hdGguaW11bChULHN0KXwwLG89bytNYXRoLmltdWwoVCx1dCl8MCxuPW4rTWF0aC5pbXVsKEIsY3QpfDAsaT1pK01hdGguaW11bChCLGR0KXwwLGk9aStNYXRoLmltdWwoTyxjdCl8MCxvPW8rTWF0aC5pbXVsKE8sZHQpfDAsbj1uK01hdGguaW11bChrLHB0KXwwLGk9aStNYXRoLmltdWwoayxidCl8MCxpPWkrTWF0aC5pbXVsKHgscHQpfDAsbz1vK01hdGguaW11bCh4LGJ0KXwwO3ZhciBPdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoT3Q+Pj4yNil8MCxPdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxvdCksaT1NYXRoLmltdWwoVSxhdCksaT1pK01hdGguaW11bCh6LG90KXwwLG89TWF0aC5pbXVsKHosYXQpLG49bitNYXRoLmltdWwoQyxzdCl8MCxpPWkrTWF0aC5pbXVsKEMsdXQpfDAsaT1pK01hdGguaW11bChOLHN0KXwwLG89bytNYXRoLmltdWwoTix1dCl8MCxuPW4rTWF0aC5pbXVsKFAsY3QpfDAsaT1pK01hdGguaW11bChQLGR0KXwwLGk9aStNYXRoLmltdWwoVCxjdCl8MCxvPW8rTWF0aC5pbXVsKFQsZHQpfDAsbj1uK01hdGguaW11bChCLHB0KXwwLGk9aStNYXRoLmltdWwoQixidCl8MCxpPWkrTWF0aC5pbXVsKE8scHQpfDAsbz1vK01hdGguaW11bChPLGJ0KXwwO3ZhciBSdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoUnQ+Pj4yNil8MCxSdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxzdCksaT1NYXRoLmltdWwoVSx1dCksaT1pK01hdGguaW11bCh6LHN0KXwwLG89TWF0aC5pbXVsKHosdXQpLG49bitNYXRoLmltdWwoQyxjdCl8MCxpPWkrTWF0aC5pbXVsKEMsZHQpfDAsaT1pK01hdGguaW11bChOLGN0KXwwLG89bytNYXRoLmltdWwoTixkdCl8MCxuPW4rTWF0aC5pbXVsKFAscHQpfDAsaT1pK01hdGguaW11bChQLGJ0KXwwLGk9aStNYXRoLmltdWwoVCxwdCl8MCxvPW8rTWF0aC5pbXVsKFQsYnQpfDA7dmFyIFB0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhQdD4+PjI2KXwwLFB0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLGN0KSxpPU1hdGguaW11bChVLGR0KSxpPWkrTWF0aC5pbXVsKHosY3QpfDAsbz1NYXRoLmltdWwoeixkdCksbj1uK01hdGguaW11bChDLHB0KXwwLGk9aStNYXRoLmltdWwoQyxidCl8MCxpPWkrTWF0aC5pbXVsKE4scHQpfDAsbz1vK01hdGguaW11bChOLGJ0KXwwO3ZhciBUdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoVHQ+Pj4yNil8MCxUdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxwdCksaT1NYXRoLmltdWwoVSxidCksaT1pK01hdGguaW11bCh6LHB0KXwwLG89TWF0aC5pbXVsKHosYnQpO3ZhciBqdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7cmV0dXJuIHU9KG8rKGk+Pj4xMyl8MCkrKGp0Pj4+MjYpfDAsanQmPTY3MTA4ODYzLHNbMF09dnQsc1sxXT15dCxzWzJdPW10LHNbM109Z3Qsc1s0XT13dCxzWzVdPV90LHNbNl09TXQsc1s3XT1TdCxzWzhdPUV0LHNbOV09QXQsc1sxMF09a3Qsc1sxMV09eHQsc1sxMl09SXQsc1sxM109QnQsc1sxNF09T3Qsc1sxNV09UnQsc1sxNl09UHQsc1sxN109VHQsc1sxOF09anQsMCE9PXUmJihzWzE5XT11LHIubGVuZ3RoKyspLHJ9O01hdGguaW11bHx8KEU9dSksby5wcm90b3R5cGUubXVsVG89ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMubGVuZ3RoK3QubGVuZ3RoO3JldHVybiByPTEwPT09dGhpcy5sZW5ndGgmJjEwPT09dC5sZW5ndGg/RSh0aGlzLHQsZSk6bjw2Mz91KHRoaXMsdCxlKTpuPDEwMjQ/aCh0aGlzLHQsZSk6Yyh0aGlzLHQsZSl9LGQucHJvdG90eXBlLm1ha2VSQlQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0KSxyPW8ucHJvdG90eXBlLl9jb3VudEJpdHModCktMSxuPTA7bjx0O24rKyllW25dPXRoaXMucmV2QmluKG4scix0KTtyZXR1cm4gZX0sZC5wcm90b3R5cGUucmV2QmluPWZ1bmN0aW9uKHQsZSxyKXtpZigwPT09dHx8dD09PXItMSlyZXR1cm4gdDtmb3IodmFyIG49MCxpPTA7aTxlO2krKylufD0oMSZ0KTw8ZS1pLTEsdD4+PTE7cmV0dXJuIG59LGQucHJvdG90eXBlLnBlcm11dGU9ZnVuY3Rpb24odCxlLHIsbixpLG8pe2Zvcih2YXIgYT0wO2E8bzthKyspblthXT1lW3RbYV1dLGlbYV09clt0W2FdXX0sZC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyLG4saSxvKXt0aGlzLnBlcm11dGUobyx0LGUscixuLGkpO2Zvcih2YXIgYT0xO2E8aTthPDw9MSlmb3IodmFyIGY9YTw8MSxzPU1hdGguY29zKDIqTWF0aC5QSS9mKSx1PU1hdGguc2luKDIqTWF0aC5QSS9mKSxoPTA7aDxpO2grPWYpZm9yKHZhciBjPXMsZD11LGw9MDtsPGE7bCsrKXt2YXIgcD1yW2grbF0sYj1uW2grbF0sdj1yW2grbCthXSx5PW5baCtsK2FdLG09Yyp2LWQqeTt5PWMqeStkKnYsdj1tLHJbaCtsXT1wK3YsbltoK2xdPWIreSxyW2grbCthXT1wLXYsbltoK2wrYV09Yi15LGwhPT1mJiYobT1zKmMtdSpkLGQ9cypkK3UqYyxjPW0pfX0sZC5wcm90b3R5cGUuZ3Vlc3NMZW4xM2I9ZnVuY3Rpb24odCxlKXt2YXIgcj0xfE1hdGgubWF4KGUsdCksbj0xJnIsaT0wO2ZvcihyPXIvMnwwO3I7cj4+Pj0xKWkrKztyZXR1cm4gMTw8aSsxK259LGQucHJvdG90eXBlLmNvbmp1Z2F0ZT1mdW5jdGlvbih0LGUscil7aWYoIShyPD0xKSlmb3IodmFyIG49MDtuPHIvMjtuKyspe3ZhciBpPXRbbl07dFtuXT10W3Itbi0xXSx0W3Itbi0xXT1pLGk9ZVtuXSxlW25dPS1lW3Itbi0xXSxlW3Itbi0xXT0taX19LGQucHJvdG90eXBlLm5vcm1hbGl6ZTEzYj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49MDtuPGUvMjtuKyspe3ZhciBpPTgxOTIqTWF0aC5yb3VuZCh0WzIqbisxXS9lKStNYXRoLnJvdW5kKHRbMipuXS9lKStyO3Rbbl09NjcxMDg4NjMmaSxyPWk8NjcxMDg4NjQ/MDppLzY3MTA4ODY0fDB9cmV0dXJuIHR9LGQucHJvdG90eXBlLmNvbnZlcnQxM2I9ZnVuY3Rpb24odCxlLHIsaSl7Zm9yKHZhciBvPTAsYT0wO2E8ZTthKyspbys9MHx0W2FdLHJbMiphXT04MTkxJm8sbz4+Pj0xMyxyWzIqYSsxXT04MTkxJm8sbz4+Pj0xMztmb3IoYT0yKmU7YTxpOysrYSlyW2FdPTA7bigwPT09byksbigwPT09KG8mLTgxOTIpKX0sZC5wcm90b3R5cGUuc3R1Yj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLHI9MDtyPHQ7cisrKWVbcl09MDtyZXR1cm4gZX0sZC5wcm90b3R5cGUubXVscD1mdW5jdGlvbih0LGUscil7dmFyIG49Mip0aGlzLmd1ZXNzTGVuMTNiKHQubGVuZ3RoLGUubGVuZ3RoKSxpPXRoaXMubWFrZVJCVChuKSxvPXRoaXMuc3R1YihuKSxhPW5ldyBBcnJheShuKSxmPW5ldyBBcnJheShuKSxzPW5ldyBBcnJheShuKSx1PW5ldyBBcnJheShuKSxoPW5ldyBBcnJheShuKSxjPW5ldyBBcnJheShuKSxkPXIud29yZHM7ZC5sZW5ndGg9bix0aGlzLmNvbnZlcnQxM2IodC53b3Jkcyx0Lmxlbmd0aCxhLG4pLFxudGhpcy5jb252ZXJ0MTNiKGUud29yZHMsZS5sZW5ndGgsdSxuKSx0aGlzLnRyYW5zZm9ybShhLG8sZixzLG4saSksdGhpcy50cmFuc2Zvcm0odSxvLGgsYyxuLGkpO2Zvcih2YXIgbD0wO2w8bjtsKyspe3ZhciBwPWZbbF0qaFtsXS1zW2xdKmNbbF07c1tsXT1mW2xdKmNbbF0rc1tsXSpoW2xdLGZbbF09cH1yZXR1cm4gdGhpcy5jb25qdWdhdGUoZixzLG4pLHRoaXMudHJhbnNmb3JtKGYscyxkLG8sbixpKSx0aGlzLmNvbmp1Z2F0ZShkLG8sbiksdGhpcy5ub3JtYWxpemUxM2IoZCxuKSxyLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxyLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aCxyLnN0cmlwKCl9LG8ucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHRoaXMubXVsVG8odCxlKX0sby5wcm90b3R5cGUubXVsZj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLGModGhpcyx0LGUpfSxvLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkubXVsVG8odCx0aGlzKX0sby5wcm90b3R5cGUuaW11bG49ZnVuY3Rpb24odCl7bihcIm51bWJlclwiPT10eXBlb2YgdCksbih0PDY3MTA4ODY0KTtmb3IodmFyIGU9MCxyPTA7cjx0aGlzLmxlbmd0aDtyKyspe3ZhciBpPSgwfHRoaXMud29yZHNbcl0pKnQsbz0oNjcxMDg4NjMmaSkrKDY3MTA4ODYzJmUpO2U+Pj0yNixlKz1pLzY3MTA4ODY0fDAsZSs9bz4+PjI2LHRoaXMud29yZHNbcl09NjcxMDg4NjMmb31yZXR1cm4gMCE9PWUmJih0aGlzLndvcmRzW3JdPWUsdGhpcy5sZW5ndGgrKyksdGhpc30sby5wcm90b3R5cGUubXVsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKHQpfSxvLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdWwodGhpcyl9LG8ucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSl9LG8ucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXt2YXIgZT1zKHQpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gbmV3IG8oMSk7Zm9yKHZhciByPXRoaXMsbj0wO248ZS5sZW5ndGgmJjA9PT1lW25dO24rKyxyPXIuc3FyKCkpO2lmKCsrbjxlLmxlbmd0aClmb3IodmFyIGk9ci5zcXIoKTtuPGUubGVuZ3RoO24rKyxpPWkuc3FyKCkpMCE9PWVbbl0mJihyPXIubXVsKGkpKTtyZXR1cm4gcn0sby5wcm90b3R5cGUuaXVzaGxuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlLHI9dCUyNixpPSh0LXIpLzI2LG89NjcxMDg4NjM+Pj4yNi1yPDwyNi1yO2lmKDAhPT1yKXt2YXIgYT0wO2ZvcihlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciBmPXRoaXMud29yZHNbZV0mbyxzPSgwfHRoaXMud29yZHNbZV0pLWY8PHI7dGhpcy53b3Jkc1tlXT1zfGEsYT1mPj4+MjYtcn1hJiYodGhpcy53b3Jkc1tlXT1hLHRoaXMubGVuZ3RoKyspfWlmKDAhPT1pKXtmb3IoZT10aGlzLmxlbmd0aC0xO2U+PTA7ZS0tKXRoaXMud29yZHNbZStpXT10aGlzLndvcmRzW2VdO2ZvcihlPTA7ZTxpO2UrKyl0aGlzLndvcmRzW2VdPTA7dGhpcy5sZW5ndGgrPWl9cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXNobG49ZnVuY3Rpb24odCl7cmV0dXJuIG4oMD09PXRoaXMubmVnYXRpdmUpLHRoaXMuaXVzaGxuKHQpfSxvLnByb3RvdHlwZS5pdXNocm49ZnVuY3Rpb24odCxlLHIpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBpO2k9ZT8oZS1lJTI2KS8yNjowO3ZhciBvPXQlMjYsYT1NYXRoLm1pbigodC1vKS8yNix0aGlzLmxlbmd0aCksZj02NzEwODg2M142NzEwODg2Mz4+Pm88PG8scz1yO2lmKGktPWEsaT1NYXRoLm1heCgwLGkpLHMpe2Zvcih2YXIgdT0wO3U8YTt1Kyspcy53b3Jkc1t1XT10aGlzLndvcmRzW3VdO3MubGVuZ3RoPWF9aWYoMD09PWEpO2Vsc2UgaWYodGhpcy5sZW5ndGg+YSlmb3IodGhpcy5sZW5ndGgtPWEsdT0wO3U8dGhpcy5sZW5ndGg7dSsrKXRoaXMud29yZHNbdV09dGhpcy53b3Jkc1t1K2FdO2Vsc2UgdGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTE7dmFyIGg9MDtmb3IodT10aGlzLmxlbmd0aC0xO3U+PTAmJigwIT09aHx8dT49aSk7dS0tKXt2YXIgYz0wfHRoaXMud29yZHNbdV07dGhpcy53b3Jkc1t1XT1oPDwyNi1vfGM+Pj5vLGg9YyZmfXJldHVybiBzJiYwIT09aCYmKHMud29yZHNbcy5sZW5ndGgrK109aCksMD09PXRoaXMubGVuZ3RoJiYodGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTEpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXNocm49ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuKDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hybih0LGUscil9LG8ucHJvdG90eXBlLnNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbih0KX0sby5wcm90b3R5cGUudXNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4odCl9LG8ucHJvdG90eXBlLnNocm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybih0KX0sby5wcm90b3R5cGUudXNocm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4odCl9LG8ucHJvdG90eXBlLnRlc3RuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPXQlMjYscj0odC1lKS8yNixpPTE8PGU7aWYodGhpcy5sZW5ndGg8PXIpcmV0dXJuITE7dmFyIG89dGhpcy53b3Jkc1tyXTtyZXR1cm4hIShvJmkpfSxvLnByb3RvdHlwZS5pbWFza249ZnVuY3Rpb24odCl7bihcIm51bWJlclwiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixyPSh0LWUpLzI2O2lmKG4oMD09PXRoaXMubmVnYXRpdmUsXCJpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnNcIiksdGhpcy5sZW5ndGg8PXIpcmV0dXJuIHRoaXM7aWYoMCE9PWUmJnIrKyx0aGlzLmxlbmd0aD1NYXRoLm1pbihyLHRoaXMubGVuZ3RoKSwwIT09ZSl7dmFyIGk9NjcxMDg4NjNeNjcxMDg4NjM+Pj5lPDxlO3RoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0mPWl9cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUubWFza249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24odCl9LG8ucHJvdG90eXBlLmlhZGRuPWZ1bmN0aW9uKHQpe3JldHVybiBuKFwibnVtYmVyXCI9PXR5cGVvZiB0KSxuKHQ8NjcxMDg4NjQpLHQ8MD90aGlzLmlzdWJuKC10KTowIT09dGhpcy5uZWdhdGl2ZT8xPT09dGhpcy5sZW5ndGgmJigwfHRoaXMud29yZHNbMF0pPHQ/KHRoaXMud29yZHNbMF09dC0oMHx0aGlzLndvcmRzWzBdKSx0aGlzLm5lZ2F0aXZlPTAsdGhpcyk6KHRoaXMubmVnYXRpdmU9MCx0aGlzLmlzdWJuKHQpLHRoaXMubmVnYXRpdmU9MSx0aGlzKTp0aGlzLl9pYWRkbih0KX0sby5wcm90b3R5cGUuX2lhZGRuPWZ1bmN0aW9uKHQpe3RoaXMud29yZHNbMF0rPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aCYmdGhpcy53b3Jkc1tlXT49NjcxMDg4NjQ7ZSsrKXRoaXMud29yZHNbZV0tPTY3MTA4ODY0LGU9PT10aGlzLmxlbmd0aC0xP3RoaXMud29yZHNbZSsxXT0xOnRoaXMud29yZHNbZSsxXSsrO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxlKzEpLHRoaXN9LG8ucHJvdG90eXBlLmlzdWJuPWZ1bmN0aW9uKHQpe2lmKG4oXCJudW1iZXJcIj09dHlwZW9mIHQpLG4odDw2NzEwODg2NCksdDwwKXJldHVybiB0aGlzLmlhZGRuKC10KTtpZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZG4odCksdGhpcy5uZWdhdGl2ZT0xLHRoaXM7aWYodGhpcy53b3Jkc1swXS09dCwxPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08MCl0aGlzLndvcmRzWzBdPS10aGlzLndvcmRzWzBdLHRoaXMubmVnYXRpdmU9MTtlbHNlIGZvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbZV08MDtlKyspdGhpcy53b3Jkc1tlXSs9NjcxMDg4NjQsdGhpcy53b3Jkc1tlKzFdLT0xO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmFkZG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbih0KX0sby5wcm90b3R5cGUuc3Vibj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKHQpfSxvLnByb3RvdHlwZS5pYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzfSxvLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKX0sby5wcm90b3R5cGUuX2lzaGxuc3VibXVsPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxvPXQubGVuZ3RoK3I7dGhpcy5fZXhwYW5kKG8pO3ZhciBhLGY9MDtmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKXthPSgwfHRoaXMud29yZHNbaStyXSkrZjt2YXIgcz0oMHx0LndvcmRzW2ldKSplO2EtPTY3MTA4ODYzJnMsZj0oYT4+MjYpLShzLzY3MTA4ODY0fDApLHRoaXMud29yZHNbaStyXT02NzEwODg2MyZhfWZvcig7aTx0aGlzLmxlbmd0aC1yO2krKylhPSgwfHRoaXMud29yZHNbaStyXSkrZixmPWE+PjI2LHRoaXMud29yZHNbaStyXT02NzEwODg2MyZhO2lmKDA9PT1mKXJldHVybiB0aGlzLnN0cmlwKCk7Zm9yKG4oZj09PS0xKSxmPTAsaT0wO2k8dGhpcy5sZW5ndGg7aSsrKWE9LSgwfHRoaXMud29yZHNbaV0pK2YsZj1hPj4yNix0aGlzLndvcmRzW2ldPTY3MTA4ODYzJmE7cmV0dXJuIHRoaXMubmVnYXRpdmU9MSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl93b3JkRGl2PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5sZW5ndGgtdC5sZW5ndGgsbj10aGlzLmNsb25lKCksaT10LGE9MHxpLndvcmRzW2kubGVuZ3RoLTFdLGY9dGhpcy5fY291bnRCaXRzKGEpO3I9MjYtZiwwIT09ciYmKGk9aS51c2hsbihyKSxuLml1c2hsbihyKSxhPTB8aS53b3Jkc1tpLmxlbmd0aC0xXSk7dmFyIHMsdT1uLmxlbmd0aC1pLmxlbmd0aDtpZihcIm1vZFwiIT09ZSl7cz1uZXcgbyhudWxsKSxzLmxlbmd0aD11KzEscy53b3Jkcz1uZXcgQXJyYXkocy5sZW5ndGgpO2Zvcih2YXIgaD0wO2g8cy5sZW5ndGg7aCsrKXMud29yZHNbaF09MH12YXIgYz1uLmNsb25lKCkuX2lzaGxuc3VibXVsKGksMSx1KTswPT09Yy5uZWdhdGl2ZSYmKG49YyxzJiYocy53b3Jkc1t1XT0xKSk7Zm9yKHZhciBkPXUtMTtkPj0wO2QtLSl7dmFyIGw9NjcxMDg4NjQqKDB8bi53b3Jkc1tpLmxlbmd0aCtkXSkrKDB8bi53b3Jkc1tpLmxlbmd0aCtkLTFdKTtmb3IobD1NYXRoLm1pbihsL2F8MCw2NzEwODg2Myksbi5faXNobG5zdWJtdWwoaSxsLGQpOzAhPT1uLm5lZ2F0aXZlOylsLS0sbi5uZWdhdGl2ZT0wLG4uX2lzaGxuc3VibXVsKGksMSxkKSxuLmlzWmVybygpfHwobi5uZWdhdGl2ZV49MSk7cyYmKHMud29yZHNbZF09bCl9cmV0dXJuIHMmJnMuc3RyaXAoKSxuLnN0cmlwKCksXCJkaXZcIiE9PWUmJjAhPT1yJiZuLml1c2hybihyKSx7ZGl2OnN8fG51bGwsbW9kOm59fSxvLnByb3RvdHlwZS5kaXZtb2Q9ZnVuY3Rpb24odCxlLHIpe2lmKG4oIXQuaXNaZXJvKCkpLHRoaXMuaXNaZXJvKCkpcmV0dXJue2RpdjpuZXcgbygwKSxtb2Q6bmV3IG8oMCl9O3ZhciBpLGEsZjtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmUmJjA9PT10Lm5lZ2F0aXZlPyhmPXRoaXMubmVnKCkuZGl2bW9kKHQsZSksXCJtb2RcIiE9PWUmJihpPWYuZGl2Lm5lZygpKSxcImRpdlwiIT09ZSYmKGE9Zi5tb2QubmVnKCksciYmMCE9PWEubmVnYXRpdmUmJmEuaWFkZCh0KSkse2RpdjppLG1vZDphfSk6MD09PXRoaXMubmVnYXRpdmUmJjAhPT10Lm5lZ2F0aXZlPyhmPXRoaXMuZGl2bW9kKHQubmVnKCksZSksXCJtb2RcIiE9PWUmJihpPWYuZGl2Lm5lZygpKSx7ZGl2OmksbW9kOmYubW9kfSk6MCE9PSh0aGlzLm5lZ2F0aXZlJnQubmVnYXRpdmUpPyhmPXRoaXMubmVnKCkuZGl2bW9kKHQubmVnKCksZSksXCJkaXZcIiE9PWUmJihhPWYubW9kLm5lZygpLHImJjAhPT1hLm5lZ2F0aXZlJiZhLmlzdWIodCkpLHtkaXY6Zi5kaXYsbW9kOmF9KTp0Lmxlbmd0aD50aGlzLmxlbmd0aHx8dGhpcy5jbXAodCk8MD97ZGl2Om5ldyBvKDApLG1vZDp0aGlzfToxPT09dC5sZW5ndGg/XCJkaXZcIj09PWU/e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm51bGx9OlwibW9kXCI9PT1lP3tkaXY6bnVsbCxtb2Q6bmV3IG8odGhpcy5tb2RuKHQud29yZHNbMF0pKX06e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm5ldyBvKHRoaXMubW9kbih0LndvcmRzWzBdKSl9OnRoaXMuX3dvcmREaXYodCxlKX0sby5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LFwiZGl2XCIsITEpLmRpdn0sby5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LFwibW9kXCIsITEpLm1vZH0sby5wcm90b3R5cGUudW1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXZtb2QodCxcIm1vZFwiLCEwKS5tb2R9LG8ucHJvdG90eXBlLmRpdlJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGl2bW9kKHQpO2lmKGUubW9kLmlzWmVybygpKXJldHVybiBlLmRpdjt2YXIgcj0wIT09ZS5kaXYubmVnYXRpdmU/ZS5tb2QuaXN1Yih0KTplLm1vZCxuPXQudXNocm4oMSksaT10LmFuZGxuKDEpLG89ci5jbXAobik7cmV0dXJuIG88MHx8MT09PWkmJjA9PT1vP2UuZGl2OjAhPT1lLmRpdi5uZWdhdGl2ZT9lLmRpdi5pc3VibigxKTplLmRpdi5pYWRkbigxKX0sby5wcm90b3R5cGUubW9kbj1mdW5jdGlvbih0KXtuKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9KDE8PDI2KSV0LHI9MCxpPXRoaXMubGVuZ3RoLTE7aT49MDtpLS0pcj0oZSpyKygwfHRoaXMud29yZHNbaV0pKSV0O3JldHVybiByfSxvLnByb3RvdHlwZS5pZGl2bj1mdW5jdGlvbih0KXtuKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBpPSgwfHRoaXMud29yZHNbcl0pKzY3MTA4ODY0KmU7dGhpcy53b3Jkc1tyXT1pL3R8MCxlPWkldH1yZXR1cm4gdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5kaXZuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaWRpdm4odCl9LG8ucHJvdG90eXBlLmVnY2Q9ZnVuY3Rpb24odCl7bigwPT09dC5uZWdhdGl2ZSksbighdC5pc1plcm8oKSk7dmFyIGU9dGhpcyxyPXQuY2xvbmUoKTtlPTAhPT1lLm5lZ2F0aXZlP2UudW1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciBpPW5ldyBvKDEpLGE9bmV3IG8oMCksZj1uZXcgbygwKSxzPW5ldyBvKDEpLHU9MDtlLmlzRXZlbigpJiZyLmlzRXZlbigpOyllLml1c2hybigxKSxyLml1c2hybigxKSwrK3U7Zm9yKHZhciBoPXIuY2xvbmUoKSxjPWUuY2xvbmUoKTshZS5pc1plcm8oKTspe2Zvcih2YXIgZD0wLGw9MTswPT09KGUud29yZHNbMF0mbCkmJmQ8MjY7KytkLGw8PD0xKTtpZihkPjApZm9yKGUuaXVzaHJuKGQpO2QtLSA+MDspKGkuaXNPZGQoKXx8YS5pc09kZCgpKSYmKGkuaWFkZChoKSxhLmlzdWIoYykpLGkuaXVzaHJuKDEpLGEuaXVzaHJuKDEpO2Zvcih2YXIgcD0wLGI9MTswPT09KHIud29yZHNbMF0mYikmJnA8MjY7KytwLGI8PD0xKTtpZihwPjApZm9yKHIuaXVzaHJuKHApO3AtLSA+MDspKGYuaXNPZGQoKXx8cy5pc09kZCgpKSYmKGYuaWFkZChoKSxzLmlzdWIoYykpLGYuaXVzaHJuKDEpLHMuaXVzaHJuKDEpO2UuY21wKHIpPj0wPyhlLmlzdWIociksaS5pc3ViKGYpLGEuaXN1YihzKSk6KHIuaXN1YihlKSxmLmlzdWIoaSkscy5pc3ViKGEpKX1yZXR1cm57YTpmLGI6cyxnY2Q6ci5pdXNobG4odSl9fSxvLnByb3RvdHlwZS5faW52bXA9ZnVuY3Rpb24odCl7bigwPT09dC5uZWdhdGl2ZSksbighdC5pc1plcm8oKSk7dmFyIGU9dGhpcyxyPXQuY2xvbmUoKTtlPTAhPT1lLm5lZ2F0aXZlP2UudW1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciBpPW5ldyBvKDEpLGE9bmV3IG8oMCksZj1yLmNsb25lKCk7ZS5jbXBuKDEpPjAmJnIuY21wbigxKT4wOyl7Zm9yKHZhciBzPTAsdT0xOzA9PT0oZS53b3Jkc1swXSZ1KSYmczwyNjsrK3MsdTw8PTEpO2lmKHM+MClmb3IoZS5pdXNocm4ocyk7cy0tID4wOylpLmlzT2RkKCkmJmkuaWFkZChmKSxpLml1c2hybigxKTtmb3IodmFyIGg9MCxjPTE7MD09PShyLndvcmRzWzBdJmMpJiZoPDI2OysraCxjPDw9MSk7aWYoaD4wKWZvcihyLml1c2hybihoKTtoLS0gPjA7KWEuaXNPZGQoKSYmYS5pYWRkKGYpLGEuaXVzaHJuKDEpO2UuY21wKHIpPj0wPyhlLmlzdWIociksaS5pc3ViKGEpKTooci5pc3ViKGUpLGEuaXN1YihpKSl9dmFyIGQ7cmV0dXJuIGQ9MD09PWUuY21wbigxKT9pOmEsZC5jbXBuKDApPDAmJmQuaWFkZCh0KSxkfSxvLnByb3RvdHlwZS5nY2Q9ZnVuY3Rpb24odCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdC5hYnMoKTtpZih0LmlzWmVybygpKXJldHVybiB0aGlzLmFicygpO3ZhciBlPXRoaXMuY2xvbmUoKSxyPXQuY2xvbmUoKTtlLm5lZ2F0aXZlPTAsci5uZWdhdGl2ZT0wO2Zvcih2YXIgbj0wO2UuaXNFdmVuKCkmJnIuaXNFdmVuKCk7bisrKWUuaXVzaHJuKDEpLHIuaXVzaHJuKDEpO2Zvcig7Oyl7Zm9yKDtlLmlzRXZlbigpOyllLml1c2hybigxKTtmb3IoO3IuaXNFdmVuKCk7KXIuaXVzaHJuKDEpO3ZhciBpPWUuY21wKHIpO2lmKGk8MCl7dmFyIG89ZTtlPXIscj1vfWVsc2UgaWYoMD09PWl8fDA9PT1yLmNtcG4oMSkpYnJlYWs7ZS5pc3ViKHIpfXJldHVybiByLml1c2hsbihuKX0sby5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZ2NkKHQpLmEudW1vZCh0KX0sby5wcm90b3R5cGUuaXNFdmVuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT0oMSZ0aGlzLndvcmRzWzBdKX0sby5wcm90b3R5cGUuaXNPZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PSgxJnRoaXMud29yZHNbMF0pfSxvLnByb3RvdHlwZS5hbmRsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53b3Jkc1swXSZ0fSxvLnByb3RvdHlwZS5iaW5jbj1mdW5jdGlvbih0KXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0KTt2YXIgZT10JTI2LHI9KHQtZSkvMjYsaT0xPDxlO2lmKHRoaXMubGVuZ3RoPD1yKXJldHVybiB0aGlzLl9leHBhbmQocisxKSx0aGlzLndvcmRzW3JdfD1pLHRoaXM7Zm9yKHZhciBvPWksYT1yOzAhPT1vJiZhPHRoaXMubGVuZ3RoO2ErKyl7dmFyIGY9MHx0aGlzLndvcmRzW2FdO2YrPW8sbz1mPj4+MjYsZiY9NjcxMDg4NjMsdGhpcy53b3Jkc1thXT1mfXJldHVybiAwIT09byYmKHRoaXMud29yZHNbYV09byx0aGlzLmxlbmd0aCsrKSx0aGlzfSxvLnByb3RvdHlwZS5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubGVuZ3RoJiYwPT09dGhpcy53b3Jkc1swXX0sby5wcm90b3R5cGUuY21wbj1mdW5jdGlvbih0KXt2YXIgZT10PDA7aWYoMCE9PXRoaXMubmVnYXRpdmUmJiFlKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiZlKXJldHVybiAxO3RoaXMuc3RyaXAoKTt2YXIgcjtpZih0aGlzLmxlbmd0aD4xKXI9MTtlbHNle2UmJih0PS10KSxuKHQ8PTY3MTA4ODYzLFwiTnVtYmVyIGlzIHRvbyBiaWdcIik7dmFyIGk9MHx0aGlzLndvcmRzWzBdO3I9aT09PXQ/MDppPHQ/LTE6MX1yZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/MHwtcjpyfSxvLnByb3RvdHlwZS5jbXA9ZnVuY3Rpb24odCl7aWYoMCE9PXRoaXMubmVnYXRpdmUmJjA9PT10Lm5lZ2F0aXZlKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZSlyZXR1cm4gMTt2YXIgZT10aGlzLnVjbXAodCk7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlPzB8LWU6ZX0sby5wcm90b3R5cGUudWNtcD1mdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD50Lmxlbmd0aClyZXR1cm4gMTtpZih0aGlzLmxlbmd0aDx0Lmxlbmd0aClyZXR1cm4tMTtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBuPTB8dGhpcy53b3Jkc1tyXSxpPTB8dC53b3Jkc1tyXTtpZihuIT09aSl7bjxpP2U9LTE6bj5pJiYoZT0xKTticmVha319cmV0dXJuIGV9LG8ucHJvdG90eXBlLmd0bj1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXRoaXMuY21wbih0KX0sby5wcm90b3R5cGUuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10aGlzLmNtcCh0KX0sby5wcm90b3R5cGUuZ3Rlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXBuKHQpPj0wfSxvLnByb3RvdHlwZS5ndGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPj0wfSxvLnByb3RvdHlwZS5sdG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wbih0KT09PS0xfSxvLnByb3RvdHlwZS5sdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk9PT0tMX0sby5wcm90b3R5cGUubHRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXBuKHQpPD0wfSxvLnByb3RvdHlwZS5sdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPD0wfSxvLnByb3RvdHlwZS5lcW49ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmNtcG4odCl9LG8ucHJvdG90eXBlLmVxPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5jbXAodCl9LG8ucmVkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbSh0KX0sby5wcm90b3R5cGUudG9SZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4oIXRoaXMucmVkLFwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSxuKDA9PT10aGlzLm5lZ2F0aXZlLFwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXNcIiksdC5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKHQpfSxvLnByb3RvdHlwZS5mcm9tUmVkPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0XCIpLHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpfSxvLnByb3RvdHlwZS5fZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVkPXQsdGhpc30sby5wcm90b3R5cGUuZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4oIXRoaXMucmVkLFwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSx0aGlzLl9mb3JjZVJlZCh0KX0sby5wcm90b3R5cGUucmVkQWRkPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5hZGQodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSUFkZD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLmlhZGQodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU3ViPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5zdWIodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSVN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLmlzdWIodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU2hsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5zaGwodGhpcyx0KX0sby5wcm90b3R5cGUucmVkTXVsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLm11bCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRJTXVsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLmltdWwodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcih0aGlzKX0sby5wcm90b3R5cGUucmVkSVNxcj1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaXNxcih0aGlzKX0sby5wcm90b3R5cGUucmVkU3FydD1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FydCh0aGlzKX0sby5wcm90b3R5cGUucmVkSW52bT1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaW52bSh0aGlzKX0sby5wcm90b3R5cGUucmVkTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLm5lZyh0aGlzKX0sby5wcm90b3R5cGUucmVkUG93PWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkJiYhdC5yZWQsXCJyZWRQb3cobm9ybWFsTnVtKVwiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5wb3codGhpcyx0KX07dmFyIEE9e2syNTY6bnVsbCxwMjI0Om51bGwscDE5MjpudWxsLHAyNTUxOTpudWxsfTtsLnByb3RvdHlwZS5fdG1wPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG8obnVsbCk7cmV0dXJuIHQud29yZHM9bmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4vMTMpKSx0fSxsLnByb3RvdHlwZS5pcmVkdWNlPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dDtkbyB0aGlzLnNwbGl0KHIsdGhpcy50bXApLHI9dGhpcy5pbXVsSyhyKSxyPXIuaWFkZCh0aGlzLnRtcCksZT1yLmJpdExlbmd0aCgpO3doaWxlKGU+dGhpcy5uKTt2YXIgbj1lPHRoaXMubj8tMTpyLnVjbXAodGhpcy5wKTtyZXR1cm4gMD09PW4/KHIud29yZHNbMF09MCxyLmxlbmd0aD0xKTpuPjA/ci5pc3ViKHRoaXMucCk6ci5zdHJpcCgpLHJ9LGwucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7dC5pdXNocm4odGhpcy5uLDAsZSl9LGwucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe3JldHVybiB0LmltdWwodGhpcy5rKX0saShwLGwpLHAucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTQxOTQzMDMsbj1NYXRoLm1pbih0Lmxlbmd0aCw5KSxpPTA7aTxuO2krKyllLndvcmRzW2ldPXQud29yZHNbaV07aWYoZS5sZW5ndGg9bix0Lmxlbmd0aDw9OSlyZXR1cm4gdC53b3Jkc1swXT0wLHZvaWQodC5sZW5ndGg9MSk7dmFyIG89dC53b3Jkc1s5XTtmb3IoZS53b3Jkc1tlLmxlbmd0aCsrXT1vJnIsaT0xMDtpPHQubGVuZ3RoO2krKyl7dmFyIGE9MHx0LndvcmRzW2ldO3Qud29yZHNbaS0xMF09KGEmcik8PDR8bz4+PjIyLG89YX1vPj4+PTIyLHQud29yZHNbaS0xMF09bywwPT09byYmdC5sZW5ndGg+MTA/dC5sZW5ndGgtPTEwOnQubGVuZ3RoLT05fSxwLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXt0LndvcmRzW3QubGVuZ3RoXT0wLHQud29yZHNbdC5sZW5ndGgrMV09MCx0Lmxlbmd0aCs9Mjtmb3IodmFyIGU9MCxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPTB8dC53b3Jkc1tyXTtlKz05Nzcqbix0LndvcmRzW3JdPTY3MTA4ODYzJmUsZT02NCpuKyhlLzY3MTA4ODY0fDApfXJldHVybiAwPT09dC53b3Jkc1t0Lmxlbmd0aC0xXSYmKHQubGVuZ3RoLS0sMD09PXQud29yZHNbdC5sZW5ndGgtMV0mJnQubGVuZ3RoLS0pLHR9LGkoYixsKSxpKHYsbCksaSh5LGwpLHkucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49MTkqKDB8dC53b3Jkc1tyXSkrZSxpPTY3MTA4ODYzJm47bj4+Pj0yNix0LndvcmRzW3JdPWksZT1ufXJldHVybiAwIT09ZSYmKHQud29yZHNbdC5sZW5ndGgrK109ZSksdH0sby5fcHJpbWU9ZnVuY3Rpb24gdChlKXtpZihBW2VdKXJldHVybiBBW2VdO3ZhciB0O2lmKFwiazI1NlwiPT09ZSl0PW5ldyBwO2Vsc2UgaWYoXCJwMjI0XCI9PT1lKXQ9bmV3IGI7ZWxzZSBpZihcInAxOTJcIj09PWUpdD1uZXcgdjtlbHNle2lmKFwicDI1NTE5XCIhPT1lKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gcHJpbWUgXCIrZSk7dD1uZXcgeX1yZXR1cm4gQVtlXT10LHR9LG0ucHJvdG90eXBlLl92ZXJpZnkxPWZ1bmN0aW9uKHQpe24oMD09PXQubmVnYXRpdmUsXCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlc1wiKSxuKHQucmVkLFwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKX0sbS5wcm90b3R5cGUuX3ZlcmlmeTI9ZnVuY3Rpb24odCxlKXtuKDA9PT0odC5uZWdhdGl2ZXxlLm5lZ2F0aXZlKSxcInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzXCIpLG4odC5yZWQmJnQucmVkPT09ZS5yZWQsXCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpfSxtLnByb3RvdHlwZS5pbW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnByaW1lP3RoaXMucHJpbWUuaXJlZHVjZSh0KS5fZm9yY2VSZWQodGhpcyk6dC51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNaZXJvKCk/dC5jbG9uZSgpOnRoaXMubS5zdWIodCkuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5hZGQoZSk7cmV0dXJuIHIuY21wKHRoaXMubSk+PTAmJnIuaXN1Yih0aGlzLm0pLHIuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5pYWRkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuaWFkZChlKTtyZXR1cm4gci5jbXAodGhpcy5tKT49MCYmci5pc3ViKHRoaXMubSkscn0sbS5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuc3ViKGUpO3JldHVybiByLmNtcG4oMCk8MCYmci5pYWRkKHRoaXMubSksci5fZm9yY2VSZWQodGhpcyl9LG0ucHJvdG90eXBlLmlzdWI9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5pc3ViKGUpO3JldHVybiByLmNtcG4oMCk8MCYmci5pYWRkKHRoaXMubSkscn0sbS5wcm90b3R5cGUuc2hsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3ZlcmlmeTEodCksdGhpcy5pbW9kKHQudXNobG4oZSkpfSxtLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3ZlcmlmeTIodCxlKSx0aGlzLmltb2QodC5pbXVsKGUpKX0sbS5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3ZlcmlmeTIodCxlKSx0aGlzLmltb2QodC5tdWwoZSkpfSxtLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmltdWwodCx0LmNsb25lKCkpfSxtLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubXVsKHQsdCl9LG0ucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24odCl7aWYodC5pc1plcm8oKSlyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPXRoaXMubS5hbmRsbigzKTtpZihuKGUlMj09PTEpLDM9PT1lKXt2YXIgcj10aGlzLm0uYWRkKG5ldyBvKDEpKS5pdXNocm4oMik7cmV0dXJuIHRoaXMucG93KHQscil9Zm9yKHZhciBpPXRoaXMubS5zdWJuKDEpLGE9MDshaS5pc1plcm8oKSYmMD09PWkuYW5kbG4oMSk7KWErKyxpLml1c2hybigxKTtuKCFpLmlzWmVybygpKTt2YXIgZj1uZXcgbygxKS50b1JlZCh0aGlzKSxzPWYucmVkTmVnKCksdT10aGlzLm0uc3VibigxKS5pdXNocm4oMSksaD10aGlzLm0uYml0TGVuZ3RoKCk7Zm9yKGg9bmV3IG8oMipoKmgpLnRvUmVkKHRoaXMpOzAhPT10aGlzLnBvdyhoLHUpLmNtcChzKTspaC5yZWRJQWRkKHMpO2Zvcih2YXIgYz10aGlzLnBvdyhoLGkpLGQ9dGhpcy5wb3codCxpLmFkZG4oMSkuaXVzaHJuKDEpKSxsPXRoaXMucG93KHQsaSkscD1hOzAhPT1sLmNtcChmKTspe2Zvcih2YXIgYj1sLHY9MDswIT09Yi5jbXAoZik7disrKWI9Yi5yZWRTcXIoKTtuKHY8cCk7dmFyIHk9dGhpcy5wb3coYyxuZXcgbygxKS5pdXNobG4ocC12LTEpKTtkPWQucmVkTXVsKHkpLGM9eS5yZWRTcXIoKSxsPWwucmVkTXVsKGMpLHA9dn1yZXR1cm4gZH0sbS5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10Ll9pbnZtcCh0aGlzLm0pO3JldHVybiAwIT09ZS5uZWdhdGl2ZT8oZS5uZWdhdGl2ZT0wLHRoaXMuaW1vZChlKS5yZWROZWcoKSk6dGhpcy5pbW9kKGUpfSxtLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCxlKXtpZihlLmlzWmVybygpKXJldHVybiBuZXcgbygxKTtpZigwPT09ZS5jbXBuKDEpKXJldHVybiB0LmNsb25lKCk7dmFyIHI9NCxuPW5ldyBBcnJheSgxPDxyKTtuWzBdPW5ldyBvKDEpLnRvUmVkKHRoaXMpLG5bMV09dDtmb3IodmFyIGk9MjtpPG4ubGVuZ3RoO2krKyluW2ldPXRoaXMubXVsKG5baS0xXSx0KTt2YXIgYT1uWzBdLGY9MCxzPTAsdT1lLmJpdExlbmd0aCgpJTI2O2ZvcigwPT09dSYmKHU9MjYpLGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSl7Zm9yKHZhciBoPWUud29yZHNbaV0sYz11LTE7Yz49MDtjLS0pe3ZhciBkPWg+PmMmMTthIT09blswXSYmKGE9dGhpcy5zcXIoYSkpLDAhPT1kfHwwIT09Zj8oZjw8PTEsZnw9ZCxzKyssKHM9PT1yfHwwPT09aSYmMD09PWMpJiYoYT10aGlzLm11bChhLG5bZl0pLHM9MCxmPTApKTpzPTB9dT0yNn1yZXR1cm4gYX0sbS5wcm90b3R5cGUuY29udmVydFRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQudW1vZCh0aGlzLm0pO3JldHVybiBlPT09dD9lLmNsb25lKCk6ZX0sbS5wcm90b3R5cGUuY29udmVydEZyb209ZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9uZSgpO3JldHVybiBlLnJlZD1udWxsLGV9LG8ubW9udD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGcodCl9LGkoZyxtKSxnLnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW1vZCh0LnVzaGxuKHRoaXMuc2hpZnQpKX0sZy5wcm90b3R5cGUuY29udmVydEZyb209ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbW9kKHQubXVsKHRoaXMucmludikpO3JldHVybiBlLnJlZD1udWxsLGV9LGcucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24odCxlKXtpZih0LmlzWmVybygpfHxlLmlzWmVybygpKXJldHVybiB0LndvcmRzWzBdPTAsdC5sZW5ndGg9MSx0O3ZhciByPXQuaW11bChlKSxuPXIubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLGk9ci5pc3ViKG4pLml1c2hybih0aGlzLnNoaWZ0KSxvPWk7cmV0dXJuIGkuY21wKHRoaXMubSk+PTA/bz1pLmlzdWIodGhpcy5tKTppLmNtcG4oMCk8MCYmKG89aS5pYWRkKHRoaXMubSkpLG8uX2ZvcmNlUmVkKHRoaXMpfSxnLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtpZih0LmlzWmVybygpfHxlLmlzWmVybygpKXJldHVybiBuZXcgbygwKS5fZm9yY2VSZWQodGhpcyk7dmFyIHI9dC5tdWwoZSksbj1yLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSxpPXIuaXN1YihuKS5pdXNocm4odGhpcy5zaGlmdCksYT1pO3JldHVybiBpLmNtcCh0aGlzLm0pPj0wP2E9aS5pc3ViKHRoaXMubSk6aS5jbXBuKDApPDAmJihhPWkuaWFkZCh0aGlzLm0pKSxhLl9mb3JjZVJlZCh0aGlzKX0sZy5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltb2QodC5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO3JldHVybiBlLl9mb3JjZVJlZCh0aGlzKX19KFwidW5kZWZpbmVkXCI9PXR5cGVvZiB0fHx0LHRoaXMpfSkuY2FsbChlLHIoOTIpKHQpKX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4oKXtpLmNhbGwodGhpcyl9dC5leHBvcnRzPW47dmFyIGk9cigxMTApLkV2ZW50RW1pdHRlcixvPXIoNjAzKTtvKG4saSksbi5SZWFkYWJsZT1yKDYwMCksbi5Xcml0YWJsZT1yKDYwMiksbi5EdXBsZXg9cig1OTUpLG4uVHJhbnNmb3JtPXIoNjAxKSxuLlBhc3NUaHJvdWdoPXIoNTk5KSxuLlN0cmVhbT1uLG4ucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKGUpe3Qud3JpdGFibGUmJiExPT09dC53cml0ZShlKSYmdS5wYXVzZSYmdS5wYXVzZSgpfWZ1bmN0aW9uIG4oKXt1LnJlYWRhYmxlJiZ1LnJlc3VtZSYmdS5yZXN1bWUoKX1mdW5jdGlvbiBvKCl7aHx8KGg9ITAsdC5lbmQoKSl9ZnVuY3Rpb24gYSgpe2h8fChoPSEwLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGYodCl7aWYocygpLDA9PT1pLmxpc3RlbmVyQ291bnQodGhpcyxcImVycm9yXCIpKXRocm93IHR9ZnVuY3Rpb24gcygpe3UucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsciksdC5yZW1vdmVMaXN0ZW5lcihcImRyYWluXCIsbiksdS5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLG8pLHUucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLGEpLHUucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLGYpLHQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLGYpLHUucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixzKSx1LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixzKSx0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixzKX12YXIgdT10aGlzO3Uub24oXCJkYXRhXCIsciksdC5vbihcImRyYWluXCIsbiksdC5faXNTdGRpb3x8ZSYmZS5lbmQ9PT0hMXx8KHUub24oXCJlbmRcIixvKSx1Lm9uKFwiY2xvc2VcIixhKSk7dmFyIGg9ITE7cmV0dXJuIHUub24oXCJlcnJvclwiLGYpLHQub24oXCJlcnJvclwiLGYpLHUub24oXCJlbmRcIixzKSx1Lm9uKFwiY2xvc2VcIixzKSx0Lm9uKFwiY2xvc2VcIixzKSx0LmVtaXQoXCJwaXBlXCIsdSksdH19LGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5leHBvcnRzPXt2ZXJzaW9uOlwiMi40LjBcIn07XCJudW1iZXJcIj09dHlwZW9mIF9fZSYmKF9fZT1yKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUscil7aWYobih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChyKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGwoZSxyKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiB0LmNhbGwoZSxyLG4pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsbixpKXtyZXR1cm4gdC5jYWxsKGUscixuLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTkwKSxpPXIoMCksbz1yKDg3KShcIm1ldGFkYXRhXCIpLGE9by5zdG9yZXx8KG8uc3RvcmU9bmV3KHIoMTkzKSkpLGY9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPWEuZ2V0KHQpO2lmKCFpKXtpZighcilyZXR1cm47YS5zZXQodCxpPW5ldyBuKX12YXIgbz1pLmdldChlKTtpZighbyl7aWYoIXIpcmV0dXJuO2kuc2V0KGUsbz1uZXcgbil9cmV0dXJuIG99LHM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWYoZSxyLCExKTtyZXR1cm4gdm9pZCAwIT09biYmbi5oYXModCl9LHU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWYoZSxyLCExKTtyZXR1cm4gdm9pZCAwPT09bj92b2lkIDA6bi5nZXQodCl9LGg9ZnVuY3Rpb24odCxlLHIsbil7ZihyLG4sITApLnNldCh0LGUpfSxjPWZ1bmN0aW9uKHQsZSl7dmFyIHI9Zih0LGUsITEpLG49W107cmV0dXJuIHImJnIuZm9yRWFjaChmdW5jdGlvbih0LGUpe24ucHVzaChlKX0pLG59LGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR8fFwic3ltYm9sXCI9PXR5cGVvZiB0P3Q6U3RyaW5nKHQpfSxsPWZ1bmN0aW9uKHQpe2koaS5TLFwiUmVmbGVjdFwiLHQpfTt0LmV4cG9ydHM9e3N0b3JlOmEsbWFwOmYsaGFzOnMsZ2V0OnUsc2V0Omgsa2V5czpjLGtleTpkLGV4cDpsfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2lmKHIoOCkpe3ZhciBuPXIoNDEpLGk9cig0KSxvPXIoNSksYT1yKDApLGY9cig4OCkscz1yKDE0MCksdT1yKDMzKSxoPXIoNDApLGM9cigzNyksZD1yKDE0KSxsPXIoNDUpLHA9cigzOCksYj1yKDEwKSx2PXIoNDcpLHk9cigyOSksbT1yKDEyKSxnPXIoMTg3KSx3PXIoNjQpLF89cig2KSxNPXIoMTEpLFM9cigxMjUpLEU9cig0MiksQT1yKDIxKSxrPXIoNDMpLmYseD1yKDE0MiksST1yKDQ4KSxCPXIoNyksTz1yKDI3KSxSPXIoNzgpLFA9cigxMzQpLFQ9cigxNDMpLGo9cig1NiksQz1yKDg0KSxOPXIoNDYpLEw9cigxMTgpLFU9cigxNjcpLHo9cig5KSxEPXIoMjApLHE9ei5mLEY9RC5mLEs9aS5SYW5nZUVycm9yLEc9aS5UeXBlRXJyb3IsVj1pLlVpbnQ4QXJyYXksSD1cIkFycmF5QnVmZmVyXCIsWD1cIlNoYXJlZFwiK0gsWT1cIkJZVEVTX1BFUl9FTEVNRU5UXCIsVz1cInByb3RvdHlwZVwiLFo9QXJyYXlbV10sSj1zLkFycmF5QnVmZmVyLCQ9cy5EYXRhVmlldyxRPU8oMCksdHQ9TygyKSxldD1PKDMpLHJ0PU8oNCksbnQ9Tyg1KSxpdD1PKDYpLG90PVIoITApLGF0PVIoITEpLGZ0PVQudmFsdWVzLHN0PVQua2V5cyx1dD1ULmVudHJpZXMsaHQ9Wi5sYXN0SW5kZXhPZixjdD1aLnJlZHVjZSxkdD1aLnJlZHVjZVJpZ2h0LGx0PVouam9pbixwdD1aLnNvcnQsYnQ9Wi5zbGljZSx2dD1aLnRvU3RyaW5nLHl0PVoudG9Mb2NhbGVTdHJpbmcsbXQ9QihcIml0ZXJhdG9yXCIpLGd0PUIoXCJ0b1N0cmluZ1RhZ1wiKSx3dD1JKFwidHlwZWRfY29uc3RydWN0b3JcIiksX3Q9SShcImRlZl9jb25zdHJ1Y3RvclwiKSxNdD1mLkNPTlNUUixTdD1mLlRZUEVELEV0PWYuVklFVyxBdD1cIldyb25nIGxlbmd0aCFcIixrdD1PKDEsZnVuY3Rpb24odCxlKXtyZXR1cm4gUHQoUCh0LHRbX3RdKSxlKX0pLHh0PW8oZnVuY3Rpb24oKXtyZXR1cm4gMT09PW5ldyBWKG5ldyBVaW50MTZBcnJheShbMV0pLmJ1ZmZlcilbMF19KSxJdD0hIVYmJiEhVltXXS5zZXQmJm8oZnVuY3Rpb24oKXtuZXcgVigxKS5zZXQoe30pfSksQnQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10KXRocm93IEcoQXQpO3ZhciByPSt0LG49Yih0KTtpZihlJiYhZyhyLG4pKXRocm93IEsoQXQpO3JldHVybiBufSxPdD1mdW5jdGlvbih0LGUpe3ZhciByPXAodCk7aWYocjwwfHxyJWUpdGhyb3cgSyhcIldyb25nIG9mZnNldCFcIik7cmV0dXJuIHJ9LFJ0PWZ1bmN0aW9uKHQpe2lmKF8odCkmJlN0IGluIHQpcmV0dXJuIHQ7dGhyb3cgRyh0K1wiIGlzIG5vdCBhIHR5cGVkIGFycmF5IVwiKX0sUHQ9ZnVuY3Rpb24odCxlKXtpZighKF8odCkmJnd0IGluIHQpKXRocm93IEcoXCJJdCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvciFcIik7cmV0dXJuIG5ldyB0KGUpfSxUdD1mdW5jdGlvbih0LGUpe3JldHVybiBqdChQKHQsdFtfdF0pLGUpfSxqdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49ZS5sZW5ndGgsaT1QdCh0LG4pO24+cjspaVtyXT1lW3IrK107cmV0dXJuIGl9LEN0PWZ1bmN0aW9uKHQsZSxyKXtxKHQsZSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rbcl19fSl9LE50PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYSxmPU0odCkscz1hcmd1bWVudHMubGVuZ3RoLGg9cz4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsYz12b2lkIDAhPT1oLGQ9eChmKTtpZih2b2lkIDAhPWQmJiFTKGQpKXtmb3IoYT1kLmNhbGwoZiksbj1bXSxlPTA7IShvPWEubmV4dCgpKS5kb25lO2UrKyluLnB1c2goby52YWx1ZSk7Zj1ufWZvcihjJiZzPjImJihoPXUoaCxhcmd1bWVudHNbMl0sMikpLGU9MCxyPWIoZi5sZW5ndGgpLGk9UHQodGhpcyxyKTtyPmU7ZSsrKWlbZV09Yz9oKGZbZV0sZSk6ZltlXTtyZXR1cm4gaX0sTHQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPWFyZ3VtZW50cy5sZW5ndGgscj1QdCh0aGlzLGUpO2U+dDspclt0XT1hcmd1bWVudHNbdCsrXTtyZXR1cm4gcn0sVXQ9ISFWJiZvKGZ1bmN0aW9uKCl7eXQuY2FsbChuZXcgVigxKSl9KSx6dD1mdW5jdGlvbigpe3JldHVybiB5dC5hcHBseShVdD9idC5jYWxsKFJ0KHRoaXMpKTpSdCh0aGlzKSxhcmd1bWVudHMpfSxEdD17Y29weVdpdGhpbjpmdW5jdGlvbih0LGUpe3JldHVybiBVLmNhbGwoUnQodGhpcyksdCxlLGFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwKX0sZXZlcnk6ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFJ0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSxmaWxsOmZ1bmN0aW9uKHQpe3JldHVybiBMLmFwcGx5KFJ0KHRoaXMpLGFyZ3VtZW50cyl9LGZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gVHQodGhpcyx0dChSdCh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKSl9LGZpbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIG50KFJ0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSxmaW5kSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIGl0KFJ0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe1EoUnQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9LGluZGV4T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGF0KFJ0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSxpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gb3QoUnQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9LGpvaW46ZnVuY3Rpb24odCl7cmV0dXJuIGx0LmFwcGx5KFJ0KHRoaXMpLGFyZ3VtZW50cyl9LGxhc3RJbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBodC5hcHBseShSdCh0aGlzKSxhcmd1bWVudHMpfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIGt0KFJ0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSxyZWR1Y2U6ZnVuY3Rpb24odCl7cmV0dXJuIGN0LmFwcGx5KFJ0KHRoaXMpLGFyZ3VtZW50cyl9LHJlZHVjZVJpZ2h0OmZ1bmN0aW9uKHQpe3JldHVybiBkdC5hcHBseShSdCh0aGlzKSxhcmd1bWVudHMpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9dGhpcyxyPVJ0KGUpLmxlbmd0aCxuPU1hdGguZmxvb3Ioci8yKSxpPTA7aTxuOyl0PWVbaV0sZVtpKytdPWVbLS1yXSxlW3JdPXQ7cmV0dXJuIGV9LHNvbWU6ZnVuY3Rpb24odCl7cmV0dXJuIGV0KFJ0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiBwdC5jYWxsKFJ0KHRoaXMpLHQpfSxzdWJhcnJheTpmdW5jdGlvbih0LGUpe3ZhciByPVJ0KHRoaXMpLG49ci5sZW5ndGgsaT12KHQsbik7cmV0dXJuIG5ldyhQKHIscltfdF0pKShyLmJ1ZmZlcixyLmJ5dGVPZmZzZXQraSpyLkJZVEVTX1BFUl9FTEVNRU5ULGIoKHZvaWQgMD09PWU/bjp2KGUsbikpLWkpKX19LHF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFR0KHRoaXMsYnQuY2FsbChSdCh0aGlzKSx0LGUpKX0sRnQ9ZnVuY3Rpb24odCl7UnQodGhpcyk7dmFyIGU9T3QoYXJndW1lbnRzWzFdLDEpLHI9dGhpcy5sZW5ndGgsbj1NKHQpLGk9YihuLmxlbmd0aCksbz0wO2lmKGkrZT5yKXRocm93IEsoQXQpO2Zvcig7bzxpOyl0aGlzW2Urb109bltvKytdfSxLdD17ZW50cmllczpmdW5jdGlvbigpe3JldHVybiB1dC5jYWxsKFJ0KHRoaXMpKX0sa2V5czpmdW5jdGlvbigpe3JldHVybiBzdC5jYWxsKFJ0KHRoaXMpKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIGZ0LmNhbGwoUnQodGhpcykpfX0sR3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gXyh0KSYmdFtTdF0mJlwic3ltYm9sXCIhPXR5cGVvZiBlJiZlIGluIHQmJlN0cmluZygrZSk9PVN0cmluZyhlKX0sVnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodCxlPXkoZSwhMCkpP2MoMix0W2VdKTpGKHQsZSl9LEh0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4hKEd0KHQsZT15KGUsITApKSYmXyhyKSYmbShyLFwidmFsdWVcIikpfHxtKHIsXCJnZXRcIil8fG0ocixcInNldFwiKXx8ci5jb25maWd1cmFibGV8fG0ocixcIndyaXRhYmxlXCIpJiYhci53cml0YWJsZXx8bShyLFwiZW51bWVyYWJsZVwiKSYmIXIuZW51bWVyYWJsZT9xKHQsZSxyKToodFtlXT1yLnZhbHVlLHQpfTtNdHx8KEQuZj1WdCx6LmY9SHQpLGEoYS5TK2EuRiohTXQsXCJPYmplY3RcIix7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOlZ0LGRlZmluZVByb3BlcnR5Okh0fSksbyhmdW5jdGlvbigpe3Z0LmNhbGwoe30pfSkmJih2dD15dD1mdW5jdGlvbigpe3JldHVybiBsdC5jYWxsKHRoaXMpfSk7dmFyIFh0PWwoe30sRHQpO2woWHQsS3QpLGQoWHQsbXQsS3QudmFsdWVzKSxsKFh0LHtzbGljZTpxdCxzZXQ6RnQsY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt9LHRvU3RyaW5nOnZ0LHRvTG9jYWxlU3RyaW5nOnp0fSksQ3QoWHQsXCJidWZmZXJcIixcImJcIiksQ3QoWHQsXCJieXRlT2Zmc2V0XCIsXCJvXCIpLEN0KFh0LFwiYnl0ZUxlbmd0aFwiLFwibFwiKSxDdChYdCxcImxlbmd0aFwiLFwiZVwiKSxxKFh0LGd0LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tTdF19fSksdC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyLHMpe3M9ISFzO3ZhciB1PXQrKHM/XCJDbGFtcGVkXCI6XCJcIikrXCJBcnJheVwiLGM9XCJVaW50OEFycmF5XCIhPXUsbD1cImdldFwiK3QscD1cInNldFwiK3Qsdj1pW3VdLHk9dnx8e30sbT12JiZBKHYpLGc9IXZ8fCFmLkFCVixNPXt9LFM9diYmdltXXSx4PWZ1bmN0aW9uKHQscil7dmFyIG49dC5fZDtyZXR1cm4gbi52W2xdKHIqZStuLm8seHQpfSxJPWZ1bmN0aW9uKHQscixuKXt2YXIgaT10Ll9kO3MmJihuPShuPU1hdGgucm91bmQobikpPDA/MDpuPjI1NT8yNTU6MjU1Jm4pLGkudltwXShyKmUraS5vLG4seHQpfSxCPWZ1bmN0aW9uKHQsZSl7cSh0LGUse2dldDpmdW5jdGlvbigpe3JldHVybiB4KHRoaXMsZSl9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gSSh0aGlzLGUsdCl9LGVudW1lcmFibGU6ITB9KX07Zz8odj1yKGZ1bmN0aW9uKHQscixuLGkpe2godCx2LHUsXCJfZFwiKTt2YXIgbyxhLGYscyxjPTAsbD0wO2lmKF8ocikpe2lmKCEociBpbnN0YW5jZW9mIEp8fChzPXcocikpPT1IfHxzPT1YKSlyZXR1cm4gU3QgaW4gcj9qdCh2LHIpOk50LmNhbGwodixyKTtvPXIsbD1PdChuLGUpO3ZhciBwPXIuYnl0ZUxlbmd0aDtpZih2b2lkIDA9PT1pKXtpZihwJWUpdGhyb3cgSyhBdCk7aWYoYT1wLWwsYTwwKXRocm93IEsoQXQpfWVsc2UgaWYoYT1iKGkpKmUsYStsPnApdGhyb3cgSyhBdCk7Zj1hL2V9ZWxzZSBmPUJ0KHIsITApLGE9ZiplLG89bmV3IEooYSk7Zm9yKGQodCxcIl9kXCIse2I6byxvOmwsbDphLGU6Zix2Om5ldyAkKG8pfSk7YzxmOylCKHQsYysrKX0pLFM9dltXXT1FKFh0KSxkKFMsXCJjb25zdHJ1Y3RvclwiLHYpKTpDKGZ1bmN0aW9uKHQpe25ldyB2KG51bGwpLG5ldyB2KHQpfSwhMCl8fCh2PXIoZnVuY3Rpb24odCxyLG4saSl7aCh0LHYsdSk7dmFyIG87cmV0dXJuIF8ocik/ciBpbnN0YW5jZW9mIEp8fChvPXcocikpPT1IfHxvPT1YP3ZvaWQgMCE9PWk/bmV3IHkocixPdChuLGUpLGkpOnZvaWQgMCE9PW4/bmV3IHkocixPdChuLGUpKTpuZXcgeShyKTpTdCBpbiByP2p0KHYscik6TnQuY2FsbCh2LHIpOm5ldyB5KEJ0KHIsYykpfSksUShtIT09RnVuY3Rpb24ucHJvdG90eXBlP2soeSkuY29uY2F0KGsobSkpOmsoeSksZnVuY3Rpb24odCl7dCBpbiB2fHxkKHYsdCx5W3RdKX0pLHZbV109UyxufHwoUy5jb25zdHJ1Y3Rvcj12KSk7dmFyIE89U1ttdF0sUj0hIU8mJihcInZhbHVlc1wiPT1PLm5hbWV8fHZvaWQgMD09Ty5uYW1lKSxQPUt0LnZhbHVlcztkKHYsd3QsITApLGQoUyxTdCx1KSxkKFMsRXQsITApLGQoUyxfdCx2KSwocz9uZXcgdigxKVtndF09PXU6Z3QgaW4gUyl8fHEoUyxndCx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV9fSksTVt1XT12LGEoYS5HK2EuVythLkYqKHYhPXkpLE0pLGEoYS5TLHUse0JZVEVTX1BFUl9FTEVNRU5UOmUsZnJvbTpOdCxvZjpMdH0pLFkgaW4gU3x8ZChTLFksZSksYShhLlAsdSxEdCksTih1KSxhKGEuUCthLkYqSXQsdSx7c2V0OkZ0fSksYShhLlArYS5GKiFSLHUsS3QpLGEoYS5QK2EuRiooUy50b1N0cmluZyE9dnQpLHUse3RvU3RyaW5nOnZ0fSksYShhLlArYS5GKm8oZnVuY3Rpb24oKXtuZXcgdigxKS5zbGljZSgpfSksdSx7c2xpY2U6cXR9KSxhKGEuUCthLkYqKG8oZnVuY3Rpb24oKXtyZXR1cm5bMSwyXS50b0xvY2FsZVN0cmluZygpIT1uZXcgdihbMSwyXSkudG9Mb2NhbGVTdHJpbmcoKX0pfHwhbyhmdW5jdGlvbigpe1MudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwyXSl9KSksdSx7dG9Mb2NhbGVTdHJpbmc6enR9KSxqW3VdPVI/TzpQLG58fFJ8fGQoUyxtdCxQKX19ZWxzZSB0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig0OCkoXCJtZXRhXCIpLGk9cig2KSxvPXIoMTIpLGE9cig5KS5mLGY9MCxzPU9iamVjdC5pc0V4dGVuc2libGV8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LHU9IXIoNSkoZnVuY3Rpb24oKXtyZXR1cm4gcyhPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLGg9ZnVuY3Rpb24odCl7YSh0LG4se3ZhbHVlOntpOlwiT1wiKyArK2Ysdzp7fX19KX0sYz1mdW5jdGlvbih0LGUpe2lmKCFpKHQpKXJldHVyblwic3ltYm9sXCI9PXR5cGVvZiB0P3Q6KFwic3RyaW5nXCI9PXR5cGVvZiB0P1wiU1wiOlwiUFwiKSt0O2lmKCFvKHQsbikpe2lmKCFzKHQpKXJldHVyblwiRlwiO2lmKCFlKXJldHVyblwiRVwiO2godCl9cmV0dXJuIHRbbl0uaX0sZD1mdW5jdGlvbih0LGUpe2lmKCFvKHQsbikpe2lmKCFzKHQpKXJldHVybiEwO2lmKCFlKXJldHVybiExO2godCl9cmV0dXJuIHRbbl0ud30sbD1mdW5jdGlvbih0KXtyZXR1cm4gdSYmcC5ORUVEJiZzKHQpJiYhbyh0LG4pJiZoKHQpLHR9LHA9dC5leHBvcnRzPXtLRVk6bixORUVEOiExLGZhc3RLZXk6YyxnZXRXZWFrOmQsb25GcmVlemU6bH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sZnVuY3Rpb24odCxlKXt2YXIgcj1NYXRoLmNlaWwsbj1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odD0rdCk/MDoodD4wP246cikodCl9fSxmdW5jdGlvbih0LGUpe3ZhciByO3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7cj1yfHxGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCl8fCgwLGV2YWwpKFwidGhpc1wiKX1jYXRjaCh0KXtcIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiYocj13aW5kb3cpfXQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUscixuKXtpZighKHQgaW5zdGFuY2VvZiBlKXx8dm9pZCAwIT09biYmbiBpbiB0KXRocm93IFR5cGVFcnJvcihyK1wiOiBpbmNvcnJlY3QgaW52b2NhdGlvbiFcIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0hMX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMyksaT1yKDE4MCksbz1yKDEyMSksYT1yKDEzMykoXCJJRV9QUk9UT1wiKSxmPWZ1bmN0aW9uKCl7fSxzPVwicHJvdG90eXBlXCIsdT1mdW5jdGlvbigpe3ZhciB0LGU9cigxMjApKFwiaWZyYW1lXCIpLG49by5sZW5ndGgsaT1cIjxcIixhPVwiPlwiO2ZvcihlLnN0eWxlLmRpc3BsYXk9XCJub25lXCIscigxMjMpLmFwcGVuZENoaWxkKGUpLGUuc3JjPVwiamF2YXNjcmlwdDpcIix0PWUuY29udGVudFdpbmRvdy5kb2N1bWVudCx0Lm9wZW4oKSx0LndyaXRlKGkrXCJzY3JpcHRcIithK1wiZG9jdW1lbnQuRj1PYmplY3RcIitpK1wiL3NjcmlwdFwiK2EpLHQuY2xvc2UoKSx1PXQuRjtuLS07KWRlbGV0ZSB1W3NdW29bbl1dO3JldHVybiB1KCl9O3QuZXhwb3J0cz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbih0LGUpe3ZhciByO3JldHVybiBudWxsIT09dD8oZltzXT1uKHQpLHI9bmV3IGYsZltzXT1udWxsLHJbYV09dCk6cj11KCksdm9pZCAwPT09ZT9yOmkocixlKX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDE4MiksaT1yKDEyMSkuY29uY2F0KFwibGVuZ3RoXCIsXCJwcm90b3R5cGVcIik7ZS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbih0KXtyZXR1cm4gbih0LGkpfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTgyKSxpPXIoMTIxKTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiBuKHQsaSl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIGkgaW4gZSluKHQsaSxlW2ldLHIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoNCksaT1yKDkpLG89cig4KSxhPXIoNykoXCJzcGVjaWVzXCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1uW3RdO28mJmUmJiFlW2FdJiZpLmYoZSxhLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigzOCksaT1NYXRoLm1heCxvPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PW4odCksdDwwP2kodCtlLDApOm8odCxlKX19LGZ1bmN0aW9uKHQsZSl7dmFyIHI9MCxuPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwiU3ltYm9sKFwiLmNvbmNhdCh2b2lkIDA9PT10P1wiXCI6dCxcIilfXCIsKCsrcituKS50b1N0cmluZygzNikpfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPWU7bi51dGlscz1yKDUyNyksbi5jb21tb249cig1MjMpLG4uc2hhPXIoNTI2KSxuLnJpcGVtZD1yKDUyNSksbi5obWFjPXIoNTI0KSxuLnNoYTE9bi5zaGEuc2hhMSxuLnNoYTI1Nj1uLnNoYS5zaGEyNTYsbi5zaGEyMjQ9bi5zaGEuc2hhMjI0LG4uc2hhMzg0PW4uc2hhLnNoYTM4NCxuLnNoYTUxMj1uLnNoYS5zaGE1MTIsbi5yaXBlbWQxNjA9bi5yaXBlbWQucmlwZW1kMTYwfSxmdW5jdGlvbih0LGUscil7dmFyIG49ZTtuLnV0aWxzPXIoNTY0KSxuLmNvbW1vbj1yKDU2MCksbi5zaGE9cig1NjMpLG4ucmlwZW1kPXIoNTYyKSxuLmhtYWM9cig1NjEpLG4uc2hhMT1uLnNoYS5zaGExLG4uc2hhMjU2PW4uc2hhLnNoYTI1NixuLnNoYTIyND1uLnNoYS5zaGEyMjQsbi5zaGEzODQ9bi5zaGEuc2hhMzg0LG4uc2hhNTEyPW4uc2hhLnNoYTUxMixuLnJpcGVtZDE2MD1uLnJpcGVtZC5yaXBlbWQxNjB9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj8odS5jYWxsKHRoaXMsdCksaC5jYWxsKHRoaXMsdCksdCYmdC5yZWFkYWJsZT09PSExJiYodGhpcy5yZWFkYWJsZT0hMSksdCYmdC53cml0YWJsZT09PSExJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHQmJnQuYWxsb3dIYWxmT3Blbj09PSExJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx2b2lkIHRoaXMub25jZShcImVuZFwiLGkpKTpuZXcgbih0KX1mdW5jdGlvbiBpKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxmKG8sdGhpcyl9ZnVuY3Rpb24gbyh0KXt0LmVuZCgpfXZhciBhPU9iamVjdC5rZXlzfHxmdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIHIgaW4gdCllLnB1c2gocik7cmV0dXJuIGV9O3QuZXhwb3J0cz1uO3ZhciBmPXIoMTU3KSxzPXIoNzMpO3MuaW5oZXJpdHM9cig3NCk7dmFyIHU9cigyNTApLGg9cigxNTUpO3MuaW5oZXJpdHMobix1KTtmb3IodmFyIGM9YShoLnByb3RvdHlwZSksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgbD1jW2RdO24ucHJvdG90eXBlW2xdfHwobi5wcm90b3R5cGVbbF09aC5wcm90b3R5cGVbbF0pfX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7aWYodCYmIXModCkpdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrdCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBvKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBhKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTMsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MH12YXIgZj1yKDEpLkJ1ZmZlcixzPWYuaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKHQmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZVwiaGV4XCI6Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6Y2FzZVwiYXNjaWlcIjpjYXNlXCJiaW5hcnlcIjpjYXNlXCJiYXNlNjRcIjpjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpjYXNlXCJyYXdcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sdT1lLlN0cmluZ0RlY29kZXI9ZnVuY3Rpb24odCl7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9KHR8fFwidXRmOFwiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLFwiXCIpLG4odCksdGhpcy5lbmNvZGluZyl7Y2FzZVwidXRmOFwiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2VcInVjczJcIjpjYXNlXCJ1dGYxNmxlXCI6dGhpcy5zdXJyb2dhdGVTaXplPTIsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1vO2JyZWFrO2Nhc2VcImJhc2U2NFwiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zLHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9YTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkKHRoaXMud3JpdGU9aSl9dGhpcy5jaGFyQnVmZmVyPW5ldyBmKDYpLHRoaXMuY2hhclJlY2VpdmVkPTAsdGhpcy5jaGFyTGVuZ3RoPTB9O3UucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1cIlwiO3RoaXMuY2hhckxlbmd0aDspe3ZhciByPXQubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOnQubGVuZ3RoO2lmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsdGhpcy5jaGFyUmVjZWl2ZWQsMCxyKSx0aGlzLmNoYXJSZWNlaXZlZCs9cix0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpcmV0dXJuXCJcIjt0PXQuc2xpY2Uocix0Lmxlbmd0aCksZT10aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCx0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO3ZhciBuPWUuY2hhckNvZGVBdChlLmxlbmd0aC0xKTtpZighKG4+PTU1Mjk2JiZuPD01NjMxOSkpe2lmKHRoaXMuY2hhclJlY2VpdmVkPXRoaXMuY2hhckxlbmd0aD0wLDA9PT10Lmxlbmd0aClyZXR1cm4gZTticmVha310aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZSxlPVwiXCJ9dGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcih0KTt2YXIgaT10Lmxlbmd0aDt0aGlzLmNoYXJMZW5ndGgmJih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsdC5sZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQsaSksaS09dGhpcy5jaGFyUmVjZWl2ZWQpLGUrPXQudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLGkpO3ZhciBpPWUubGVuZ3RoLTEsbj1lLmNoYXJDb2RlQXQoaSk7aWYobj49NTUyOTYmJm48PTU2MzE5KXt2YXIgbz10aGlzLnN1cnJvZ2F0ZVNpemU7cmV0dXJuIHRoaXMuY2hhckxlbmd0aCs9byx0aGlzLmNoYXJSZWNlaXZlZCs9byx0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsbywwLG8pLHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCwwLG8pLGUuc3Vic3RyaW5nKDAsaSl9cmV0dXJuIGV9LHUucHJvdG90eXBlLmRldGVjdEluY29tcGxldGVDaGFyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aD49Mz8zOnQubGVuZ3RoO2U+MDtlLS0pe3ZhciByPXRbdC5sZW5ndGgtZV07aWYoMT09ZSYmcj4+NT09Nil7dGhpcy5jaGFyTGVuZ3RoPTI7YnJlYWt9aWYoZTw9MiYmcj4+ND09MTQpe3RoaXMuY2hhckxlbmd0aD0zO2JyZWFrfWlmKGU8PTMmJnI+PjM9PTMwKXt0aGlzLmNoYXJMZW5ndGg9NDticmVha319dGhpcy5jaGFyUmVjZWl2ZWQ9ZX0sdS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPVwiXCI7aWYodCYmdC5sZW5ndGgmJihlPXRoaXMud3JpdGUodCkpLHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgcj10aGlzLmNoYXJSZWNlaXZlZCxuPXRoaXMuY2hhckJ1ZmZlcixpPXRoaXMuZW5jb2Rpbmc7ZSs9bi5zbGljZSgwLHIpLnRvU3RyaW5nKGkpfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGkodCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG5yZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1yKDYyKSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbih0aGlzLGUpLGkodGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gbyhlLHQpLGV9KGEpO3QuZXhwb3J0cz1mfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig3KShcInVuc2NvcGFibGVzXCIpLGk9QXJyYXkucHJvdG90eXBlO3ZvaWQgMD09aVtuXSYmcigxNCkoaSxuLHt9KSx0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aVtuXVt0XT0hMH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDMzKSxpPXIoMTc2KSxvPXIoMTI1KSxhPXIoMyksZj1yKDEwKSxzPXIoMTQyKSx1PXt9LGg9e30sZT10LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIsYyxkKXt2YXIgbCxwLGIsdix5PWQ/ZnVuY3Rpb24oKXtyZXR1cm4gdH06cyh0KSxtPW4ocixjLGU/MjoxKSxnPTA7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgeSl0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgaXRlcmFibGUhXCIpO2lmKG8oeSkpe2ZvcihsPWYodC5sZW5ndGgpO2w+ZztnKyspaWYodj1lP20oYShwPXRbZ10pWzBdLHBbMV0pOm0odFtnXSksdj09PXV8fHY9PT1oKXJldHVybiB2fWVsc2UgZm9yKGI9eS5jYWxsKHQpOyEocD1iLm5leHQoKSkuZG9uZTspaWYodj1pKGIsbSxwLnZhbHVlLGUpLHY9PT11fHx2PT09aClyZXR1cm4gdn07ZS5CUkVBSz11LGUuUkVUVVJOPWh9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig5KS5mLGk9cigxMiksbz1yKDcpKFwidG9TdHJpbmdUYWdcIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyKXt0JiYhaSh0PXI/dDp0LnByb3RvdHlwZSxvKSYmbih0LG8se2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTplfSl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoMjQpLG89cig1KSxhPXIoMTM4KSxmPVwiW1wiK2ErXCJdXCIscz1cIuKAi8KFXCIsdT1SZWdFeHAoXCJeXCIrZitmK1wiKlwiKSxoPVJlZ0V4cChmK2YrXCIqJFwiKSxjPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT17fSxmPW8oZnVuY3Rpb24oKXtyZXR1cm4hIWFbdF0oKXx8c1t0XSgpIT1zfSksdT1pW3RdPWY/ZShkKTphW3RdO3ImJihpW3JdPXUpLG4obi5QK24uRipmLFwiU3RyaW5nXCIsaSl9LGQ9Yy50cmltPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9U3RyaW5nKGkodCkpLDEmZSYmKHQ9dC5yZXBsYWNlKHUsXCJcIikpLDImZSYmKHQ9dC5yZXBsYWNlKGgsXCJcIikpLHR9O3QuZXhwb3J0cz1jfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7dS5jYWxsKHRoaXMsXCJkaWdlc3RcIiksdGhpcy5faGFzaD10LHRoaXMuYnVmZmVycz1bXX1mdW5jdGlvbiBpKHQpe3UuY2FsbCh0aGlzLFwiZGlnZXN0XCIpLHRoaXMuX2hhc2g9dH12YXIgbz1yKDIpLGE9cigxMDUpLGY9cig1NjcpLHM9cig1NjgpLHU9cig1NjYpO28obix1KSxuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuYnVmZmVycy5wdXNoKHQpfSxuLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXt2YXIgdD1lLmNvbmNhdCh0aGlzLmJ1ZmZlcnMpLHI9dGhpcy5faGFzaCh0KTtyZXR1cm4gdGhpcy5idWZmZXJzPW51bGwscn0sbyhpLHUpLGkucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5faGFzaC51cGRhdGUodCl9LGkucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNoLmRpZ2VzdCgpfSx0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC50b0xvd2VyQ2FzZSgpLFwibWQ1XCI9PT10P25ldyBuKGEpOlwicm1kMTYwXCI9PT10fHxcInJpcGVtZDE2MFwiPT09dD9uZXcgbihmKTpuZXcgaShzKHQpKX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIodCxyKXt0aGlzLl9ibG9jaz1uZXcgZSh0KSx0aGlzLl9maW5hbFNpemU9cix0aGlzLl9ibG9ja1NpemU9dCx0aGlzLl9sZW49MCx0aGlzLl9zPTB9ci5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQscil7XCJzdHJpbmdcIj09dHlwZW9mIHQmJihyPXJ8fFwidXRmOFwiLHQ9bmV3IGUodCxyKSk7Zm9yKHZhciBuPXRoaXMuX2xlbis9dC5sZW5ndGgsaT10aGlzLl9zfHwwLG89MCxhPXRoaXMuX2Jsb2NrO2k8bjspe2Zvcih2YXIgZj1NYXRoLm1pbih0Lmxlbmd0aCxvK3RoaXMuX2Jsb2NrU2l6ZS1pJXRoaXMuX2Jsb2NrU2l6ZSkscz1mLW8sdT0wO3U8czt1KyspYVtpJXRoaXMuX2Jsb2NrU2l6ZSt1XT10W3Urb107aSs9cyxvKz1zLGkldGhpcy5fYmxvY2tTaXplPT09MCYmdGhpcy5fdXBkYXRlKGEpfXJldHVybiB0aGlzLl9zPWksdGhpc30sci5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPTgqdGhpcy5fbGVuO3RoaXMuX2Jsb2NrW3RoaXMuX2xlbiV0aGlzLl9ibG9ja1NpemVdPTEyOCx0aGlzLl9ibG9jay5maWxsKDAsdGhpcy5fbGVuJXRoaXMuX2Jsb2NrU2l6ZSsxKSxlJSg4KnRoaXMuX2Jsb2NrU2l6ZSk+PTgqdGhpcy5fZmluYWxTaXplJiYodGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKSx0aGlzLl9ibG9jay5maWxsKDApKSx0aGlzLl9ibG9jay53cml0ZUludDMyQkUoZSx0aGlzLl9ibG9ja1NpemUtNCk7dmFyIHI9dGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKXx8dGhpcy5faGFzaCgpO3JldHVybiB0P3IudG9TdHJpbmcodCk6cn0sci5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIl91cGRhdGUgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc1wiKX0sdC5leHBvcnRzPXJ9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUscixuKXtmdW5jdGlvbiBpKCl7dGhyb3cgbmV3IEVycm9yKFwic2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3NlclxcbnVzZSBjaHJvbWUsIEZpcmVGb3ggb3IgSW50ZXJuZXQgRXhwbG9yZXIgMTFcIil9ZnVuY3Rpb24gbyh0LGkpe2lmKHQ+NjU1MzYpdGhyb3cgbmV3IEVycm9yKFwicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlc1wiKTt2YXIgbz1uZXcgZS5VaW50OEFycmF5KHQpO3Q+MCYmYS5nZXRSYW5kb21WYWx1ZXMobyk7dmFyIGY9bmV3IHIoby5idWZmZXIpO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGk/bi5uZXh0VGljayhmdW5jdGlvbigpe2kobnVsbCxmKX0pOmZ9dmFyIGE9ZS5jcnlwdG98fGUubXNDcnlwdG87YSYmYS5nZXRSYW5kb21WYWx1ZXM/dC5leHBvcnRzPW86dC5leHBvcnRzPWl9KS5jYWxsKGUscigzOSkscigxKS5CdWZmZXIscigyNikpfSxmdW5jdGlvbih0LGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIG4odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIWV8fFwib2JqZWN0XCIhPXR5cGVvZiBlJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiBpKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9dmFyIG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyKHRoaXMsZSk7dmFyIGk9bih0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMpKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksXCJtZXNzYWdlXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOnZvaWQgMCE9PXQ/U3RyaW5nKHQpOlwiXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxcIm5hbWVcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6aS5jb25zdHJ1Y3Rvci5uYW1lfSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGksaS5jb25zdHJ1Y3RvciksaX1yZXR1cm4gaShlLHQpLGV9KEVycm9yKTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbj1lW3JdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gciYmdChlLnByb3RvdHlwZSxyKSxuJiZ0KGUsbiksZX19KCksbz1yKDExNSksYT1yKDc1KSxmPXIoOTApLHM9cig5MSksdT1yKDIwMSksaD1yKDExNiksYz1yKDE1OSksZD1yKDExMyksbD0vXmNmOihbMS05YS1mXVswLTlhLWZdezAsM318MCk6W2EtekEtWjAtOV8tXSokLyxwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe24odGhpcyx0KX1yZXR1cm4gaSh0LFt7a2V5OlwiZ2V0VHlwZUlkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5UWVBFX0lEfX0se2tleTpcImdldEJpdG1hc2tcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLkZFQVRVUkVfQklUTUFTS319LHtrZXk6XCJnZXRDb25kaXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PW5ldyBhO3JldHVybiB0LnNldFR5cGVJZCh0aGlzLmdldFR5cGVJZCgpKSx0LnNldEJpdG1hc2sodGhpcy5nZXRCaXRtYXNrKCkpLHQuc2V0SGFzaCh0aGlzLmdlbmVyYXRlSGFzaCgpKSx0LnNldE1heEZ1bGZpbGxtZW50TGVuZ3RoKHRoaXMuY2FsY3VsYXRlTWF4RnVsZmlsbG1lbnRMZW5ndGgoKSksdH19LHtrZXk6XCJnZXRDb25kaXRpb25VcmlcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmRpdGlvbigpLnNlcmlhbGl6ZVVyaSgpfX0se2tleTpcImdldENvbmRpdGlvbkJpbmFyeVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZGl0aW9uKCkuc2VyaWFsaXplQmluYXJ5KCl9fSx7a2V5OlwiZ2VuZXJhdGVIYXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzc1wiKX19LHtrZXk6XCJjYWxjdWxhdGVNYXhGdWxmaWxsbWVudExlbmd0aFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGY7cmV0dXJuIHRoaXMud3JpdGVQYXlsb2FkKHQpLHQuZ2V0U2l6ZSgpfX0se2tleTpcInNlcmlhbGl6ZVVyaVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCJjZjpcIit0aGlzLmdldFR5cGVJZCgpLnRvU3RyaW5nKDE2KStcIjpcIitoLmVuY29kZSh0aGlzLnNlcmlhbGl6ZVBheWxvYWQoKSl9fSx7a2V5Olwic2VyaWFsaXplQmluYXJ5XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgcztyZXR1cm4gdC53cml0ZVVJbnQxNih0aGlzLmdldFR5cGVJZCgpKSx0LndyaXRlVmFyT2N0ZXRTdHJpbmcodGhpcy5zZXJpYWxpemVQYXlsb2FkKCkpLHQuZ2V0QnVmZmVyKCl9fSx7a2V5Olwic2VyaWFsaXplUGF5bG9hZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHM7cmV0dXJuIHRoaXMud3JpdGVQYXlsb2FkKHQpLHQuZ2V0QnVmZmVyKCl9fSx7a2V5OlwidmFsaWRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKX19XSxbe2tleTpcImZyb21VcmlcIix2YWx1ZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgdClyZXR1cm4gZTtpZihcInN0cmluZ1wiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoXCJTZXJpYWxpemVkIGZ1bGZpbGxtZW50IG11c3QgYmUgYSBzdHJpbmdcIik7dmFyIHI9ZS5zcGxpdChcIjpcIik7aWYoXCJjZlwiIT09clswXSl0aHJvdyBuZXcgYygnU2VyaWFsaXplZCBmdWxmaWxsbWVudCBtdXN0IHN0YXJ0IHdpdGggXCJjZjpcIicpO2lmKCF0LlJFR0VYLmV4ZWMoZSkpdGhyb3cgbmV3IGQoXCJJbnZhbGlkIGZ1bGZpbGxtZW50IGZvcm1hdFwiKTt2YXIgbj1wYXJzZUludChyWzFdLDE2KSxpPWguZGVjb2RlKHJbMl0pLGE9by5nZXRDbGFzc0Zyb21UeXBlSWQobiksZj1uZXcgYTtyZXR1cm4gZi5wYXJzZVBheWxvYWQodS5mcm9tKGkpLGkubGVuZ3RoKSxmfX0se2tleTpcImZyb21CaW5hcnlcIix2YWx1ZTpmdW5jdGlvbih0KXt0PXUuZnJvbSh0KTt2YXIgZT1vLmdldENsYXNzRnJvbVR5cGVJZCh0LnJlYWRVSW50MTYoKSkscj1uZXcgZSxuPXQucmVhZExlbmd0aFByZWZpeCgpO3JldHVybiByLnBhcnNlUGF5bG9hZCh0LG4pLHJ9fV0pLHR9KCk7cC5SRUdFWD1sLHQuZXhwb3J0cz1wfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyMyksaT1yKDcpKFwidG9TdHJpbmdUYWdcIiksbz1cIkFyZ3VtZW50c1wiPT1uKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSksYT1mdW5jdGlvbih0LGUpe3RyeXtyZXR1cm4gdFtlXX1jYXRjaCh0KXt9fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUscixmO3JldHVybiB2b2lkIDA9PT10P1wiVW5kZWZpbmVkXCI6bnVsbD09PXQ/XCJOdWxsXCI6XCJzdHJpbmdcIj09dHlwZW9mKHI9YShlPU9iamVjdCh0KSxpKSk/cjpvP24oZSk6XCJPYmplY3RcIj09KGY9bihlKSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuY2FsbGVlP1wiQXJndW1lbnRzXCI6Zn19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDIzKTt0LmV4cG9ydHM9T2JqZWN0KFwielwiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuXCJTdHJpbmdcIj09bih0KT90LnNwbGl0KFwiXCIpOk9iamVjdCh0KX19LGZ1bmN0aW9uKHQsZSl7ZS5mPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe2Zvcih2YXIgbj1NYXRoLm1pbih0Lmxlbmd0aCxyLmxlbmd0aCksaT1uZXcgZShuKSxvPTA7bzxuOysrbylpW29dPXRbb11ecltvXTtyZXR1cm4gaX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7dmFyIG49ZTtuLlJlcG9ydGVyPXIoNTMyKS5SZXBvcnRlcixuLkRlY29kZXJCdWZmZXI9cigyMTQpLkRlY29kZXJCdWZmZXIsbi5FbmNvZGVyQnVmZmVyPXIoMjE0KS5FbmNvZGVyQnVmZmVyLG4uTm9kZT1yKDUzMSl9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7Zm9yKHZhciBuPU1hdGgubWluKHQubGVuZ3RoLHIubGVuZ3RoKSxpPW5ldyBlKG4pLG89MDtvPG47KytvKWlbb109dFtvXV5yW29dO3JldHVybiBpfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcihlfHxcIkFzc2VydGlvbiBmYWlsZWRcIil9ZnVuY3Rpb24gaSh0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gbyh0LGUscil7cmV0dXJuIG8uaXNCTih0KT90Oih0aGlzLm5lZ2F0aXZlPTAsdGhpcy53b3Jkcz1udWxsLHRoaXMubGVuZ3RoPTAsdGhpcy5yZWQ9bnVsbCx2b2lkKG51bGwhPT10JiYoXCJsZVwiIT09ZSYmXCJiZVwiIT09ZXx8KHI9ZSxlPTEwKSx0aGlzLl9pbml0KHR8fDAsZXx8MTAscnx8XCJiZVwiKSkpKX1mdW5jdGlvbiBhKHQsZSxyKXtmb3IodmFyIG49MCxpPU1hdGgubWluKHQubGVuZ3RoLHIpLG89ZTtvPGk7bysrKXt2YXIgYT10LmNoYXJDb2RlQXQobyktNDg7bjw8PTQsbnw9YT49NDkmJmE8PTU0P2EtNDkrMTA6YT49MTcmJmE8PTIyP2EtMTcrMTA6MTUmYX1yZXR1cm4gbn1mdW5jdGlvbiBmKHQsZSxyLG4pe2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgsciksYT1lO2E8bzthKyspe3ZhciBmPXQuY2hhckNvZGVBdChhKS00ODtpKj1uLGkrPWY+PTQ5P2YtNDkrMTA6Zj49MTc/Zi0xNysxMDpmfXJldHVybiBpfWZ1bmN0aW9uIHModCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0LmJpdExlbmd0aCgpKSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPXIvMjZ8MCxpPXIlMjY7ZVtyXT0odC53b3Jkc1tuXSYxPDxpKT4+Pml9cmV0dXJuIGV9ZnVuY3Rpb24gdSh0LGUscil7ci5uZWdhdGl2ZT1lLm5lZ2F0aXZlXnQubmVnYXRpdmU7dmFyIG49dC5sZW5ndGgrZS5sZW5ndGh8MDtyLmxlbmd0aD1uLG49bi0xfDA7dmFyIGk9MHx0LndvcmRzWzBdLG89MHxlLndvcmRzWzBdLGE9aSpvLGY9NjcxMDg4NjMmYSxzPWEvNjcxMDg4NjR8MDtyLndvcmRzWzBdPWY7Zm9yKHZhciB1PTE7dTxuO3UrKyl7Zm9yKHZhciBoPXM+Pj4yNixjPTY3MTA4ODYzJnMsZD1NYXRoLm1pbih1LGUubGVuZ3RoLTEpLGw9TWF0aC5tYXgoMCx1LXQubGVuZ3RoKzEpO2w8PWQ7bCsrKXt2YXIgcD11LWx8MDtpPTB8dC53b3Jkc1twXSxvPTB8ZS53b3Jkc1tsXSxhPWkqbytjLGgrPWEvNjcxMDg4NjR8MCxjPTY3MTA4ODYzJmF9ci53b3Jkc1t1XT0wfGMscz0wfGh9cmV0dXJuIDAhPT1zP3Iud29yZHNbdV09MHxzOnIubGVuZ3RoLS0sci5zdHJpcCgpfWZ1bmN0aW9uIGgodCxlLHIpe3IubmVnYXRpdmU9ZS5uZWdhdGl2ZV50Lm5lZ2F0aXZlLHIubGVuZ3RoPXQubGVuZ3RoK2UubGVuZ3RoO2Zvcih2YXIgbj0wLGk9MCxvPTA7bzxyLmxlbmd0aC0xO28rKyl7dmFyIGE9aTtpPTA7Zm9yKHZhciBmPTY3MTA4ODYzJm4scz1NYXRoLm1pbihvLGUubGVuZ3RoLTEpLHU9TWF0aC5tYXgoMCxvLXQubGVuZ3RoKzEpO3U8PXM7dSsrKXt2YXIgaD1vLXUsYz0wfHQud29yZHNbaF0sZD0wfGUud29yZHNbdV0sbD1jKmQscD02NzEwODg2MyZsO2E9YSsobC82NzEwODg2NHwwKXwwLHA9cCtmfDAsZj02NzEwODg2MyZwLGE9YSsocD4+PjI2KXwwLGkrPWE+Pj4yNixhJj02NzEwODg2M31yLndvcmRzW29dPWYsbj1hLGE9aX1yZXR1cm4gMCE9PW4/ci53b3Jkc1tvXT1uOnIubGVuZ3RoLS0sci5zdHJpcCgpfWZ1bmN0aW9uIGModCxlLHIpe3ZhciBuPW5ldyBkO3JldHVybiBuLm11bHAodCxlLHIpfWZ1bmN0aW9uIGQodCxlKXt0aGlzLng9dCx0aGlzLnk9ZX1mdW5jdGlvbiBsKHQsZSl7dGhpcy5uYW1lPXQsdGhpcy5wPW5ldyBvKGUsMTYpLHRoaXMubj10aGlzLnAuYml0TGVuZ3RoKCksdGhpcy5rPW5ldyBvKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKSx0aGlzLnRtcD10aGlzLl90bXAoKX1mdW5jdGlvbiBwKCl7bC5jYWxsKHRoaXMsXCJrMjU2XCIsXCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZlwiKX1mdW5jdGlvbiBiKCl7bC5jYWxsKHRoaXMsXCJwMjI0XCIsXCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMVwiKX1mdW5jdGlvbiB2KCl7bC5jYWxsKHRoaXMsXCJwMTkyXCIsXCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZlwiKX1mdW5jdGlvbiB5KCl7bC5jYWxsKHRoaXMsXCIyNTUxOVwiLFwiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZFwiKX1mdW5jdGlvbiBtKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXt2YXIgZT1vLl9wcmltZSh0KTt0aGlzLm09ZS5wLHRoaXMucHJpbWU9ZX1lbHNlIG4odC5ndG4oMSksXCJtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDFcIiksdGhpcy5tPXQsdGhpcy5wcmltZT1udWxsfWZ1bmN0aW9uIGcodCl7bS5jYWxsKHRoaXMsdCksdGhpcy5zaGlmdD10aGlzLm0uYml0TGVuZ3RoKCksdGhpcy5zaGlmdCUyNiE9PTAmJih0aGlzLnNoaWZ0Kz0yNi10aGlzLnNoaWZ0JTI2KSx0aGlzLnI9bmV3IG8oMSkuaXVzaGxuKHRoaXMuc2hpZnQpLHRoaXMucjI9dGhpcy5pbW9kKHRoaXMuci5zcXIoKSksdGhpcy5yaW52PXRoaXMuci5faW52bXAodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pLHRoaXMubWludj10aGlzLm1pbnYudW1vZCh0aGlzLnIpLHRoaXMubWludj10aGlzLnIuc3ViKHRoaXMubWludil9XCJvYmplY3RcIj09dHlwZW9mIHQ/dC5leHBvcnRzPW86ZS5CTj1vLG8uQk49byxvLndvcmRTaXplPTI2O3ZhciB3O3RyeXt3PXIoMSkuQnVmZmVyfWNhdGNoKHQpe31vLmlzQk49ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBvfHxudWxsIT09dCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQuY29uc3RydWN0b3Iud29yZFNpemU9PT1vLndvcmRTaXplJiZBcnJheS5pc0FycmF5KHQud29yZHMpfSxvLm1heD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNtcChlKT4wP3Q6ZX0sby5taW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jbXAoZSk8MD90OmV9LG8ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxyKXtpZihcIm51bWJlclwiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5faW5pdE51bWJlcih0LGUscik7aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpcmV0dXJuIHRoaXMuX2luaXRBcnJheSh0LGUscik7XCJoZXhcIj09PWUmJihlPTE2KSxuKGU9PT0oMHxlKSYmZT49MiYmZTw9MzYpLHQ9dC50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgaT0wO1wiLVwiPT09dFswXSYmaSsrLDE2PT09ZT90aGlzLl9wYXJzZUhleCh0LGkpOnRoaXMuX3BhcnNlQmFzZSh0LGUsaSksXCItXCI9PT10WzBdJiYodGhpcy5uZWdhdGl2ZT0xKSx0aGlzLnN0cmlwKCksXCJsZVwiPT09ciYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUscil9LG8ucHJvdG90eXBlLl9pbml0TnVtYmVyPWZ1bmN0aW9uKHQsZSxyKXt0PDAmJih0aGlzLm5lZ2F0aXZlPTEsdD0tdCksdDw2NzEwODg2ND8odGhpcy53b3Jkcz1bNjcxMDg4NjMmdF0sdGhpcy5sZW5ndGg9MSk6dDw0NTAzNTk5NjI3MzcwNDk2Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZ0LHQvNjcxMDg4NjQmNjcxMDg4NjNdLHRoaXMubGVuZ3RoPTIpOihuKHQ8OTAwNzE5OTI1NDc0MDk5MiksdGhpcy53b3Jkcz1bNjcxMDg4NjMmdCx0LzY3MTA4ODY0JjY3MTA4ODYzLDFdLHRoaXMubGVuZ3RoPTMpLFwibGVcIj09PXImJnRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSxlLHIpfSxvLnByb3RvdHlwZS5faW5pdEFycmF5PWZ1bmN0aW9uKHQsZSxyKXtpZihuKFwibnVtYmVyXCI9PXR5cGVvZiB0Lmxlbmd0aCksdC5sZW5ndGg8PTApcmV0dXJuIHRoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTEsdGhpczt0aGlzLmxlbmd0aD1NYXRoLmNlaWwodC5sZW5ndGgvMyksdGhpcy53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09MDt2YXIgbyxhLGY9MDtpZihcImJlXCI9PT1yKWZvcihpPXQubGVuZ3RoLTEsbz0wO2k+PTA7aS09MylhPXRbaV18dFtpLTFdPDw4fHRbaS0yXTw8MTYsdGhpcy53b3Jkc1tvXXw9YTw8ZiY2NzEwODg2Myx0aGlzLndvcmRzW28rMV09YT4+PjI2LWYmNjcxMDg4NjMsZis9MjQsZj49MjYmJihmLT0yNixvKyspO2Vsc2UgaWYoXCJsZVwiPT09cilmb3IoaT0wLG89MDtpPHQubGVuZ3RoO2krPTMpYT10W2ldfHRbaSsxXTw8OHx0W2krMl08PDE2LHRoaXMud29yZHNbb118PWE8PGYmNjcxMDg4NjMsdGhpcy53b3Jkc1tvKzFdPWE+Pj4yNi1mJjY3MTA4ODYzLGYrPTI0LGY+PTI2JiYoZi09MjYsbysrKTtyZXR1cm4gdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5fcGFyc2VIZXg9ZnVuY3Rpb24odCxlKXt0aGlzLmxlbmd0aD1NYXRoLmNlaWwoKHQubGVuZ3RoLWUpLzYpLHRoaXMud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9MDtyPHRoaXMubGVuZ3RoO3IrKyl0aGlzLndvcmRzW3JdPTA7dmFyIG4saSxvPTA7Zm9yKHI9dC5sZW5ndGgtNixuPTA7cj49ZTtyLT02KWk9YSh0LHIscis2KSx0aGlzLndvcmRzW25dfD1pPDxvJjY3MTA4ODYzLHRoaXMud29yZHNbbisxXXw9aT4+PjI2LW8mNDE5NDMwMyxvKz0yNCxvPj0yNiYmKG8tPTI2LG4rKyk7cis2IT09ZSYmKGk9YSh0LGUscis2KSx0aGlzLndvcmRzW25dfD1pPDxvJjY3MTA4ODYzLHRoaXMud29yZHNbbisxXXw9aT4+PjI2LW8mNDE5NDMwMyksdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5fcGFyc2VCYXNlPWZ1bmN0aW9uKHQsZSxyKXt0aGlzLndvcmRzPVswXSx0aGlzLmxlbmd0aD0xO2Zvcih2YXIgbj0wLGk9MTtpPD02NzEwODg2MztpKj1lKW4rKztuLS0saT1pL2V8MDtmb3IodmFyIG89dC5sZW5ndGgtcixhPW8lbixzPU1hdGgubWluKG8sby1hKStyLHU9MCxoPXI7aDxzO2grPW4pdT1mKHQsaCxoK24sZSksdGhpcy5pbXVsbihpKSx0aGlzLndvcmRzWzBdK3U8NjcxMDg4NjQ/dGhpcy53b3Jkc1swXSs9dTp0aGlzLl9pYWRkbih1KTtpZigwIT09YSl7dmFyIGM9MTtmb3IodT1mKHQsaCx0Lmxlbmd0aCxlKSxoPTA7aDxhO2grKyljKj1lO3RoaXMuaW11bG4oYyksdGhpcy53b3Jkc1swXSt1PDY3MTA4ODY0P3RoaXMud29yZHNbMF0rPXU6dGhpcy5faWFkZG4odSl9fSxvLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQpe3Qud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoKTtmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoO2UrKyl0LndvcmRzW2VdPXRoaXMud29yZHNbZV07dC5sZW5ndGg9dGhpcy5sZW5ndGgsdC5uZWdhdGl2ZT10aGlzLm5lZ2F0aXZlLHQucmVkPXRoaXMucmVkfSxvLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBvKG51bGwpO3JldHVybiB0aGlzLmNvcHkodCksdH0sby5wcm90b3R5cGUuX2V4cGFuZD1mdW5jdGlvbih0KXtmb3IoO3RoaXMubGVuZ3RoPHQ7KXRoaXMud29yZHNbdGhpcy5sZW5ndGgrK109MDtyZXR1cm4gdGhpc30sby5wcm90b3R5cGUuc3RyaXA9ZnVuY3Rpb24oKXtmb3IoO3RoaXMubGVuZ3RoPjEmJjA9PT10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdOyl0aGlzLmxlbmd0aC0tO3JldHVybiB0aGlzLl9ub3JtU2lnbigpfSxvLnByb3RvdHlwZS5fbm9ybVNpZ249ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubGVuZ3RoJiYwPT09dGhpcy53b3Jkc1swXSYmKHRoaXMubmVnYXRpdmU9MCksdGhpc30sby5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybih0aGlzLnJlZD9cIjxCTi1SOiBcIjpcIjxCTjogXCIpK3RoaXMudG9TdHJpbmcoMTYpK1wiPlwifTt2YXIgXz1bXCJcIixcIjBcIixcIjAwXCIsXCIwMDBcIixcIjAwMDBcIixcIjAwMDAwXCIsXCIwMDAwMDBcIixcIjAwMDAwMDBcIixcIjAwMDAwMDAwXCIsXCIwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwXCIsXCIwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwXCIsXCIwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwXCIsXCIwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwXCIsXCIwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCIsXCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIl0sTT1bMCwwLDI1LDE2LDEyLDExLDEwLDksOCw4LDcsNyw3LDcsNiw2LDYsNiw2LDYsNiw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1XSxTPVswLDAsMzM1NTQ0MzIsNDMwNDY3MjEsMTY3NzcyMTYsNDg4MjgxMjUsNjA0NjYxNzYsNDAzNTM2MDcsMTY3NzcyMTYsNDMwNDY3MjEsMWU3LDE5NDg3MTcxLDM1ODMxODA4LDYyNzQ4NTE3LDc1Mjk1MzYsMTEzOTA2MjUsMTY3NzcyMTYsMjQxMzc1NjksMzQwMTIyMjQsNDcwNDU4ODEsNjRlNiw0MDg0MTAxLDUxNTM2MzIsNjQzNjM0Myw3OTYyNjI0LDk3NjU2MjUsMTE4ODEzNzYsMTQzNDg5MDcsMTcyMTAzNjgsMjA1MTExNDksMjQzZTUsMjg2MjkxNTEsMzM1NTQ0MzIsMzkxMzUzOTMsNDU0MzU0MjQsNTI1MjE4NzUsNjA0NjYxNzZdO28ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQsZSl7dD10fHwxMCxlPTB8ZXx8MTt2YXIgcjtpZigxNj09PXR8fFwiaGV4XCI9PT10KXtyPVwiXCI7Zm9yKHZhciBpPTAsbz0wLGE9MDthPHRoaXMubGVuZ3RoO2ErKyl7dmFyIGY9dGhpcy53b3Jkc1thXSxzPSgxNjc3NzIxNSYoZjw8aXxvKSkudG9TdHJpbmcoMTYpO289Zj4+PjI0LWkmMTY3NzcyMTUscj0wIT09b3x8YSE9PXRoaXMubGVuZ3RoLTE/X1s2LXMubGVuZ3RoXStzK3I6cytyLGkrPTIsaT49MjYmJihpLT0yNixhLS0pfWZvcigwIT09byYmKHI9by50b1N0cmluZygxNikrcik7ci5sZW5ndGglZSE9PTA7KXI9XCIwXCIrcjtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmUmJihyPVwiLVwiK3IpLHJ9aWYodD09PSgwfHQpJiZ0Pj0yJiZ0PD0zNil7dmFyIHU9TVt0XSxoPVNbdF07cj1cIlwiO3ZhciBjPXRoaXMuY2xvbmUoKTtmb3IoYy5uZWdhdGl2ZT0wOyFjLmlzWmVybygpOyl7dmFyIGQ9Yy5tb2RuKGgpLnRvU3RyaW5nKHQpO2M9Yy5pZGl2bihoKSxyPWMuaXNaZXJvKCk/ZCtyOl9bdS1kLmxlbmd0aF0rZCtyfWZvcih0aGlzLmlzWmVybygpJiYocj1cIjBcIityKTtyLmxlbmd0aCVlIT09MDspcj1cIjBcIityO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKHI9XCItXCIrcikscn1uKCExLFwiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNlwiKX0sby5wcm90b3R5cGUudG9OdW1iZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLndvcmRzWzBdO3JldHVybiAyPT09dGhpcy5sZW5ndGg/dCs9NjcxMDg4NjQqdGhpcy53b3Jkc1sxXTozPT09dGhpcy5sZW5ndGgmJjE9PT10aGlzLndvcmRzWzJdP3QrPTQ1MDM1OTk2MjczNzA0OTYrNjcxMDg4NjQqdGhpcy53b3Jkc1sxXTp0aGlzLmxlbmd0aD4yJiZuKCExLFwiTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzXCIpLDAhPT10aGlzLm5lZ2F0aXZlPy10OnR9LG8ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKDE2KX0sby5wcm90b3R5cGUudG9CdWZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbihcInVuZGVmaW5lZFwiIT10eXBlb2YgdyksdGhpcy50b0FycmF5TGlrZSh3LHQsZSl9LG8ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSx0LGUpfSxvLnByb3RvdHlwZS50b0FycmF5TGlrZT1mdW5jdGlvbih0LGUscil7dmFyIGk9dGhpcy5ieXRlTGVuZ3RoKCksbz1yfHxNYXRoLm1heCgxLGkpO24oaTw9byxcImJ5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGhcIiksbihvPjAsXCJSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDBcIiksdGhpcy5zdHJpcCgpO3ZhciBhLGYscz1cImxlXCI9PT1lLHU9bmV3IHQobyksaD10aGlzLmNsb25lKCk7aWYocyl7Zm9yKGY9MDshaC5pc1plcm8oKTtmKyspYT1oLmFuZGxuKDI1NSksaC5pdXNocm4oOCksdVtmXT1hO2Zvcig7ZjxvO2YrKyl1W2ZdPTB9ZWxzZXtmb3IoZj0wO2Y8by1pO2YrKyl1W2ZdPTA7Zm9yKGY9MDshaC5pc1plcm8oKTtmKyspYT1oLmFuZGxuKDI1NSksaC5pdXNocm4oOCksdVtvLWYtMV09YX1yZXR1cm4gdX0sTWF0aC5jbHozMj9vLnByb3RvdHlwZS5fY291bnRCaXRzPWZ1bmN0aW9uKHQpe3JldHVybiAzMi1NYXRoLmNsejMyKHQpfTpvLnByb3RvdHlwZS5fY291bnRCaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQscj0wO3JldHVybiBlPj00MDk2JiYocis9MTMsZT4+Pj0xMyksZT49NjQmJihyKz03LGU+Pj49NyksZT49OCYmKHIrPTQsZT4+Pj00KSxlPj0yJiYocis9MixlPj4+PTIpLHIrZX0sby5wcm90b3R5cGUuX3plcm9CaXRzPWZ1bmN0aW9uKHQpe2lmKDA9PT10KXJldHVybiAyNjt2YXIgZT10LHI9MDtyZXR1cm4gMD09PSg4MTkxJmUpJiYocis9MTMsZT4+Pj0xMyksMD09PSgxMjcmZSkmJihyKz03LGU+Pj49NyksMD09PSgxNSZlKSYmKHIrPTQsZT4+Pj00KSwwPT09KDMmZSkmJihyKz0yLGU+Pj49MiksMD09PSgxJmUpJiZyKysscn0sby5wcm90b3R5cGUuYml0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXSxlPXRoaXMuX2NvdW50Qml0cyh0KTtyZXR1cm4gMjYqKHRoaXMubGVuZ3RoLTEpK2V9LG8ucHJvdG90eXBlLnplcm9CaXRzPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gMDtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciByPXRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbZV0pO2lmKHQrPXIsMjYhPT1yKWJyZWFrfXJldHVybiB0fSxvLnByb3RvdHlwZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpLzgpfSxvLnByb3RvdHlwZS50b1R3b3M9ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlP3RoaXMuYWJzKCkuaW5vdG4odCkuaWFkZG4oMSk6dGhpcy5jbG9uZSgpfSxvLnByb3RvdHlwZS5mcm9tVHdvcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50ZXN0bih0LTEpP3RoaXMubm90bih0KS5pYWRkbigxKS5pbmVnKCk6dGhpcy5jbG9uZSgpfSxvLnByb3RvdHlwZS5pc05lZz1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZX0sby5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCl9LG8ucHJvdG90eXBlLmluZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1plcm8oKXx8KHRoaXMubmVnYXRpdmVePTEpLHRoaXN9LG8ucHJvdG90eXBlLml1b3I9ZnVuY3Rpb24odCl7Zm9yKDt0aGlzLmxlbmd0aDx0Lmxlbmd0aDspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRoaXMud29yZHNbZV09dGhpcy53b3Jkc1tlXXx0LndvcmRzW2VdO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlvcj1mdW5jdGlvbih0KXtyZXR1cm4gbigwPT09KHRoaXMubmVnYXRpdmV8dC5uZWdhdGl2ZSkpLHRoaXMuaXVvcih0KX0sby5wcm90b3R5cGUub3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pb3IodCk6dC5jbG9uZSgpLmlvcih0aGlzKX0sby5wcm90b3R5cGUudW9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXVvcih0KTp0LmNsb25lKCkuaXVvcih0aGlzKX0sby5wcm90b3R5cGUuaXVhbmQ9ZnVuY3Rpb24odCl7dmFyIGU7ZT10aGlzLmxlbmd0aD50Lmxlbmd0aD90OnRoaXM7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspdGhpcy53b3Jkc1tyXT10aGlzLndvcmRzW3JdJnQud29yZHNbcl07cmV0dXJuIHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaWFuZD1mdW5jdGlvbih0KXtyZXR1cm4gbigwPT09KHRoaXMubmVnYXRpdmV8dC5uZWdhdGl2ZSkpLHRoaXMuaXVhbmQodCl9LG8ucHJvdG90eXBlLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlhbmQodCk6dC5jbG9uZSgpLmlhbmQodGhpcyl9LG8ucHJvdG90eXBlLnVhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdWFuZCh0KTp0LmNsb25lKCkuaXVhbmQodGhpcyl9LG8ucHJvdG90eXBlLml1eG9yPWZ1bmN0aW9uKHQpe3ZhciBlLHI7dGhpcy5sZW5ndGg+dC5sZW5ndGg/KGU9dGhpcyxyPXQpOihlPXQscj10aGlzKTtmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rKyl0aGlzLndvcmRzW25dPWUud29yZHNbbl1eci53b3Jkc1tuXTtpZih0aGlzIT09ZSlmb3IoO248ZS5sZW5ndGg7bisrKXRoaXMud29yZHNbbl09ZS53b3Jkc1tuXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5peG9yPWZ1bmN0aW9uKHQpe3JldHVybiBuKDA9PT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdXhvcih0KX0sby5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXhvcih0KTp0LmNsb25lKCkuaXhvcih0aGlzKX0sby5wcm90b3R5cGUudXhvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLml1eG9yKHQpOnQuY2xvbmUoKS5pdXhvcih0aGlzKX0sby5wcm90b3R5cGUuaW5vdG49ZnVuY3Rpb24odCl7bihcIm51bWJlclwiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9MHxNYXRoLmNlaWwodC8yNikscj10JTI2O3RoaXMuX2V4cGFuZChlKSxyPjAmJmUtLTtmb3IodmFyIGk9MDtpPGU7aSsrKXRoaXMud29yZHNbaV09NjcxMDg4NjMmfnRoaXMud29yZHNbaV07cmV0dXJuIHI+MCYmKHRoaXMud29yZHNbaV09fnRoaXMud29yZHNbaV0mNjcxMDg4NjM+PjI2LXIpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUubm90bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKHQpfSxvLnByb3RvdHlwZS5zZXRuPWZ1bmN0aW9uKHQsZSl7bihcIm51bWJlclwiPT10eXBlb2YgdCYmdD49MCk7dmFyIHI9dC8yNnwwLGk9dCUyNjtyZXR1cm4gdGhpcy5fZXhwYW5kKHIrMSksZT90aGlzLndvcmRzW3JdPXRoaXMud29yZHNbcl18MTw8aTp0aGlzLndvcmRzW3JdPXRoaXMud29yZHNbcl0mfigxPDxpKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlhZGQ9ZnVuY3Rpb24odCl7dmFyIGU7aWYoMCE9PXRoaXMubmVnYXRpdmUmJjA9PT10Lm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsZT10aGlzLmlzdWIodCksdGhpcy5uZWdhdGl2ZV49MSx0aGlzLl9ub3JtU2lnbigpO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZSlyZXR1cm4gdC5uZWdhdGl2ZT0wLGU9dGhpcy5pc3ViKHQpLHQubmVnYXRpdmU9MSxlLl9ub3JtU2lnbigpO3ZhciByLG47dGhpcy5sZW5ndGg+dC5sZW5ndGg/KHI9dGhpcyxuPXQpOihyPXQsbj10aGlzKTtmb3IodmFyIGk9MCxvPTA7bzxuLmxlbmd0aDtvKyspZT0oMHxyLndvcmRzW29dKSsoMHxuLndvcmRzW29dKStpLHRoaXMud29yZHNbb109NjcxMDg4NjMmZSxpPWU+Pj4yNjtmb3IoOzAhPT1pJiZvPHIubGVuZ3RoO28rKyllPSgwfHIud29yZHNbb10pK2ksdGhpcy53b3Jkc1tvXT02NzEwODg2MyZlLGk9ZT4+PjI2O2lmKHRoaXMubGVuZ3RoPXIubGVuZ3RoLDAhPT1pKXRoaXMud29yZHNbdGhpcy5sZW5ndGhdPWksdGhpcy5sZW5ndGgrKztlbHNlIGlmKHIhPT10aGlzKWZvcig7bzxyLmxlbmd0aDtvKyspdGhpcy53b3Jkc1tvXT1yLndvcmRzW29dO3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIDAhPT10Lm5lZ2F0aXZlJiYwPT09dGhpcy5uZWdhdGl2ZT8odC5uZWdhdGl2ZT0wLGU9dGhpcy5zdWIodCksdC5uZWdhdGl2ZV49MSxlKTowPT09dC5uZWdhdGl2ZSYmMCE9PXRoaXMubmVnYXRpdmU/KHRoaXMubmVnYXRpdmU9MCxlPXQuc3ViKHRoaXMpLHRoaXMubmVnYXRpdmU9MSxlKTp0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaWFkZCh0KTp0LmNsb25lKCkuaWFkZCh0aGlzKX0sby5wcm90b3R5cGUuaXN1Yj1mdW5jdGlvbih0KXtpZigwIT09dC5uZWdhdGl2ZSl7dC5uZWdhdGl2ZT0wO3ZhciBlPXRoaXMuaWFkZCh0KTtyZXR1cm4gdC5uZWdhdGl2ZT0xLGUuX25vcm1TaWduKCl9aWYoMCE9PXRoaXMubmVnYXRpdmUpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzLmlhZGQodCksdGhpcy5uZWdhdGl2ZT0xLHRoaXMuX25vcm1TaWduKCk7dmFyIHI9dGhpcy5jbXAodCk7aWYoMD09PXIpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzLmxlbmd0aD0xLHRoaXMud29yZHNbMF09MCx0aGlzO3ZhciBuLGk7cj4wPyhuPXRoaXMsaT10KToobj10LGk9dGhpcyk7Zm9yKHZhciBvPTAsYT0wO2E8aS5sZW5ndGg7YSsrKWU9KDB8bi53b3Jkc1thXSktKDB8aS53b3Jkc1thXSkrbyxvPWU+PjI2LHRoaXMud29yZHNbYV09NjcxMDg4NjMmZTtmb3IoOzAhPT1vJiZhPG4ubGVuZ3RoO2ErKyllPSgwfG4ud29yZHNbYV0pK28sbz1lPj4yNix0aGlzLndvcmRzW2FdPTY3MTA4ODYzJmU7aWYoMD09PW8mJmE8bi5sZW5ndGgmJm4hPT10aGlzKWZvcig7YTxuLmxlbmd0aDthKyspdGhpcy53b3Jkc1thXT1uLndvcmRzW2FdO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxhKSxuIT09dGhpcyYmKHRoaXMubmVnYXRpdmU9MSksdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKHQpfTt2YXIgRT1mdW5jdGlvbih0LGUscil7dmFyIG4saSxvLGE9dC53b3JkcyxmPWUud29yZHMscz1yLndvcmRzLHU9MCxoPTB8YVswXSxjPTgxOTEmaCxkPWg+Pj4xMyxsPTB8YVsxXSxwPTgxOTEmbCxiPWw+Pj4xMyx2PTB8YVsyXSx5PTgxOTEmdixtPXY+Pj4xMyxnPTB8YVszXSx3PTgxOTEmZyxfPWc+Pj4xMyxNPTB8YVs0XSxTPTgxOTEmTSxFPU0+Pj4xMyxBPTB8YVs1XSxrPTgxOTEmQSx4PUE+Pj4xMyxJPTB8YVs2XSxCPTgxOTEmSSxPPUk+Pj4xMyxSPTB8YVs3XSxQPTgxOTEmUixUPVI+Pj4xMyxqPTB8YVs4XSxDPTgxOTEmaixOPWo+Pj4xMyxMPTB8YVs5XSxVPTgxOTEmTCx6PUw+Pj4xMyxEPTB8ZlswXSxxPTgxOTEmRCxGPUQ+Pj4xMyxLPTB8ZlsxXSxHPTgxOTEmSyxWPUs+Pj4xMyxIPTB8ZlsyXSxYPTgxOTEmSCxZPUg+Pj4xMyxXPTB8ZlszXSxaPTgxOTEmVyxKPVc+Pj4xMywkPTB8Zls0XSxRPTgxOTEmJCx0dD0kPj4+MTMsZXQ9MHxmWzVdLHJ0PTgxOTEmZXQsbnQ9ZXQ+Pj4xMyxpdD0wfGZbNl0sb3Q9ODE5MSZpdCxhdD1pdD4+PjEzLGZ0PTB8Zls3XSxzdD04MTkxJmZ0LHV0PWZ0Pj4+MTMsaHQ9MHxmWzhdLGN0PTgxOTEmaHQsZHQ9aHQ+Pj4xMyxsdD0wfGZbOV0scHQ9ODE5MSZsdCxidD1sdD4+PjEzO3IubmVnYXRpdmU9dC5uZWdhdGl2ZV5lLm5lZ2F0aXZlLHIubGVuZ3RoPTE5LG49TWF0aC5pbXVsKGMscSksaT1NYXRoLmltdWwoYyxGKSxpPWkrTWF0aC5pbXVsKGQscSl8MCxvPU1hdGguaW11bChkLEYpO3ZhciB2dD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsodnQ+Pj4yNil8MCx2dCY9NjcxMDg4NjMsbj1NYXRoLmltdWwocCxxKSxpPU1hdGguaW11bChwLEYpLGk9aStNYXRoLmltdWwoYixxKXwwLG89TWF0aC5pbXVsKGIsRiksbj1uK01hdGguaW11bChjLEcpfDAsaT1pK01hdGguaW11bChjLFYpfDAsaT1pK01hdGguaW11bChkLEcpfDAsbz1vK01hdGguaW11bChkLFYpfDA7dmFyIHl0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyh5dD4+PjI2KXwwLHl0Jj02NzEwODg2MyxuPU1hdGguaW11bCh5LHEpLGk9TWF0aC5pbXVsKHksRiksaT1pK01hdGguaW11bChtLHEpfDAsbz1NYXRoLmltdWwobSxGKSxuPW4rTWF0aC5pbXVsKHAsRyl8MCxpPWkrTWF0aC5pbXVsKHAsVil8MCxpPWkrTWF0aC5pbXVsKGIsRyl8MCxvPW8rTWF0aC5pbXVsKGIsVil8MCxuPW4rTWF0aC5pbXVsKGMsWCl8MCxpPWkrTWF0aC5pbXVsKGMsWSl8MCxpPWkrTWF0aC5pbXVsKGQsWCl8MCxvPW8rTWF0aC5pbXVsKGQsWSl8MDt2YXIgbXQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKG10Pj4+MjYpfDAsbXQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKHcscSksaT1NYXRoLmltdWwodyxGKSxpPWkrTWF0aC5pbXVsKF8scSl8MCxvPU1hdGguaW11bChfLEYpLG49bitNYXRoLmltdWwoeSxHKXwwLGk9aStNYXRoLmltdWwoeSxWKXwwLGk9aStNYXRoLmltdWwobSxHKXwwLG89bytNYXRoLmltdWwobSxWKXwwLG49bitNYXRoLmltdWwocCxYKXwwLGk9aStNYXRoLmltdWwocCxZKXwwLGk9aStNYXRoLmltdWwoYixYKXwwLG89bytNYXRoLmltdWwoYixZKXwwLG49bitNYXRoLmltdWwoYyxaKXwwLGk9aStNYXRoLmltdWwoYyxKKXwwLGk9aStNYXRoLmltdWwoZCxaKXwwLG89bytNYXRoLmltdWwoZCxKKXwwO3ZhciBndD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoZ3Q+Pj4yNil8MCxndCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoUyxxKSxpPU1hdGguaW11bChTLEYpLGk9aStNYXRoLmltdWwoRSxxKXwwLG89TWF0aC5pbXVsKEUsRiksbj1uK01hdGguaW11bCh3LEcpfDAsaT1pK01hdGguaW11bCh3LFYpfDAsaT1pK01hdGguaW11bChfLEcpfDAsbz1vK01hdGguaW11bChfLFYpfDAsbj1uK01hdGguaW11bCh5LFgpfDAsaT1pK01hdGguaW11bCh5LFkpfDAsaT1pK01hdGguaW11bChtLFgpfDAsbz1vK01hdGguaW11bChtLFkpfDAsbj1uK01hdGguaW11bChwLFopfDAsaT1pK01hdGguaW11bChwLEopfDAsaT1pK01hdGguaW11bChiLFopfDAsbz1vK01hdGguaW11bChiLEopfDAsbj1uK01hdGguaW11bChjLFEpfDAsaT1pK01hdGguaW11bChjLHR0KXwwLGk9aStNYXRoLmltdWwoZCxRKXwwLG89bytNYXRoLmltdWwoZCx0dCl8MDt2YXIgd3Q9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKHd0Pj4+MjYpfDAsd3QmPTY3MTA4ODYzLG49TWF0aC5pbXVsKGsscSksaT1NYXRoLmltdWwoayxGKSxpPWkrTWF0aC5pbXVsKHgscSl8MCxvPU1hdGguaW11bCh4LEYpLG49bitNYXRoLmltdWwoUyxHKXwwLGk9aStNYXRoLmltdWwoUyxWKXwwLGk9aStNYXRoLmltdWwoRSxHKXwwLG89bytNYXRoLmltdWwoRSxWKXwwLG49bitNYXRoLmltdWwodyxYKXwwLGk9aStNYXRoLmltdWwodyxZKXwwLGk9aStNYXRoLmltdWwoXyxYKXwwLG89bytNYXRoLmltdWwoXyxZKXwwLG49bitNYXRoLmltdWwoeSxaKXwwLGk9aStNYXRoLmltdWwoeSxKKXwwLGk9aStNYXRoLmltdWwobSxaKXwwLG89bytNYXRoLmltdWwobSxKKXwwLG49bitNYXRoLmltdWwocCxRKXwwLGk9aStNYXRoLmltdWwocCx0dCl8MCxpPWkrTWF0aC5pbXVsKGIsUSl8MCxvPW8rTWF0aC5pbXVsKGIsdHQpfDAsbj1uK01hdGguaW11bChjLHJ0KXwwLGk9aStNYXRoLmltdWwoYyxudCl8MCxpPWkrTWF0aC5pbXVsKGQscnQpfDAsbz1vK01hdGguaW11bChkLG50KXwwO3ZhciBfdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoX3Q+Pj4yNil8MCxfdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoQixxKSxpPU1hdGguaW11bChCLEYpLGk9aStNYXRoLmltdWwoTyxxKXwwLG89TWF0aC5pbXVsKE8sRiksbj1uK01hdGguaW11bChrLEcpfDAsaT1pK01hdGguaW11bChrLFYpfDAsaT1pK01hdGguaW11bCh4LEcpfDAsbz1vK01hdGguaW11bCh4LFYpfDAsbj1uK01hdGguaW11bChTLFgpfDAsaT1pK01hdGguaW11bChTLFkpfDAsaT1pK01hdGguaW11bChFLFgpfDAsbz1vK01hdGguaW11bChFLFkpfDAsbj1uK01hdGguaW11bCh3LFopfDAsaT1pK01hdGguaW11bCh3LEopfDAsaT1pK01hdGguaW11bChfLFopfDAsbz1vK01hdGguaW11bChfLEopfDAsbj1uK01hdGguaW11bCh5LFEpfDAsaT1pK01hdGguaW11bCh5LHR0KXwwLGk9aStNYXRoLmltdWwobSxRKXwwLG89bytNYXRoLmltdWwobSx0dCl8MCxuPW4rTWF0aC5pbXVsKHAscnQpfDAsaT1pK01hdGguaW11bChwLG50KXwwLGk9aStNYXRoLmltdWwoYixydCl8MCxvPW8rTWF0aC5pbXVsKGIsbnQpfDAsbj1uK01hdGguaW11bChjLG90KXwwLGk9aStNYXRoLmltdWwoYyxhdCl8MCxpPWkrTWF0aC5pbXVsKGQsb3QpfDAsbz1vK01hdGguaW11bChkLGF0KXwwO3ZhciBNdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoTXQ+Pj4yNil8MCxNdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoUCxxKSxpPU1hdGguaW11bChQLEYpLGk9aStNYXRoLmltdWwoVCxxKXwwLG89TWF0aC5pbXVsKFQsRiksbj1uK01hdGguaW11bChCLEcpfDAsaT1pK01hdGguaW11bChCLFYpfDAsaT1pK01hdGguaW11bChPLEcpfDAsbz1vK01hdGguaW11bChPLFYpfDAsbj1uK01hdGguaW11bChrLFgpfDAsaT1pK01hdGguaW11bChrLFkpfDAsaT1pK01hdGguaW11bCh4LFgpfDAsbz1vK01hdGguaW11bCh4LFkpfDAsbj1uK01hdGguaW11bChTLFopfDAsaT1pK01hdGguaW11bChTLEopfDAsaT1pK01hdGguaW11bChFLFopfDAsbz1vK01hdGguaW11bChFLEopfDAsbj1uK01hdGguaW11bCh3LFEpfDAsaT1pK01hdGguaW11bCh3LHR0KXwwLGk9aStNYXRoLmltdWwoXyxRKXwwLG89bytNYXRoLmltdWwoXyx0dCl8MCxuPW4rTWF0aC5pbXVsKHkscnQpfDAsaT1pK01hdGguaW11bCh5LG50KXwwLGk9aStNYXRoLmltdWwobSxydCl8MCxvPW8rTWF0aC5pbXVsKG0sbnQpfDAsbj1uK01hdGguaW11bChwLG90KXwwLGk9aStNYXRoLmltdWwocCxhdCl8MCxpPWkrTWF0aC5pbXVsKGIsb3QpfDAsbz1vK01hdGguaW11bChiLGF0KXwwLG49bitNYXRoLmltdWwoYyxzdCl8MCxpPWkrTWF0aC5pbXVsKGMsdXQpfDAsaT1pK01hdGguaW11bChkLHN0KXwwLG89bytNYXRoLmltdWwoZCx1dCl8MDt2YXIgU3Q9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKFN0Pj4+MjYpfDAsU3QmPTY3MTA4ODYzLG49TWF0aC5pbXVsKEMscSksaT1NYXRoLmltdWwoQyxGKSxpPWkrTWF0aC5pbXVsKE4scSl8MCxvPU1hdGguaW11bChOLEYpLG49bitNYXRoLmltdWwoUCxHKXwwLGk9aStNYXRoLmltdWwoUCxWKXwwLGk9aStNYXRoLmltdWwoVCxHKXwwLG89bytNYXRoLmltdWwoVCxWKXwwLG49bitNYXRoLmltdWwoQixYKXwwLGk9aStNYXRoLmltdWwoQixZKXwwLGk9aStNYXRoLmltdWwoTyxYKXwwLG89bytNYXRoLmltdWwoTyxZKXwwLG49bitNYXRoLmltdWwoayxaKXwwLGk9aStNYXRoLmltdWwoayxKKXwwLGk9aStNYXRoLmltdWwoeCxaKXwwLG89bytNYXRoLmltdWwoeCxKKXwwLG49bitNYXRoLmltdWwoUyxRKXwwLGk9aStNYXRoLmltdWwoUyx0dCl8MCxpPWkrTWF0aC5pbXVsKEUsUSl8MCxvPW8rTWF0aC5pbXVsKEUsdHQpfDAsbj1uK01hdGguaW11bCh3LHJ0KXwwLGk9aStNYXRoLmltdWwodyxudCl8MCxpPWkrTWF0aC5pbXVsKF8scnQpfDAsbz1vK01hdGguaW11bChfLG50KXwwLG49bitNYXRoLmltdWwoeSxvdCl8MCxpPWkrTWF0aC5pbXVsKHksYXQpfDAsaT1pK01hdGguaW11bChtLG90KXwwLG89bytNYXRoLmltdWwobSxhdCl8MCxuPW4rTWF0aC5pbXVsKHAsc3QpfDAsaT1pK01hdGguaW11bChwLHV0KXwwLGk9aStNYXRoLmltdWwoYixzdCl8MCxvPW8rTWF0aC5pbXVsKGIsdXQpfDAsbj1uK01hdGguaW11bChjLGN0KXwwLGk9aStNYXRoLmltdWwoYyxkdCl8MCxpPWkrTWF0aC5pbXVsKGQsY3QpfDAsbz1vK01hdGguaW11bChkLGR0KXwwO3ZhciBFdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoRXQ+Pj4yNil8MCxFdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxxKSxpPU1hdGguaW11bChVLEYpLGk9aStNYXRoLmltdWwoeixxKXwwLG89TWF0aC5pbXVsKHosRiksbj1uK01hdGguaW11bChDLEcpfDAsaT1pK01hdGguaW11bChDLFYpfDAsaT1pK01hdGguaW11bChOLEcpfDAsbz1vK01hdGguaW11bChOLFYpfDAsbj1uK01hdGguaW11bChQLFgpfDAsaT1pK01hdGguaW11bChQLFkpfDAsaT1pK01hdGguaW11bChULFgpfDAsbz1vK01hdGguaW11bChULFkpfDAsbj1uK01hdGguaW11bChCLFopfDAsaT1pK01hdGguaW11bChCLEopfDAsaT1pK01hdGguaW11bChPLFopfDAsbz1vK01hdGguaW11bChPLEopfDAsbj1uK01hdGguaW11bChrLFEpfDAsaT1pK01hdGguaW11bChrLHR0KXwwLGk9aStNYXRoLmltdWwoeCxRKXwwLG89bytNYXRoLmltdWwoeCx0dCl8MCxuPW4rTWF0aC5pbXVsKFMscnQpfDAsaT1pK01hdGguaW11bChTLG50KXwwLGk9aStNYXRoLmltdWwoRSxydCl8MCxvPW8rTWF0aC5pbXVsKEUsbnQpfDAsbj1uK01hdGguaW11bCh3LG90KXwwLGk9aStNYXRoLmltdWwodyxhdCl8MCxpPWkrTWF0aC5pbXVsKF8sb3QpfDAsbz1vK01hdGguaW11bChfLGF0KXwwLG49bitNYXRoLmltdWwoeSxzdCl8MCxpPWkrTWF0aC5pbXVsKHksdXQpfDAsaT1pK01hdGguaW11bChtLHN0KXwwLG89bytNYXRoLmltdWwobSx1dCl8MCxuPW4rTWF0aC5pbXVsKHAsY3QpfDAsaT1pK01hdGguaW11bChwLGR0KXwwLGk9aStNYXRoLmltdWwoYixjdCl8MCxvPW8rTWF0aC5pbXVsKGIsZHQpfDAsbj1uK01hdGguaW11bChjLHB0KXwwLGk9aStNYXRoLmltdWwoYyxidCl8MCxpPWkrTWF0aC5pbXVsKGQscHQpfDAsbz1vK01hdGguaW11bChkLGJ0KXwwO3ZhciBBdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoQXQ+Pj4yNil8MCxBdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxHKSxpPU1hdGguaW11bChVLFYpLGk9aStNYXRoLmltdWwoeixHKXwwLG89TWF0aC5pbXVsKHosViksbj1uK01hdGguaW11bChDLFgpfDAsaT1pK01hdGguaW11bChDLFkpfDAsaT1pK01hdGguaW11bChOLFgpfDAsbz1vK01hdGguaW11bChOLFkpfDAsbj1uK01hdGguaW11bChQLFopfDAsaT1pK01hdGguaW11bChQLEopfDAsaT1pK01hdGguaW11bChULFopfDAsbz1vK01hdGguaW11bChULEopfDAsbj1uK01hdGguaW11bChCLFEpfDAsaT1pK01hdGguaW11bChCLHR0KXwwLGk9aStNYXRoLmltdWwoTyxRKXwwLG89bytNYXRoLmltdWwoTyx0dCl8MCxuPW4rTWF0aC5pbXVsKGsscnQpfDAsaT1pK01hdGguaW11bChrLG50KXwwLGk9aStNYXRoLmltdWwoeCxydCl8MCxvPW8rTWF0aC5pbXVsKHgsbnQpfDAsbj1uK01hdGguaW11bChTLG90KXwwLGk9aStNYXRoLmltdWwoUyxhdCl8MCxpPWkrTWF0aC5pbXVsKEUsb3QpfDAsbz1vK01hdGguaW11bChFLGF0KXwwLG49bitNYXRoLmltdWwodyxzdCl8MCxpPWkrTWF0aC5pbXVsKHcsdXQpfDAsaT1pK01hdGguaW11bChfLHN0KXwwLG89bytNYXRoLmltdWwoXyx1dCl8MCxuPW4rTWF0aC5pbXVsKHksY3QpfDAsaT1pK01hdGguaW11bCh5LGR0KXwwLGk9aStNYXRoLmltdWwobSxjdCl8MCxvPW8rTWF0aC5pbXVsKG0sZHQpfDAsbj1uK01hdGguaW11bChwLHB0KXwwLGk9aStNYXRoLmltdWwocCxidCl8MCxpPWkrTWF0aC5pbXVsKGIscHQpfDAsbz1vK01hdGguaW11bChiLGJ0KXwwO3ZhciBrdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoa3Q+Pj4yNil8MCxrdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxYKSxpPU1hdGguaW11bChVLFkpLGk9aStNYXRoLmltdWwoeixYKXwwLG89TWF0aC5pbXVsKHosWSksbj1uK01hdGguaW11bChDLFopfDAsaT1pK01hdGguaW11bChDLEopfDAsaT1pK01hdGguaW11bChOLFopfDAsbz1vK01hdGguaW11bChOLEopfDAsbj1uK01hdGguaW11bChQLFEpfDAsaT1pK01hdGguaW11bChQLHR0KXwwLGk9aStNYXRoLmltdWwoVCxRKXwwLG89bytNYXRoLmltdWwoVCx0dCl8MCxuPW4rTWF0aC5pbXVsKEIscnQpfDAsaT1pK01hdGguaW11bChCLG50KXwwLGk9aStNYXRoLmltdWwoTyxydCl8MCxvPW8rTWF0aC5pbXVsKE8sbnQpfDAsbj1uK01hdGguaW11bChrLG90KXwwLGk9aStNYXRoLmltdWwoayxhdCl8MCxpPWkrTWF0aC5pbXVsKHgsb3QpfDAsbz1vK01hdGguaW11bCh4LGF0KXwwLG49bitNYXRoLmltdWwoUyxzdCl8MCxpPWkrTWF0aC5pbXVsKFMsdXQpfDAsaT1pK01hdGguaW11bChFLHN0KXwwLG89bytNYXRoLmltdWwoRSx1dCl8MCxuPW4rTWF0aC5pbXVsKHcsY3QpfDAsaT1pK01hdGguaW11bCh3LGR0KXwwLGk9aStNYXRoLmltdWwoXyxjdCl8MCxvPW8rTWF0aC5pbXVsKF8sZHQpfDAsbj1uK01hdGguaW11bCh5LHB0KXwwLGk9aStNYXRoLmltdWwoeSxidCl8MCxpPWkrTWF0aC5pbXVsKG0scHQpfDAsbz1vK01hdGguaW11bChtLGJ0KXwwO3ZhciB4dD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoeHQ+Pj4yNil8MCx4dCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxaKSxpPU1hdGguaW11bChVLEopLGk9aStNYXRoLmltdWwoeixaKXwwLG89TWF0aC5pbXVsKHosSiksbj1uK01hdGguaW11bChDLFEpfDAsaT1pK01hdGguaW11bChDLHR0KXwwLGk9aStNYXRoLmltdWwoTixRKXwwLG89bytNYXRoLmltdWwoTix0dCl8MCxuPW4rTWF0aC5pbXVsKFAscnQpfDAsaT1pK01hdGguaW11bChQLG50KXwwLGk9aStNYXRoLmltdWwoVCxydCl8MCxvPW8rTWF0aC5pbXVsKFQsbnQpfDAsbj1uK01hdGguaW11bChCLG90KXwwLGk9aStNYXRoLmltdWwoQixhdCl8MCxpPWkrTWF0aC5pbXVsKE8sb3QpfDAsbz1vK01hdGguaW11bChPLGF0KXwwLG49bitNYXRoLmltdWwoayxzdCl8MCxpPWkrTWF0aC5pbXVsKGssdXQpfDAsaT1pK01hdGguaW11bCh4LHN0KXwwLG89bytNYXRoLmltdWwoeCx1dCl8MCxuPW4rTWF0aC5pbXVsKFMsY3QpfDAsaT1pK01hdGguaW11bChTLGR0KXwwLGk9aStNYXRoLmltdWwoRSxjdCl8MCxvPW8rTWF0aC5pbXVsKEUsZHQpfDAsbj1uK01hdGguaW11bCh3LHB0KXwwLGk9aStNYXRoLmltdWwodyxidCl8MCxpPWkrTWF0aC5pbXVsKF8scHQpfDAsbz1vK01hdGguaW11bChfLGJ0KXwwO3ZhciBJdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoSXQ+Pj4yNil8MCxJdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxRKSxpPU1hdGguaW11bChVLHR0KSxpPWkrTWF0aC5pbXVsKHosUSl8MCxvPU1hdGguaW11bCh6LHR0KSxuPW4rTWF0aC5pbXVsKEMscnQpfDAsaT1pK01hdGguaW11bChDLG50KXwwLGk9aStNYXRoLmltdWwoTixydCl8MCxvPW8rTWF0aC5pbXVsKE4sbnQpfDAsbj1uK01hdGguaW11bChQLG90KXwwLGk9aStNYXRoLmltdWwoUCxhdCl8MCxpPWkrTWF0aC5pbXVsKFQsb3QpfDAsbz1vK01hdGguaW11bChULGF0KXwwLG49bitNYXRoLmltdWwoQixzdCl8MCxpPWkrTWF0aC5pbXVsKEIsdXQpfDAsaT1pK01hdGguaW11bChPLHN0KXwwLG89bytNYXRoLmltdWwoTyx1dCl8MCxuPW4rTWF0aC5pbXVsKGssY3QpfDAsaT1pK01hdGguaW11bChrLGR0KXwwLGk9aStNYXRoLmltdWwoeCxjdCl8MCxvPW8rTWF0aC5pbXVsKHgsZHQpfDAsbj1uK01hdGguaW11bChTLHB0KXwwLGk9aStNYXRoLmltdWwoUyxidCl8MCxpPWkrTWF0aC5pbXVsKEUscHQpfDAsbz1vK01hdGguaW11bChFLGJ0KXwwO3ZhciBCdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoQnQ+Pj4yNil8MCxCdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxydCksaT1NYXRoLmltdWwoVSxudCksaT1pK01hdGguaW11bCh6LHJ0KXwwLG89TWF0aC5pbXVsKHosbnQpLG49bitNYXRoLmltdWwoQyxvdCl8MCxpPWkrTWF0aC5pbXVsKEMsYXQpfDAsaT1pK01hdGguaW11bChOLG90KXwwLG89bytNYXRoLmltdWwoTixhdCl8MCxuPW4rTWF0aC5pbXVsKFAsc3QpfDAsaT1pK01hdGguaW11bChQLHV0KXwwLGk9aStNYXRoLmltdWwoVCxzdCl8MCxvPW8rTWF0aC5pbXVsKFQsdXQpfDAsbj1uK01hdGguaW11bChCLGN0KXwwLGk9aStNYXRoLmltdWwoQixkdCl8MCxpPWkrTWF0aC5pbXVsKE8sY3QpfDAsbz1vK01hdGguaW11bChPLGR0KXwwLG49bitNYXRoLmltdWwoayxwdCl8MCxpPWkrTWF0aC5pbXVsKGssYnQpfDAsaT1pK01hdGguaW11bCh4LHB0KXwwLG89bytNYXRoLmltdWwoeCxidCl8MDt2YXIgT3Q9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKE90Pj4+MjYpfDAsT3QmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUsb3QpLGk9TWF0aC5pbXVsKFUsYXQpLGk9aStNYXRoLmltdWwoeixvdCl8MCxvPU1hdGguaW11bCh6LGF0KSxuPW4rTWF0aC5pbXVsKEMsc3QpfDAsaT1pK01hdGguaW11bChDLHV0KXwwLGk9aStNYXRoLmltdWwoTixzdCl8MCxvPW8rTWF0aC5pbXVsKE4sdXQpfDAsbj1uK01hdGguaW11bChQLGN0KXwwLGk9aStNYXRoLmltdWwoUCxkdCl8MCxpPWkrTWF0aC5pbXVsKFQsY3QpfDAsbz1vK01hdGguaW11bChULGR0KXwwLG49bitNYXRoLmltdWwoQixwdCl8MCxpPWkrTWF0aC5pbXVsKEIsYnQpfDAsaT1pK01hdGguaW11bChPLHB0KXwwLG89bytNYXRoLmltdWwoTyxidCl8MDt2YXIgUnQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKFJ0Pj4+MjYpfDAsUnQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUsc3QpLGk9TWF0aC5pbXVsKFUsdXQpLGk9aStNYXRoLmltdWwoeixzdCl8MCxvPU1hdGguaW11bCh6LHV0KSxuPW4rTWF0aC5pbXVsKEMsY3QpfDAsaT1pK01hdGguaW11bChDLGR0KXwwLGk9aStNYXRoLmltdWwoTixjdCl8MCxvPW8rTWF0aC5pbXVsKE4sZHQpfDAsbj1uK01hdGguaW11bChQLHB0KXwwLGk9aStNYXRoLmltdWwoUCxidCl8MCxpPWkrTWF0aC5pbXVsKFQscHQpfDAsbz1vK01hdGguaW11bChULGJ0KXwwO3ZhciBQdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoUHQ+Pj4yNil8MCxQdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxjdCksaT1NYXRoLmltdWwoVSxkdCksaT1pK01hdGguaW11bCh6LGN0KXwwLG89TWF0aC5pbXVsKHosZHQpLG49bitNYXRoLmltdWwoQyxwdCl8MCxpPWkrTWF0aC5pbXVsKEMsYnQpfDAsaT1pK01hdGguaW11bChOLHB0KXwwLG89bytNYXRoLmltdWwoTixidCl8MDt2YXIgVHQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKFR0Pj4+MjYpfDAsVHQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKFUscHQpLGk9TWF0aC5pbXVsKFUsYnQpLGk9aStNYXRoLmltdWwoeixwdCl8MCxvPU1hdGguaW11bCh6LGJ0KTt2YXIganQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3JldHVybiB1PShvKyhpPj4+MTMpfDApKyhqdD4+PjI2KXwwLGp0Jj02NzEwODg2MyxzWzBdPXZ0LHNbMV09eXQsc1syXT1tdCxzWzNdPWd0LHNbNF09d3Qsc1s1XT1fdCxzWzZdPU10LHNbN109U3Qsc1s4XT1FdCxzWzldPUF0LHNbMTBdPWt0LHNbMTFdPXh0LHNbMTJdPUl0LHNbMTNdPUJ0LHNbMTRdPU90LHNbMTVdPVJ0LHNbMTZdPVB0LHNbMTddPVR0LHNbMThdPWp0LDAhPT11JiYoc1sxOV09dSxyLmxlbmd0aCsrKSxyfTtNYXRoLmltdWx8fChFPXUpLG8ucHJvdG90eXBlLm11bFRvPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLmxlbmd0aCt0Lmxlbmd0aDtyZXR1cm4gcj0xMD09PXRoaXMubGVuZ3RoJiYxMD09PXQubGVuZ3RoP0UodGhpcyx0LGUpOm48NjM/dSh0aGlzLHQsZSk6bjwxMDI0P2godGhpcyx0LGUpOmModGhpcyx0LGUpfSxkLnByb3RvdHlwZS5tYWtlUkJUPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscj1vLnByb3RvdHlwZS5fY291bnRCaXRzKHQpLTEsbj0wO248dDtuKyspZVtuXT10aGlzLnJldkJpbihuLHIsdCk7cmV0dXJuIGV9LGQucHJvdG90eXBlLnJldkJpbj1mdW5jdGlvbih0LGUscil7aWYoMD09PXR8fHQ9PT1yLTEpcmV0dXJuIHQ7Zm9yKHZhciBuPTAsaT0wO2k8ZTtpKyspbnw9KDEmdCk8PGUtaS0xLHQ+Pj0xO3JldHVybiBufSxcbmQucHJvdG90eXBlLnBlcm11dGU9ZnVuY3Rpb24odCxlLHIsbixpLG8pe2Zvcih2YXIgYT0wO2E8bzthKyspblthXT1lW3RbYV1dLGlbYV09clt0W2FdXX0sZC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyLG4saSxvKXt0aGlzLnBlcm11dGUobyx0LGUscixuLGkpO2Zvcih2YXIgYT0xO2E8aTthPDw9MSlmb3IodmFyIGY9YTw8MSxzPU1hdGguY29zKDIqTWF0aC5QSS9mKSx1PU1hdGguc2luKDIqTWF0aC5QSS9mKSxoPTA7aDxpO2grPWYpZm9yKHZhciBjPXMsZD11LGw9MDtsPGE7bCsrKXt2YXIgcD1yW2grbF0sYj1uW2grbF0sdj1yW2grbCthXSx5PW5baCtsK2FdLG09Yyp2LWQqeTt5PWMqeStkKnYsdj1tLHJbaCtsXT1wK3YsbltoK2xdPWIreSxyW2grbCthXT1wLXYsbltoK2wrYV09Yi15LGwhPT1mJiYobT1zKmMtdSpkLGQ9cypkK3UqYyxjPW0pfX0sZC5wcm90b3R5cGUuZ3Vlc3NMZW4xM2I9ZnVuY3Rpb24odCxlKXt2YXIgcj0xfE1hdGgubWF4KGUsdCksbj0xJnIsaT0wO2ZvcihyPXIvMnwwO3I7cj4+Pj0xKWkrKztyZXR1cm4gMTw8aSsxK259LGQucHJvdG90eXBlLmNvbmp1Z2F0ZT1mdW5jdGlvbih0LGUscil7aWYoIShyPD0xKSlmb3IodmFyIG49MDtuPHIvMjtuKyspe3ZhciBpPXRbbl07dFtuXT10W3Itbi0xXSx0W3Itbi0xXT1pLGk9ZVtuXSxlW25dPS1lW3Itbi0xXSxlW3Itbi0xXT0taX19LGQucHJvdG90eXBlLm5vcm1hbGl6ZTEzYj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49MDtuPGUvMjtuKyspe3ZhciBpPTgxOTIqTWF0aC5yb3VuZCh0WzIqbisxXS9lKStNYXRoLnJvdW5kKHRbMipuXS9lKStyO3Rbbl09NjcxMDg4NjMmaSxyPWk8NjcxMDg4NjQ/MDppLzY3MTA4ODY0fDB9cmV0dXJuIHR9LGQucHJvdG90eXBlLmNvbnZlcnQxM2I9ZnVuY3Rpb24odCxlLHIsaSl7Zm9yKHZhciBvPTAsYT0wO2E8ZTthKyspbys9MHx0W2FdLHJbMiphXT04MTkxJm8sbz4+Pj0xMyxyWzIqYSsxXT04MTkxJm8sbz4+Pj0xMztmb3IoYT0yKmU7YTxpOysrYSlyW2FdPTA7bigwPT09byksbigwPT09KG8mLTgxOTIpKX0sZC5wcm90b3R5cGUuc3R1Yj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLHI9MDtyPHQ7cisrKWVbcl09MDtyZXR1cm4gZX0sZC5wcm90b3R5cGUubXVscD1mdW5jdGlvbih0LGUscil7dmFyIG49Mip0aGlzLmd1ZXNzTGVuMTNiKHQubGVuZ3RoLGUubGVuZ3RoKSxpPXRoaXMubWFrZVJCVChuKSxvPXRoaXMuc3R1YihuKSxhPW5ldyBBcnJheShuKSxmPW5ldyBBcnJheShuKSxzPW5ldyBBcnJheShuKSx1PW5ldyBBcnJheShuKSxoPW5ldyBBcnJheShuKSxjPW5ldyBBcnJheShuKSxkPXIud29yZHM7ZC5sZW5ndGg9bix0aGlzLmNvbnZlcnQxM2IodC53b3Jkcyx0Lmxlbmd0aCxhLG4pLHRoaXMuY29udmVydDEzYihlLndvcmRzLGUubGVuZ3RoLHUsbiksdGhpcy50cmFuc2Zvcm0oYSxvLGYscyxuLGkpLHRoaXMudHJhbnNmb3JtKHUsbyxoLGMsbixpKTtmb3IodmFyIGw9MDtsPG47bCsrKXt2YXIgcD1mW2xdKmhbbF0tc1tsXSpjW2xdO3NbbF09ZltsXSpjW2xdK3NbbF0qaFtsXSxmW2xdPXB9cmV0dXJuIHRoaXMuY29uanVnYXRlKGYscyxuKSx0aGlzLnRyYW5zZm9ybShmLHMsZCxvLG4saSksdGhpcy5jb25qdWdhdGUoZCxvLG4pLHRoaXMubm9ybWFsaXplMTNiKGQsbiksci5uZWdhdGl2ZT10Lm5lZ2F0aXZlXmUubmVnYXRpdmUsci5sZW5ndGg9dC5sZW5ndGgrZS5sZW5ndGgsci5zdHJpcCgpfSxvLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG8obnVsbCk7cmV0dXJuIGUud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoK3QubGVuZ3RoKSx0aGlzLm11bFRvKHQsZSl9LG8ucHJvdG90eXBlLm11bGY9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG8obnVsbCk7cmV0dXJuIGUud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoK3QubGVuZ3RoKSxjKHRoaXMsdCxlKX0sby5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKHQsdGhpcyl9LG8ucHJvdG90eXBlLmltdWxuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQpLG4odDw2NzEwODg2NCk7Zm9yKHZhciBlPTAscj0wO3I8dGhpcy5sZW5ndGg7cisrKXt2YXIgaT0oMHx0aGlzLndvcmRzW3JdKSp0LG89KDY3MTA4ODYzJmkpKyg2NzEwODg2MyZlKTtlPj49MjYsZSs9aS82NzEwODg2NHwwLGUrPW8+Pj4yNix0aGlzLndvcmRzW3JdPTY3MTA4ODYzJm99cmV0dXJuIDAhPT1lJiYodGhpcy53b3Jkc1tyXT1lLHRoaXMubGVuZ3RoKyspLHRoaXN9LG8ucHJvdG90eXBlLm11bG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbih0KX0sby5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsKHRoaXMpfSxvLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpfSxvLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7dmFyIGU9cyh0KTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG5ldyBvKDEpO2Zvcih2YXIgcj10aGlzLG49MDtuPGUubGVuZ3RoJiYwPT09ZVtuXTtuKysscj1yLnNxcigpKTtpZigrK248ZS5sZW5ndGgpZm9yKHZhciBpPXIuc3FyKCk7bjxlLmxlbmd0aDtuKyssaT1pLnNxcigpKTAhPT1lW25dJiYocj1yLm11bChpKSk7cmV0dXJuIHJ9LG8ucHJvdG90eXBlLml1c2hsbj1mdW5jdGlvbih0KXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZSxyPXQlMjYsaT0odC1yKS8yNixvPTY3MTA4ODYzPj4+MjYtcjw8MjYtcjtpZigwIT09cil7dmFyIGE9MDtmb3IoZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXt2YXIgZj10aGlzLndvcmRzW2VdJm8scz0oMHx0aGlzLndvcmRzW2VdKS1mPDxyO3RoaXMud29yZHNbZV09c3xhLGE9Zj4+PjI2LXJ9YSYmKHRoaXMud29yZHNbZV09YSx0aGlzLmxlbmd0aCsrKX1pZigwIT09aSl7Zm9yKGU9dGhpcy5sZW5ndGgtMTtlPj0wO2UtLSl0aGlzLndvcmRzW2UraV09dGhpcy53b3Jkc1tlXTtmb3IoZT0wO2U8aTtlKyspdGhpcy53b3Jkc1tlXT0wO3RoaXMubGVuZ3RoKz1pfXJldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlzaGxuPWZ1bmN0aW9uKHQpe3JldHVybiBuKDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hsbih0KX0sby5wcm90b3R5cGUuaXVzaHJuPWZ1bmN0aW9uKHQsZSxyKXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgaTtpPWU/KGUtZSUyNikvMjY6MDt2YXIgbz10JTI2LGE9TWF0aC5taW4oKHQtbykvMjYsdGhpcy5sZW5ndGgpLGY9NjcxMDg4NjNeNjcxMDg4NjM+Pj5vPDxvLHM9cjtpZihpLT1hLGk9TWF0aC5tYXgoMCxpKSxzKXtmb3IodmFyIHU9MDt1PGE7dSsrKXMud29yZHNbdV09dGhpcy53b3Jkc1t1XTtzLmxlbmd0aD1hfWlmKDA9PT1hKTtlbHNlIGlmKHRoaXMubGVuZ3RoPmEpZm9yKHRoaXMubGVuZ3RoLT1hLHU9MDt1PHRoaXMubGVuZ3RoO3UrKyl0aGlzLndvcmRzW3VdPXRoaXMud29yZHNbdSthXTtlbHNlIHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xO3ZhciBoPTA7Zm9yKHU9dGhpcy5sZW5ndGgtMTt1Pj0wJiYoMCE9PWh8fHU+PWkpO3UtLSl7dmFyIGM9MHx0aGlzLndvcmRzW3VdO3RoaXMud29yZHNbdV09aDw8MjYtb3xjPj4+byxoPWMmZn1yZXR1cm4gcyYmMCE9PWgmJihzLndvcmRzW3MubGVuZ3RoKytdPWgpLDA9PT10aGlzLmxlbmd0aCYmKHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmlzaHJuPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbigwPT09dGhpcy5uZWdhdGl2ZSksdGhpcy5pdXNocm4odCxlLHIpfSxvLnByb3RvdHlwZS5zaGxuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXNobG4odCl9LG8ucHJvdG90eXBlLnVzaGxuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKHQpfSxvLnByb3RvdHlwZS5zaHJuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXNocm4odCl9LG8ucHJvdG90eXBlLnVzaHJuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXVzaHJuKHQpfSxvLnByb3RvdHlwZS50ZXN0bj1mdW5jdGlvbih0KXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZT10JTI2LHI9KHQtZSkvMjYsaT0xPDxlO2lmKHRoaXMubGVuZ3RoPD1yKXJldHVybiExO3ZhciBvPXRoaXMud29yZHNbcl07cmV0dXJuISEobyZpKX0sby5wcm90b3R5cGUuaW1hc2tuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPXQlMjYscj0odC1lKS8yNjtpZihuKDA9PT10aGlzLm5lZ2F0aXZlLFwiaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzXCIpLHRoaXMubGVuZ3RoPD1yKXJldHVybiB0aGlzO2lmKDAhPT1lJiZyKyssdGhpcy5sZW5ndGg9TWF0aC5taW4ocix0aGlzLmxlbmd0aCksMCE9PWUpe3ZhciBpPTY3MTA4ODYzXjY3MTA4ODYzPj4+ZTw8ZTt0aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdJj1pfXJldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLm1hc2tuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKHQpfSxvLnByb3RvdHlwZS5pYWRkbj1mdW5jdGlvbih0KXtyZXR1cm4gbihcIm51bWJlclwiPT10eXBlb2YgdCksbih0PDY3MTA4ODY0KSx0PDA/dGhpcy5pc3VibigtdCk6MCE9PXRoaXMubmVnYXRpdmU/MT09PXRoaXMubGVuZ3RoJiYoMHx0aGlzLndvcmRzWzBdKTx0Pyh0aGlzLndvcmRzWzBdPXQtKDB8dGhpcy53b3Jkc1swXSksdGhpcy5uZWdhdGl2ZT0wLHRoaXMpOih0aGlzLm5lZ2F0aXZlPTAsdGhpcy5pc3Vibih0KSx0aGlzLm5lZ2F0aXZlPTEsdGhpcyk6dGhpcy5faWFkZG4odCl9LG8ucHJvdG90eXBlLl9pYWRkbj1mdW5jdGlvbih0KXt0aGlzLndvcmRzWzBdKz10O2Zvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbZV0+PTY3MTA4ODY0O2UrKyl0aGlzLndvcmRzW2VdLT02NzEwODg2NCxlPT09dGhpcy5sZW5ndGgtMT90aGlzLndvcmRzW2UrMV09MTp0aGlzLndvcmRzW2UrMV0rKztyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgsZSsxKSx0aGlzfSxvLnByb3RvdHlwZS5pc3Vibj1mdW5jdGlvbih0KXtpZihuKFwibnVtYmVyXCI9PXR5cGVvZiB0KSxuKHQ8NjcxMDg4NjQpLHQ8MClyZXR1cm4gdGhpcy5pYWRkbigtdCk7aWYoMCE9PXRoaXMubmVnYXRpdmUpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzLmlhZGRuKHQpLHRoaXMubmVnYXRpdmU9MSx0aGlzO2lmKHRoaXMud29yZHNbMF0tPXQsMT09PXRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzWzBdPDApdGhpcy53b3Jkc1swXT0tdGhpcy53b3Jkc1swXSx0aGlzLm5lZ2F0aXZlPTE7ZWxzZSBmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzW2VdPDA7ZSsrKXRoaXMud29yZHNbZV0rPTY3MTA4ODY0LHRoaXMud29yZHNbZSsxXS09MTtyZXR1cm4gdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5hZGRuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaWFkZG4odCl9LG8ucHJvdG90eXBlLnN1Ym49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3Vibih0KX0sby5wcm90b3R5cGUuaWFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpc30sby5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCl9LG8ucHJvdG90eXBlLl9pc2hsbnN1Ym11bD1mdW5jdGlvbih0LGUscil7dmFyIGksbz10Lmxlbmd0aCtyO3RoaXMuX2V4cGFuZChvKTt2YXIgYSxmPTA7Zm9yKGk9MDtpPHQubGVuZ3RoO2krKyl7YT0oMHx0aGlzLndvcmRzW2krcl0pK2Y7dmFyIHM9KDB8dC53b3Jkc1tpXSkqZTthLT02NzEwODg2MyZzLGY9KGE+PjI2KS0ocy82NzEwODg2NHwwKSx0aGlzLndvcmRzW2krcl09NjcxMDg4NjMmYX1mb3IoO2k8dGhpcy5sZW5ndGgtcjtpKyspYT0oMHx0aGlzLndvcmRzW2krcl0pK2YsZj1hPj4yNix0aGlzLndvcmRzW2krcl09NjcxMDg4NjMmYTtpZigwPT09ZilyZXR1cm4gdGhpcy5zdHJpcCgpO2ZvcihuKGY9PT0tMSksZj0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKylhPS0oMHx0aGlzLndvcmRzW2ldKStmLGY9YT4+MjYsdGhpcy53b3Jkc1tpXT02NzEwODg2MyZhO3JldHVybiB0aGlzLm5lZ2F0aXZlPTEsdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5fd29yZERpdj1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMubGVuZ3RoLXQubGVuZ3RoLG49dGhpcy5jbG9uZSgpLGk9dCxhPTB8aS53b3Jkc1tpLmxlbmd0aC0xXSxmPXRoaXMuX2NvdW50Qml0cyhhKTtyPTI2LWYsMCE9PXImJihpPWkudXNobG4ociksbi5pdXNobG4ociksYT0wfGkud29yZHNbaS5sZW5ndGgtMV0pO3ZhciBzLHU9bi5sZW5ndGgtaS5sZW5ndGg7aWYoXCJtb2RcIiE9PWUpe3M9bmV3IG8obnVsbCkscy5sZW5ndGg9dSsxLHMud29yZHM9bmV3IEFycmF5KHMubGVuZ3RoKTtmb3IodmFyIGg9MDtoPHMubGVuZ3RoO2grKylzLndvcmRzW2hdPTB9dmFyIGM9bi5jbG9uZSgpLl9pc2hsbnN1Ym11bChpLDEsdSk7MD09PWMubmVnYXRpdmUmJihuPWMscyYmKHMud29yZHNbdV09MSkpO2Zvcih2YXIgZD11LTE7ZD49MDtkLS0pe3ZhciBsPTY3MTA4ODY0KigwfG4ud29yZHNbaS5sZW5ndGgrZF0pKygwfG4ud29yZHNbaS5sZW5ndGgrZC0xXSk7Zm9yKGw9TWF0aC5taW4obC9hfDAsNjcxMDg4NjMpLG4uX2lzaGxuc3VibXVsKGksbCxkKTswIT09bi5uZWdhdGl2ZTspbC0tLG4ubmVnYXRpdmU9MCxuLl9pc2hsbnN1Ym11bChpLDEsZCksbi5pc1plcm8oKXx8KG4ubmVnYXRpdmVePTEpO3MmJihzLndvcmRzW2RdPWwpfXJldHVybiBzJiZzLnN0cmlwKCksbi5zdHJpcCgpLFwiZGl2XCIhPT1lJiYwIT09ciYmbi5pdXNocm4ocikse2RpdjpzfHxudWxsLG1vZDpufX0sby5wcm90b3R5cGUuZGl2bW9kPWZ1bmN0aW9uKHQsZSxyKXtpZihuKCF0LmlzWmVybygpKSx0aGlzLmlzWmVybygpKXJldHVybntkaXY6bmV3IG8oMCksbW9kOm5ldyBvKDApfTt2YXIgaSxhLGY7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09dC5uZWdhdGl2ZT8oZj10aGlzLm5lZygpLmRpdm1vZCh0LGUpLFwibW9kXCIhPT1lJiYoaT1mLmRpdi5uZWcoKSksXCJkaXZcIiE9PWUmJihhPWYubW9kLm5lZygpLHImJjAhPT1hLm5lZ2F0aXZlJiZhLmlhZGQodCkpLHtkaXY6aSxtb2Q6YX0pOjA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZT8oZj10aGlzLmRpdm1vZCh0Lm5lZygpLGUpLFwibW9kXCIhPT1lJiYoaT1mLmRpdi5uZWcoKSkse2RpdjppLG1vZDpmLm1vZH0pOjAhPT0odGhpcy5uZWdhdGl2ZSZ0Lm5lZ2F0aXZlKT8oZj10aGlzLm5lZygpLmRpdm1vZCh0Lm5lZygpLGUpLFwiZGl2XCIhPT1lJiYoYT1mLm1vZC5uZWcoKSxyJiYwIT09YS5uZWdhdGl2ZSYmYS5pc3ViKHQpKSx7ZGl2OmYuZGl2LG1vZDphfSk6dC5sZW5ndGg+dGhpcy5sZW5ndGh8fHRoaXMuY21wKHQpPDA/e2RpdjpuZXcgbygwKSxtb2Q6dGhpc306MT09PXQubGVuZ3RoP1wiZGl2XCI9PT1lP3tkaXY6dGhpcy5kaXZuKHQud29yZHNbMF0pLG1vZDpudWxsfTpcIm1vZFwiPT09ZT97ZGl2Om51bGwsbW9kOm5ldyBvKHRoaXMubW9kbih0LndvcmRzWzBdKSl9OntkaXY6dGhpcy5kaXZuKHQud29yZHNbMF0pLG1vZDpuZXcgbyh0aGlzLm1vZG4odC53b3Jkc1swXSkpfTp0aGlzLl93b3JkRGl2KHQsZSl9LG8ucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXZtb2QodCxcImRpdlwiLCExKS5kaXZ9LG8ucHJvdG90eXBlLm1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXZtb2QodCxcIm1vZFwiLCExKS5tb2R9LG8ucHJvdG90eXBlLnVtb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsXCJtb2RcIiwhMCkubW9kfSxvLnByb3RvdHlwZS5kaXZSb3VuZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRpdm1vZCh0KTtpZihlLm1vZC5pc1plcm8oKSlyZXR1cm4gZS5kaXY7dmFyIHI9MCE9PWUuZGl2Lm5lZ2F0aXZlP2UubW9kLmlzdWIodCk6ZS5tb2Qsbj10LnVzaHJuKDEpLGk9dC5hbmRsbigxKSxvPXIuY21wKG4pO3JldHVybiBvPDB8fDE9PT1pJiYwPT09bz9lLmRpdjowIT09ZS5kaXYubmVnYXRpdmU/ZS5kaXYuaXN1Ym4oMSk6ZS5kaXYuaWFkZG4oMSl9LG8ucHJvdG90eXBlLm1vZG49ZnVuY3Rpb24odCl7bih0PD02NzEwODg2Myk7Zm9yKHZhciBlPSgxPDwyNikldCxyPTAsaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKXI9KGUqcisoMHx0aGlzLndvcmRzW2ldKSkldDtyZXR1cm4gcn0sby5wcm90b3R5cGUuaWRpdm49ZnVuY3Rpb24odCl7bih0PD02NzEwODg2Myk7Zm9yKHZhciBlPTAscj10aGlzLmxlbmd0aC0xO3I+PTA7ci0tKXt2YXIgaT0oMHx0aGlzLndvcmRzW3JdKSs2NzEwODg2NCplO3RoaXMud29yZHNbcl09aS90fDAsZT1pJXR9cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuZGl2bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKHQpfSxvLnByb3RvdHlwZS5lZ2NkPWZ1bmN0aW9uKHQpe24oMD09PXQubmVnYXRpdmUpLG4oIXQuaXNaZXJvKCkpO3ZhciBlPXRoaXMscj10LmNsb25lKCk7ZT0wIT09ZS5uZWdhdGl2ZT9lLnVtb2QodCk6ZS5jbG9uZSgpO2Zvcih2YXIgaT1uZXcgbygxKSxhPW5ldyBvKDApLGY9bmV3IG8oMCkscz1uZXcgbygxKSx1PTA7ZS5pc0V2ZW4oKSYmci5pc0V2ZW4oKTspZS5pdXNocm4oMSksci5pdXNocm4oMSksKyt1O2Zvcih2YXIgaD1yLmNsb25lKCksYz1lLmNsb25lKCk7IWUuaXNaZXJvKCk7KXtmb3IodmFyIGQ9MCxsPTE7MD09PShlLndvcmRzWzBdJmwpJiZkPDI2OysrZCxsPDw9MSk7aWYoZD4wKWZvcihlLml1c2hybihkKTtkLS0gPjA7KShpLmlzT2RkKCl8fGEuaXNPZGQoKSkmJihpLmlhZGQoaCksYS5pc3ViKGMpKSxpLml1c2hybigxKSxhLml1c2hybigxKTtmb3IodmFyIHA9MCxiPTE7MD09PShyLndvcmRzWzBdJmIpJiZwPDI2OysrcCxiPDw9MSk7aWYocD4wKWZvcihyLml1c2hybihwKTtwLS0gPjA7KShmLmlzT2RkKCl8fHMuaXNPZGQoKSkmJihmLmlhZGQoaCkscy5pc3ViKGMpKSxmLml1c2hybigxKSxzLml1c2hybigxKTtlLmNtcChyKT49MD8oZS5pc3ViKHIpLGkuaXN1YihmKSxhLmlzdWIocykpOihyLmlzdWIoZSksZi5pc3ViKGkpLHMuaXN1YihhKSl9cmV0dXJue2E6ZixiOnMsZ2NkOnIuaXVzaGxuKHUpfX0sby5wcm90b3R5cGUuX2ludm1wPWZ1bmN0aW9uKHQpe24oMD09PXQubmVnYXRpdmUpLG4oIXQuaXNaZXJvKCkpO3ZhciBlPXRoaXMscj10LmNsb25lKCk7ZT0wIT09ZS5uZWdhdGl2ZT9lLnVtb2QodCk6ZS5jbG9uZSgpO2Zvcih2YXIgaT1uZXcgbygxKSxhPW5ldyBvKDApLGY9ci5jbG9uZSgpO2UuY21wbigxKT4wJiZyLmNtcG4oMSk+MDspe2Zvcih2YXIgcz0wLHU9MTswPT09KGUud29yZHNbMF0mdSkmJnM8MjY7KytzLHU8PD0xKTtpZihzPjApZm9yKGUuaXVzaHJuKHMpO3MtLSA+MDspaS5pc09kZCgpJiZpLmlhZGQoZiksaS5pdXNocm4oMSk7Zm9yKHZhciBoPTAsYz0xOzA9PT0oci53b3Jkc1swXSZjKSYmaDwyNjsrK2gsYzw8PTEpO2lmKGg+MClmb3Ioci5pdXNocm4oaCk7aC0tID4wOylhLmlzT2RkKCkmJmEuaWFkZChmKSxhLml1c2hybigxKTtlLmNtcChyKT49MD8oZS5pc3ViKHIpLGkuaXN1YihhKSk6KHIuaXN1YihlKSxhLmlzdWIoaSkpfXZhciBkO3JldHVybiBkPTA9PT1lLmNtcG4oMSk/aTphLGQuY21wbigwKTwwJiZkLmlhZGQodCksZH0sby5wcm90b3R5cGUuZ2NkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHQuYWJzKCk7aWYodC5pc1plcm8oKSlyZXR1cm4gdGhpcy5hYnMoKTt2YXIgZT10aGlzLmNsb25lKCkscj10LmNsb25lKCk7ZS5uZWdhdGl2ZT0wLHIubmVnYXRpdmU9MDtmb3IodmFyIG49MDtlLmlzRXZlbigpJiZyLmlzRXZlbigpO24rKyllLml1c2hybigxKSxyLml1c2hybigxKTtmb3IoOzspe2Zvcig7ZS5pc0V2ZW4oKTspZS5pdXNocm4oMSk7Zm9yKDtyLmlzRXZlbigpOylyLml1c2hybigxKTt2YXIgaT1lLmNtcChyKTtpZihpPDApe3ZhciBvPWU7ZT1yLHI9b31lbHNlIGlmKDA9PT1pfHwwPT09ci5jbXBuKDEpKWJyZWFrO2UuaXN1YihyKX1yZXR1cm4gci5pdXNobG4obil9LG8ucHJvdG90eXBlLmludm09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWdjZCh0KS5hLnVtb2QodCl9LG8ucHJvdG90eXBlLmlzRXZlbj1mdW5jdGlvbigpe3JldHVybiAwPT09KDEmdGhpcy53b3Jkc1swXSl9LG8ucHJvdG90eXBlLmlzT2RkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT0oMSZ0aGlzLndvcmRzWzBdKX0sby5wcm90b3R5cGUuYW5kbG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud29yZHNbMF0mdH0sby5wcm90b3R5cGUuYmluY249ZnVuY3Rpb24odCl7bihcIm51bWJlclwiPT10eXBlb2YgdCk7dmFyIGU9dCUyNixyPSh0LWUpLzI2LGk9MTw8ZTtpZih0aGlzLmxlbmd0aDw9cilyZXR1cm4gdGhpcy5fZXhwYW5kKHIrMSksdGhpcy53b3Jkc1tyXXw9aSx0aGlzO2Zvcih2YXIgbz1pLGE9cjswIT09byYmYTx0aGlzLmxlbmd0aDthKyspe3ZhciBmPTB8dGhpcy53b3Jkc1thXTtmKz1vLG89Zj4+PjI2LGYmPTY3MTA4ODYzLHRoaXMud29yZHNbYV09Zn1yZXR1cm4gMCE9PW8mJih0aGlzLndvcmRzW2FdPW8sdGhpcy5sZW5ndGgrKyksdGhpc30sby5wcm90b3R5cGUuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxlbmd0aCYmMD09PXRoaXMud29yZHNbMF19LG8ucHJvdG90eXBlLmNtcG49ZnVuY3Rpb24odCl7dmFyIGU9dDwwO2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYhZSlyZXR1cm4tMTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmZSlyZXR1cm4gMTt0aGlzLnN0cmlwKCk7dmFyIHI7aWYodGhpcy5sZW5ndGg+MSlyPTE7ZWxzZXtlJiYodD0tdCksbih0PD02NzEwODg2MyxcIk51bWJlciBpcyB0b28gYmlnXCIpO3ZhciBpPTB8dGhpcy53b3Jkc1swXTtyPWk9PT10PzA6aTx0Py0xOjF9cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlPzB8LXI6cn0sby5wcm90b3R5cGUuY21wPWZ1bmN0aW9uKHQpe2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09dC5uZWdhdGl2ZSlyZXR1cm4tMTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmMCE9PXQubmVnYXRpdmUpcmV0dXJuIDE7dmFyIGU9dGhpcy51Y21wKHQpO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZT8wfC1lOmV9LG8ucHJvdG90eXBlLnVjbXA9ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg+dC5sZW5ndGgpcmV0dXJuIDE7aWYodGhpcy5sZW5ndGg8dC5sZW5ndGgpcmV0dXJuLTE7Zm9yKHZhciBlPTAscj10aGlzLmxlbmd0aC0xO3I+PTA7ci0tKXt2YXIgbj0wfHRoaXMud29yZHNbcl0saT0wfHQud29yZHNbcl07aWYobiE9PWkpe248aT9lPS0xOm4+aSYmKGU9MSk7YnJlYWt9fXJldHVybiBlfSxvLnByb3RvdHlwZS5ndG49ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10aGlzLmNtcG4odCl9LG8ucHJvdG90eXBlLmd0PWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dGhpcy5jbXAodCl9LG8ucHJvdG90eXBlLmd0ZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wbih0KT49MH0sby5wcm90b3R5cGUuZ3RlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KT49MH0sby5wcm90b3R5cGUubHRuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcG4odCk9PT0tMX0sby5wcm90b3R5cGUubHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPT09LTF9LG8ucHJvdG90eXBlLmx0ZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wbih0KTw9MH0sby5wcm90b3R5cGUubHRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KTw9MH0sby5wcm90b3R5cGUuZXFuPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5jbXBuKHQpfSxvLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuY21wKHQpfSxvLnJlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG0odCl9LG8ucHJvdG90eXBlLnRvUmVkPWZ1bmN0aW9uKHQpe3JldHVybiBuKCF0aGlzLnJlZCxcIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHRcIiksbigwPT09dGhpcy5uZWdhdGl2ZSxcInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzXCIpLHQuY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZCh0KX0sby5wcm90b3R5cGUuZnJvbVJlZD1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwiZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSx0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKX0sby5wcm90b3R5cGUuX2ZvcmNlUmVkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlZD10LHRoaXN9LG8ucHJvdG90eXBlLmZvcmNlUmVkPWZ1bmN0aW9uKHQpe3JldHVybiBuKCF0aGlzLnJlZCxcIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHRcIiksdGhpcy5fZm9yY2VSZWQodCl9LG8ucHJvdG90eXBlLnJlZEFkZD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuYWRkKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZElBZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4odGhpcy5yZWQsXCJyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5pYWRkKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZFN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuc3ViKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZElTdWI9ZnVuY3Rpb24odCl7cmV0dXJuIG4odGhpcy5yZWQsXCJyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5pc3ViKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZFNobD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuc2hsKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZE11bD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTIodGhpcyx0KSx0aGlzLnJlZC5tdWwodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSU11bD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTIodGhpcyx0KSx0aGlzLnJlZC5pbXVsKHRoaXMsdCl9LG8ucHJvdG90eXBlLnJlZFNxcj1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5zcXIodGhpcyl9LG8ucHJvdG90eXBlLnJlZElTcXI9ZnVuY3Rpb24oKXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLmlzcXIodGhpcyl9LG8ucHJvdG90eXBlLnJlZFNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcnQodGhpcyl9LG8ucHJvdG90eXBlLnJlZEludm09ZnVuY3Rpb24oKXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLmludm0odGhpcyl9LG8ucHJvdG90eXBlLnJlZE5lZz1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5uZWcodGhpcyl9LG8ucHJvdG90eXBlLnJlZFBvdz1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCYmIXQucmVkLFwicmVkUG93KG5vcm1hbE51bSlcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQucG93KHRoaXMsdCl9O3ZhciBBPXtrMjU2Om51bGwscDIyNDpudWxsLHAxOTI6bnVsbCxwMjU1MTk6bnVsbH07bC5wcm90b3R5cGUuX3RtcD1mdW5jdGlvbigpe3ZhciB0PW5ldyBvKG51bGwpO3JldHVybiB0LndvcmRzPW5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uLzEzKSksdH0sbC5wcm90b3R5cGUuaXJlZHVjZT1mdW5jdGlvbih0KXt2YXIgZSxyPXQ7ZG8gdGhpcy5zcGxpdChyLHRoaXMudG1wKSxyPXRoaXMuaW11bEsocikscj1yLmlhZGQodGhpcy50bXApLGU9ci5iaXRMZW5ndGgoKTt3aGlsZShlPnRoaXMubik7dmFyIG49ZTx0aGlzLm4/LTE6ci51Y21wKHRoaXMucCk7cmV0dXJuIDA9PT1uPyhyLndvcmRzWzBdPTAsci5sZW5ndGg9MSk6bj4wP3IuaXN1Yih0aGlzLnApOnIuc3RyaXAoKSxyfSxsLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbih0LGUpe3QuaXVzaHJuKHRoaXMubiwwLGUpfSxsLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXtyZXR1cm4gdC5pbXVsKHRoaXMuayl9LGkocCxsKSxwLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj00MTk0MzAzLG49TWF0aC5taW4odC5sZW5ndGgsOSksaT0wO2k8bjtpKyspZS53b3Jkc1tpXT10LndvcmRzW2ldO2lmKGUubGVuZ3RoPW4sdC5sZW5ndGg8PTkpcmV0dXJuIHQud29yZHNbMF09MCx2b2lkKHQubGVuZ3RoPTEpO3ZhciBvPXQud29yZHNbOV07Zm9yKGUud29yZHNbZS5sZW5ndGgrK109byZyLGk9MTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBhPTB8dC53b3Jkc1tpXTt0LndvcmRzW2ktMTBdPShhJnIpPDw0fG8+Pj4yMixvPWF9bz4+Pj0yMix0LndvcmRzW2ktMTBdPW8sMD09PW8mJnQubGVuZ3RoPjEwP3QubGVuZ3RoLT0xMDp0Lmxlbmd0aC09OX0scC5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7dC53b3Jkc1t0Lmxlbmd0aF09MCx0LndvcmRzW3QubGVuZ3RoKzFdPTAsdC5sZW5ndGgrPTI7Zm9yKHZhciBlPTAscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbj0wfHQud29yZHNbcl07ZSs9OTc3Km4sdC53b3Jkc1tyXT02NzEwODg2MyZlLGU9NjQqbisoZS82NzEwODg2NHwwKX1yZXR1cm4gMD09PXQud29yZHNbdC5sZW5ndGgtMV0mJih0Lmxlbmd0aC0tLDA9PT10LndvcmRzW3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aC0tKSx0fSxpKGIsbCksaSh2LGwpLGkoeSxsKSx5LnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPTE5KigwfHQud29yZHNbcl0pK2UsaT02NzEwODg2MyZuO24+Pj49MjYsdC53b3Jkc1tyXT1pLGU9bn1yZXR1cm4gMCE9PWUmJih0LndvcmRzW3QubGVuZ3RoKytdPWUpLHR9LG8uX3ByaW1lPWZ1bmN0aW9uIHQoZSl7aWYoQVtlXSlyZXR1cm4gQVtlXTt2YXIgdDtpZihcImsyNTZcIj09PWUpdD1uZXcgcDtlbHNlIGlmKFwicDIyNFwiPT09ZSl0PW5ldyBiO2Vsc2UgaWYoXCJwMTkyXCI9PT1lKXQ9bmV3IHY7ZWxzZXtpZihcInAyNTUxOVwiIT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHByaW1lIFwiK2UpO3Q9bmV3IHl9cmV0dXJuIEFbZV09dCx0fSxtLnByb3RvdHlwZS5fdmVyaWZ5MT1mdW5jdGlvbih0KXtuKDA9PT10Lm5lZ2F0aXZlLFwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXNcIiksbih0LnJlZCxcInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIil9LG0ucHJvdG90eXBlLl92ZXJpZnkyPWZ1bmN0aW9uKHQsZSl7bigwPT09KHQubmVnYXRpdmV8ZS5uZWdhdGl2ZSksXCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlc1wiKSxuKHQucmVkJiZ0LnJlZD09PWUucmVkLFwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKX0sbS5wcm90b3R5cGUuaW1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcmltZT90aGlzLnByaW1lLmlyZWR1Y2UodCkuX2ZvcmNlUmVkKHRoaXMpOnQudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKX0sbS5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKHQpe3JldHVybiB0LmlzWmVybygpP3QuY2xvbmUoKTp0aGlzLm0uc3ViKHQpLl9mb3JjZVJlZCh0aGlzKX0sbS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuYWRkKGUpO3JldHVybiByLmNtcCh0aGlzLm0pPj0wJiZyLmlzdWIodGhpcy5tKSxyLl9mb3JjZVJlZCh0aGlzKX0sbS5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgcj10LmlhZGQoZSk7cmV0dXJuIHIuY21wKHRoaXMubSk+PTAmJnIuaXN1Yih0aGlzLm0pLHJ9LG0ucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgcj10LnN1YihlKTtyZXR1cm4gci5jbXBuKDApPDAmJnIuaWFkZCh0aGlzLm0pLHIuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuaXN1YihlKTtyZXR1cm4gci5jbXBuKDApPDAmJnIuaWFkZCh0aGlzLm0pLHJ9LG0ucHJvdG90eXBlLnNobD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkxKHQpLHRoaXMuaW1vZCh0LnVzaGxuKGUpKX0sbS5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkyKHQsZSksdGhpcy5pbW9kKHQuaW11bChlKSl9LG0ucHJvdG90eXBlLm11bD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl92ZXJpZnkyKHQsZSksdGhpcy5pbW9kKHQubXVsKGUpKX0sbS5wcm90b3R5cGUuaXNxcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbXVsKHQsdC5jbG9uZSgpKX0sbS5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm11bCh0LHQpfSxtLnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKHQpe2lmKHQuaXNaZXJvKCkpcmV0dXJuIHQuY2xvbmUoKTt2YXIgZT10aGlzLm0uYW5kbG4oMyk7aWYobihlJTI9PT0xKSwzPT09ZSl7dmFyIHI9dGhpcy5tLmFkZChuZXcgbygxKSkuaXVzaHJuKDIpO3JldHVybiB0aGlzLnBvdyh0LHIpfWZvcih2YXIgaT10aGlzLm0uc3VibigxKSxhPTA7IWkuaXNaZXJvKCkmJjA9PT1pLmFuZGxuKDEpOylhKyssaS5pdXNocm4oMSk7bighaS5pc1plcm8oKSk7dmFyIGY9bmV3IG8oMSkudG9SZWQodGhpcykscz1mLnJlZE5lZygpLHU9dGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpLGg9dGhpcy5tLmJpdExlbmd0aCgpO2ZvcihoPW5ldyBvKDIqaCpoKS50b1JlZCh0aGlzKTswIT09dGhpcy5wb3coaCx1KS5jbXAocyk7KWgucmVkSUFkZChzKTtmb3IodmFyIGM9dGhpcy5wb3coaCxpKSxkPXRoaXMucG93KHQsaS5hZGRuKDEpLml1c2hybigxKSksbD10aGlzLnBvdyh0LGkpLHA9YTswIT09bC5jbXAoZik7KXtmb3IodmFyIGI9bCx2PTA7MCE9PWIuY21wKGYpO3YrKyliPWIucmVkU3FyKCk7bih2PHApO3ZhciB5PXRoaXMucG93KGMsbmV3IG8oMSkuaXVzaGxuKHAtdi0xKSk7ZD1kLnJlZE11bCh5KSxjPXkucmVkU3FyKCksbD1sLnJlZE11bChjKSxwPXZ9cmV0dXJuIGR9LG0ucHJvdG90eXBlLmludm09ZnVuY3Rpb24odCl7dmFyIGU9dC5faW52bXAodGhpcy5tKTtyZXR1cm4gMCE9PWUubmVnYXRpdmU/KGUubmVnYXRpdmU9MCx0aGlzLmltb2QoZSkucmVkTmVnKCkpOnRoaXMuaW1vZChlKX0sbS5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQsZSl7aWYoZS5pc1plcm8oKSlyZXR1cm4gbmV3IG8oMSk7aWYoMD09PWUuY21wbigxKSlyZXR1cm4gdC5jbG9uZSgpO3ZhciByPTQsbj1uZXcgQXJyYXkoMTw8cik7blswXT1uZXcgbygxKS50b1JlZCh0aGlzKSxuWzFdPXQ7Zm9yKHZhciBpPTI7aTxuLmxlbmd0aDtpKyspbltpXT10aGlzLm11bChuW2ktMV0sdCk7dmFyIGE9blswXSxmPTAscz0wLHU9ZS5iaXRMZW5ndGgoKSUyNjtmb3IoMD09PXUmJih1PTI2KSxpPWUubGVuZ3RoLTE7aT49MDtpLS0pe2Zvcih2YXIgaD1lLndvcmRzW2ldLGM9dS0xO2M+PTA7Yy0tKXt2YXIgZD1oPj5jJjE7YSE9PW5bMF0mJihhPXRoaXMuc3FyKGEpKSwwIT09ZHx8MCE9PWY/KGY8PD0xLGZ8PWQscysrLChzPT09cnx8MD09PWkmJjA9PT1jKSYmKGE9dGhpcy5tdWwoYSxuW2ZdKSxzPTAsZj0wKSk6cz0wfXU9MjZ9cmV0dXJuIGF9LG0ucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbih0KXt2YXIgZT10LnVtb2QodGhpcy5tKTtyZXR1cm4gZT09PXQ/ZS5jbG9uZSgpOmV9LG0ucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvbmUoKTtyZXR1cm4gZS5yZWQ9bnVsbCxlfSxvLm1vbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBnKHQpfSxpKGcsbSksZy5wcm90b3R5cGUuY29udmVydFRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmltb2QodC51c2hsbih0aGlzLnNoaWZ0KSl9LGcucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW1vZCh0Lm11bCh0aGlzLnJpbnYpKTtyZXR1cm4gZS5yZWQ9bnVsbCxlfSxnLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQsZSl7aWYodC5pc1plcm8oKXx8ZS5pc1plcm8oKSlyZXR1cm4gdC53b3Jkc1swXT0wLHQubGVuZ3RoPTEsdDt2YXIgcj10LmltdWwoZSksbj1yLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSxpPXIuaXN1YihuKS5pdXNocm4odGhpcy5zaGlmdCksbz1pO3JldHVybiBpLmNtcCh0aGlzLm0pPj0wP289aS5pc3ViKHRoaXMubSk6aS5jbXBuKDApPDAmJihvPWkuaWFkZCh0aGlzLm0pKSxvLl9mb3JjZVJlZCh0aGlzKX0sZy5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7aWYodC5pc1plcm8oKXx8ZS5pc1plcm8oKSlyZXR1cm4gbmV3IG8oMCkuX2ZvcmNlUmVkKHRoaXMpO3ZhciByPXQubXVsKGUpLG49ci5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksaT1yLmlzdWIobikuaXVzaHJuKHRoaXMuc2hpZnQpLGE9aTtyZXR1cm4gaS5jbXAodGhpcy5tKT49MD9hPWkuaXN1Yih0aGlzLm0pOmkuY21wbigwKTwwJiYoYT1pLmlhZGQodGhpcy5tKSksYS5fZm9yY2VSZWQodGhpcyl9LGcucHJvdG90eXBlLmludm09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbW9kKHQuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTtyZXR1cm4gZS5fZm9yY2VSZWQodGhpcyl9fShcInVuZGVmaW5lZFwiPT10eXBlb2YgdHx8dCx0aGlzKX0pLmNhbGwoZSxyKDkyKSh0KSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lO24uUmVwb3J0ZXI9cig1ODIpLlJlcG9ydGVyLG4uRGVjb2RlckJ1ZmZlcj1yKDIzNCkuRGVjb2RlckJ1ZmZlcixuLkVuY29kZXJCdWZmZXI9cigyMzQpLkVuY29kZXJCdWZmZXIsbi5Ob2RlPXIoNTgxKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXtmb3IodmFyIG49TWF0aC5taW4odC5sZW5ndGgsci5sZW5ndGgpLGk9bmV3IGUobiksbz0wO288bjsrK28paVtvXT10W29dXnJbb107cmV0dXJuIGl9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiByKHQpe3JldHVybiBBcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkodCk6XCJbb2JqZWN0IEFycmF5XVwiPT09dih0KX1mdW5jdGlvbiBuKHQpe3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgdH1mdW5jdGlvbiBpKHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10fWZ1bmN0aW9uIGEodCl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHR9ZnVuY3Rpb24gZih0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdH1mdW5jdGlvbiBzKHQpe3JldHVyblwic3ltYm9sXCI9PXR5cGVvZiB0fWZ1bmN0aW9uIHUodCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gaCh0KXtyZXR1cm5cIltvYmplY3QgUmVnRXhwXVwiPT09dih0KX1mdW5jdGlvbiBjKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBkKHQpe3JldHVyblwiW29iamVjdCBEYXRlXVwiPT09dih0KX1mdW5jdGlvbiBsKHQpe3JldHVyblwiW29iamVjdCBFcnJvcl1cIj09PXYodCl8fHQgaW5zdGFuY2VvZiBFcnJvcn1mdW5jdGlvbiBwKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHR9ZnVuY3Rpb24gYih0KXtyZXR1cm4gbnVsbD09PXR8fFwiYm9vbGVhblwiPT10eXBlb2YgdHx8XCJudW1iZXJcIj09dHlwZW9mIHR8fFwic3RyaW5nXCI9PXR5cGVvZiB0fHxcInN5bWJvbFwiPT10eXBlb2YgdHx8XCJ1bmRlZmluZWRcIj09dHlwZW9mIHR9ZnVuY3Rpb24gdih0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWUuaXNBcnJheT1yLGUuaXNCb29sZWFuPW4sZS5pc051bGw9aSxlLmlzTnVsbE9yVW5kZWZpbmVkPW8sZS5pc051bWJlcj1hLGUuaXNTdHJpbmc9ZixlLmlzU3ltYm9sPXMsZS5pc1VuZGVmaW5lZD11LGUuaXNSZWdFeHA9aCxlLmlzT2JqZWN0PWMsZS5pc0RhdGU9ZCxlLmlzRXJyb3I9bCxlLmlzRnVuY3Rpb249cCxlLmlzUHJpbWl0aXZlPWIsZS5pc0J1ZmZlcj10LmlzQnVmZmVyfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3Quc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OnQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbj1lW3JdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gciYmdChlLnByb3RvdHlwZSxyKSxuJiZ0KGUsbiksZX19KCksbz1yKDExNSksYT1yKDE1OSksZj1yKDExMykscz1yKDUzKSx1PXIoMTE2KSxoPXIoMjAxKSxjPXIoOTEpLGQ9cigxNjIpLGw9L15jYzooWzEtOWEtZl1bMC05YS1mXXswLDN9fDApOlsxLTlhLWZdWzAtOWEtZl17MCwxNX06W2EtekEtWjAtOV8tXXswLDg2fTooWzEtOV1bMC05XXswLDE3fXwwKSQvLHA9L15jYzooWzEtOWEtZl1bMC05YS1mXXswLDN9fDApOlsxLTlhLWZdWzAtOWEtZl17MCw3fTpbYS16QS1aMC05Xy1dezAsODZ9OihbMS05XVswLTldezAsMTd9fDApJC8sYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtuKHRoaXMsdCl9cmV0dXJuIGkodCxbe2tleTpcImdldFR5cGVJZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19LHtrZXk6XCJzZXRUeXBlSWRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnR5cGU9dH19LHtrZXk6XCJnZXRCaXRtYXNrXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iaXRtYXNrfX0se2tleTpcInNldEJpdG1hc2tcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmJpdG1hc2s9dH19LHtrZXk6XCJnZXRIYXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNoKXRocm93IG5ldyBzKFwiSGFzaCBub3Qgc2V0XCIpO3JldHVybiB0aGlzLmhhc2h9fSx7a2V5Olwic2V0SGFzaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJIYXNoIG11c3QgYmUgYSBCdWZmZXJcIik7dGhpcy5oYXNoPXR9fSx7a2V5OlwiZ2V0TWF4RnVsZmlsbG1lbnRMZW5ndGhcIix2YWx1ZTpmdW5jdGlvbigpe2lmKFwibnVtYmVyXCIhPXR5cGVvZiB0aGlzLm1heEZ1bGZpbGxtZW50TGVuZ3RoKXRocm93IG5ldyBzKFwiTWF4aW11bSBmdWxmaWxsbWVudCBsZW5ndGggbm90IHNldFwiKTtyZXR1cm4gdGhpcy5tYXhGdWxmaWxsbWVudExlbmd0aH19LHtrZXk6XCJzZXRNYXhGdWxmaWxsbWVudExlbmd0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCFkKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJGdWxmaWxsbWVudCBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyXCIpO2lmKHQ8MCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVsZmlsbG1lbnQgbGVuZ3RoIG11c3QgYmUgcG9zaXRpdmUgb3IgemVyb1wiKTt0aGlzLm1heEZ1bGZpbGxtZW50TGVuZ3RoPXR9fSx7a2V5Olwic2VyaWFsaXplVXJpXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cImNjOlwiK3RoaXMuZ2V0VHlwZUlkKCkudG9TdHJpbmcoMTYpK1wiOlwiK3RoaXMuZ2V0Qml0bWFzaygpLnRvU3RyaW5nKDE2KStcIjpcIit1LmVuY29kZSh0aGlzLmdldEhhc2goKSkrXCI6XCIrdGhpcy5nZXRNYXhGdWxmaWxsbWVudExlbmd0aCgpfX0se2tleTpcInNlcmlhbGl6ZUJpbmFyeVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGM7cmV0dXJuIHQud3JpdGVVSW50MTYodGhpcy5nZXRUeXBlSWQoKSksdC53cml0ZVZhclVJbnQodGhpcy5nZXRCaXRtYXNrKCkpLHQud3JpdGVWYXJPY3RldFN0cmluZyh0aGlzLmdldEhhc2goKSksdC53cml0ZVZhclVJbnQodGhpcy5nZXRNYXhGdWxmaWxsbWVudExlbmd0aCgpKSx0LmdldEJ1ZmZlcigpfX0se2tleTpcInBhcnNlQmluYXJ5XCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5zZXRUeXBlSWQodC5yZWFkVUludDE2KCkpLHRoaXMuc2V0Qml0bWFzayh0LnJlYWRWYXJVSW50KCkpLHRoaXMuc2V0SGFzaCh0LnJlYWRWYXJPY3RldFN0cmluZygpKSx0aGlzLnNldE1heEZ1bGZpbGxtZW50TGVuZ3RoKHQucmVhZFZhclVJbnQoKSl9fSx7a2V5OlwidmFsaWRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKG8uZ2V0Q2xhc3NGcm9tVHlwZUlkKHRoaXMuZ2V0VHlwZUlkKCkpLHRoaXMuZ2V0Qml0bWFzaygpPnQuTUFYX1NBRkVfQklUTUFTSyl0aHJvdyBuZXcgRXJyb3IoXCJCaXRtYXNrIHRvbyBsYXJnZSB0byBiZSBzYWZlbHkgcmVwcmVzZW50ZWRcIik7aWYodGhpcy5nZXRCaXRtYXNrKCkmfnQuU1VQUE9SVEVEX0JJVE1BU0spdGhyb3cgbmV3IEVycm9yKFwiQ29uZGl0aW9uIHJlcXVlc3RlZCB1bnN1cHBvcnRlZCBmZWF0dXJlIHN1aXRlc1wiKTtpZih0aGlzLmdldE1heEZ1bGZpbGxtZW50TGVuZ3RoKCk+dC5NQVhfRlVMRklMTE1FTlRfTEVOR1RIKXRocm93IG5ldyBFcnJvcihcIkNvbmRpdGlvbiByZXF1ZXN0ZWQgdG9vIGxhcmdlIG9mIGEgbWF4IGZ1bGZpbGxtZW50IHNpemVcIik7cmV0dXJuITB9fV0sW3trZXk6XCJmcm9tVXJpXCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIHQpcmV0dXJuIGU7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKFwiU2VyaWFsaXplZCBjb25kaXRpb24gbXVzdCBiZSBhIHN0cmluZ1wiKTt2YXIgcj1lLnNwbGl0KFwiOlwiKTtpZihcImNjXCIhPT1yWzBdKXRocm93IG5ldyBhKCdTZXJpYWxpemVkIGNvbmRpdGlvbiBtdXN0IHN0YXJ0IHdpdGggXCJjYzpcIicpO2lmKCF0LlJFR0VYX1NUUklDVC5leGVjKGUpKXRocm93IG5ldyBmKFwiSW52YWxpZCBjb25kaXRpb24gZm9ybWF0XCIpO3ZhciBuPW5ldyB0O3JldHVybiBuLnNldFR5cGVJZChwYXJzZUludChyWzFdLDE2KSksbi5zZXRCaXRtYXNrKHBhcnNlSW50KHJbMl0sMTYpKSxuLnNldEhhc2godS5kZWNvZGUoclszXSkpLG4uc2V0TWF4RnVsZmlsbG1lbnRMZW5ndGgocGFyc2VJbnQocls0XSwxMCkpLG59fSx7a2V5OlwiZnJvbUJpbmFyeVwiLHZhbHVlOmZ1bmN0aW9uKGUpe2U9aC5mcm9tKGUpO3ZhciByPW5ldyB0O3JldHVybiByLnBhcnNlQmluYXJ5KGUpLHJ9fV0pLHR9KCk7Yi5NQVhfU0FGRV9CSVRNQVNLPTQyOTQ5NjcyOTUsYi5TVVBQT1JURURfQklUTUFTSz02MyxiLk1BWF9GVUxGSUxMTUVOVF9MRU5HVEg9NjU1MzUsYi5SRUdFWD1sLGIuUkVHRVhfU1RSSUNUPXAsdC5leHBvcnRzPWJ9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksbiYmdChlLG4pLGV9fSgpLGY9cig2Mykscz1yKDExNCksdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG4odGhpcyxlKSxpKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuIG8oZSx0KSxhKGUsW3trZXk6XCJnZW5lcmF0ZUhhc2hcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PW5ldyBzKFwic2hhMjU2XCIpO3JldHVybiB0aGlzLndyaXRlSGFzaFBheWxvYWQodCksdC5nZXREaWdlc3QoKX19XSksZX0oZik7dC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P251bGwhPT10OlwiZnVuY3Rpb25cIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxNyksaT1yKDEwKSxvPXIoNDcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLGEpe3ZhciBmLHM9bihlKSx1PWkocy5sZW5ndGgpLGg9byhhLHUpO2lmKHQmJnIhPXIpe2Zvcig7dT5oOylpZihmPXNbaCsrXSxmIT1mKXJldHVybiEwfWVsc2UgZm9yKDt1Pmg7aCsrKWlmKCh0fHxoIGluIHMpJiZzW2hdPT09cilyZXR1cm4gdHx8aHx8MDtyZXR1cm4hdCYmLTF9fX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoNCksaT1yKDApLG89cigxNSksYT1yKDQ1KSxmPXIoMzYpLHM9cig1NSksdT1yKDQwKSxoPXIoNiksYz1yKDUpLGQ9cig4NCksbD1yKDU3KSxwPXIoMTI0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIsYix2LHkpe3ZhciBtPW5bdF0sZz1tLHc9dj9cInNldFwiOlwiYWRkXCIsXz1nJiZnLnByb3RvdHlwZSxNPXt9LFM9ZnVuY3Rpb24odCl7dmFyIGU9X1t0XTtvKF8sdCxcImRlbGV0ZVwiPT10P2Z1bmN0aW9uKHQpe3JldHVybiEoeSYmIWgodCkpJiZlLmNhbGwodGhpcywwPT09dD8wOnQpfTpcImhhc1wiPT10P2Z1bmN0aW9uKHQpe3JldHVybiEoeSYmIWgodCkpJiZlLmNhbGwodGhpcywwPT09dD8wOnQpfTpcImdldFwiPT10P2Z1bmN0aW9uKHQpe3JldHVybiB5JiYhaCh0KT92b2lkIDA6ZS5jYWxsKHRoaXMsMD09PXQ/MDp0KX06XCJhZGRcIj09dD9mdW5jdGlvbih0KXtyZXR1cm4gZS5jYWxsKHRoaXMsMD09PXQ/MDp0KSx0aGlzfTpmdW5jdGlvbih0LHIpe3JldHVybiBlLmNhbGwodGhpcywwPT09dD8wOnQsciksdGhpc30pfTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBnJiYoeXx8Xy5mb3JFYWNoJiYhYyhmdW5jdGlvbigpeyhuZXcgZykuZW50cmllcygpLm5leHQoKX0pKSl7dmFyIEU9bmV3IGcsQT1FW3ddKHk/e306LTAsMSkhPUUsaz1jKGZ1bmN0aW9uKCl7RS5oYXMoMSl9KSx4PWQoZnVuY3Rpb24odCl7bmV3IGcodCl9KSxJPSF5JiZjKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBnLGU9NTtlLS07KXRbd10oZSxlKTtyZXR1cm4hdC5oYXMoLTApfSk7eHx8KGc9ZShmdW5jdGlvbihlLHIpe3UoZSxnLHQpO3ZhciBuPXAobmV3IG0sZSxnKTtyZXR1cm4gdm9pZCAwIT1yJiZzKHIsdixuW3ddLG4pLG59KSxnLnByb3RvdHlwZT1fLF8uY29uc3RydWN0b3I9ZyksKGt8fEkpJiYoUyhcImRlbGV0ZVwiKSxTKFwiaGFzXCIpLHYmJlMoXCJnZXRcIikpLChJfHxBKSYmUyh3KSx5JiZfLmNsZWFyJiZkZWxldGUgXy5jbGVhcn1lbHNlIGc9Yi5nZXRDb25zdHJ1Y3RvcihlLHQsdix3KSxhKGcucHJvdG90eXBlLHIpLGYuTkVFRD0hMDtyZXR1cm4gbChnLHQpLE1bdF09ZyxpKGkuRytpLlcraS5GKihnIT1tKSxNKSx5fHxiLnNldFN0cm9uZyhnLHQsdiksZ319LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDE0KSxpPXIoMTUpLG89cig1KSxhPXIoMjQpLGY9cig3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIpe3ZhciBzPWYodCksdT1yKGEscyxcIlwiW3RdKSxoPXVbMF0sYz11WzFdO28oZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gZVtzXT1mdW5jdGlvbigpe3JldHVybiA3fSw3IT1cIlwiW3RdKGUpfSkmJihpKFN0cmluZy5wcm90b3R5cGUsdCxoKSxuKFJlZ0V4cC5wcm90b3R5cGUscywyPT1lP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIGMuY2FsbCh0LHRoaXMsZSl9OmZ1bmN0aW9uKHQpe3JldHVybiBjLmNhbGwodCx0aGlzKX0pKX19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDMpO3QuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciB0PW4odGhpcyksZT1cIlwiO3JldHVybiB0Lmdsb2JhbCYmKGUrPVwiZ1wiKSx0Lmlnbm9yZUNhc2UmJihlKz1cImlcIiksdC5tdWx0aWxpbmUmJihlKz1cIm1cIiksdC51bmljb2RlJiYoZSs9XCJ1XCIpLHQuc3RpY2t5JiYoZSs9XCJ5XCIpLGV9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUscil7dmFyIG49dm9pZCAwPT09cjtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbj90KCk6dC5jYWxsKHIpO2Nhc2UgMTpyZXR1cm4gbj90KGVbMF0pOnQuY2FsbChyLGVbMF0pO2Nhc2UgMjpyZXR1cm4gbj90KGVbMF0sZVsxXSk6dC5jYWxsKHIsZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIG4/dChlWzBdLGVbMV0sZVsyXSk6dC5jYWxsKHIsZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbj90KGVbMF0sZVsxXSxlWzJdLGVbM10pOnQuY2FsbChyLGVbMF0sZVsxXSxlWzJdLGVbM10pfXJldHVybiB0LmFwcGx5KHIsZSl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2KSxpPXIoMjMpLG89cig3KShcIm1hdGNoXCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gbih0KSYmKHZvaWQgMCE9PShlPXRbb10pPyEhZTpcIlJlZ0V4cFwiPT1pKHQpKX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDcpKFwiaXRlcmF0b3JcIiksaT0hMTt0cnl7dmFyIG89WzddW25dKCk7by5yZXR1cm49ZnVuY3Rpb24oKXtpPSEwfSxBcnJheS5mcm9tKG8sZnVuY3Rpb24oKXt0aHJvdyAyfSl9Y2F0Y2godCl7fXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFlJiYhaSlyZXR1cm4hMTt2YXIgcj0hMTt0cnl7dmFyIG89WzddLGE9b1tuXSgpO2EubmV4dD1mdW5jdGlvbigpe3JldHVybntkb25lOnI9ITB9fSxvW25dPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LHQobyl9Y2F0Y2godCl7fXJldHVybiByfX0sZnVuY3Rpb24odCxlLHIpe3QuZXhwb3J0cz1yKDQxKXx8IXIoNSkoZnVuY3Rpb24oKXt2YXIgdD1NYXRoLnJhbmRvbSgpO19fZGVmaW5lU2V0dGVyX18uY2FsbChudWxsLHQsZnVuY3Rpb24oKXt9KSxkZWxldGUgcig0KVt0XX0pfSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig0KSxpPVwiX19jb3JlLWpzX3NoYXJlZF9fXCIsbz1uW2ldfHwobltpXT17fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvW3RdfHwob1t0XT17fSl9fSxmdW5jdGlvbih0LGUscil7Zm9yKHZhciBuLGk9cig0KSxvPXIoMTQpLGE9cig0OCksZj1hKFwidHlwZWRfYXJyYXlcIikscz1hKFwidmlld1wiKSx1PSEoIWkuQXJyYXlCdWZmZXJ8fCFpLkRhdGFWaWV3KSxoPXUsYz0wLGQ9OSxsPVwiSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXlcIi5zcGxpdChcIixcIik7YzxkOykobj1pW2xbYysrXV0pPyhvKG4ucHJvdG90eXBlLGYsITApLG8obi5wcm90b3R5cGUscywhMCkpOmg9ITE7dC5leHBvcnRzPXtBQlY6dSxDT05TVFI6aCxUWVBFRDpmLFZJRVc6c319LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P251bGwhPT10OlwiZnVuY3Rpb25cIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dC5leHBvcnRzPXIoNDcyKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3QuZXhwb3J0cz1yKDQ3NCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0LndlYnBhY2tQb2x5ZmlsbHx8KHQuZGVwcmVjYXRlPWZ1bmN0aW9uKCl7fSx0LnBhdGhzPVtdLHQuY2hpbGRyZW58fCh0LmNoaWxkcmVuPVtdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImxvYWRlZFwiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiaWRcIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuaX19KSx0LndlYnBhY2tQb2x5ZmlsbD0xKSx0fX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2UucmFuZG9tQnl0ZXM9ZS5ybmc9ZS5wc2V1ZG9SYW5kb21CeXRlcz1lLnBybmc9cig2MSksZS5jcmVhdGVIYXNoPWUuSGFzaD1yKDU5KSxlLmNyZWF0ZUhtYWM9ZS5IbWFjPXIoMTQ5KTt2YXIgbj1bXCJzaGExXCIsXCJzaGEyMjRcIixcInNoYTI1NlwiLFwic2hhMzg0XCIsXCJzaGE1MTJcIixcIm1kNVwiLFwicm1kMTYwXCJdLmNvbmNhdChPYmplY3Qua2V5cyhyKDIxMSkpKTtlLmdldEhhc2hlcz1mdW5jdGlvbigpe3JldHVybiBufTt2YXIgaT1yKDE1MSk7ZS5wYmtkZjI9aS5wYmtkZjIsZS5wYmtkZjJTeW5jPWkucGJrZGYyU3luYzt2YXIgbz1yKDQ5Myk7W1wiQ2lwaGVyXCIsXCJjcmVhdGVDaXBoZXJcIixcIkNpcGhlcml2XCIsXCJjcmVhdGVDaXBoZXJpdlwiLFwiRGVjaXBoZXJcIixcImNyZWF0ZURlY2lwaGVyXCIsXCJEZWNpcGhlcml2XCIsXCJjcmVhdGVEZWNpcGhlcml2XCIsXCJnZXRDaXBoZXJzXCIsXCJsaXN0Q2lwaGVyc1wiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09b1t0XX0pO3ZhciBhPXIoNTczKTtbXCJEaWZmaWVIZWxsbWFuR3JvdXBcIixcImNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cFwiLFwiZ2V0RGlmZmllSGVsbG1hblwiLFwiY3JlYXRlRGlmZmllSGVsbG1hblwiLFwiRGlmZmllSGVsbG1hblwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09YVt0XX0pO3ZhciBmPXIoNTA2KTtbXCJjcmVhdGVTaWduXCIsXCJTaWduXCIsXCJjcmVhdGVWZXJpZnlcIixcIlZlcmlmeVwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09Zlt0XX0pLGUuY3JlYXRlRUNESD1yKDU0NCk7dmFyIHM9cig1NzcpO1tcInB1YmxpY0VuY3J5cHRcIixcInByaXZhdGVFbmNyeXB0XCIsXCJwdWJsaWNEZWNyeXB0XCIsXCJwcml2YXRlRGVjcnlwdFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09c1t0XX0pLFtcImNyZWF0ZUNyZWRlbnRpYWxzXCJdLmZvckVhY2goZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihbXCJzb3JyeSwgXCIrdCtcIiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0XCIsXCJ3ZSBhY2NlcHQgcHVsbCByZXF1ZXN0c1wiLFwiaHR0cHM6Ly9naXRodWIuY29tL2NyeXB0by1icm93c2VyaWZ5L2NyeXB0by1icm93c2VyaWZ5XCJdLmpvaW4oXCJcXG5cIikpfX0pfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCl7dmFyIGUscjtyZXR1cm4gZT10PmZ8fHQ8MD8ocj1NYXRoLmFicyh0KSVmLHQ8MD9mLXI6cik6dH1mdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7dCsrKXRbZV09MDtyZXR1cm4hMX1mdW5jdGlvbiBpKCl7dGhpcy5TQk9YPVtdLHRoaXMuSU5WX1NCT1g9W10sdGhpcy5TVUJfTUlYPVtbXSxbXSxbXSxbXV0sdGhpcy5JTlZfU1VCX01JWD1bW10sW10sW10sW11dLHRoaXMuaW5pdCgpLHRoaXMuUkNPTj1bMCwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NF19ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGU9dC5sZW5ndGgvNCxyPW5ldyBBcnJheShlKSxuPS0xOysrbjxlOylyW25dPXQucmVhZFVJbnQzMkJFKDQqbik7cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0KXt0aGlzLl9rZXk9byh0KSx0aGlzLl9kb1Jlc2V0KCl9dmFyIGY9TWF0aC5wb3coMiwzMik7aS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0LGUscixuLGksbyxhLGYscyx1O2Zvcih0PWZ1bmN0aW9uKCl7dmFyIHQscjtmb3Iocj1bXSxlPXQ9MDt0PDI1NjtlPSsrdCllPDEyOD9yLnB1c2goZTw8MSk6ci5wdXNoKGU8PDFeMjgzKTtyZXR1cm4gcn0oKSxpPTAscz0wLGU9dT0wO3U8MjU2O2U9Kyt1KXI9c15zPDwxXnM8PDJeczw8M15zPDw0LHI9cj4+PjheMjU1JnJeOTksdGhpcy5TQk9YW2ldPXIsdGhpcy5JTlZfU0JPWFtyXT1pLG89dFtpXSxhPXRbb10sZj10W2FdLG49MjU3KnRbcl1eMTY4NDMwMDgqcix0aGlzLlNVQl9NSVhbMF1baV09bjw8MjR8bj4+PjgsdGhpcy5TVUJfTUlYWzFdW2ldPW48PDE2fG4+Pj4xNix0aGlzLlNVQl9NSVhbMl1baV09bjw8OHxuPj4+MjQsdGhpcy5TVUJfTUlYWzNdW2ldPW4sbj0xNjg0MzAwOSpmXjY1NTM3KmFeMjU3Km9eMTY4NDMwMDgqaSx0aGlzLklOVl9TVUJfTUlYWzBdW3JdPW48PDI0fG4+Pj44LHRoaXMuSU5WX1NVQl9NSVhbMV1bcl09bjw8MTZ8bj4+PjE2LHRoaXMuSU5WX1NVQl9NSVhbMl1bcl09bjw8OHxuPj4+MjQsdGhpcy5JTlZfU1VCX01JWFszXVtyXT1uLDA9PT1pP2k9cz0xOihpPW9edFt0W3RbZl5vXV1dLHNePXRbdFtzXV0pO3JldHVybiEwfTt2YXIgcz1uZXcgaTthLmJsb2NrU2l6ZT0xNixhLnByb3RvdHlwZS5ibG9ja1NpemU9YS5ibG9ja1NpemUsYS5rZXlTaXplPTMyLGEucHJvdG90eXBlLmtleVNpemU9YS5rZXlTaXplLGEucHJvdG90eXBlLl9kb1Jlc2V0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG4saSxvO2ZvcihyPXRoaXMuX2tleSxlPXIubGVuZ3RoLHRoaXMuX25Sb3VuZHM9ZSs2LGk9NCoodGhpcy5fblJvdW5kcysxKSx0aGlzLl9rZXlTY2hlZHVsZT1bXSxuPTA7bjxpO24rKyl0aGlzLl9rZXlTY2hlZHVsZVtuXT1uPGU/cltuXToobz10aGlzLl9rZXlTY2hlZHVsZVtuLTFdLG4lZT09PTA/KG89bzw8OHxvPj4+MjQsbz1zLlNCT1hbbz4+PjI0XTw8MjR8cy5TQk9YW28+Pj4xNiYyNTVdPDwxNnxzLlNCT1hbbz4+PjgmMjU1XTw8OHxzLlNCT1hbMjU1Jm9dLG9ePXMuUkNPTltuL2V8MF08PDI0KTplPjYmJm4lZT09PTQ/bz1zLlNCT1hbbz4+PjI0XTw8MjR8cy5TQk9YW28+Pj4xNiYyNTVdPDwxNnxzLlNCT1hbbz4+PjgmMjU1XTw8OHxzLlNCT1hbMjU1Jm9dOnZvaWQgMCx0aGlzLl9rZXlTY2hlZHVsZVtuLWVdXm8pO2Zvcih0aGlzLl9pbnZLZXlTY2hlZHVsZT1bXSx0PTA7dDxpO3QrKyluPWktdCxvPXRoaXMuX2tleVNjaGVkdWxlW24tKHQlND8wOjQpXSx0aGlzLl9pbnZLZXlTY2hlZHVsZVt0XT10PDR8fG48PTQ/bzpzLklOVl9TVUJfTUlYWzBdW3MuU0JPWFtvPj4+MjRdXV5zLklOVl9TVUJfTUlYWzFdW3MuU0JPWFtvPj4+MTYmMjU1XV1ecy5JTlZfU1VCX01JWFsyXVtzLlNCT1hbbz4+PjgmMjU1XV1ecy5JTlZfU1VCX01JWFszXVtzLlNCT1hbMjU1Jm9dXTtcbnJldHVybiEwfSxhLnByb3RvdHlwZS5lbmNyeXB0QmxvY2s9ZnVuY3Rpb24oZSl7ZT1vKG5ldyB0KGUpKTt2YXIgcj10aGlzLl9kb0NyeXB0QmxvY2soZSx0aGlzLl9rZXlTY2hlZHVsZSxzLlNVQl9NSVgscy5TQk9YKSxuPW5ldyB0KDE2KTtyZXR1cm4gbi53cml0ZVVJbnQzMkJFKHJbMF0sMCksbi53cml0ZVVJbnQzMkJFKHJbMV0sNCksbi53cml0ZVVJbnQzMkJFKHJbMl0sOCksbi53cml0ZVVJbnQzMkJFKHJbM10sMTIpLG59LGEucHJvdG90eXBlLmRlY3J5cHRCbG9jaz1mdW5jdGlvbihlKXtlPW8obmV3IHQoZSkpO3ZhciByPVtlWzNdLGVbMV1dO2VbMV09clswXSxlWzNdPXJbMV07dmFyIG49dGhpcy5fZG9DcnlwdEJsb2NrKGUsdGhpcy5faW52S2V5U2NoZWR1bGUscy5JTlZfU1VCX01JWCxzLklOVl9TQk9YKSxpPW5ldyB0KDE2KTtyZXR1cm4gaS53cml0ZVVJbnQzMkJFKG5bMF0sMCksaS53cml0ZVVJbnQzMkJFKG5bM10sNCksaS53cml0ZVVJbnQzMkJFKG5bMl0sOCksaS53cml0ZVVJbnQzMkJFKG5bMV0sMTIpLGl9LGEucHJvdG90eXBlLnNjcnViPWZ1bmN0aW9uKCl7bih0aGlzLl9rZXlTY2hlZHVsZSksbih0aGlzLl9pbnZLZXlTY2hlZHVsZSksbih0aGlzLl9rZXkpfSxhLnByb3RvdHlwZS5fZG9DcnlwdEJsb2NrPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvLGEsZixzLHUsaCxjLGQsbDthPXRbMF1eZVswXSxmPXRbMV1eZVsxXSxzPXRbMl1eZVsyXSx1PXRbM11eZVszXSxvPTQ7Zm9yKHZhciBwPTE7cDx0aGlzLl9uUm91bmRzO3ArKyloPW5bMF1bYT4+PjI0XV5uWzFdW2Y+Pj4xNiYyNTVdXm5bMl1bcz4+PjgmMjU1XV5uWzNdWzI1NSZ1XV5lW28rK10sYz1uWzBdW2Y+Pj4yNF1eblsxXVtzPj4+MTYmMjU1XV5uWzJdW3U+Pj44JjI1NV1eblszXVsyNTUmYV1eZVtvKytdLGQ9blswXVtzPj4+MjRdXm5bMV1bdT4+PjE2JjI1NV1eblsyXVthPj4+OCYyNTVdXm5bM11bMjU1JmZdXmVbbysrXSxsPW5bMF1bdT4+PjI0XV5uWzFdW2E+Pj4xNiYyNTVdXm5bMl1bZj4+PjgmMjU1XV5uWzNdWzI1NSZzXV5lW28rK10sYT1oLGY9YyxzPWQsdT1sO3JldHVybiBoPShpW2E+Pj4yNF08PDI0fGlbZj4+PjE2JjI1NV08PDE2fGlbcz4+PjgmMjU1XTw8OHxpWzI1NSZ1XSleZVtvKytdLGM9KGlbZj4+PjI0XTw8MjR8aVtzPj4+MTYmMjU1XTw8MTZ8aVt1Pj4+OCYyNTVdPDw4fGlbMjU1JmFdKV5lW28rK10sZD0oaVtzPj4+MjRdPDwyNHxpW3U+Pj4xNiYyNTVdPDwxNnxpW2E+Pj44JjI1NV08PDh8aVsyNTUmZl0pXmVbbysrXSxsPShpW3U+Pj4yNF08PDI0fGlbYT4+PjE2JjI1NV08PDE2fGlbZj4+PjgmMjU1XTw8OHxpWzI1NSZzXSleZVtvKytdLFtyKGgpLHIoYykscihkKSxyKGwpXX0sZS5BRVM9YX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSl7ZVtcImFlcy0xMjgtZWNiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjAsbW9kZTpcIkVDQlwiLHR5cGU6XCJibG9ja1wifSxlW1wiYWVzLTE5Mi1lY2JcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MCxtb2RlOlwiRUNCXCIsdHlwZTpcImJsb2NrXCJ9LGVbXCJhZXMtMjU2LWVjYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjowLG1vZGU6XCJFQ0JcIix0eXBlOlwiYmxvY2tcIn0sZVtcImFlcy0xMjgtY2JjXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjE2LG1vZGU6XCJDQkNcIix0eXBlOlwiYmxvY2tcIn0sZVtcImFlcy0xOTItY2JjXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTkyLGl2OjE2LG1vZGU6XCJDQkNcIix0eXBlOlwiYmxvY2tcIn0sZVtcImFlcy0yNTYtY2JjXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MjU2LGl2OjE2LG1vZGU6XCJDQkNcIix0eXBlOlwiYmxvY2tcIn0sZS5hZXMxMjg9ZVtcImFlcy0xMjgtY2JjXCJdLGUuYWVzMTkyPWVbXCJhZXMtMTkyLWNiY1wiXSxlLmFlczI1Nj1lW1wiYWVzLTI1Ni1jYmNcIl0sZVtcImFlcy0xMjgtY2ZiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjE2LG1vZGU6XCJDRkJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTkyLWNmYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ0ZCXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTI1Ni1jZmJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTYsbW9kZTpcIkNGQlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtY2ZiOFwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxNixtb2RlOlwiQ0ZCOFwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xOTItY2ZiOFwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ0ZCOFwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0yNTYtY2ZiOFwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjoxNixtb2RlOlwiQ0ZCOFwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtY2ZiMVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxNixtb2RlOlwiQ0ZCMVwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xOTItY2ZiMVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ0ZCMVwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0yNTYtY2ZiMVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjoxNixtb2RlOlwiQ0ZCMVwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtb2ZiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjE2LG1vZGU6XCJPRkJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTkyLW9mYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiT0ZCXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTI1Ni1vZmJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTYsbW9kZTpcIk9GQlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtY3RyXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjE2LG1vZGU6XCJDVFJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTkyLWN0clwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ1RSXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTI1Ni1jdHJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTYsbW9kZTpcIkNUUlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtZ2NtXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjEyLG1vZGU6XCJHQ01cIix0eXBlOlwiYXV0aFwifSxlW1wiYWVzLTE5Mi1nY21cIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MTIsbW9kZTpcIkdDTVwiLHR5cGU6XCJhdXRoXCJ9LGVbXCJhZXMtMjU2LWdjbVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjoxMixtb2RlOlwiR0NNXCIsdHlwZTpcImF1dGhcIn19LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGUscj10Lmxlbmd0aDtyLS07KXtpZihlPXQucmVhZFVJbnQ4KHIpLDI1NSE9PWUpe2UrKyx0LndyaXRlVUludDgoZSxyKTticmVha310LndyaXRlVUludDgoMCxyKX19ZnVuY3Rpb24gaSh0KXt2YXIgZT10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpO3JldHVybiBuKHQuX3ByZXYpLGV9dmFyIG89cig2Nyk7ZS5lbmNyeXB0PWZ1bmN0aW9uKGUscil7Zm9yKDtlLl9jYWNoZS5sZW5ndGg8ci5sZW5ndGg7KWUuX2NhY2hlPXQuY29uY2F0KFtlLl9jYWNoZSxpKGUpXSk7dmFyIG49ZS5fY2FjaGUuc2xpY2UoMCxyLmxlbmd0aCk7cmV0dXJuIGUuX2NhY2hlPWUuX2NhY2hlLnNsaWNlKHIubGVuZ3RoKSxvKHIsbil9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe2kuY2FsbCh0aGlzKSx0aGlzLmhhc2hNb2RlPVwic3RyaW5nXCI9PXR5cGVvZiB0LHRoaXMuaGFzaE1vZGU/dGhpc1t0XT10aGlzLl9maW5hbE9yRGlnZXN0OnRoaXMuZmluYWw9dGhpcy5fZmluYWxPckRpZ2VzdCx0aGlzLl9kZWNvZGVyPW51bGwsdGhpcy5fZW5jb2Rpbmc9bnVsbH12YXIgaT1yKDMxKS5UcmFuc2Zvcm0sbz1yKDIpLGE9cig1MikuU3RyaW5nRGVjb2Rlcjt0LmV4cG9ydHM9bixvKG4saSksbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQscixuKXtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9bmV3IGUodCxyKSk7dmFyIGk9dGhpcy5fdXBkYXRlKHQpO3JldHVybiB0aGlzLmhhc2hNb2RlP3RoaXM6KG4mJihpPXRoaXMuX3RvU3RyaW5nKGksbikpLGkpfSxuLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZz1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUuZ2V0QXV0aFRhZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcInRyeWluZyB0byBnZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGVcIil9LG4ucHJvdG90eXBlLnNldEF1dGhUYWc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpfSxuLnByb3RvdHlwZS5zZXRBQUQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gc2V0IGFhZCBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKX0sbi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dmFyIG47dHJ5e3RoaXMuaGFzaE1vZGU/dGhpcy5fdXBkYXRlKHQpOnRoaXMucHVzaCh0aGlzLl91cGRhdGUodCkpfWNhdGNoKHQpe249dH1maW5hbGx5e3Iobil9fSxuLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24odCl7dmFyIGU7dHJ5e3RoaXMucHVzaCh0aGlzLl9maW5hbCgpKX1jYXRjaCh0KXtlPXR9ZmluYWxseXt0KGUpfX0sbi5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3Q9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fZmluYWwoKXx8bmV3IGUoXCJcIik7cmV0dXJuIHQmJihyPXRoaXMuX3RvU3RyaW5nKHIsdCwhMCkpLHJ9LG4ucHJvdG90eXBlLl90b1N0cmluZz1mdW5jdGlvbih0LGUscil7aWYodGhpcy5fZGVjb2Rlcnx8KHRoaXMuX2RlY29kZXI9bmV3IGEoZSksdGhpcy5fZW5jb2Rpbmc9ZSksdGhpcy5fZW5jb2RpbmchPT1lKXRocm93IG5ldyBFcnJvcihcImNhbid0IHN3aXRjaCBlbmNvZGluZ3NcIik7dmFyIG49dGhpcy5fZGVjb2Rlci53cml0ZSh0KTtyZXR1cm4gciYmKG4rPXRoaXMuX2RlY29kZXIuZW5kKCkpLG59fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fFwiQXNzZXJ0aW9uIGZhaWxlZFwiKX10LmV4cG9ydHM9cixyLmVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtpZih0IT1lKXRocm93IG5ldyBFcnJvcihyfHxcIkFzc2VydGlvbiBmYWlsZWQ6IFwiK3QrXCIgIT0gXCIrZSl9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49ZTtuLmJhc2U9cig1MDgpLG4uc2hvcnQ9cig1MTEpLG4ubW9udD1yKDUxMCksbi5lZHdhcmRzPXIoNTA5KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPWU7bi5iaWdudW09cigxOCksbi5kZWZpbmU9cig1MzApLmRlZmluZSxuLmJhc2U9cig2OCksbi5jb25zdGFudHM9cigyMTUpLG4uZGVjb2RlcnM9cig1MzQpLG4uZW5jb2RlcnM9cig1MzYpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCl7dmFyIGUscjtyZXR1cm4gZT10PmZ8fHQ8MD8ocj1NYXRoLmFicyh0KSVmLHQ8MD9mLXI6cik6dH1mdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7dCsrKXRbZV09MDtyZXR1cm4hMX1mdW5jdGlvbiBpKCl7dGhpcy5TQk9YPVtdLHRoaXMuSU5WX1NCT1g9W10sdGhpcy5TVUJfTUlYPVtbXSxbXSxbXSxbXV0sdGhpcy5JTlZfU1VCX01JWD1bW10sW10sW10sW11dLHRoaXMuaW5pdCgpLHRoaXMuUkNPTj1bMCwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NF19ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGU9dC5sZW5ndGgvNCxyPW5ldyBBcnJheShlKSxuPS0xOysrbjxlOylyW25dPXQucmVhZFVJbnQzMkJFKDQqbik7cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0KXt0aGlzLl9rZXk9byh0KSx0aGlzLl9kb1Jlc2V0KCl9dmFyIGY9TWF0aC5wb3coMiwzMik7aS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0LGUscixuLGksbyxhLGYscyx1O2Zvcih0PWZ1bmN0aW9uKCl7dmFyIHQscjtmb3Iocj1bXSxlPXQ9MDt0PDI1NjtlPSsrdCllPDEyOD9yLnB1c2goZTw8MSk6ci5wdXNoKGU8PDFeMjgzKTtyZXR1cm4gcn0oKSxpPTAscz0wLGU9dT0wO3U8MjU2O2U9Kyt1KXI9c15zPDwxXnM8PDJeczw8M15zPDw0LHI9cj4+PjheMjU1JnJeOTksdGhpcy5TQk9YW2ldPXIsdGhpcy5JTlZfU0JPWFtyXT1pLG89dFtpXSxhPXRbb10sZj10W2FdLG49MjU3KnRbcl1eMTY4NDMwMDgqcix0aGlzLlNVQl9NSVhbMF1baV09bjw8MjR8bj4+PjgsdGhpcy5TVUJfTUlYWzFdW2ldPW48PDE2fG4+Pj4xNix0aGlzLlNVQl9NSVhbMl1baV09bjw8OHxuPj4+MjQsdGhpcy5TVUJfTUlYWzNdW2ldPW4sbj0xNjg0MzAwOSpmXjY1NTM3KmFeMjU3Km9eMTY4NDMwMDgqaSx0aGlzLklOVl9TVUJfTUlYWzBdW3JdPW48PDI0fG4+Pj44LHRoaXMuSU5WX1NVQl9NSVhbMV1bcl09bjw8MTZ8bj4+PjE2LHRoaXMuSU5WX1NVQl9NSVhbMl1bcl09bjw8OHxuPj4+MjQsdGhpcy5JTlZfU1VCX01JWFszXVtyXT1uLDA9PT1pP2k9cz0xOihpPW9edFt0W3RbZl5vXV1dLHNePXRbdFtzXV0pO3JldHVybiEwfTt2YXIgcz1uZXcgaTthLmJsb2NrU2l6ZT0xNixhLnByb3RvdHlwZS5ibG9ja1NpemU9YS5ibG9ja1NpemUsYS5rZXlTaXplPTMyLGEucHJvdG90eXBlLmtleVNpemU9YS5rZXlTaXplLGEucHJvdG90eXBlLl9kb1Jlc2V0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG4saSxvO2ZvcihyPXRoaXMuX2tleSxlPXIubGVuZ3RoLHRoaXMuX25Sb3VuZHM9ZSs2LGk9NCoodGhpcy5fblJvdW5kcysxKSx0aGlzLl9rZXlTY2hlZHVsZT1bXSxuPTA7bjxpO24rKyl0aGlzLl9rZXlTY2hlZHVsZVtuXT1uPGU/cltuXToobz10aGlzLl9rZXlTY2hlZHVsZVtuLTFdLG4lZT09PTA/KG89bzw8OHxvPj4+MjQsbz1zLlNCT1hbbz4+PjI0XTw8MjR8cy5TQk9YW28+Pj4xNiYyNTVdPDwxNnxzLlNCT1hbbz4+PjgmMjU1XTw8OHxzLlNCT1hbMjU1Jm9dLG9ePXMuUkNPTltuL2V8MF08PDI0KTplPjYmJm4lZT09PTQ/bz1zLlNCT1hbbz4+PjI0XTw8MjR8cy5TQk9YW28+Pj4xNiYyNTVdPDwxNnxzLlNCT1hbbz4+PjgmMjU1XTw8OHxzLlNCT1hbMjU1Jm9dOnZvaWQgMCx0aGlzLl9rZXlTY2hlZHVsZVtuLWVdXm8pO2Zvcih0aGlzLl9pbnZLZXlTY2hlZHVsZT1bXSx0PTA7dDxpO3QrKyluPWktdCxvPXRoaXMuX2tleVNjaGVkdWxlW24tKHQlND8wOjQpXSx0aGlzLl9pbnZLZXlTY2hlZHVsZVt0XT10PDR8fG48PTQ/bzpzLklOVl9TVUJfTUlYWzBdW3MuU0JPWFtvPj4+MjRdXV5zLklOVl9TVUJfTUlYWzFdW3MuU0JPWFtvPj4+MTYmMjU1XV1ecy5JTlZfU1VCX01JWFsyXVtzLlNCT1hbbz4+PjgmMjU1XV1ecy5JTlZfU1VCX01JWFszXVtzLlNCT1hbMjU1Jm9dXTtyZXR1cm4hMH0sYS5wcm90b3R5cGUuZW5jcnlwdEJsb2NrPWZ1bmN0aW9uKGUpe2U9byhuZXcgdChlKSk7dmFyIHI9dGhpcy5fZG9DcnlwdEJsb2NrKGUsdGhpcy5fa2V5U2NoZWR1bGUscy5TVUJfTUlYLHMuU0JPWCksbj1uZXcgdCgxNik7cmV0dXJuIG4ud3JpdGVVSW50MzJCRShyWzBdLDApLG4ud3JpdGVVSW50MzJCRShyWzFdLDQpLG4ud3JpdGVVSW50MzJCRShyWzJdLDgpLG4ud3JpdGVVSW50MzJCRShyWzNdLDEyKSxufSxhLnByb3RvdHlwZS5kZWNyeXB0QmxvY2s9ZnVuY3Rpb24oZSl7ZT1vKG5ldyB0KGUpKTt2YXIgcj1bZVszXSxlWzFdXTtlWzFdPXJbMF0sZVszXT1yWzFdO3ZhciBuPXRoaXMuX2RvQ3J5cHRCbG9jayhlLHRoaXMuX2ludktleVNjaGVkdWxlLHMuSU5WX1NVQl9NSVgscy5JTlZfU0JPWCksaT1uZXcgdCgxNik7cmV0dXJuIGkud3JpdGVVSW50MzJCRShuWzBdLDApLGkud3JpdGVVSW50MzJCRShuWzNdLDQpLGkud3JpdGVVSW50MzJCRShuWzJdLDgpLGkud3JpdGVVSW50MzJCRShuWzFdLDEyKSxpfSxhLnByb3RvdHlwZS5zY3J1Yj1mdW5jdGlvbigpe24odGhpcy5fa2V5U2NoZWR1bGUpLG4odGhpcy5faW52S2V5U2NoZWR1bGUpLG4odGhpcy5fa2V5KX0sYS5wcm90b3R5cGUuX2RvQ3J5cHRCbG9jaz1mdW5jdGlvbih0LGUsbixpKXt2YXIgbyxhLGYscyx1LGgsYyxkLGw7YT10WzBdXmVbMF0sZj10WzFdXmVbMV0scz10WzJdXmVbMl0sdT10WzNdXmVbM10sbz00O2Zvcih2YXIgcD0xO3A8dGhpcy5fblJvdW5kcztwKyspaD1uWzBdW2E+Pj4yNF1eblsxXVtmPj4+MTYmMjU1XV5uWzJdW3M+Pj44JjI1NV1eblszXVsyNTUmdV1eZVtvKytdLGM9blswXVtmPj4+MjRdXm5bMV1bcz4+PjE2JjI1NV1eblsyXVt1Pj4+OCYyNTVdXm5bM11bMjU1JmFdXmVbbysrXSxkPW5bMF1bcz4+PjI0XV5uWzFdW3U+Pj4xNiYyNTVdXm5bMl1bYT4+PjgmMjU1XV5uWzNdWzI1NSZmXV5lW28rK10sbD1uWzBdW3U+Pj4yNF1eblsxXVthPj4+MTYmMjU1XV5uWzJdW2Y+Pj44JjI1NV1eblszXVsyNTUmc11eZVtvKytdLGE9aCxmPWMscz1kLHU9bDtyZXR1cm4gaD0oaVthPj4+MjRdPDwyNHxpW2Y+Pj4xNiYyNTVdPDwxNnxpW3M+Pj44JjI1NV08PDh8aVsyNTUmdV0pXmVbbysrXSxjPShpW2Y+Pj4yNF08PDI0fGlbcz4+PjE2JjI1NV08PDE2fGlbdT4+PjgmMjU1XTw8OHxpWzI1NSZhXSleZVtvKytdLGQ9KGlbcz4+PjI0XTw8MjR8aVt1Pj4+MTYmMjU1XTw8MTZ8aVthPj4+OCYyNTVdPDw4fGlbMjU1JmZdKV5lW28rK10sbD0oaVt1Pj4+MjRdPDwyNHxpW2E+Pj4xNiYyNTVdPDwxNnxpW2Y+Pj44JjI1NV08PDh8aVsyNTUmc10pXmVbbysrXSxbcihoKSxyKGMpLHIoZCkscihsKV19LGUuQUVTPWF9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBlLHI9dC5sZW5ndGg7ci0tOyl7aWYoZT10LnJlYWRVSW50OChyKSwyNTUhPT1lKXtlKyssdC53cml0ZVVJbnQ4KGUscik7YnJlYWt9dC53cml0ZVVJbnQ4KDAscil9fWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5fY2lwaGVyLmVuY3J5cHRCbG9jayh0Ll9wcmV2KTtyZXR1cm4gbih0Ll9wcmV2KSxlfXZhciBvPXIoNjkpO2UuZW5jcnlwdD1mdW5jdGlvbihlLHIpe2Zvcig7ZS5fY2FjaGUubGVuZ3RoPHIubGVuZ3RoOyllLl9jYWNoZT10LmNvbmNhdChbZS5fY2FjaGUsaShlKV0pO3ZhciBuPWUuX2NhY2hlLnNsaWNlKDAsci5sZW5ndGgpO3JldHVybiBlLl9jYWNoZT1lLl9jYWNoZS5zbGljZShyLmxlbmd0aCksbyhyLG4pfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0KXtpLmNhbGwodGhpcyksdGhpcy5oYXNoTW9kZT1cInN0cmluZ1wiPT10eXBlb2YgdCx0aGlzLmhhc2hNb2RlP3RoaXNbdF09dGhpcy5fZmluYWxPckRpZ2VzdDp0aGlzLmZpbmFsPXRoaXMuX2ZpbmFsT3JEaWdlc3QsdGhpcy5fZGVjb2Rlcj1udWxsLHRoaXMuX2VuY29kaW5nPW51bGx9dmFyIGk9cigzMSkuVHJhbnNmb3JtLG89cigyKSxhPXIoNTIpLlN0cmluZ0RlY29kZXI7dC5leHBvcnRzPW4sbyhuLGkpLG4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LHIsbil7XCJzdHJpbmdcIj09dHlwZW9mIHQmJih0PW5ldyBlKHQscikpO3ZhciBpPXRoaXMuX3VwZGF0ZSh0KTtyZXR1cm4gdGhpcy5oYXNoTW9kZT90aGlzOihuJiYoaT10aGlzLl90b1N0cmluZyhpLG4pKSxpKX0sbi5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmc9ZnVuY3Rpb24oKXt9LG4ucHJvdG90eXBlLmdldEF1dGhUYWc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gZ2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpfSxuLnByb3RvdHlwZS5zZXRBdXRoVGFnPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwidHJ5aW5nIHRvIHNldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKX0sbi5wcm90b3R5cGUuc2V0QUFEPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwidHJ5aW5nIHRvIHNldCBhYWQgaW4gdW5zdXBwb3J0ZWQgc3RhdGVcIil9LG4ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3ZhciBuO3RyeXt0aGlzLmhhc2hNb2RlP3RoaXMuX3VwZGF0ZSh0KTp0aGlzLnB1c2godGhpcy5fdXBkYXRlKHQpKX1jYXRjaCh0KXtuPXR9ZmluYWxseXtyKG4pfX0sbi5wcm90b3R5cGUuX2ZsdXNoPWZ1bmN0aW9uKHQpe3ZhciBlO3RyeXt0aGlzLnB1c2godGhpcy5fZmluYWwoKSl9Y2F0Y2godCl7ZT10fWZpbmFsbHl7dChlKX19LG4ucHJvdG90eXBlLl9maW5hbE9yRGlnZXN0PWZ1bmN0aW9uKHQpe3ZhciByPXRoaXMuX2ZpbmFsKCl8fG5ldyBlKFwiXCIpO3JldHVybiB0JiYocj10aGlzLl90b1N0cmluZyhyLHQsITApKSxyfSxuLnByb3RvdHlwZS5fdG9TdHJpbmc9ZnVuY3Rpb24odCxlLHIpe2lmKHRoaXMuX2RlY29kZXJ8fCh0aGlzLl9kZWNvZGVyPW5ldyBhKGUpLHRoaXMuX2VuY29kaW5nPWUpLHRoaXMuX2VuY29kaW5nIT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJjYW4ndCBzd2l0Y2ggZW5jb2RpbmdzXCIpO3ZhciBuPXRoaXMuX2RlY29kZXIud3JpdGUodCk7cmV0dXJuIHImJihuKz10aGlzLl9kZWNvZGVyLmVuZCgpKSxufX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1lO24uYmFzZT1yKDU0NSksbi5zaG9ydD1yKDU0OCksbi5tb250PXIoNTQ3KSxuLmVkd2FyZHM9cig1NDYpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe3RbZT4+NV18PTEyODw8ZSUzMix0WyhlKzY0Pj4+OTw8NCkrMTRdPWU7Zm9yKHZhciByPTE3MzI1ODQxOTMsbj0tMjcxNzMzODc5LGk9LTE3MzI1ODQxOTQsaD0yNzE3MzM4NzgsYz0wO2M8dC5sZW5ndGg7Yys9MTYpe3ZhciBkPXIsbD1uLHA9aSxiPWg7cj1vKHIsbixpLGgsdFtjKzBdLDcsLTY4MDg3NjkzNiksaD1vKGgscixuLGksdFtjKzFdLDEyLC0zODk1NjQ1ODYpLGk9byhpLGgscixuLHRbYysyXSwxNyw2MDYxMDU4MTkpLG49byhuLGksaCxyLHRbYyszXSwyMiwtMTA0NDUyNTMzMCkscj1vKHIsbixpLGgsdFtjKzRdLDcsLTE3NjQxODg5NyksaD1vKGgscixuLGksdFtjKzVdLDEyLDEyMDAwODA0MjYpLGk9byhpLGgscixuLHRbYys2XSwxNywtMTQ3MzIzMTM0MSksbj1vKG4saSxoLHIsdFtjKzddLDIyLC00NTcwNTk4Mykscj1vKHIsbixpLGgsdFtjKzhdLDcsMTc3MDAzNTQxNiksaD1vKGgscixuLGksdFtjKzldLDEyLC0xOTU4NDE0NDE3KSxpPW8oaSxoLHIsbix0W2MrMTBdLDE3LC00MjA2Myksbj1vKG4saSxoLHIsdFtjKzExXSwyMiwtMTk5MDQwNDE2Mikscj1vKHIsbixpLGgsdFtjKzEyXSw3LDE4MDQ2MDM2ODIpLGg9byhoLHIsbixpLHRbYysxM10sMTIsLTQwMzQxMTAxKSxpPW8oaSxoLHIsbix0W2MrMTRdLDE3LC0xNTAyMDAyMjkwKSxuPW8obixpLGgscix0W2MrMTVdLDIyLDEyMzY1MzUzMjkpLHI9YShyLG4saSxoLHRbYysxXSw1LC0xNjU3OTY1MTApLGg9YShoLHIsbixpLHRbYys2XSw5LC0xMDY5NTAxNjMyKSxpPWEoaSxoLHIsbix0W2MrMTFdLDE0LDY0MzcxNzcxMyksbj1hKG4saSxoLHIsdFtjKzBdLDIwLC0zNzM4OTczMDIpLHI9YShyLG4saSxoLHRbYys1XSw1LC03MDE1NTg2OTEpLGg9YShoLHIsbixpLHRbYysxMF0sOSwzODAxNjA4MyksaT1hKGksaCxyLG4sdFtjKzE1XSwxNCwtNjYwNDc4MzM1KSxuPWEobixpLGgscix0W2MrNF0sMjAsLTQwNTUzNzg0OCkscj1hKHIsbixpLGgsdFtjKzldLDUsNTY4NDQ2NDM4KSxoPWEoaCxyLG4saSx0W2MrMTRdLDksLTEwMTk4MDM2OTApLGk9YShpLGgscixuLHRbYyszXSwxNCwtMTg3MzYzOTYxKSxuPWEobixpLGgscix0W2MrOF0sMjAsMTE2MzUzMTUwMSkscj1hKHIsbixpLGgsdFtjKzEzXSw1LC0xNDQ0NjgxNDY3KSxoPWEoaCxyLG4saSx0W2MrMl0sOSwtNTE0MDM3ODQpLGk9YShpLGgscixuLHRbYys3XSwxNCwxNzM1MzI4NDczKSxuPWEobixpLGgscix0W2MrMTJdLDIwLC0xOTI2NjA3NzM0KSxyPWYocixuLGksaCx0W2MrNV0sNCwtMzc4NTU4KSxoPWYoaCxyLG4saSx0W2MrOF0sMTEsLTIwMjI1NzQ0NjMpLGk9ZihpLGgscixuLHRbYysxMV0sMTYsMTgzOTAzMDU2Miksbj1mKG4saSxoLHIsdFtjKzE0XSwyMywtMzUzMDk1NTYpLHI9ZihyLG4saSxoLHRbYysxXSw0LC0xNTMwOTkyMDYwKSxoPWYoaCxyLG4saSx0W2MrNF0sMTEsMTI3Mjg5MzM1MyksaT1mKGksaCxyLG4sdFtjKzddLDE2LC0xNTU0OTc2MzIpLG49ZihuLGksaCxyLHRbYysxMF0sMjMsLTEwOTQ3MzA2NDApLHI9ZihyLG4saSxoLHRbYysxM10sNCw2ODEyNzkxNzQpLGg9ZihoLHIsbixpLHRbYyswXSwxMSwtMzU4NTM3MjIyKSxpPWYoaSxoLHIsbix0W2MrM10sMTYsLTcyMjUyMTk3OSksbj1mKG4saSxoLHIsdFtjKzZdLDIzLDc2MDI5MTg5KSxyPWYocixuLGksaCx0W2MrOV0sNCwtNjQwMzY0NDg3KSxoPWYoaCxyLG4saSx0W2MrMTJdLDExLC00MjE4MTU4MzUpLGk9ZihpLGgscixuLHRbYysxNV0sMTYsNTMwNzQyNTIwKSxuPWYobixpLGgscix0W2MrMl0sMjMsLTk5NTMzODY1MSkscj1zKHIsbixpLGgsdFtjKzBdLDYsLTE5ODYzMDg0NCksaD1zKGgscixuLGksdFtjKzddLDEwLDExMjY4OTE0MTUpLGk9cyhpLGgscixuLHRbYysxNF0sMTUsLTE0MTYzNTQ5MDUpLG49cyhuLGksaCxyLHRbYys1XSwyMSwtNTc0MzQwNTUpLHI9cyhyLG4saSxoLHRbYysxMl0sNiwxNzAwNDg1NTcxKSxoPXMoaCxyLG4saSx0W2MrM10sMTAsLTE4OTQ5ODY2MDYpLGk9cyhpLGgscixuLHRbYysxMF0sMTUsLTEwNTE1MjMpLG49cyhuLGksaCxyLHRbYysxXSwyMSwtMjA1NDkyMjc5OSkscj1zKHIsbixpLGgsdFtjKzhdLDYsMTg3MzMxMzM1OSksaD1zKGgscixuLGksdFtjKzE1XSwxMCwtMzA2MTE3NDQpLGk9cyhpLGgscixuLHRbYys2XSwxNSwtMTU2MDE5ODM4MCksbj1zKG4saSxoLHIsdFtjKzEzXSwyMSwxMzA5MTUxNjQ5KSxyPXMocixuLGksaCx0W2MrNF0sNiwtMTQ1NTIzMDcwKSxoPXMoaCxyLG4saSx0W2MrMTFdLDEwLC0xMTIwMjEwMzc5KSxpPXMoaSxoLHIsbix0W2MrMl0sMTUsNzE4Nzg3MjU5KSxuPXMobixpLGgscix0W2MrOV0sMjEsLTM0MzQ4NTU1MSkscj11KHIsZCksbj11KG4sbCksaT11KGkscCksaD11KGgsYil9cmV0dXJuIEFycmF5KHIsbixpLGgpfWZ1bmN0aW9uIGkodCxlLHIsbixpLG8pe3JldHVybiB1KGgodSh1KGUsdCksdShuLG8pKSxpKSxyKX1mdW5jdGlvbiBvKHQsZSxyLG4sbyxhLGYpe3JldHVybiBpKGUmcnx+ZSZuLHQsZSxvLGEsZil9ZnVuY3Rpb24gYSh0LGUscixuLG8sYSxmKXtyZXR1cm4gaShlJm58ciZ+bix0LGUsbyxhLGYpfWZ1bmN0aW9uIGYodCxlLHIsbixvLGEsZil7cmV0dXJuIGkoZV5yXm4sdCxlLG8sYSxmKX1mdW5jdGlvbiBzKHQsZSxyLG4sbyxhLGYpe3JldHVybiBpKHJeKGV8fm4pLHQsZSxvLGEsZil9ZnVuY3Rpb24gdSh0LGUpe3ZhciByPSg2NTUzNSZ0KSsoNjU1MzUmZSksbj0odD4+MTYpKyhlPj4xNikrKHI+PjE2KTtyZXR1cm4gbjw8MTZ8NjU1MzUmcn1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuIHQ8PGV8dD4+PjMyLWV9dmFyIGM9cig1NjUpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gYy5oYXNoKHQsbiwxNil9fSxmdW5jdGlvbih0LGUscil7dmFyIG49ZTtuLmJpZ251bT1yKDcwKSxuLmRlZmluZT1yKDU4MCkuZGVmaW5lLG4uYmFzZT1yKDcxKSxuLmNvbnN0YW50cz1yKDIzNSksbi5kZWNvZGVycz1yKDU4NCksbi5lbmNvZGVycz1yKDU4Nil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gcih0KXt2YXIgZSxyO3JldHVybiBlPXQ+Znx8dDwwPyhyPU1hdGguYWJzKHQpJWYsdDwwP2YtcjpyKTp0fWZ1bmN0aW9uIG4odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDt0KyspdFtlXT0wO3JldHVybiExfWZ1bmN0aW9uIGkoKXt0aGlzLlNCT1g9W10sdGhpcy5JTlZfU0JPWD1bXSx0aGlzLlNVQl9NSVg9W1tdLFtdLFtdLFtdXSx0aGlzLklOVl9TVUJfTUlYPVtbXSxbXSxbXSxbXV0sdGhpcy5pbml0KCksdGhpcy5SQ09OPVswLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0XX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT10Lmxlbmd0aC80LHI9bmV3IEFycmF5KGUpLG49LTE7KytuPGU7KXJbbl09dC5yZWFkVUludDMyQkUoNCpuKTtyZXR1cm4gcn1mdW5jdGlvbiBhKHQpe3RoaXMuX2tleT1vKHQpLHRoaXMuX2RvUmVzZXQoKX12YXIgZj1NYXRoLnBvdygyLDMyKTtpLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG4saSxvLGEsZixzLHU7Zm9yKHQ9ZnVuY3Rpb24oKXt2YXIgdCxyO2ZvcihyPVtdLGU9dD0wO3Q8MjU2O2U9Kyt0KWU8MTI4P3IucHVzaChlPDwxKTpyLnB1c2goZTw8MV4yODMpO3JldHVybiByfSgpLGk9MCxzPTAsZT11PTA7dTwyNTY7ZT0rK3Upcj1zXnM8PDFeczw8Ml5zPDwzXnM8PDQscj1yPj4+OF4yNTUmcl45OSx0aGlzLlNCT1hbaV09cix0aGlzLklOVl9TQk9YW3JdPWksbz10W2ldLGE9dFtvXSxmPXRbYV0sbj0yNTcqdFtyXV4xNjg0MzAwOCpyLHRoaXMuU1VCX01JWFswXVtpXT1uPDwyNHxuPj4+OCx0aGlzLlNVQl9NSVhbMV1baV09bjw8MTZ8bj4+PjE2LHRoaXMuU1VCX01JWFsyXVtpXT1uPDw4fG4+Pj4yNCx0aGlzLlNVQl9NSVhbM11baV09bixuPTE2ODQzMDA5KmZeNjU1MzcqYV4yNTcqb14xNjg0MzAwOCppLHRoaXMuSU5WX1NVQl9NSVhbMF1bcl09bjw8MjR8bj4+PjgsdGhpcy5JTlZfU1VCX01JWFsxXVtyXT1uPDwxNnxuPj4+MTYsdGhpcy5JTlZfU1VCX01JWFsyXVtyXT1uPDw4fG4+Pj4yNCx0aGlzLklOVl9TVUJfTUlYWzNdW3JdPW4sMD09PWk/aT1zPTE6KGk9b150W3RbdFtmXm9dXV0sc149dFt0W3NdXSk7cmV0dXJuITB9O3ZhciBzPW5ldyBpO2EuYmxvY2tTaXplPTE2LGEucHJvdG90eXBlLmJsb2NrU2l6ZT1hLmJsb2NrU2l6ZSxhLmtleVNpemU9MzIsYS5wcm90b3R5cGUua2V5U2l6ZT1hLmtleVNpemUsYS5wcm90b3R5cGUuX2RvUmVzZXQ9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbixpLG87Zm9yKHI9dGhpcy5fa2V5LGU9ci5sZW5ndGgsdGhpcy5fblJvdW5kcz1lKzYsaT00Kih0aGlzLl9uUm91bmRzKzEpLHRoaXMuX2tleVNjaGVkdWxlPVtdLG49MDtuPGk7bisrKXRoaXMuX2tleVNjaGVkdWxlW25dPW48ZT9yW25dOihvPXRoaXMuX2tleVNjaGVkdWxlW24tMV0sbiVlPT09MD8obz1vPDw4fG8+Pj4yNCxvPXMuU0JPWFtvPj4+MjRdPDwyNHxzLlNCT1hbbz4+PjE2JjI1NV08PDE2fHMuU0JPWFtvPj4+OCYyNTVdPDw4fHMuU0JPWFsyNTUmb10sb149cy5SQ09OW24vZXwwXTw8MjQpOmU+NiYmbiVlPT09ND9vPXMuU0JPWFtvPj4+MjRdPDwyNHxzLlNCT1hbbz4+PjE2JjI1NV08PDE2fHMuU0JPWFtvPj4+OCYyNTVdPDw4fHMuU0JPWFsyNTUmb106dm9pZCAwLHRoaXMuX2tleVNjaGVkdWxlW24tZV1ebyk7Zm9yKHRoaXMuX2ludktleVNjaGVkdWxlPVtdLHQ9MDt0PGk7dCsrKW49aS10LG89dGhpcy5fa2V5U2NoZWR1bGVbbi0odCU0PzA6NCldLHRoaXMuX2ludktleVNjaGVkdWxlW3RdPXQ8NHx8bjw9ND9vOnMuSU5WX1NVQl9NSVhbMF1bcy5TQk9YW28+Pj4yNF1dXnMuSU5WX1NVQl9NSVhbMV1bcy5TQk9YW28+Pj4xNiYyNTVdXV5zLklOVl9TVUJfTUlYWzJdW3MuU0JPWFtvPj4+OCYyNTVdXV5zLklOVl9TVUJfTUlYWzNdW3MuU0JPWFsyNTUmb11dO3JldHVybiEwfSxhLnByb3RvdHlwZS5lbmNyeXB0QmxvY2s9ZnVuY3Rpb24oZSl7ZT1vKG5ldyB0KGUpKTt2YXIgcj10aGlzLl9kb0NyeXB0QmxvY2soZSx0aGlzLl9rZXlTY2hlZHVsZSxzLlNVQl9NSVgscy5TQk9YKSxuPW5ldyB0KDE2KTtyZXR1cm4gbi53cml0ZVVJbnQzMkJFKHJbMF0sMCksbi53cml0ZVVJbnQzMkJFKHJbMV0sNCksbi53cml0ZVVJbnQzMkJFKHJbMl0sOCksbi53cml0ZVVJbnQzMkJFKHJbM10sMTIpLG59LGEucHJvdG90eXBlLmRlY3J5cHRCbG9jaz1mdW5jdGlvbihlKXtlPW8obmV3IHQoZSkpO3ZhciByPVtlWzNdLGVbMV1dO2VbMV09clswXSxlWzNdPXJbMV07dmFyIG49dGhpcy5fZG9DcnlwdEJsb2NrKGUsdGhpcy5faW52S2V5U2NoZWR1bGUscy5JTlZfU1VCX01JWCxzLklOVl9TQk9YKSxpPW5ldyB0KDE2KTtyZXR1cm4gaS53cml0ZVVJbnQzMkJFKG5bMF0sMCksaS53cml0ZVVJbnQzMkJFKG5bM10sNCksaS53cml0ZVVJbnQzMkJFKG5bMl0sOCksaS53cml0ZVVJbnQzMkJFKG5bMV0sMTIpLGl9LGEucHJvdG90eXBlLnNjcnViPWZ1bmN0aW9uKCl7bih0aGlzLl9rZXlTY2hlZHVsZSksbih0aGlzLl9pbnZLZXlTY2hlZHVsZSksbih0aGlzLl9rZXkpfSxhLnByb3RvdHlwZS5fZG9DcnlwdEJsb2NrPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvLGEsZixzLHUsaCxjLGQsbDthPXRbMF1eZVswXSxmPXRbMV1eZVsxXSxzPXRbMl1eZVsyXSx1PXRbM11eZVszXSxvPTQ7Zm9yKHZhciBwPTE7cDx0aGlzLl9uUm91bmRzO3ArKyloPW5bMF1bYT4+PjI0XV5uWzFdW2Y+Pj4xNiYyNTVdXm5bMl1bcz4+PjgmMjU1XV5uWzNdWzI1NSZ1XV5lW28rK10sYz1uWzBdW2Y+Pj4yNF1eblsxXVtzPj4+MTYmMjU1XV5uWzJdW3U+Pj44JjI1NV1eblszXVsyNTUmYV1eZVtvKytdLGQ9blswXVtzPj4+MjRdXm5bMV1bdT4+PjE2JjI1NV1eblsyXVthPj4+OCYyNTVdXm5bM11bMjU1JmZdXmVbbysrXSxsPW5bMF1bdT4+PjI0XV5uWzFdW2E+Pj4xNiYyNTVdXm5bMl1bZj4+PjgmMjU1XV5uWzNdWzI1NSZzXV5lW28rK10sYT1oLGY9YyxzPWQsdT1sO3JldHVybiBoPShpW2E+Pj4yNF08PDI0fGlbZj4+PjE2JjI1NV08PDE2fGlbcz4+PjgmMjU1XTw8OHxpWzI1NSZ1XSleZVtvKytdLGM9KGlbZj4+PjI0XTw8MjR8aVtzPj4+MTYmMjU1XTw8MTZ8aVt1Pj4+OCYyNTVdPDw4fGlbMjU1JmFdKV5lW28rK10sZD0oaVtzPj4+MjRdPDwyNHxpW3U+Pj4xNiYyNTVdPDwxNnxpW2E+Pj44JjI1NV08PDh8aVsyNTUmZl0pXmVbbysrXSxsPShpW3U+Pj4yNF08PDI0fGlbYT4+PjE2JjI1NV08PDE2fGlbZj4+PjgmMjU1XTw8OHxpWzI1NSZzXSleZVtvKytdLFtyKGgpLHIoYykscihkKSxyKGwpXX0sZS5BRVM9YX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGUscj10Lmxlbmd0aDtyLS07KXtpZihlPXQucmVhZFVJbnQ4KHIpLDI1NSE9PWUpe2UrKyx0LndyaXRlVUludDgoZSxyKTticmVha310LndyaXRlVUludDgoMCxyKX19ZnVuY3Rpb24gaSh0KXt2YXIgZT10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpO3JldHVybiBuKHQuX3ByZXYpLGV9dmFyIG89cig3Mik7ZS5lbmNyeXB0PWZ1bmN0aW9uKGUscil7Zm9yKDtlLl9jYWNoZS5sZW5ndGg8ci5sZW5ndGg7KWUuX2NhY2hlPXQuY29uY2F0KFtlLl9jYWNoZSxpKGUpXSk7dmFyIG49ZS5fY2FjaGUuc2xpY2UoMCxyLmxlbmd0aCk7cmV0dXJuIGUuX2NhY2hlPWUuX2NhY2hlLnNsaWNlKHIubGVuZ3RoKSxvKHIsbil9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe2kuY2FsbCh0aGlzKSx0aGlzLmhhc2hNb2RlPVwic3RyaW5nXCI9PXR5cGVvZiB0LHRoaXMuaGFzaE1vZGU/dGhpc1t0XT10aGlzLl9maW5hbE9yRGlnZXN0OnRoaXMuZmluYWw9dGhpcy5fZmluYWxPckRpZ2VzdCx0aGlzLl9kZWNvZGVyPW51bGwsdGhpcy5fZW5jb2Rpbmc9bnVsbH12YXIgaT1yKDMxKS5UcmFuc2Zvcm0sbz1yKDIpLGE9cig1MikuU3RyaW5nRGVjb2Rlcjt0LmV4cG9ydHM9bixvKG4saSksbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQscixuKXtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9bmV3IGUodCxyKSk7dmFyIGk9dGhpcy5fdXBkYXRlKHQpO3JldHVybiB0aGlzLmhhc2hNb2RlP3RoaXM6KG4mJihpPXRoaXMuX3RvU3RyaW5nKGksbikpLGkpfSxuLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZz1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUuZ2V0QXV0aFRhZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcInRyeWluZyB0byBnZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGVcIil9LG4ucHJvdG90eXBlLnNldEF1dGhUYWc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpfSxuLnByb3RvdHlwZS5zZXRBQUQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gc2V0IGFhZCBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKX0sbi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dmFyIG47dHJ5e3RoaXMuaGFzaE1vZGU/dGhpcy5fdXBkYXRlKHQpOnRoaXMucHVzaCh0aGlzLl91cGRhdGUodCkpfWNhdGNoKHQpe249dH1maW5hbGx5e3Iobil9fSxuLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24odCl7dmFyIGU7dHJ5e3RoaXMucHVzaCh0aGlzLl9maW5hbCgpKX1jYXRjaCh0KXtlPXR9ZmluYWxseXt0KGUpfX0sbi5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3Q9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fZmluYWwoKXx8bmV3IGUoXCJcIik7cmV0dXJuIHQmJihyPXRoaXMuX3RvU3RyaW5nKHIsdCwhMCkpLHJ9LG4ucHJvdG90eXBlLl90b1N0cmluZz1mdW5jdGlvbih0LGUscil7aWYodGhpcy5fZGVjb2Rlcnx8KHRoaXMuX2RlY29kZXI9bmV3IGEoZSksdGhpcy5fZW5jb2Rpbmc9ZSksdGhpcy5fZW5jb2RpbmchPT1lKXRocm93IG5ldyBFcnJvcihcImNhbid0IHN3aXRjaCBlbmNvZGluZ3NcIik7dmFyIG49dGhpcy5fZGVjb2Rlci53cml0ZSh0KTtyZXR1cm4gciYmKG4rPXRoaXMuX2RlY29kZXIuZW5kKCkpLG59fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dGhpcy5fZXZlbnRzPXRoaXMuX2V2ZW50c3x8e30sdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfWZ1bmN0aW9uIG4odCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdH1mdW5jdGlvbiBpKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0fWZ1bmN0aW9uIG8odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIGEodCl7cmV0dXJuIHZvaWQgMD09PXR9dC5leHBvcnRzPXIsci5FdmVudEVtaXR0ZXI9cixyLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMCxyLmRlZmF1bHRNYXhMaXN0ZW5lcnM9MTAsci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe2lmKCFpKHQpfHx0PDB8fGlzTmFOKHQpKXRocm93IFR5cGVFcnJvcihcIm4gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlclwiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXQsdGhpc30sci5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxyLGksZixzLHU7aWYodGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSxcImVycm9yXCI9PT10JiYoIXRoaXMuX2V2ZW50cy5lcnJvcnx8byh0aGlzLl9ldmVudHMuZXJyb3IpJiYhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpe2lmKGU9YXJndW1lbnRzWzFdLGUgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBoPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcrZStcIilcIik7dGhyb3cgaC5jb250ZXh0PWUsaH1pZihyPXRoaXMuX2V2ZW50c1t0XSxhKHIpKXJldHVybiExO2lmKG4ocikpc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpyLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSAyOnIuY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOnIuY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2RlZmF1bHQ6Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksci5hcHBseSh0aGlzLGYpfWVsc2UgaWYobyhyKSlmb3IoZj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksdT1yLnNsaWNlKCksaT11Lmxlbmd0aCxzPTA7czxpO3MrKyl1W3NdLmFwcGx5KHRoaXMsZik7cmV0dXJuITB9LHIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIGk7aWYoIW4oZSkpdGhyb3cgVHlwZUVycm9yKFwibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO3JldHVybiB0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lciYmdGhpcy5lbWl0KFwibmV3TGlzdGVuZXJcIix0LG4oZS5saXN0ZW5lcik/ZS5saXN0ZW5lcjplKSx0aGlzLl9ldmVudHNbdF0/byh0aGlzLl9ldmVudHNbdF0pP3RoaXMuX2V2ZW50c1t0XS5wdXNoKGUpOnRoaXMuX2V2ZW50c1t0XT1bdGhpcy5fZXZlbnRzW3RdLGVdOnRoaXMuX2V2ZW50c1t0XT1lLG8odGhpcy5fZXZlbnRzW3RdKSYmIXRoaXMuX2V2ZW50c1t0XS53YXJuZWQmJihpPWEodGhpcy5fbWF4TGlzdGVuZXJzKT9yLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dGhpcy5fbWF4TGlzdGVuZXJzLGkmJmk+MCYmdGhpcy5fZXZlbnRzW3RdLmxlbmd0aD5pJiYodGhpcy5fZXZlbnRzW3RdLndhcm5lZD0hMCxjb25zb2xlLmVycm9yKFwiKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC5cIix0aGlzLl9ldmVudHNbdF0ubGVuZ3RoKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBjb25zb2xlLnRyYWNlJiZjb25zb2xlLnRyYWNlKCkpKSx0aGlzfSxyLnByb3RvdHlwZS5vbj1yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlTGlzdGVuZXIodCxyKSxpfHwoaT0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9aWYoIW4oZSkpdGhyb3cgVHlwZUVycm9yKFwibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO3ZhciBpPSExO3JldHVybiByLmxpc3RlbmVyPWUsdGhpcy5vbih0LHIpLHRoaXN9LHIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHIsaSxhLGY7aWYoIW4oZSkpdGhyb3cgVHlwZUVycm9yKFwibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO2lmKCF0aGlzLl9ldmVudHN8fCF0aGlzLl9ldmVudHNbdF0pcmV0dXJuIHRoaXM7aWYocj10aGlzLl9ldmVudHNbdF0sYT1yLmxlbmd0aCxpPS0xLHI9PT1lfHxuKHIubGlzdGVuZXIpJiZyLmxpc3RlbmVyPT09ZSlkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIix0LGUpO2Vsc2UgaWYobyhyKSl7Zm9yKGY9YTtmLS0gPjA7KWlmKHJbZl09PT1lfHxyW2ZdLmxpc3RlbmVyJiZyW2ZdLmxpc3RlbmVyPT09ZSl7aT1mO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpczsxPT09ci5sZW5ndGg/KHIubGVuZ3RoPTAsZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSk6ci5zcGxpY2UoaSwxKSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsdCxlKX1yZXR1cm4gdGhpc30sci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoIXRoaXMuX2V2ZW50cylyZXR1cm4gdGhpcztpZighdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9ldmVudHM9e306dGhpcy5fZXZlbnRzW3RdJiZkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihlIGluIHRoaXMuX2V2ZW50cylcInJlbW92ZUxpc3RlbmVyXCIhPT1lJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhlKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJyZW1vdmVMaXN0ZW5lclwiKSx0aGlzLl9ldmVudHM9e30sdGhpc31pZihyPXRoaXMuX2V2ZW50c1t0XSxuKHIpKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxyKTtlbHNlIGlmKHIpZm9yKDtyLmxlbmd0aDspdGhpcy5yZW1vdmVMaXN0ZW5lcih0LHJbci5sZW5ndGgtMV0pO3JldHVybiBkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXN9LHIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gZT10aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50c1t0XT9uKHRoaXMuX2V2ZW50c1t0XSk/W3RoaXMuX2V2ZW50c1t0XV06dGhpcy5fZXZlbnRzW3RdLnNsaWNlKCk6W119LHIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fZXZlbnRzKXt2YXIgZT10aGlzLl9ldmVudHNbdF07aWYobihlKSlyZXR1cm4gMTtpZihlKXJldHVybiBlLmxlbmd0aH1yZXR1cm4gMH0sci5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGlzdGVuZXJDb3VudChlKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXtuZXdJbnZhbGlkQXNuMUVycm9yOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBFcnJvcjtyZXR1cm4gZS5uYW1lPVwiSW52YWxpZEFzbjFFcnJvclwiLGUubWVzc2FnZT10fHxcIlwiLGV9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e0VPQzowLEJvb2xlYW46MSxJbnRlZ2VyOjIsQml0U3RyaW5nOjMsT2N0ZXRTdHJpbmc6NCxOdWxsOjUsT0lEOjYsT2JqZWN0RGVzY3JpcHRvcjo3LEV4dGVybmFsOjgsUmVhbDo5LEVudW1lcmF0aW9uOjEwLFBEVjoxMSxVdGY4U3RyaW5nOjEyLFJlbGF0aXZlT0lEOjEzLFNlcXVlbmNlOjE2LFNldDoxNyxOdW1lcmljU3RyaW5nOjE4LFByaW50YWJsZVN0cmluZzoxOSxUNjFTdHJpbmc6MjAsVmlkZW90ZXhTdHJpbmc6MjEsSUE1U3RyaW5nOjIyLFVUQ1RpbWU6MjMsR2VuZXJhbGl6ZWRUaW1lOjI0LEdyYXBoaWNTdHJpbmc6MjUsVmlzaWJsZVN0cmluZzoyNixHZW5lcmFsU3RyaW5nOjI4LFVuaXZlcnNhbFN0cmluZzoyOSxDaGFyYWN0ZXJTdHJpbmc6MzAsQk1QU3RyaW5nOjMxLENvbnN0cnVjdG9yOjMyLENvbnRleHQ6MTI4fX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGkodCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIWV8fFwib2JqZWN0XCIhPXR5cGVvZiBlJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiBvKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9dmFyIGE9cig2MiksZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG4odGhpcyxlKSxpKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuIG8oZSx0KSxlfShhKTt0LmV4cG9ydHM9Zn0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGkodCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIWV8fFwib2JqZWN0XCIhPXR5cGVvZiBlJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiBvKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiByJiZ0KGUucHJvdG90eXBlLHIpLG4mJnQoZSxuKSxlfX0oKSxmPXIoOTMpLHM9cig5MSksdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe24odGhpcyxlKTt2YXIgcj1pKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcykpO3JldHVybiByLmhhc2g9Zi5jcmVhdGVIYXNoKHQpLHJ9cmV0dXJuIG8oZSx0KSxhKGUsW3trZXk6XCJ3cml0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuaGFzaC51cGRhdGUodCl9fSx7a2V5OlwiZ2V0RGlnZXN0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNoLmRpZ2VzdCgpfX1dLFt7a2V5OlwiZ2V0TGVuZ3RoXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGYuY3JlYXRlSGFzaCh0KS5kaWdlc3QoKS5sZW5ndGh9fV0pLGV9KHMpO3QuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiByJiZ0KGUucHJvdG90eXBlLHIpLG4mJnQoZSxuKSxlfX0oKSxvPXIoMjYxKSxhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe24odGhpcyx0KX1yZXR1cm4gaSh0LG51bGwsW3trZXk6XCJnZXRDbGFzc0Zyb21UeXBlSWRcIix2YWx1ZTpmdW5jdGlvbihlKXtpZihlPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBvKFwiVHlwZSBcIitlK1wiIGlzIG5vdCBzdXBwb3J0ZWRcIik7dmFyIHI9ITAsbj0hMSxpPXZvaWQgMDt0cnl7Zm9yKHZhciBhLGY9dC5yZWdpc3RlcmVkVHlwZXNbU3ltYm9sLml0ZXJhdG9yXSgpOyEocj0oYT1mLm5leHQoKSkuZG9uZSk7cj0hMCl7dmFyIHM9YS52YWx1ZTtpZihlPT09cy50eXBlSWQpcmV0dXJuIHMuQ2xhc3N9fWNhdGNoKHQpe249ITAsaT10fWZpbmFsbHl7dHJ5eyFyJiZmLnJldHVybiYmZi5yZXR1cm4oKX1maW5hbGx5e2lmKG4pdGhyb3cgaX19dGhyb3cgbmV3IG8oXCJUeXBlIFwiK2UrXCIgaXMgbm90IHN1cHBvcnRlZFwiKX19LHtrZXk6XCJyZWdpc3RlclR5cGVcIix2YWx1ZTpmdW5jdGlvbihlKXt0LnJlZ2lzdGVyZWRUeXBlcy5wdXNoKHt0eXBlSWQ6ZS5UWVBFX0lELENsYXNzOmV9KX19XSksdH0oKTthLnJlZ2lzdGVyZWRUeXBlcz1bXSx0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiOyhmdW5jdGlvbihlKXtmdW5jdGlvbiByKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX12YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksbiYmdChlLG4pLGV9fSgpLGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cih0aGlzLHQpfXJldHVybiBuKHQsbnVsbCxbe2tleTpcImRlY29kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciByPXQucmVwbGFjZSgvXFwtL2csXCIrXCIpLnJlcGxhY2UoL18vZyxcIi9cIik7cmV0dXJuIG5ldyBlKHIsXCJiYXNlNjRcIil9fSx7a2V5OlwiZW5jb2RlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9TdHJpbmcoXCJiYXNlNjRcIikucmVwbGFjZSgvPS9nLFwiXCIpLnJlcGxhY2UoL1xcKy9nLFwiLVwiKS5yZXBsYWNlKC9cXC8vZyxcIl9cIil9fV0pLHR9KCk7dC5leHBvcnRzPWl9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7dC5leHBvcnRzPSFyKDE2NCkoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDExKSxpPXIoNDcpLG89cigxMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uKHRoaXMpLHI9byhlLmxlbmd0aCksYT1hcmd1bWVudHMubGVuZ3RoLGY9aShhPjE/YXJndW1lbnRzWzFdOnZvaWQgMCxyKSxzPWE+Mj9hcmd1bWVudHNbMl06dm9pZCAwLHU9dm9pZCAwPT09cz9yOmkocyxyKTt1PmY7KWVbZisrXT10O3JldHVybiBlfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoOSksaT1yKDM3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIpe2UgaW4gdD9uLmYodCxlLGkoMCxyKSk6dFtlXT1yfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNiksaT1yKDQpLmRvY3VtZW50LG89bihpKSYmbihpLmNyZWF0ZUVsZW1lbnQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbz9pLmNyZWF0ZUVsZW1lbnQodCk6e319fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1cImNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZlwiLnNwbGl0KFwiLFwiKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNykoXCJtYXRjaFwiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9Ly4vO3RyeXtcIi8uL1wiW3RdKGUpfWNhdGNoKHIpe3RyeXtyZXR1cm4gZVtuXT0hMSwhXCIvLi9cIlt0XShlKX1jYXRjaCh0KXt9fXJldHVybiEwfX0sZnVuY3Rpb24odCxlLHIpe3QuZXhwb3J0cz1yKDQpLmRvY3VtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDYpLGk9cigxMzIpLnNldDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIpe3ZhciBvLGE9ZS5jb25zdHJ1Y3RvcjtyZXR1cm4gYSE9PXImJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEmJihvPWEucHJvdG90eXBlKSE9PXIucHJvdG90eXBlJiZuKG8pJiZpJiZpKHQsbyksdH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDU2KSxpPXIoNykoXCJpdGVyYXRvclwiKSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihuLkFycmF5PT09dHx8b1tpXT09PXQpfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMjMpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm5cIkFycmF5XCI9PW4odCl9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cig0MiksaT1yKDM3KSxvPXIoNTcpLGE9e307cigxNCkoYSxyKDcpKFwiaXRlcmF0b3JcIiksZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuZXhwb3J0cz1mdW5jdGlvbih0LGUscil7dC5wcm90b3R5cGU9bihhLHtuZXh0OmkoMSxyKX0pLG8odCxlK1wiIEl0ZXJhdG9yXCIpfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoNDEpLGk9cigwKSxvPXIoMTUpLGE9cigxNCksZj1yKDEyKSxzPXIoNTYpLHU9cigxMjcpLGg9cig1NyksYz1yKDIxKSxkPXIoNykoXCJpdGVyYXRvclwiKSxsPSEoW10ua2V5cyYmXCJuZXh0XCJpbltdLmtleXMoKSkscD1cIkBAaXRlcmF0b3JcIixiPVwia2V5c1wiLHY9XCJ2YWx1ZXNcIix5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUscixtLGcsdyxfKXt1KHIsZSxtKTt2YXIgTSxTLEUsQT1mdW5jdGlvbih0KXtpZighbCYmdCBpbiBCKXJldHVybiBCW3RdO3N3aXRjaCh0KXtjYXNlIGI6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKHRoaXMsdCl9O2Nhc2UgdjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcyx0KX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKHRoaXMsdCl9fSxrPWUrXCIgSXRlcmF0b3JcIix4PWc9PXYsST0hMSxCPXQucHJvdG90eXBlLE89QltkXXx8QltwXXx8ZyYmQltnXSxSPU98fEEoZyksUD1nP3g/QShcImVudHJpZXNcIik6Ujp2b2lkIDAsVD1cIkFycmF5XCI9PWU/Qi5lbnRyaWVzfHxPOk87aWYoVCYmKEU9YyhULmNhbGwobmV3IHQpKSxFIT09T2JqZWN0LnByb3RvdHlwZSYmKGgoRSxrLCEwKSxufHxmKEUsZCl8fGEoRSxkLHkpKSkseCYmTyYmTy5uYW1lIT09diYmKEk9ITAsUj1mdW5jdGlvbigpe3JldHVybiBPLmNhbGwodGhpcyl9KSxuJiYhX3x8IWwmJiFJJiZCW2RdfHxhKEIsZCxSKSxzW2VdPVIsc1trXT15LGcpaWYoTT17dmFsdWVzOng/UjpBKHYpLGtleXM6dz9SOkEoYiksZW50cmllczpQfSxfKWZvcihTIGluIE0pUyBpbiBCfHxvKEIsUyxNW1NdKTtlbHNlIGkoaS5QK2kuRioobHx8SSksZSxNKTtyZXR1cm4gTX19LGZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5leHBtMTt0LmV4cG9ydHM9IXJ8fHIoMTApPjIyMDI1LjQ2NTc5NDgwNjcxOHx8cigxMCk8MjIwMjUuNDY1Nzk0ODA2NzE4fHxyKC0yZS0xNykhPS0yZS0xNz9mdW5jdGlvbih0KXtyZXR1cm4gMD09KHQ9K3QpP3Q6dD4tMWUtNiYmdDwxZS02P3QrdCp0LzI6TWF0aC5leHAodCktMX06cn0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gMD09KHQ9K3QpfHx0IT10P3Q6dDwwPy0xOjF9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig0KSxpPXIoMTM5KS5zZXQsbz1uLk11dGF0aW9uT2JzZXJ2ZXJ8fG4uV2ViS2l0TXV0YXRpb25PYnNlcnZlcixhPW4ucHJvY2VzcyxmPW4uUHJvbWlzZSxzPVwicHJvY2Vzc1wiPT1yKDIzKShhKTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsdT1mdW5jdGlvbigpe3ZhciBuLGk7Zm9yKHMmJihuPWEuZG9tYWluKSYmbi5leGl0KCk7dDspe2k9dC5mbix0PXQubmV4dDt0cnl7aSgpfWNhdGNoKG4pe3Rocm93IHQ/cigpOmU9dm9pZCAwLG59fWU9dm9pZCAwLG4mJm4uZW50ZXIoKX07aWYocylyPWZ1bmN0aW9uKCl7YS5uZXh0VGljayh1KX07ZWxzZSBpZihvKXt2YXIgaD0hMCxjPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO25ldyBvKHUpLm9ic2VydmUoYyx7Y2hhcmFjdGVyRGF0YTohMH0pLHI9ZnVuY3Rpb24oKXtjLmRhdGE9aD0haH19ZWxzZSBpZihmJiZmLnJlc29sdmUpe3ZhciBkPWYucmVzb2x2ZSgpO3I9ZnVuY3Rpb24oKXtkLnRoZW4odSl9fWVsc2Ugcj1mdW5jdGlvbigpe2kuY2FsbChuLHUpfTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9e2ZuOm4sbmV4dDp2b2lkIDB9O2UmJihlLm5leHQ9aSksdHx8KHQ9aSxyKCkpLGU9aX19fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2KSxpPXIoMyksbz1mdW5jdGlvbih0LGUpe2lmKGkodCksIW4oZSkmJm51bGwhPT1lKXRocm93IFR5cGVFcnJvcihlK1wiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKX07dC5leHBvcnRzPXtzZXQ6T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoXCJfX3Byb3RvX19cImlue30/ZnVuY3Rpb24odCxlLG4pe3RyeXtuPXIoMzMpKEZ1bmN0aW9uLmNhbGwscigyMCkuZihPYmplY3QucHJvdG90eXBlLFwiX19wcm90b19fXCIpLnNldCwyKSxuKHQsW10pLGU9ISh0IGluc3RhbmNlb2YgQXJyYXkpfWNhdGNoKHQpe2U9ITB9cmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIG8odCxyKSxlP3QuX19wcm90b19fPXI6bih0LHIpLHR9fSh7fSwhMSk6dm9pZCAwKSxjaGVjazpvfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoODcpKFwia2V5c1wiKSxpPXIoNDgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gblt0XXx8KG5bdF09aSh0KSl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigzKSxpPXIoMTMpLG89cig3KShcInNwZWNpZXNcIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIHIsYT1uKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHx2b2lkIDA9PShyPW4oYSlbb10pP2U6aShyKX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDM4KSxpPXIoMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt2YXIgbyxhLGY9U3RyaW5nKGkoZSkpLHM9bihyKSx1PWYubGVuZ3RoO3JldHVybiBzPDB8fHM+PXU/dD9cIlwiOnZvaWQgMDoobz1mLmNoYXJDb2RlQXQocyksbzw1NTI5Nnx8bz41NjMxOXx8cysxPT09dXx8KGE9Zi5jaGFyQ29kZUF0KHMrMSkpPDU2MzIwfHxhPjU3MzQzP3Q/Zi5jaGFyQXQocyk6bzp0P2Yuc2xpY2UocyxzKzIpOihvLTU1Mjk2PDwxMCkrKGEtNTYzMjApKzY1NTM2KX19fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig4MyksaT1yKDI0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIpe2lmKG4oZSkpdGhyb3cgVHlwZUVycm9yKFwiU3RyaW5nI1wiK3IrXCIgZG9lc24ndCBhY2NlcHQgcmVnZXghXCIpO3JldHVybiBTdHJpbmcoaSh0KSl9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigzOCksaT1yKDI0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKGkodGhpcykpLHI9XCJcIixvPW4odCk7aWYobzwwfHxvPT0xLzApdGhyb3cgUmFuZ2VFcnJvcihcIkNvdW50IGNhbid0IGJlIG5lZ2F0aXZlXCIpO2Zvcig7bz4wOyhvPj4+PTEpJiYoZSs9ZSkpMSZvJiYocis9ZSk7cmV0dXJuIHJ9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1cIlxcdFxcblxcdlxcZlxcciDCoOGagOGgjuKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFxcdTIwMjhcXHUyMDI5XFx1ZmVmZlwifSxmdW5jdGlvbih0LGUscil7dmFyIG4saSxvLGE9cigzMyksZj1yKDgyKSxzPXIoMTIzKSx1PXIoMTIwKSxoPXIoNCksYz1oLnByb2Nlc3MsZD1oLnNldEltbWVkaWF0ZSxsPWguY2xlYXJJbW1lZGlhdGUscD1oLk1lc3NhZ2VDaGFubmVsLGI9MCx2PXt9LHk9XCJvbnJlYWR5c3RhdGVjaGFuZ2VcIixtPWZ1bmN0aW9uKCl7dmFyIHQ9K3RoaXM7aWYodi5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIGU9dlt0XTtkZWxldGUgdlt0XSxlKCl9fSxnPWZ1bmN0aW9uKHQpe20uY2FsbCh0LmRhdGEpfTtkJiZsfHwoZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0xO2FyZ3VtZW50cy5sZW5ndGg+cjspZS5wdXNoKGFyZ3VtZW50c1tyKytdKTtyZXR1cm4gdlsrK2JdPWZ1bmN0aW9uKCl7ZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCksZSl9LG4oYiksYn0sbD1mdW5jdGlvbih0KXtkZWxldGUgdlt0XX0sXCJwcm9jZXNzXCI9PXIoMjMpKGMpP249ZnVuY3Rpb24odCl7Yy5uZXh0VGljayhhKG0sdCwxKSl9OnA/KGk9bmV3IHAsbz1pLnBvcnQyLGkucG9ydDEub25tZXNzYWdlPWcsbj1hKG8ucG9zdE1lc3NhZ2UsbywxKSk6aC5hZGRFdmVudExpc3RlbmVyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBwb3N0TWVzc2FnZSYmIWguaW1wb3J0U2NyaXB0cz8obj1mdW5jdGlvbih0KXtoLnBvc3RNZXNzYWdlKHQrXCJcIixcIipcIil9LGguYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIixnLCExKSk6bj15IGluIHUoXCJzY3JpcHRcIik/ZnVuY3Rpb24odCl7cy5hcHBlbmRDaGlsZCh1KFwic2NyaXB0XCIpKVt5XT1mdW5jdGlvbigpe3MucmVtb3ZlQ2hpbGQodGhpcyksbS5jYWxsKHQpfX06ZnVuY3Rpb24odCl7c2V0VGltZW91dChhKG0sdCwxKSwwKX0pLHQuZXhwb3J0cz17c2V0OmQsY2xlYXI6bH19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDQpLGk9cig4KSxvPXIoNDEpLGE9cig4OCksZj1yKDE0KSxzPXIoNDUpLHU9cig1KSxoPXIoNDApLGM9cigzOCksZD1yKDEwKSxsPXIoNDMpLmYscD1yKDkpLmYsYj1yKDExOCksdj1yKDU3KSx5PVwiQXJyYXlCdWZmZXJcIixtPVwiRGF0YVZpZXdcIixnPVwicHJvdG90eXBlXCIsdz1cIldyb25nIGxlbmd0aCFcIixfPVwiV3JvbmcgaW5kZXghXCIsTT1uW3ldLFM9blttXSxFPW4uTWF0aCxBPW4uUmFuZ2VFcnJvcixrPW4uSW5maW5pdHkseD1NLEk9RS5hYnMsQj1FLnBvdyxPPUUuZmxvb3IsUj1FLmxvZyxQPUUuTE4yLFQ9XCJidWZmZXJcIixqPVwiYnl0ZUxlbmd0aFwiLEM9XCJieXRlT2Zmc2V0XCIsTj1pP1wiX2JcIjpULEw9aT9cIl9sXCI6aixVPWk/XCJfb1wiOkMsej1mdW5jdGlvbih0LGUscil7XG52YXIgbixpLG8sYT1BcnJheShyKSxmPTgqci1lLTEscz0oMTw8ZiktMSx1PXM+PjEsaD0yMz09PWU/QigyLC0yNCktQigyLC03Nyk6MCxjPTAsZD10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9SSh0KSx0IT10fHx0PT09az8oaT10IT10PzE6MCxuPXMpOihuPU8oUih0KS9QKSx0KihvPUIoMiwtbikpPDEmJihuLS0sbyo9MiksdCs9bit1Pj0xP2gvbzpoKkIoMiwxLXUpLHQqbz49MiYmKG4rKyxvLz0yKSxuK3U+PXM/KGk9MCxuPXMpOm4rdT49MT8oaT0odCpvLTEpKkIoMixlKSxuKz11KTooaT10KkIoMix1LTEpKkIoMixlKSxuPTApKTtlPj04O2FbYysrXT0yNTUmaSxpLz0yNTYsZS09OCk7Zm9yKG49bjw8ZXxpLGYrPWU7Zj4wO2FbYysrXT0yNTUmbixuLz0yNTYsZi09OCk7cmV0dXJuIGFbLS1jXXw9MTI4KmQsYX0sRD1mdW5jdGlvbih0LGUscil7dmFyIG4saT04KnItZS0xLG89KDE8PGkpLTEsYT1vPj4xLGY9aS03LHM9ci0xLHU9dFtzLS1dLGg9MTI3JnU7Zm9yKHU+Pj03O2Y+MDtoPTI1NipoK3Rbc10scy0tLGYtPTgpO2ZvcihuPWgmKDE8PC1mKS0xLGg+Pj0tZixmKz1lO2Y+MDtuPTI1NipuK3Rbc10scy0tLGYtPTgpO2lmKDA9PT1oKWg9MS1hO2Vsc2V7aWYoaD09PW8pcmV0dXJuIG4/TmFOOnU/LWs6aztuKz1CKDIsZSksaC09YX1yZXR1cm4odT8tMToxKSpuKkIoMixoLWUpfSxxPWZ1bmN0aW9uKHQpe3JldHVybiB0WzNdPDwyNHx0WzJdPDwxNnx0WzFdPDw4fHRbMF19LEY9ZnVuY3Rpb24odCl7cmV0dXJuWzI1NSZ0XX0sSz1mdW5jdGlvbih0KXtyZXR1cm5bMjU1JnQsdD4+OCYyNTVdfSxHPWZ1bmN0aW9uKHQpe3JldHVyblsyNTUmdCx0Pj44JjI1NSx0Pj4xNiYyNTUsdD4+MjQmMjU1XX0sVj1mdW5jdGlvbih0KXtyZXR1cm4geih0LDUyLDgpfSxIPWZ1bmN0aW9uKHQpe3JldHVybiB6KHQsMjMsNCl9LFg9ZnVuY3Rpb24odCxlLHIpe3AodFtnXSxlLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tyXX19KX0sWT1mdW5jdGlvbih0LGUscixuKXt2YXIgaT0rcixvPWMoaSk7aWYoaSE9b3x8bzwwfHxvK2U+dFtMXSl0aHJvdyBBKF8pO3ZhciBhPXRbTl0uX2IsZj1vK3RbVV0scz1hLnNsaWNlKGYsZitlKTtyZXR1cm4gbj9zOnMucmV2ZXJzZSgpfSxXPWZ1bmN0aW9uKHQsZSxyLG4saSxvKXt2YXIgYT0rcixmPWMoYSk7aWYoYSE9Znx8ZjwwfHxmK2U+dFtMXSl0aHJvdyBBKF8pO2Zvcih2YXIgcz10W05dLl9iLHU9Zit0W1VdLGg9bigraSksZD0wO2Q8ZTtkKyspc1t1K2RdPWhbbz9kOmUtZC0xXX0sWj1mdW5jdGlvbih0LGUpe2godCxNLHkpO3ZhciByPStlLG49ZChyKTtpZihyIT1uKXRocm93IEEodyk7cmV0dXJuIG59O2lmKGEuQUJWKXtpZighdShmdW5jdGlvbigpe25ldyBNfSl8fCF1KGZ1bmN0aW9uKCl7bmV3IE0oLjUpfSkpe009ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KFoodGhpcyx0KSl9O2Zvcih2YXIgSiwkPU1bZ109eFtnXSxRPWwoeCksdHQ9MDtRLmxlbmd0aD50dDspKEo9UVt0dCsrXSlpbiBNfHxmKE0sSix4W0pdKTtvfHwoJC5jb25zdHJ1Y3Rvcj1NKX12YXIgZXQ9bmV3IFMobmV3IE0oMikpLHJ0PVNbZ10uc2V0SW50ODtldC5zZXRJbnQ4KDAsMjE0NzQ4MzY0OCksZXQuc2V0SW50OCgxLDIxNDc0ODM2NDkpLCFldC5nZXRJbnQ4KDApJiZldC5nZXRJbnQ4KDEpfHxzKFNbZ10se3NldEludDg6ZnVuY3Rpb24odCxlKXtydC5jYWxsKHRoaXMsdCxlPDwyND4+MjQpfSxzZXRVaW50ODpmdW5jdGlvbih0LGUpe3J0LmNhbGwodGhpcyx0LGU8PDI0Pj4yNCl9fSwhMCl9ZWxzZSBNPWZ1bmN0aW9uKHQpe3ZhciBlPVoodGhpcyx0KTt0aGlzLl9iPWIuY2FsbChBcnJheShlKSwwKSx0aGlzW0xdPWV9LFM9ZnVuY3Rpb24odCxlLHIpe2godGhpcyxTLG0pLGgodCxNLG0pO3ZhciBuPXRbTF0saT1jKGUpO2lmKGk8MHx8aT5uKXRocm93IEEoXCJXcm9uZyBvZmZzZXQhXCIpO2lmKHI9dm9pZCAwPT09cj9uLWk6ZChyKSxpK3I+bil0aHJvdyBBKHcpO3RoaXNbTl09dCx0aGlzW1VdPWksdGhpc1tMXT1yfSxpJiYoWChNLGosXCJfbFwiKSxYKFMsVCxcIl9iXCIpLFgoUyxqLFwiX2xcIiksWChTLEMsXCJfb1wiKSkscyhTW2ddLHtnZXRJbnQ4OmZ1bmN0aW9uKHQpe3JldHVybiBZKHRoaXMsMSx0KVswXTw8MjQ+PjI0fSxnZXRVaW50ODpmdW5jdGlvbih0KXtyZXR1cm4gWSh0aGlzLDEsdClbMF19LGdldEludDE2OmZ1bmN0aW9uKHQpe3ZhciBlPVkodGhpcywyLHQsYXJndW1lbnRzWzFdKTtyZXR1cm4oZVsxXTw8OHxlWzBdKTw8MTY+PjE2fSxnZXRVaW50MTY6ZnVuY3Rpb24odCl7dmFyIGU9WSh0aGlzLDIsdCxhcmd1bWVudHNbMV0pO3JldHVybiBlWzFdPDw4fGVbMF19LGdldEludDMyOmZ1bmN0aW9uKHQpe3JldHVybiBxKFkodGhpcyw0LHQsYXJndW1lbnRzWzFdKSl9LGdldFVpbnQzMjpmdW5jdGlvbih0KXtyZXR1cm4gcShZKHRoaXMsNCx0LGFyZ3VtZW50c1sxXSkpPj4+MH0sZ2V0RmxvYXQzMjpmdW5jdGlvbih0KXtyZXR1cm4gRChZKHRoaXMsNCx0LGFyZ3VtZW50c1sxXSksMjMsNCl9LGdldEZsb2F0NjQ6ZnVuY3Rpb24odCl7cmV0dXJuIEQoWSh0aGlzLDgsdCxhcmd1bWVudHNbMV0pLDUyLDgpfSxzZXRJbnQ4OmZ1bmN0aW9uKHQsZSl7Vyh0aGlzLDEsdCxGLGUpfSxzZXRVaW50ODpmdW5jdGlvbih0LGUpe1codGhpcywxLHQsRixlKX0sc2V0SW50MTY6ZnVuY3Rpb24odCxlKXtXKHRoaXMsMix0LEssZSxhcmd1bWVudHNbMl0pfSxzZXRVaW50MTY6ZnVuY3Rpb24odCxlKXtXKHRoaXMsMix0LEssZSxhcmd1bWVudHNbMl0pfSxzZXRJbnQzMjpmdW5jdGlvbih0LGUpe1codGhpcyw0LHQsRyxlLGFyZ3VtZW50c1syXSl9LHNldFVpbnQzMjpmdW5jdGlvbih0LGUpe1codGhpcyw0LHQsRyxlLGFyZ3VtZW50c1syXSl9LHNldEZsb2F0MzI6ZnVuY3Rpb24odCxlKXtXKHRoaXMsNCx0LEgsZSxhcmd1bWVudHNbMl0pfSxzZXRGbG9hdDY0OmZ1bmN0aW9uKHQsZSl7Vyh0aGlzLDgsdCxWLGUsYXJndW1lbnRzWzJdKX19KTt2KE0seSksdihTLG0pLGYoU1tnXSxhLlZJRVcsITApLGVbeV09TSxlW21dPVN9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDQpLGk9cigzMiksbz1yKDQxKSxhPXIoMTg5KSxmPXIoOSkuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9aS5TeW1ib2x8fChpLlN5bWJvbD1vP3t9Om4uU3ltYm9sfHx7fSk7XCJfXCI9PXQuY2hhckF0KDApfHx0IGluIGV8fGYoZSx0LHt2YWx1ZTphLmYodCl9KX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDY0KSxpPXIoNykoXCJpdGVyYXRvclwiKSxvPXIoNTYpO3QuZXhwb3J0cz1yKDMyKS5nZXRJdGVyYXRvck1ldGhvZD1mdW5jdGlvbih0KXtpZih2b2lkIDAhPXQpcmV0dXJuIHRbaV18fHRbXCJAQGl0ZXJhdG9yXCJdfHxvW24odCldfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoNTQpLGk9cigxNzcpLG89cig1NiksYT1yKDE3KTt0LmV4cG9ydHM9cigxMjgpKEFycmF5LFwiQXJyYXlcIixmdW5jdGlvbih0LGUpe3RoaXMuX3Q9YSh0KSx0aGlzLl9pPTAsdGhpcy5faz1lfSxmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3QsZT10aGlzLl9rLHI9dGhpcy5faSsrO3JldHVybiF0fHxyPj10Lmxlbmd0aD8odGhpcy5fdD12b2lkIDAsaSgxKSk6XCJrZXlzXCI9PWU/aSgwLHIpOlwidmFsdWVzXCI9PWU/aSgwLHRbcl0pOmkoMCxbcix0W3JdXSl9LFwidmFsdWVzXCIpLG8uQXJndW1lbnRzPW8uQXJyYXksbihcImtleXNcIiksbihcInZhbHVlc1wiKSxuKFwiZW50cmllc1wiKX0sZnVuY3Rpb24odCxlLHIpe3QuZXhwb3J0cz0hcigxOTkpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZS51dGlscz1yKDUwNSksZS5DaXBoZXI9cig1MDIpLGUuREVTPXIoNTAzKSxlLkNCQz1yKDUwMSksZS5FREU9cig1MDQpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxyLG4sbyl7ZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxcImJpbmFyeVwiKSksciYmIWUuaXNCdWZmZXIocikmJihyPW5ldyBlKHIsXCJiaW5hcnlcIikpLG4vPTgsbz1vfHwwO2Zvcih2YXIgYSxmLHM9MCx1PTAsaD1uZXcgZShuKSxjPW5ldyBlKG8pLGQ9MCxsPVtdOzspe2lmKGQrKz4wJiZsLnB1c2goYSksbC5wdXNoKHQpLHImJmwucHVzaChyKSxhPWkoZS5jb25jYXQobCkpLGw9W10sZj0wLG4+MClmb3IoOzspe2lmKDA9PT1uKWJyZWFrO2lmKGY9PT1hLmxlbmd0aClicmVhaztoW3MrK109YVtmXSxuLS0sZisrfWlmKG8+MCYmZiE9PWEubGVuZ3RoKWZvcig7Oyl7aWYoMD09PW8pYnJlYWs7aWYoZj09PWEubGVuZ3RoKWJyZWFrO2NbdSsrXT1hW2ZdLG8tLSxmKyt9aWYoMD09PW4mJjA9PT1vKWJyZWFrfWZvcihmPTA7ZjxhLmxlbmd0aDtmKyspYVtmXT0wO3JldHVybntrZXk6aCxpdjpjfX12YXIgaT1yKDEwNSk7dC5leHBvcnRzPW59KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUpe2VbXCJhZXMtMTI4LWVjYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjowLG1vZGU6XCJFQ0JcIix0eXBlOlwiYmxvY2tcIn0sZVtcImFlcy0xOTItZWNiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTkyLGl2OjAsbW9kZTpcIkVDQlwiLHR5cGU6XCJibG9ja1wifSxlW1wiYWVzLTI1Ni1lY2JcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MCxtb2RlOlwiRUNCXCIsdHlwZTpcImJsb2NrXCJ9LGVbXCJhZXMtMTI4LWNiY1wiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxNixtb2RlOlwiQ0JDXCIsdHlwZTpcImJsb2NrXCJ9LGVbXCJhZXMtMTkyLWNiY1wiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ0JDXCIsdHlwZTpcImJsb2NrXCJ9LGVbXCJhZXMtMjU2LWNiY1wiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjoxNixtb2RlOlwiQ0JDXCIsdHlwZTpcImJsb2NrXCJ9LGUuYWVzMTI4PWVbXCJhZXMtMTI4LWNiY1wiXSxlLmFlczE5Mj1lW1wiYWVzLTE5Mi1jYmNcIl0sZS5hZXMyNTY9ZVtcImFlcy0yNTYtY2JjXCJdLGVbXCJhZXMtMTI4LWNmYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxNixtb2RlOlwiQ0ZCXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTE5Mi1jZmJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MTYsbW9kZTpcIkNGQlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0yNTYtY2ZiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MjU2LGl2OjE2LG1vZGU6XCJDRkJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTI4LWNmYjhcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxMjgsaXY6MTYsbW9kZTpcIkNGQjhcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTkyLWNmYjhcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MTYsbW9kZTpcIkNGQjhcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMjU2LWNmYjhcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTYsbW9kZTpcIkNGQjhcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTI4LWNmYjFcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxMjgsaXY6MTYsbW9kZTpcIkNGQjFcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTkyLWNmYjFcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MTYsbW9kZTpcIkNGQjFcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMjU2LWNmYjFcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTYsbW9kZTpcIkNGQjFcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTI4LW9mYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxNixtb2RlOlwiT0ZCXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTE5Mi1vZmJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MTYsbW9kZTpcIk9GQlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0yNTYtb2ZiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MjU2LGl2OjE2LG1vZGU6XCJPRkJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTI4LWN0clwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxNixtb2RlOlwiQ1RSXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTE5Mi1jdHJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MTYsbW9kZTpcIkNUUlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0yNTYtY3RyXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MjU2LGl2OjE2LG1vZGU6XCJDVFJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTI4LWdjbVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxMixtb2RlOlwiR0NNXCIsdHlwZTpcImF1dGhcIn0sZVtcImFlcy0xOTItZ2NtXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTkyLGl2OjEyLG1vZGU6XCJHQ01cIix0eXBlOlwiYXV0aFwifSxlW1wiYWVzLTI1Ni1nY21cIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTIsbW9kZTpcIkdDTVwiLHR5cGU6XCJhdXRoXCJ9fSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxyLG4sbyl7ZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxcImJpbmFyeVwiKSksciYmIWUuaXNCdWZmZXIocikmJihyPW5ldyBlKHIsXCJiaW5hcnlcIikpLG4vPTgsbz1vfHwwO2Zvcih2YXIgYSxmLHM9MCx1PTAsaD1uZXcgZShuKSxjPW5ldyBlKG8pLGQ9MCxsPVtdOzspe2lmKGQrKz4wJiZsLnB1c2goYSksbC5wdXNoKHQpLHImJmwucHVzaChyKSxhPWkoZS5jb25jYXQobCkpLGw9W10sZj0wLG4+MClmb3IoOzspe2lmKDA9PT1uKWJyZWFrO2lmKGY9PT1hLmxlbmd0aClicmVhaztoW3MrK109YVtmXSxuLS0sZisrfWlmKG8+MCYmZiE9PWEubGVuZ3RoKWZvcig7Oyl7aWYoMD09PW8pYnJlYWs7aWYoZj09PWEubGVuZ3RoKWJyZWFrO2NbdSsrXT1hW2ZdLG8tLSxmKyt9aWYoMD09PW4mJjA9PT1vKWJyZWFrfWZvcihmPTA7ZjxhLmxlbmd0aDtmKyspYVtmXT0wO3JldHVybntrZXk6aCxpdjpjfX12YXIgaT1yKDEwNSk7dC5leHBvcnRzPW59KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxyKXthLmNhbGwodGhpcyksdD10LnRvTG93ZXJDYXNlKCksXCJzdHJpbmdcIj09dHlwZW9mIHImJihyPW5ldyBlKHIpKTt2YXIgbj1cInNoYTUxMlwiPT09dHx8XCJzaGEzODRcIj09PXQ/MTI4OjY0O3RoaXMuX2FsZz10LHRoaXMuX2tleT1yLHIubGVuZ3RoPm4/cj1pKHQpLnVwZGF0ZShyKS5kaWdlc3QoKTpyLmxlbmd0aDxuJiYocj1lLmNvbmNhdChbcixmXSxuKSk7Zm9yKHZhciBvPXRoaXMuX2lwYWQ9bmV3IGUobikscz10aGlzLl9vcGFkPW5ldyBlKG4pLHU9MDt1PG47dSsrKW9bdV09NTReclt1XSxzW3VdPTkyXnJbdV07dGhpcy5faGFzaD1pKHQpLnVwZGF0ZShvKX12YXIgaT1yKDU5KSxvPXIoMiksYT1yKDMxKS5UcmFuc2Zvcm0sZj1uZXcgZSgxMjgpO2YuZmlsbCgwKSxvKG4sYSksbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2hhc2gudXBkYXRlKHQsZSksdGhpc30sbi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dGhpcy5faGFzaC51cGRhdGUodCkscigpfSxuLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24odCl7dGhpcy5wdXNoKHRoaXMuZGlnZXN0KCkpLHQoKX0sbi5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2hhc2guZGlnZXN0KCk7cmV0dXJuIGkodGhpcy5fYWxnKS51cGRhdGUodGhpcy5fb3BhZCkudXBkYXRlKGUpLmRpZ2VzdCh0KX0sdC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQsZSl9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fFwiQXNzZXJ0aW9uIGZhaWxlZFwiKX1mdW5jdGlvbiBpKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiBvKHQsZSxyKXtyZXR1cm4gby5pc0JOKHQpP3Q6KHRoaXMubmVnYXRpdmU9MCx0aGlzLndvcmRzPW51bGwsdGhpcy5sZW5ndGg9MCx0aGlzLnJlZD1udWxsLHZvaWQobnVsbCE9PXQmJihcImxlXCIhPT1lJiZcImJlXCIhPT1lfHwocj1lLGU9MTApLHRoaXMuX2luaXQodHx8MCxlfHwxMCxyfHxcImJlXCIpKSkpfWZ1bmN0aW9uIGEodCxlLHIpe2Zvcih2YXIgbj0wLGk9TWF0aC5taW4odC5sZW5ndGgsciksbz1lO288aTtvKyspe3ZhciBhPXQuY2hhckNvZGVBdChvKS00ODtuPDw9NCxufD1hPj00OSYmYTw9NTQ/YS00OSsxMDphPj0xNyYmYTw9MjI/YS0xNysxMDoxNSZhfXJldHVybiBufWZ1bmN0aW9uIGYodCxlLHIsbil7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aCxyKSxhPWU7YTxvO2ErKyl7dmFyIGY9dC5jaGFyQ29kZUF0KGEpLTQ4O2kqPW4saSs9Zj49NDk/Zi00OSsxMDpmPj0xNz9mLTE3KzEwOmZ9cmV0dXJuIGl9ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQuYml0TGVuZ3RoKCkpLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ci8yNnwwLGk9ciUyNjtlW3JdPSh0LndvcmRzW25dJjE8PGkpPj4+aX1yZXR1cm4gZX1mdW5jdGlvbiB1KHQsZSxyKXtyLm5lZ2F0aXZlPWUubmVnYXRpdmVedC5uZWdhdGl2ZTt2YXIgbj10Lmxlbmd0aCtlLmxlbmd0aHwwO3IubGVuZ3RoPW4sbj1uLTF8MDt2YXIgaT0wfHQud29yZHNbMF0sbz0wfGUud29yZHNbMF0sYT1pKm8sZj02NzEwODg2MyZhLHM9YS82NzEwODg2NHwwO3Iud29yZHNbMF09Zjtmb3IodmFyIHU9MTt1PG47dSsrKXtmb3IodmFyIGg9cz4+PjI2LGM9NjcxMDg4NjMmcyxkPU1hdGgubWluKHUsZS5sZW5ndGgtMSksbD1NYXRoLm1heCgwLHUtdC5sZW5ndGgrMSk7bDw9ZDtsKyspe3ZhciBwPXUtbHwwO2k9MHx0LndvcmRzW3BdLG89MHxlLndvcmRzW2xdLGE9aSpvK2MsaCs9YS82NzEwODg2NHwwLGM9NjcxMDg4NjMmYX1yLndvcmRzW3VdPTB8YyxzPTB8aH1yZXR1cm4gMCE9PXM/ci53b3Jkc1t1XT0wfHM6ci5sZW5ndGgtLSxyLnN0cmlwKCl9ZnVuY3Rpb24gaCh0LGUscil7ci5uZWdhdGl2ZT1lLm5lZ2F0aXZlXnQubmVnYXRpdmUsci5sZW5ndGg9dC5sZW5ndGgrZS5sZW5ndGg7Zm9yKHZhciBuPTAsaT0wLG89MDtvPHIubGVuZ3RoLTE7bysrKXt2YXIgYT1pO2k9MDtmb3IodmFyIGY9NjcxMDg4NjMmbixzPU1hdGgubWluKG8sZS5sZW5ndGgtMSksdT1NYXRoLm1heCgwLG8tdC5sZW5ndGgrMSk7dTw9czt1Kyspe3ZhciBoPW8tdSxjPTB8dC53b3Jkc1toXSxkPTB8ZS53b3Jkc1t1XSxsPWMqZCxwPTY3MTA4ODYzJmw7YT1hKyhsLzY3MTA4ODY0fDApfDAscD1wK2Z8MCxmPTY3MTA4ODYzJnAsYT1hKyhwPj4+MjYpfDAsaSs9YT4+PjI2LGEmPTY3MTA4ODYzfXIud29yZHNbb109ZixuPWEsYT1pfXJldHVybiAwIT09bj9yLndvcmRzW29dPW46ci5sZW5ndGgtLSxyLnN0cmlwKCl9ZnVuY3Rpb24gYyh0LGUscil7dmFyIG49bmV3IGQ7cmV0dXJuIG4ubXVscCh0LGUscil9ZnVuY3Rpb24gZCh0LGUpe3RoaXMueD10LHRoaXMueT1lfWZ1bmN0aW9uIGwodCxlKXt0aGlzLm5hbWU9dCx0aGlzLnA9bmV3IG8oZSwxNiksdGhpcy5uPXRoaXMucC5iaXRMZW5ndGgoKSx0aGlzLms9bmV3IG8oMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApLHRoaXMudG1wPXRoaXMuX3RtcCgpfWZ1bmN0aW9uIHAoKXtsLmNhbGwodGhpcyxcImsyNTZcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmXCIpfWZ1bmN0aW9uIGIoKXtsLmNhbGwodGhpcyxcInAyMjRcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxXCIpfWZ1bmN0aW9uIHYoKXtsLmNhbGwodGhpcyxcInAxOTJcIixcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmXCIpfWZ1bmN0aW9uIHkoKXtsLmNhbGwodGhpcyxcIjI1NTE5XCIsXCI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkXCIpfWZ1bmN0aW9uIG0odCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciBlPW8uX3ByaW1lKHQpO3RoaXMubT1lLnAsdGhpcy5wcmltZT1lfWVsc2Ugbih0Lmd0bigxKSxcIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMVwiKSx0aGlzLm09dCx0aGlzLnByaW1lPW51bGx9ZnVuY3Rpb24gZyh0KXttLmNhbGwodGhpcyx0KSx0aGlzLnNoaWZ0PXRoaXMubS5iaXRMZW5ndGgoKSx0aGlzLnNoaWZ0JTI2IT09MCYmKHRoaXMuc2hpZnQrPTI2LXRoaXMuc2hpZnQlMjYpLHRoaXMucj1uZXcgbygxKS5pdXNobG4odGhpcy5zaGlmdCksdGhpcy5yMj10aGlzLmltb2QodGhpcy5yLnNxcigpKSx0aGlzLnJpbnY9dGhpcy5yLl9pbnZtcCh0aGlzLm0pLHRoaXMubWludj10aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSksdGhpcy5taW52PXRoaXMubWludi51bW9kKHRoaXMuciksdGhpcy5taW52PXRoaXMuci5zdWIodGhpcy5taW52KX1cIm9iamVjdFwiPT10eXBlb2YgdD90LmV4cG9ydHM9bzplLkJOPW8sby5CTj1vLG8ud29yZFNpemU9MjY7dmFyIHc7dHJ5e3c9cigxKS5CdWZmZXJ9Y2F0Y2godCl7fW8uaXNCTj1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG98fG51bGwhPT10JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3Rvci53b3JkU2l6ZT09PW8ud29yZFNpemUmJkFycmF5LmlzQXJyYXkodC53b3Jkcyl9LG8ubWF4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY21wKGUpPjA/dDplfSxvLm1pbj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNtcChlKTwwP3Q6ZX0sby5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLHIpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXJldHVybiB0aGlzLl9pbml0TnVtYmVyKHQsZSxyKTtpZihcIm9iamVjdFwiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5faW5pdEFycmF5KHQsZSxyKTtcImhleFwiPT09ZSYmKGU9MTYpLG4oZT09PSgwfGUpJiZlPj0yJiZlPD0zNiksdD10LnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBpPTA7XCItXCI9PT10WzBdJiZpKyssMTY9PT1lP3RoaXMuX3BhcnNlSGV4KHQsaSk6dGhpcy5fcGFyc2VCYXNlKHQsZSxpKSxcIi1cIj09PXRbMF0mJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKSxcImxlXCI9PT1yJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksZSxyKX0sby5wcm90b3R5cGUuX2luaXROdW1iZXI9ZnVuY3Rpb24odCxlLHIpe3Q8MCYmKHRoaXMubmVnYXRpdmU9MSx0PS10KSx0PDY3MTA4ODY0Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZ0XSx0aGlzLmxlbmd0aD0xKTp0PDQ1MDM1OTk2MjczNzA0OTY/KHRoaXMud29yZHM9WzY3MTA4ODYzJnQsdC82NzEwODg2NCY2NzEwODg2M10sdGhpcy5sZW5ndGg9Mik6KG4odDw5MDA3MTk5MjU0NzQwOTkyKSx0aGlzLndvcmRzPVs2NzEwODg2MyZ0LHQvNjcxMDg4NjQmNjcxMDg4NjMsMV0sdGhpcy5sZW5ndGg9MyksXCJsZVwiPT09ciYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUscil9LG8ucHJvdG90eXBlLl9pbml0QXJyYXk9ZnVuY3Rpb24odCxlLHIpe2lmKG4oXCJudW1iZXJcIj09dHlwZW9mIHQubGVuZ3RoKSx0Lmxlbmd0aDw9MClyZXR1cm4gdGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MSx0aGlzO3RoaXMubGVuZ3RoPU1hdGguY2VpbCh0Lmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciBvLGEsZj0wO2lmKFwiYmVcIj09PXIpZm9yKGk9dC5sZW5ndGgtMSxvPTA7aT49MDtpLT0zKWE9dFtpXXx0W2ktMV08PDh8dFtpLTJdPDwxNix0aGlzLndvcmRzW29dfD1hPDxmJjY3MTA4ODYzLHRoaXMud29yZHNbbysxXT1hPj4+MjYtZiY2NzEwODg2MyxmKz0yNCxmPj0yNiYmKGYtPTI2LG8rKyk7ZWxzZSBpZihcImxlXCI9PT1yKWZvcihpPTAsbz0wO2k8dC5sZW5ndGg7aSs9MylhPXRbaV18dFtpKzFdPDw4fHRbaSsyXTw8MTYsdGhpcy53b3Jkc1tvXXw9YTw8ZiY2NzEwODg2Myx0aGlzLndvcmRzW28rMV09YT4+PjI2LWYmNjcxMDg4NjMsZis9MjQsZj49MjYmJihmLT0yNixvKyspO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl9wYXJzZUhleD1mdW5jdGlvbih0LGUpe3RoaXMubGVuZ3RoPU1hdGguY2VpbCgodC5sZW5ndGgtZSkvNiksdGhpcy53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgcj0wO3I8dGhpcy5sZW5ndGg7cisrKXRoaXMud29yZHNbcl09MDt2YXIgbixpLG89MDtmb3Iocj10Lmxlbmd0aC02LG49MDtyPj1lO3ItPTYpaT1hKHQscixyKzYpLHRoaXMud29yZHNbbl18PWk8PG8mNjcxMDg4NjMsdGhpcy53b3Jkc1tuKzFdfD1pPj4+MjYtbyY0MTk0MzAzLG8rPTI0LG8+PTI2JiYoby09MjYsbisrKTtyKzYhPT1lJiYoaT1hKHQsZSxyKzYpLHRoaXMud29yZHNbbl18PWk8PG8mNjcxMDg4NjMsdGhpcy53b3Jkc1tuKzFdfD1pPj4+MjYtbyY0MTk0MzAzKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl9wYXJzZUJhc2U9ZnVuY3Rpb24odCxlLHIpe3RoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTE7Zm9yKHZhciBuPTAsaT0xO2k8PTY3MTA4ODYzO2kqPWUpbisrO24tLSxpPWkvZXwwO2Zvcih2YXIgbz10Lmxlbmd0aC1yLGE9byVuLHM9TWF0aC5taW4obyxvLWEpK3IsdT0wLGg9cjtoPHM7aCs9bil1PWYodCxoLGgrbixlKSx0aGlzLmltdWxuKGkpLHRoaXMud29yZHNbMF0rdTw2NzEwODg2ND90aGlzLndvcmRzWzBdKz11OnRoaXMuX2lhZGRuKHUpO2lmKDAhPT1hKXt2YXIgYz0xO2Zvcih1PWYodCxoLHQubGVuZ3RoLGUpLGg9MDtoPGE7aCsrKWMqPWU7dGhpcy5pbXVsbihjKSx0aGlzLndvcmRzWzBdK3U8NjcxMDg4NjQ/dGhpcy53b3Jkc1swXSs9dTp0aGlzLl9pYWRkbih1KX19LG8ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCl7dC53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXQud29yZHNbZV09dGhpcy53b3Jkc1tlXTt0Lmxlbmd0aD10aGlzLmxlbmd0aCx0Lm5lZ2F0aXZlPXRoaXMubmVnYXRpdmUsdC5yZWQ9dGhpcy5yZWR9LG8ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG8obnVsbCk7cmV0dXJuIHRoaXMuY29weSh0KSx0fSxvLnByb3RvdHlwZS5fZXhwYW5kPWZ1bmN0aW9uKHQpe2Zvcig7dGhpcy5sZW5ndGg8dDspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS5zdHJpcD1mdW5jdGlvbigpe2Zvcig7dGhpcy5sZW5ndGg+MSYmMD09PXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV07KXRoaXMubGVuZ3RoLS07cmV0dXJuIHRoaXMuX25vcm1TaWduKCl9LG8ucHJvdG90eXBlLl9ub3JtU2lnbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdJiYodGhpcy5uZWdhdGl2ZT0wKSx0aGlzfSxvLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMucmVkP1wiPEJOLVI6IFwiOlwiPEJOOiBcIikrdGhpcy50b1N0cmluZygxNikrXCI+XCJ9O3ZhciBfPVtcIlwiLFwiMFwiLFwiMDBcIixcIjAwMFwiLFwiMDAwMFwiLFwiMDAwMDBcIixcIjAwMDAwMFwiLFwiMDAwMDAwMFwiLFwiMDAwMDAwMDBcIixcIjAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiXSxNPVswLDAsMjUsMTYsMTIsMTEsMTAsOSw4LDgsNyw3LDcsNyw2LDYsNiw2LDYsNiw2LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDVdLFM9WzAsMCwzMzU1NDQzMiw0MzA0NjcyMSwxNjc3NzIxNiw0ODgyODEyNSw2MDQ2NjE3Niw0MDM1MzYwNywxNjc3NzIxNiw0MzA0NjcyMSwxZTcsMTk0ODcxNzEsMzU4MzE4MDgsNjI3NDg1MTcsNzUyOTUzNiwxMTM5MDYyNSwxNjc3NzIxNiwyNDEzNzU2OSwzNDAxMjIyNCw0NzA0NTg4MSw2NGU2LDQwODQxMDEsNTE1MzYzMiw2NDM2MzQzLDc5NjI2MjQsOTc2NTYyNSwxMTg4MTM3NiwxNDM0ODkwNywxNzIxMDM2OCwyMDUxMTE0OSwyNDNlNSwyODYyOTE1MSwzMzU1NDQzMiwzOTEzNTM5Myw0NTQzNTQyNCw1MjUyMTg3NSw2MDQ2NjE3Nl07by5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24odCxlKXt0PXR8fDEwLGU9MHxlfHwxO3ZhciByO2lmKDE2PT09dHx8XCJoZXhcIj09PXQpe3I9XCJcIjtmb3IodmFyIGk9MCxvPTAsYT0wO2E8dGhpcy5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLndvcmRzW2FdLHM9KDE2Nzc3MjE1JihmPDxpfG8pKS50b1N0cmluZygxNik7bz1mPj4+MjQtaSYxNjc3NzIxNSxyPTAhPT1vfHxhIT09dGhpcy5sZW5ndGgtMT9fWzYtcy5sZW5ndGhdK3MrcjpzK3IsaSs9MixpPj0yNiYmKGktPTI2LGEtLSl9Zm9yKDAhPT1vJiYocj1vLnRvU3RyaW5nKDE2KStyKTtyLmxlbmd0aCVlIT09MDspcj1cIjBcIityO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKHI9XCItXCIrcikscn1pZih0PT09KDB8dCkmJnQ+PTImJnQ8PTM2KXt2YXIgdT1NW3RdLGg9U1t0XTtyPVwiXCI7dmFyIGM9dGhpcy5jbG9uZSgpO2ZvcihjLm5lZ2F0aXZlPTA7IWMuaXNaZXJvKCk7KXt2YXIgZD1jLm1vZG4oaCkudG9TdHJpbmcodCk7Yz1jLmlkaXZuKGgpLHI9Yy5pc1plcm8oKT9kK3I6X1t1LWQubGVuZ3RoXStkK3J9Zm9yKHRoaXMuaXNaZXJvKCkmJihyPVwiMFwiK3IpO3IubGVuZ3RoJWUhPT0wOylyPVwiMFwiK3I7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlJiYocj1cIi1cIityKSxyfW4oITEsXCJCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpfSxvLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMud29yZHNbMF07cmV0dXJuIDI9PT10aGlzLmxlbmd0aD90Kz02NzEwODg2NCp0aGlzLndvcmRzWzFdOjM9PT10aGlzLmxlbmd0aCYmMT09PXRoaXMud29yZHNbMl0/dCs9NDUwMzU5OTYyNzM3MDQ5Nis2NzEwODg2NCp0aGlzLndvcmRzWzFdOnRoaXMubGVuZ3RoPjImJm4oITEsXCJOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHNcIiksMCE9PXRoaXMubmVnYXRpdmU/LXQ6dH0sby5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpfSxvLnByb3RvdHlwZS50b0J1ZmZlcj1mdW5jdGlvbih0LGUpe3JldHVybiBuKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3KSx0aGlzLnRvQXJyYXlMaWtlKHcsdCxlKX0sby5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LHQsZSl9LG8ucHJvdG90eXBlLnRvQXJyYXlMaWtlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT10aGlzLmJ5dGVMZW5ndGgoKSxvPXJ8fE1hdGgubWF4KDEsaSk7bihpPD1vLFwiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aFwiKSxuKG8+MCxcIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMFwiKSx0aGlzLnN0cmlwKCk7dmFyIGEsZixzPVwibGVcIj09PWUsdT1uZXcgdChvKSxoPXRoaXMuY2xvbmUoKTtpZihzKXtmb3IoZj0wOyFoLmlzWmVybygpO2YrKylhPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSx1W2ZdPWE7Zm9yKDtmPG87ZisrKXVbZl09MH1lbHNle2ZvcihmPTA7ZjxvLWk7ZisrKXVbZl09MDtmb3IoZj0wOyFoLmlzWmVybygpO2YrKylhPWguYW5kbG4oMjU1KSxoLml1c2hybig4KSx1W28tZi0xXT1hfXJldHVybiB1fSxNYXRoLmNsejMyP28ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDMyLU1hdGguY2x6MzIodCl9Om8ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24odCl7dmFyIGU9dCxyPTA7cmV0dXJuIGU+PTQwOTYmJihyKz0xMyxlPj4+PTEzKSxlPj02NCYmKHIrPTcsZT4+Pj03KSxlPj04JiYocis9NCxlPj4+PTQpLGU+PTImJihyKz0yLGU+Pj49MikscitlfSxvLnByb3RvdHlwZS5femVyb0JpdHM9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIDI2O3ZhciBlPXQscj0wO3JldHVybiAwPT09KDgxOTEmZSkmJihyKz0xMyxlPj4+PTEzKSwwPT09KDEyNyZlKSYmKHIrPTcsZT4+Pj03KSwwPT09KDE1JmUpJiYocis9NCxlPj4+PTQpLDA9PT0oMyZlKSYmKHIrPTIsZT4+Pj0yKSwwPT09KDEmZSkmJnIrKyxyfSxvLnByb3RvdHlwZS5iaXRMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdLGU9dGhpcy5fY291bnRCaXRzKHQpO3JldHVybiAyNioodGhpcy5sZW5ndGgtMSkrZX0sby5wcm90b3R5cGUuemVyb0JpdHM9ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiAwO2Zvcih2YXIgdD0wLGU9MDtlPHRoaXMubGVuZ3RoO2UrKyl7dmFyIHI9dGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tlXSk7aWYodCs9ciwyNiE9PXIpYnJlYWt9cmV0dXJuIHR9LG8ucHJvdG90eXBlLmJ5dGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkvOCl9LG8ucHJvdG90eXBlLnRvVHdvcz1mdW5jdGlvbih0KXtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/dGhpcy5hYnMoKS5pbm90bih0KS5pYWRkbigxKTp0aGlzLmNsb25lKCl9LG8ucHJvdG90eXBlLmZyb21Ud29zPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRlc3RuKHQtMSk/dGhpcy5ub3RuKHQpLmlhZGRuKDEpLmluZWcoKTp0aGlzLmNsb25lKCl9LG8ucHJvdG90eXBlLmlzTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlfSxvLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKX0sby5wcm90b3R5cGUuaW5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzWmVybygpfHwodGhpcy5uZWdhdGl2ZV49MSksdGhpc30sby5wcm90b3R5cGUuaXVvcj1mdW5jdGlvbih0KXtmb3IoO3RoaXMubGVuZ3RoPHQubGVuZ3RoOyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy53b3Jkc1tlXT10aGlzLndvcmRzW2VdfHQud29yZHNbZV07cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaW9yPWZ1bmN0aW9uKHQpe3JldHVybiBuKDA9PT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdW9yKHQpfSxvLnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlvcih0KTp0LmNsb25lKCkuaW9yKHRoaXMpfSxvLnByb3RvdHlwZS51b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdW9yKHQpOnQuY2xvbmUoKS5pdW9yKHRoaXMpfSxvLnByb3RvdHlwZS5pdWFuZD1mdW5jdGlvbih0KXt2YXIgZTtlPXRoaXMubGVuZ3RoPnQubGVuZ3RoP3Q6dGhpcztmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0aGlzLndvcmRzW3JdPXRoaXMud29yZHNbcl0mdC53b3Jkc1tyXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuKDA9PT0odGhpcy5uZWdhdGl2ZXx0Lm5lZ2F0aXZlKSksdGhpcy5pdWFuZCh0KX0sby5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaWFuZCh0KTp0LmNsb25lKCkuaWFuZCh0aGlzKX0sby5wcm90b3R5cGUudWFuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLml1YW5kKHQpOnQuY2xvbmUoKS5pdWFuZCh0aGlzKX0sby5wcm90b3R5cGUuaXV4b3I9ZnVuY3Rpb24odCl7dmFyIGUscjt0aGlzLmxlbmd0aD50Lmxlbmd0aD8oZT10aGlzLHI9dCk6KGU9dCxyPXRoaXMpO2Zvcih2YXIgbj0wO248ci5sZW5ndGg7bisrKXRoaXMud29yZHNbbl09ZS53b3Jkc1tuXV5yLndvcmRzW25dO2lmKHRoaXMhPT1lKWZvcig7bjxlLmxlbmd0aDtuKyspdGhpcy53b3Jkc1tuXT1lLndvcmRzW25dO3JldHVybiB0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLml4b3I9ZnVuY3Rpb24odCl7cmV0dXJuIG4oMD09PSh0aGlzLm5lZ2F0aXZlfHQubmVnYXRpdmUpKSx0aGlzLml1eG9yKHQpfSxvLnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5peG9yKHQpOnQuY2xvbmUoKS5peG9yKHRoaXMpfSxvLnByb3RvdHlwZS51eG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXV4b3IodCk6dC5jbG9uZSgpLml1eG9yKHRoaXMpfSxvLnByb3RvdHlwZS5pbm90bj1mdW5jdGlvbih0KXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZT0wfE1hdGguY2VpbCh0LzI2KSxyPXQlMjY7dGhpcy5fZXhwYW5kKGUpLHI+MCYmZS0tO2Zvcih2YXIgaT0wO2k8ZTtpKyspdGhpcy53b3Jkc1tpXT02NzEwODg2MyZ+dGhpcy53b3Jkc1tpXTtyZXR1cm4gcj4wJiYodGhpcy53b3Jkc1tpXT1+dGhpcy53b3Jkc1tpXSY2NzEwODg2Mz4+MjYtciksdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5ub3RuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaW5vdG4odCl9LG8ucHJvdG90eXBlLnNldG49ZnVuY3Rpb24odCxlKXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgcj10LzI2fDAsaT10JTI2O3JldHVybiB0aGlzLl9leHBhbmQocisxKSxlP3RoaXMud29yZHNbcl09dGhpcy53b3Jkc1tyXXwxPDxpOnRoaXMud29yZHNbcl09dGhpcy53b3Jkc1tyXSZ+KDE8PGkpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbih0KXt2YXIgZTtpZigwIT09dGhpcy5uZWdhdGl2ZSYmMD09PXQubmVnYXRpdmUpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCxlPXRoaXMuaXN1Yih0KSx0aGlzLm5lZ2F0aXZlXj0xLHRoaXMuX25vcm1TaWduKCk7aWYoMD09PXRoaXMubmVnYXRpdmUmJjAhPT10Lm5lZ2F0aXZlKXJldHVybiB0Lm5lZ2F0aXZlPTAsZT10aGlzLmlzdWIodCksdC5uZWdhdGl2ZT0xLGUuX25vcm1TaWduKCk7dmFyIHIsbjt0aGlzLmxlbmd0aD50Lmxlbmd0aD8ocj10aGlzLG49dCk6KHI9dCxuPXRoaXMpO2Zvcih2YXIgaT0wLG89MDtvPG4ubGVuZ3RoO28rKyllPSgwfHIud29yZHNbb10pKygwfG4ud29yZHNbb10pK2ksdGhpcy53b3Jkc1tvXT02NzEwODg2MyZlLGk9ZT4+PjI2O2Zvcig7MCE9PWkmJm88ci5sZW5ndGg7bysrKWU9KDB8ci53b3Jkc1tvXSkraSx0aGlzLndvcmRzW29dPTY3MTA4ODYzJmUsaT1lPj4+MjY7aWYodGhpcy5sZW5ndGg9ci5sZW5ndGgsMCE9PWkpdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF09aSx0aGlzLmxlbmd0aCsrO2Vsc2UgaWYociE9PXRoaXMpZm9yKDtvPHIubGVuZ3RoO28rKyl0aGlzLndvcmRzW29dPXIud29yZHNbb107cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMCE9PXQubmVnYXRpdmUmJjA9PT10aGlzLm5lZ2F0aXZlPyh0Lm5lZ2F0aXZlPTAsZT10aGlzLnN1Yih0KSx0Lm5lZ2F0aXZlXj0xLGUpOjA9PT10Lm5lZ2F0aXZlJiYwIT09dGhpcy5uZWdhdGl2ZT8odGhpcy5uZWdhdGl2ZT0wLGU9dC5zdWIodGhpcyksdGhpcy5uZWdhdGl2ZT0xLGUpOnRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKHQpOnQuY2xvbmUoKS5pYWRkKHRoaXMpfSxvLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQpe2lmKDAhPT10Lm5lZ2F0aXZlKXt0Lm5lZ2F0aXZlPTA7dmFyIGU9dGhpcy5pYWRkKHQpO3JldHVybiB0Lm5lZ2F0aXZlPTEsZS5fbm9ybVNpZ24oKX1pZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZCh0KSx0aGlzLm5lZ2F0aXZlPTEsdGhpcy5fbm9ybVNpZ24oKTt2YXIgcj10aGlzLmNtcCh0KTtpZigwPT09cilyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMubGVuZ3RoPTEsdGhpcy53b3Jkc1swXT0wLHRoaXM7dmFyIG4saTtyPjA/KG49dGhpcyxpPXQpOihuPXQsaT10aGlzKTtmb3IodmFyIG89MCxhPTA7YTxpLmxlbmd0aDthKyspZT0oMHxuLndvcmRzW2FdKS0oMHxpLndvcmRzW2FdKStvLG89ZT4+MjYsdGhpcy53b3Jkc1thXT02NzEwODg2MyZlO2Zvcig7MCE9PW8mJmE8bi5sZW5ndGg7YSsrKWU9KDB8bi53b3Jkc1thXSkrbyxvPWU+PjI2LHRoaXMud29yZHNbYV09NjcxMDg4NjMmZTtpZigwPT09byYmYTxuLmxlbmd0aCYmbiE9PXRoaXMpZm9yKDthPG4ubGVuZ3RoO2ErKyl0aGlzLndvcmRzW2FdPW4ud29yZHNbYV07cmV0dXJuIHRoaXMubGVuZ3RoPU1hdGgubWF4KHRoaXMubGVuZ3RoLGEpLG4hPT10aGlzJiYodGhpcy5uZWdhdGl2ZT0xKSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIodCl9O3ZhciBFPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpLG8sYT10LndvcmRzLGY9ZS53b3JkcyxzPXIud29yZHMsdT0wLGg9MHxhWzBdLGM9ODE5MSZoLGQ9aD4+PjEzLGw9MHxhWzFdLHA9ODE5MSZsLGI9bD4+PjEzLHY9MHxhWzJdLHk9ODE5MSZ2LG09dj4+PjEzLGc9MHxhWzNdLHc9ODE5MSZnLF89Zz4+PjEzLE09MHxhWzRdLFM9ODE5MSZNLEU9TT4+PjEzLEE9MHxhWzVdLGs9ODE5MSZBLHg9QT4+PjEzLEk9MHxhWzZdLEI9ODE5MSZJLE89ST4+PjEzLFI9MHxhWzddLFA9ODE5MSZSLFQ9Uj4+PjEzLGo9MHxhWzhdLEM9ODE5MSZqLE49aj4+PjEzLEw9MHxhWzldLFU9ODE5MSZMLHo9TD4+PjEzLEQ9MHxmWzBdLHE9ODE5MSZELEY9RD4+PjEzLEs9MHxmWzFdLEc9ODE5MSZLLFY9Sz4+PjEzLEg9MHxmWzJdLFg9ODE5MSZILFk9SD4+PjEzLFc9MHxmWzNdLFo9ODE5MSZXLEo9Vz4+PjEzLCQ9MHxmWzRdLFE9ODE5MSYkLHR0PSQ+Pj4xMyxldD0wfGZbNV0scnQ9ODE5MSZldCxudD1ldD4+PjEzLGl0PTB8Zls2XSxvdD04MTkxJml0LGF0PWl0Pj4+MTMsZnQ9MHxmWzddLHN0PTgxOTEmZnQsdXQ9ZnQ+Pj4xMyxodD0wfGZbOF0sY3Q9ODE5MSZodCxkdD1odD4+PjEzLGx0PTB8Zls5XSxwdD04MTkxJmx0LGJ0PWx0Pj4+MTM7ci5uZWdhdGl2ZT10Lm5lZ2F0aXZlXmUubmVnYXRpdmUsci5sZW5ndGg9MTksbj1NYXRoLmltdWwoYyxxKSxpPU1hdGguaW11bChjLEYpLGk9aStNYXRoLmltdWwoZCxxKXwwLG89TWF0aC5pbXVsKGQsRik7dmFyIHZ0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyh2dD4+PjI2KXwwLHZ0Jj02NzEwODg2MyxuPU1hdGguaW11bChwLHEpLGk9TWF0aC5pbXVsKHAsRiksaT1pK01hdGguaW11bChiLHEpfDAsbz1NYXRoLmltdWwoYixGKSxuPW4rTWF0aC5pbXVsKGMsRyl8MCxpPWkrTWF0aC5pbXVsKGMsVil8MCxpPWkrTWF0aC5pbXVsKGQsRyl8MCxvPW8rTWF0aC5pbXVsKGQsVil8MDt2YXIgeXQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KG8rKGk+Pj4xMyl8MCkrKHl0Pj4+MjYpfDAseXQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKHkscSksaT1NYXRoLmltdWwoeSxGKSxpPWkrTWF0aC5pbXVsKG0scSl8MCxvPU1hdGguaW11bChtLEYpLG49bitNYXRoLmltdWwocCxHKXwwLGk9aStNYXRoLmltdWwocCxWKXwwLGk9aStNYXRoLmltdWwoYixHKXwwLG89bytNYXRoLmltdWwoYixWKXwwLG49bitNYXRoLmltdWwoYyxYKXwwLGk9aStNYXRoLmltdWwoYyxZKXwwLGk9aStNYXRoLmltdWwoZCxYKXwwLG89bytNYXRoLmltdWwoZCxZKXwwO3ZhciBtdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsobXQ+Pj4yNil8MCxtdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwodyxxKSxpPU1hdGguaW11bCh3LEYpLGk9aStNYXRoLmltdWwoXyxxKXwwLG89TWF0aC5pbXVsKF8sRiksbj1uK01hdGguaW11bCh5LEcpfDAsaT1pK01hdGguaW11bCh5LFYpfDAsaT1pK01hdGguaW11bChtLEcpfDAsbz1vK01hdGguaW11bChtLFYpfDAsbj1uK01hdGguaW11bChwLFgpfDAsaT1pK01hdGguaW11bChwLFkpfDAsaT1pK01hdGguaW11bChiLFgpfDAsbz1vK01hdGguaW11bChiLFkpfDAsbj1uK01hdGguaW11bChjLFopfDAsaT1pK01hdGguaW11bChjLEopfDAsaT1pK01hdGguaW11bChkLFopfDAsbz1vK01hdGguaW11bChkLEopfDA7dmFyIGd0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhndD4+PjI2KXwwLGd0Jj02NzEwODg2MyxuPU1hdGguaW11bChTLHEpLGk9TWF0aC5pbXVsKFMsRiksaT1pK01hdGguaW11bChFLHEpfDAsbz1NYXRoLmltdWwoRSxGKSxuPW4rTWF0aC5pbXVsKHcsRyl8MCxpPWkrTWF0aC5pbXVsKHcsVil8MCxpPWkrTWF0aC5pbXVsKF8sRyl8MCxvPW8rTWF0aC5pbXVsKF8sVil8MCxuPW4rTWF0aC5pbXVsKHksWCl8MCxpPWkrTWF0aC5pbXVsKHksWSl8MCxpPWkrTWF0aC5pbXVsKG0sWCl8MCxvPW8rTWF0aC5pbXVsKG0sWSl8MCxuPW4rTWF0aC5pbXVsKHAsWil8MCxpPWkrTWF0aC5pbXVsKHAsSil8MCxpPWkrTWF0aC5pbXVsKGIsWil8MCxvPW8rTWF0aC5pbXVsKGIsSil8MCxuPW4rTWF0aC5pbXVsKGMsUSl8MCxpPWkrTWF0aC5pbXVsKGMsdHQpfDAsaT1pK01hdGguaW11bChkLFEpfDAsbz1vK01hdGguaW11bChkLHR0KXwwO3ZhciB3dD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsod3Q+Pj4yNil8MCx3dCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoayxxKSxpPU1hdGguaW11bChrLEYpLGk9aStNYXRoLmltdWwoeCxxKXwwLG89TWF0aC5pbXVsKHgsRiksbj1uK01hdGguaW11bChTLEcpfDAsaT1pK01hdGguaW11bChTLFYpfDAsaT1pK01hdGguaW11bChFLEcpfDAsbz1vK01hdGguaW11bChFLFYpfDAsbj1uK01hdGguaW11bCh3LFgpfDAsaT1pK01hdGguaW11bCh3LFkpfDAsaT1pK01hdGguaW11bChfLFgpfDAsbz1vK01hdGguaW11bChfLFkpfDAsbj1uK01hdGguaW11bCh5LFopfDAsaT1pK01hdGguaW11bCh5LEopfDAsaT1pK01hdGguaW11bChtLFopfDAsbz1vK01hdGguaW11bChtLEopfDAsbj1uK01hdGguaW11bChwLFEpfDAsaT1pK01hdGguaW11bChwLHR0KXwwLGk9aStNYXRoLmltdWwoYixRKXwwLG89bytNYXRoLmltdWwoYix0dCl8MCxuPW4rTWF0aC5pbXVsKGMscnQpfDAsaT1pK01hdGguaW11bChjLG50KXwwLGk9aStNYXRoLmltdWwoZCxydCl8MCxvPW8rTWF0aC5pbXVsKGQsbnQpfDA7dmFyIF90PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhfdD4+PjI2KXwwLF90Jj02NzEwODg2MyxuPU1hdGguaW11bChCLHEpLGk9TWF0aC5pbXVsKEIsRiksaT1pK01hdGguaW11bChPLHEpfDAsbz1NYXRoLmltdWwoTyxGKSxuPW4rTWF0aC5pbXVsKGssRyl8MCxpPWkrTWF0aC5pbXVsKGssVil8MCxpPWkrTWF0aC5pbXVsKHgsRyl8MCxvPW8rTWF0aC5pbXVsKHgsVil8MCxuPW4rTWF0aC5pbXVsKFMsWCl8MCxpPWkrTWF0aC5pbXVsKFMsWSl8MCxpPWkrTWF0aC5pbXVsKEUsWCl8MCxvPW8rTWF0aC5pbXVsKEUsWSl8MCxuPW4rTWF0aC5pbXVsKHcsWil8MCxpPWkrTWF0aC5pbXVsKHcsSil8MCxpPWkrTWF0aC5pbXVsKF8sWil8MCxvPW8rTWF0aC5pbXVsKF8sSil8MCxuPW4rTWF0aC5pbXVsKHksUSl8MCxpPWkrTWF0aC5pbXVsKHksdHQpfDAsaT1pK01hdGguaW11bChtLFEpfDAsbz1vK01hdGguaW11bChtLHR0KXwwLG49bitNYXRoLmltdWwocCxydCl8MCxpPWkrTWF0aC5pbXVsKHAsbnQpfDAsaT1pK01hdGguaW11bChiLHJ0KXwwLG89bytNYXRoLmltdWwoYixudCl8MCxuPW4rTWF0aC5pbXVsKGMsb3QpfDAsaT1pK01hdGguaW11bChjLGF0KXwwLGk9aStNYXRoLmltdWwoZCxvdCl8MCxvPW8rTWF0aC5pbXVsKGQsYXQpfDA7dmFyIE10PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhNdD4+PjI2KXwwLE10Jj02NzEwODg2MyxuPU1hdGguaW11bChQLHEpLGk9TWF0aC5pbXVsKFAsRiksaT1pK01hdGguaW11bChULHEpfDAsbz1NYXRoLmltdWwoVCxGKSxuPW4rTWF0aC5pbXVsKEIsRyl8MCxpPWkrTWF0aC5pbXVsKEIsVil8MCxpPWkrTWF0aC5pbXVsKE8sRyl8MCxvPW8rTWF0aC5pbXVsKE8sVil8MCxuPW4rTWF0aC5pbXVsKGssWCl8MCxpPWkrTWF0aC5pbXVsKGssWSl8MCxpPWkrTWF0aC5pbXVsKHgsWCl8MCxvPW8rTWF0aC5pbXVsKHgsWSl8MCxuPW4rTWF0aC5pbXVsKFMsWil8MCxpPWkrTWF0aC5pbXVsKFMsSil8MCxpPWkrTWF0aC5pbXVsKEUsWil8MCxvPW8rTWF0aC5pbXVsKEUsSil8MCxuPW4rTWF0aC5pbXVsKHcsUSl8MCxpPWkrTWF0aC5pbXVsKHcsdHQpfDAsaT1pK01hdGguaW11bChfLFEpfDAsbz1vK01hdGguaW11bChfLHR0KXwwLG49bitNYXRoLmltdWwoeSxydCl8MCxpPWkrTWF0aC5pbXVsKHksbnQpfDAsaT1pK01hdGguaW11bChtLHJ0KXwwLG89bytNYXRoLmltdWwobSxudCl8MCxuPW4rTWF0aC5pbXVsKHAsb3QpfDAsaT1pK01hdGguaW11bChwLGF0KXwwLGk9aStNYXRoLmltdWwoYixvdCl8MCxvPW8rTWF0aC5pbXVsKGIsYXQpfDAsbj1uK01hdGguaW11bChjLHN0KXwwLGk9aStNYXRoLmltdWwoYyx1dCl8MCxpPWkrTWF0aC5pbXVsKGQsc3QpfDAsbz1vK01hdGguaW11bChkLHV0KXwwO3ZhciBTdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoU3Q+Pj4yNil8MCxTdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoQyxxKSxpPU1hdGguaW11bChDLEYpLGk9aStNYXRoLmltdWwoTixxKXwwLG89TWF0aC5pbXVsKE4sRiksbj1uK01hdGguaW11bChQLEcpfDAsaT1pK01hdGguaW11bChQLFYpfDAsaT1pK01hdGguaW11bChULEcpfDAsbz1vK01hdGguaW11bChULFYpfDAsbj1uK01hdGguaW11bChCLFgpfDAsaT1pK01hdGguaW11bChCLFkpfDAsaT1pK01hdGguaW11bChPLFgpfDAsbz1vK01hdGguaW11bChPLFkpfDAsbj1uK01hdGguaW11bChrLFopfDAsaT1pK01hdGguaW11bChrLEopfDAsaT1pK01hdGguaW11bCh4LFopfDAsbz1vK01hdGguaW11bCh4LEopfDAsbj1uK01hdGguaW11bChTLFEpfDAsaT1pK01hdGguaW11bChTLHR0KXwwLGk9aStNYXRoLmltdWwoRSxRKXwwLG89bytNYXRoLmltdWwoRSx0dCl8MCxuPW4rTWF0aC5pbXVsKHcscnQpfDAsaT1pK01hdGguaW11bCh3LG50KXwwLGk9aStNYXRoLmltdWwoXyxydCl8MCxvPW8rTWF0aC5pbXVsKF8sbnQpfDAsbj1uK01hdGguaW11bCh5LG90KXwwLGk9aStNYXRoLmltdWwoeSxhdCl8MCxpPWkrTWF0aC5pbXVsKG0sb3QpfDAsbz1vK01hdGguaW11bChtLGF0KXwwLG49bitNYXRoLmltdWwocCxzdCl8MCxpPWkrTWF0aC5pbXVsKHAsdXQpfDAsaT1pK01hdGguaW11bChiLHN0KXwwLG89bytNYXRoLmltdWwoYix1dCl8MCxuPW4rTWF0aC5pbXVsKGMsY3QpfDAsaT1pK01hdGguaW11bChjLGR0KXwwLGk9aStNYXRoLmltdWwoZCxjdCl8MCxvPW8rTWF0aC5pbXVsKGQsZHQpfDA7dmFyIEV0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhFdD4+PjI2KXwwLEV0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLHEpLGk9TWF0aC5pbXVsKFUsRiksaT1pK01hdGguaW11bCh6LHEpfDAsbz1NYXRoLmltdWwoeixGKSxuPW4rTWF0aC5pbXVsKEMsRyl8MCxpPWkrTWF0aC5pbXVsKEMsVil8MCxpPWkrTWF0aC5pbXVsKE4sRyl8MCxvPW8rTWF0aC5pbXVsKE4sVil8MCxuPW4rTWF0aC5pbXVsKFAsWCl8MCxpPWkrTWF0aC5pbXVsKFAsWSl8MCxpPWkrTWF0aC5pbXVsKFQsWCl8MCxvPW8rTWF0aC5pbXVsKFQsWSl8MCxuPW4rTWF0aC5pbXVsKEIsWil8MCxpPWkrTWF0aC5pbXVsKEIsSil8MCxpPWkrTWF0aC5pbXVsKE8sWil8MCxvPW8rTWF0aC5pbXVsKE8sSil8MCxuPW4rTWF0aC5pbXVsKGssUSl8MCxpPWkrTWF0aC5pbXVsKGssdHQpfDAsaT1pK01hdGguaW11bCh4LFEpfDAsbz1vK01hdGguaW11bCh4LHR0KXwwLG49bitNYXRoLmltdWwoUyxydCl8MCxpPWkrTWF0aC5pbXVsKFMsbnQpfDAsaT1pK01hdGguaW11bChFLHJ0KXwwLG89bytNYXRoLmltdWwoRSxudCl8MCxuPW4rTWF0aC5pbXVsKHcsb3QpfDAsaT1pK01hdGguaW11bCh3LGF0KXwwLGk9aStNYXRoLmltdWwoXyxvdCl8MCxvPW8rTWF0aC5pbXVsKF8sYXQpfDAsbj1uK01hdGguaW11bCh5LHN0KXwwLGk9aStNYXRoLmltdWwoeSx1dCl8MCxpPWkrTWF0aC5pbXVsKG0sc3QpfDAsbz1vK01hdGguaW11bChtLHV0KXwwLG49bitNYXRoLmltdWwocCxjdCl8MCxpPWkrTWF0aC5pbXVsKHAsZHQpfDAsaT1pK01hdGguaW11bChiLGN0KXwwLG89bytNYXRoLmltdWwoYixkdCl8MCxuPW4rTWF0aC5pbXVsKGMscHQpfDAsaT1pK01hdGguaW11bChjLGJ0KXwwLGk9aStNYXRoLmltdWwoZCxwdCl8MCxvPW8rTWF0aC5pbXVsKGQsYnQpfDA7dmFyIEF0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhBdD4+PjI2KXwwLEF0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLEcpLGk9TWF0aC5pbXVsKFUsViksaT1pK01hdGguaW11bCh6LEcpfDAsbz1NYXRoLmltdWwoeixWKSxuPW4rTWF0aC5pbXVsKEMsWCl8MCxpPWkrTWF0aC5pbXVsKEMsWSl8MCxpPWkrTWF0aC5pbXVsKE4sWCl8MCxvPW8rTWF0aC5pbXVsKE4sWSl8MCxuPW4rTWF0aC5pbXVsKFAsWil8MCxpPWkrTWF0aC5pbXVsKFAsSil8MCxpPWkrTWF0aC5pbXVsKFQsWil8MCxvPW8rTWF0aC5pbXVsKFQsSil8MCxuPW4rTWF0aC5pbXVsKEIsUSl8MCxpPWkrTWF0aC5pbXVsKEIsdHQpfDAsaT1pK01hdGguaW11bChPLFEpfDAsbz1vK01hdGguaW11bChPLHR0KXwwLG49bitNYXRoLmltdWwoayxydCl8MCxpPWkrTWF0aC5pbXVsKGssbnQpfDAsaT1pK01hdGguaW11bCh4LHJ0KXwwLG89bytNYXRoLmltdWwoeCxudCl8MCxuPW4rTWF0aC5pbXVsKFMsb3QpfDAsaT1pK01hdGguaW11bChTLGF0KXwwLGk9aStNYXRoLmltdWwoRSxvdCl8MCxvPW8rTWF0aC5pbXVsKEUsYXQpfDAsbj1uK01hdGguaW11bCh3LHN0KXwwLGk9aStNYXRoLmltdWwodyx1dCl8MCxpPWkrTWF0aC5pbXVsKF8sc3QpfDAsbz1vK01hdGguaW11bChfLHV0KXwwLG49bitNYXRoLmltdWwoeSxjdCl8MCxpPWkrTWF0aC5pbXVsKHksZHQpfDAsaT1pK01hdGguaW11bChtLGN0KXwwLG89bytNYXRoLmltdWwobSxkdCl8MCxuPW4rTWF0aC5pbXVsKHAscHQpfDAsaT1pK01hdGguaW11bChwLGJ0KXwwLGk9aStNYXRoLmltdWwoYixwdCl8MCxvPW8rTWF0aC5pbXVsKGIsYnQpfDA7dmFyIGt0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhrdD4+PjI2KXwwLGt0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLFgpLGk9TWF0aC5pbXVsKFUsWSksaT1pK01hdGguaW11bCh6LFgpfDAsbz1NYXRoLmltdWwoeixZKSxuPW4rTWF0aC5pbXVsKEMsWil8MCxpPWkrTWF0aC5pbXVsKEMsSil8MCxpPWkrTWF0aC5pbXVsKE4sWil8MCxvPW8rTWF0aC5pbXVsKE4sSil8MCxuPW4rTWF0aC5pbXVsKFAsUSl8MCxpPWkrTWF0aC5pbXVsKFAsdHQpfDAsaT1pK01hdGguaW11bChULFEpfDAsbz1vK01hdGguaW11bChULHR0KXwwLG49bitNYXRoLmltdWwoQixydCl8MCxpPWkrTWF0aC5pbXVsKEIsbnQpfDAsaT1pK01hdGguaW11bChPLHJ0KXwwLG89bytNYXRoLmltdWwoTyxudCl8MCxuPW4rTWF0aC5pbXVsKGssb3QpfDAsaT1pK01hdGguaW11bChrLGF0KXwwLGk9aStNYXRoLmltdWwoeCxvdCl8MCxvPW8rTWF0aC5pbXVsKHgsYXQpfDAsbj1uK01hdGguaW11bChTLHN0KXwwLGk9aStNYXRoLmltdWwoUyx1dCl8MCxpPWkrTWF0aC5pbXVsKEUsc3QpfDAsbz1vK01hdGguaW11bChFLHV0KXwwLG49bitNYXRoLmltdWwodyxjdCl8MCxpPWkrTWF0aC5pbXVsKHcsZHQpfDAsaT1pK01hdGguaW11bChfLGN0KXwwLG89bytNYXRoLmltdWwoXyxkdCl8MCxuPW4rTWF0aC5pbXVsKHkscHQpfDAsaT1pK01hdGguaW11bCh5LGJ0KXwwLGk9aStNYXRoLmltdWwobSxwdCl8MCxvPW8rTWF0aC5pbXVsKG0sYnQpfDA7dmFyIHh0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyh4dD4+PjI2KXwwLHh0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLFopLGk9TWF0aC5pbXVsKFUsSiksaT1pK01hdGguaW11bCh6LFopfDAsbz1NYXRoLmltdWwoeixKKSxuPW4rTWF0aC5pbXVsKEMsUSl8MCxpPWkrTWF0aC5pbXVsKEMsdHQpfDAsaT1pK01hdGguaW11bChOLFEpfDAsbz1vK01hdGguaW11bChOLHR0KXwwLG49bitNYXRoLmltdWwoUCxydCl8MCxpPWkrTWF0aC5pbXVsKFAsbnQpfDAsaT1pK01hdGguaW11bChULHJ0KXwwLG89bytNYXRoLmltdWwoVCxudCl8MCxuPW4rTWF0aC5pbXVsKEIsb3QpfDAsaT1pK01hdGguaW11bChCLGF0KXwwLGk9aStNYXRoLmltdWwoTyxvdCl8MCxvPW8rTWF0aC5pbXVsKE8sYXQpfDAsbj1uK01hdGguaW11bChrLHN0KXwwLGk9aStNYXRoLmltdWwoayx1dCl8MCxpPWkrTWF0aC5pbXVsKHgsc3QpfDAsbz1vK01hdGguaW11bCh4LHV0KXwwLG49bitNYXRoLmltdWwoUyxjdCl8MCxpPWkrTWF0aC5pbXVsKFMsZHQpfDAsaT1pK01hdGguaW11bChFLGN0KXwwLG89bytNYXRoLmltdWwoRSxkdCl8MCxuPW4rTWF0aC5pbXVsKHcscHQpfDAsaT1pK01hdGguaW11bCh3LGJ0KXwwLGk9aStNYXRoLmltdWwoXyxwdCl8MCxvPW8rTWF0aC5pbXVsKF8sYnQpfDA7dmFyIEl0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhJdD4+PjI2KXwwLEl0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLFEpLGk9TWF0aC5pbXVsKFUsdHQpLGk9aStNYXRoLmltdWwoeixRKXwwLG89TWF0aC5pbXVsKHosdHQpLG49bitNYXRoLmltdWwoQyxydCl8MCxpPWkrTWF0aC5pbXVsKEMsbnQpfDAsaT1pK01hdGguaW11bChOLHJ0KXwwLG89bytNYXRoLmltdWwoTixudCl8MCxuPW4rTWF0aC5pbXVsKFAsb3QpfDAsaT1pK01hdGguaW11bChQLGF0KXwwLGk9aStNYXRoLmltdWwoVCxvdCl8MCxvPW8rTWF0aC5pbXVsKFQsYXQpfDAsbj1uK01hdGguaW11bChCLHN0KXwwLGk9aStNYXRoLmltdWwoQix1dCl8MCxpPWkrTWF0aC5pbXVsKE8sc3QpfDAsbz1vK01hdGguaW11bChPLHV0KXwwLG49bitNYXRoLmltdWwoayxjdCl8MCxpPWkrTWF0aC5pbXVsKGssZHQpfDAsaT1pK01hdGguaW11bCh4LGN0KXwwLG89bytNYXRoLmltdWwoeCxkdCl8MCxuPW4rTWF0aC5pbXVsKFMscHQpfDAsaT1pK01hdGguaW11bChTLGJ0KXwwLGk9aStNYXRoLmltdWwoRSxwdCl8MCxvPW8rTWF0aC5pbXVsKEUsYnQpfDA7dmFyIEJ0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhCdD4+PjI2KXwwLEJ0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLHJ0KSxpPU1hdGguaW11bChVLG50KSxpPWkrTWF0aC5pbXVsKHoscnQpfDAsbz1NYXRoLmltdWwoeixudCksbj1uK01hdGguaW11bChDLG90KXwwLGk9aStNYXRoLmltdWwoQyxhdCl8MCxpPWkrTWF0aC5pbXVsKE4sb3QpfDAsbz1vK01hdGguaW11bChOLGF0KXwwLG49bitNYXRoLmltdWwoUCxzdCl8MCxpPWkrTWF0aC5pbXVsKFAsdXQpfDAsaT1pK01hdGguaW11bChULHN0KXwwLG89bytNYXRoLmltdWwoVCx1dCl8MCxuPW4rTWF0aC5pbXVsKEIsY3QpfDAsaT1pK01hdGguaW11bChCLGR0KXwwLGk9aStNYXRoLmltdWwoTyxjdCl8MCxvPW8rTWF0aC5pbXVsKE8sZHQpfDAsbj1uK01hdGguaW11bChrLHB0KXwwLGk9aStNYXRoLmltdWwoayxidCl8MCxpPWkrTWF0aC5pbXVsKHgscHQpfDAsbz1vK01hdGguaW11bCh4LGJ0KXwwO3ZhciBPdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoT3Q+Pj4yNil8MCxPdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxvdCksaT1NYXRoLmltdWwoVSxhdCksaT1pK01hdGguaW11bCh6LG90KXwwLG89TWF0aC5pbXVsKHosYXQpLG49bitNYXRoLmltdWwoQyxzdCl8MCxpPWkrTWF0aC5pbXVsKEMsdXQpfDAsaT1pK01hdGguaW11bChOLHN0KXwwLG89bytNYXRoLmltdWwoTix1dCl8MCxuPW4rTWF0aC5pbXVsKFAsY3QpfDAsaT1pK01hdGguaW11bChQLGR0KXwwLGk9aStNYXRoLmltdWwoVCxjdCl8MCxvPW8rTWF0aC5pbXVsKFQsZHQpfDAsbj1uK01hdGguaW11bChCLHB0KXwwLGk9aStNYXRoLmltdWwoQixidCl8MCxpPWkrTWF0aC5pbXVsKE8scHQpfDAsbz1vK01hdGguaW11bChPLGJ0KXwwO3ZhciBSdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoUnQ+Pj4yNil8MCxSdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxzdCksaT1NYXRoLmltdWwoVSx1dCksaT1pK01hdGguaW11bCh6LHN0KXwwLG89TWF0aC5pbXVsKHosdXQpLG49bitNYXRoLmltdWwoQyxjdCl8MCxpPWkrTWF0aC5pbXVsKEMsZHQpfDAsaT1pK01hdGguaW11bChOLGN0KXwwLG89bytNYXRoLmltdWwoTixkdCl8MCxuPW4rTWF0aC5pbXVsKFAscHQpfDAsaT1pK01hdGguaW11bChQLGJ0KXwwLGk9aStNYXRoLmltdWwoVCxwdCl8MCxvPW8rTWF0aC5pbXVsKFQsYnQpfDA7dmFyIFB0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShvKyhpPj4+MTMpfDApKyhQdD4+PjI2KXwwLFB0Jj02NzEwODg2MyxuPU1hdGguaW11bChVLGN0KSxpPU1hdGguaW11bChVLGR0KSxpPWkrTWF0aC5pbXVsKHosY3QpfDAsbz1NYXRoLmltdWwoeixkdCksbj1uK01hdGguaW11bChDLHB0KXwwLGk9aStNYXRoLmltdWwoQyxidCl8MCxpPWkrTWF0aC5pbXVsKE4scHQpfDAsbz1vK01hdGguaW11bChOLGJ0KXwwO3ZhciBUdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0obysoaT4+PjEzKXwwKSsoVHQ+Pj4yNil8MCxUdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVSxwdCksaT1NYXRoLmltdWwoVSxidCksaT1pK01hdGguaW11bCh6LHB0KXwwLG89TWF0aC5pbXVsKHosYnQpO3ZhciBqdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7cmV0dXJuIHU9KG8rKGk+Pj4xMyl8MCkrKGp0Pj4+MjYpfDAsanQmPTY3MTA4ODYzLHNbMF09dnQsc1sxXT15dCxzWzJdPW10LHNbM109Z3Qsc1s0XT13dCxzWzVdPV90LHNbNl09TXQsc1s3XT1TdCxzWzhdPUV0LHNbOV09QXQsc1sxMF09a3Qsc1sxMV09eHQsc1sxMl09SXQsc1sxM109QnQsc1sxNF09T3Qsc1sxNV09UnQsc1sxNl09UHQsc1sxN109VHQsc1sxOF09anQsMCE9PXUmJihzWzE5XT11LHIubGVuZ3RoKyspLHJ9O01hdGguaW11bHx8KEU9dSksby5wcm90b3R5cGUubXVsVG89ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMubGVuZ3RoK3QubGVuZ3RoO3JldHVybiByPTEwPT09dGhpcy5sZW5ndGgmJjEwPT09dC5sZW5ndGg/RSh0aGlzLHQsZSk6bjw2Mz91KHRoaXMsdCxlKTpuPDEwMjQ/aCh0aGlzLHQsZSk6Yyh0aGlzLHQsZSl9LGQucHJvdG90eXBlLm1ha2VSQlQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0KSxyPW8ucHJvdG90eXBlLl9jb3VudEJpdHModCktMSxuPTA7bjx0O24rKyllW25dPXRoaXMucmV2QmluKG4scix0KTtyZXR1cm4gZX0sZC5wcm90b3R5cGUucmV2QmluPWZ1bmN0aW9uKHQsZSxyKXtpZigwPT09dHx8dD09PXItMSlyZXR1cm4gdDtmb3IodmFyIG49MCxpPTA7aTxlO2krKylufD0oMSZ0KTw8ZS1pLTEsdD4+PTE7cmV0dXJuIG59LGQucHJvdG90eXBlLnBlcm11dGU9ZnVuY3Rpb24odCxlLHIsbixpLG8pe2Zvcih2YXIgYT0wO2E8bzthKyspblthXT1lW3RbYV1dLGlbYV09clt0W2FdXX0sZC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyLG4saSxvKXt0aGlzLnBlcm11dGUobyx0LGUscixuLGkpO2Zvcih2YXIgYT0xO2E8aTthPDw9MSlmb3IodmFyIGY9YTw8MSxzPU1hdGguY29zKDIqTWF0aC5QSS9mKSx1PU1hdGguc2luKDIqTWF0aC5QSS9mKSxoPTA7aDxpO2grPWYpZm9yKHZhciBjPXMsZD11LGw9MDtsPGE7bCsrKXt2YXIgcD1yW2grbF0sYj1uW2grbF0sdj1yW2grbCthXSx5PW5baCtsK2FdLG09Yyp2LWQqeTt5PWMqeStkKnYsdj1tLHJbaCtsXT1wK3YsbltoK2xdPWIreSxyW2grbCthXT1wLXYsbltoK2wrYV09Yi15LFxubCE9PWYmJihtPXMqYy11KmQsZD1zKmQrdSpjLGM9bSl9fSxkLnByb3RvdHlwZS5ndWVzc0xlbjEzYj1mdW5jdGlvbih0LGUpe3ZhciByPTF8TWF0aC5tYXgoZSx0KSxuPTEmcixpPTA7Zm9yKHI9ci8yfDA7cjtyPj4+PTEpaSsrO3JldHVybiAxPDxpKzErbn0sZC5wcm90b3R5cGUuY29uanVnYXRlPWZ1bmN0aW9uKHQsZSxyKXtpZighKHI8PTEpKWZvcih2YXIgbj0wO248ci8yO24rKyl7dmFyIGk9dFtuXTt0W25dPXRbci1uLTFdLHRbci1uLTFdPWksaT1lW25dLGVbbl09LWVbci1uLTFdLGVbci1uLTFdPS1pfX0sZC5wcm90b3R5cGUubm9ybWFsaXplMTNiPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0wO248ZS8yO24rKyl7dmFyIGk9ODE5MipNYXRoLnJvdW5kKHRbMipuKzFdL2UpK01hdGgucm91bmQodFsyKm5dL2UpK3I7dFtuXT02NzEwODg2MyZpLHI9aTw2NzEwODg2ND8wOmkvNjcxMDg4NjR8MH1yZXR1cm4gdH0sZC5wcm90b3R5cGUuY29udmVydDEzYj1mdW5jdGlvbih0LGUscixpKXtmb3IodmFyIG89MCxhPTA7YTxlO2ErKylvKz0wfHRbYV0sclsyKmFdPTgxOTEmbyxvPj4+PTEzLHJbMiphKzFdPTgxOTEmbyxvPj4+PTEzO2ZvcihhPTIqZTthPGk7KythKXJbYV09MDtuKDA9PT1vKSxuKDA9PT0obyYtODE5MikpfSxkLnByb3RvdHlwZS5zdHViPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscj0wO3I8dDtyKyspZVtyXT0wO3JldHVybiBlfSxkLnByb3RvdHlwZS5tdWxwPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj0yKnRoaXMuZ3Vlc3NMZW4xM2IodC5sZW5ndGgsZS5sZW5ndGgpLGk9dGhpcy5tYWtlUkJUKG4pLG89dGhpcy5zdHViKG4pLGE9bmV3IEFycmF5KG4pLGY9bmV3IEFycmF5KG4pLHM9bmV3IEFycmF5KG4pLHU9bmV3IEFycmF5KG4pLGg9bmV3IEFycmF5KG4pLGM9bmV3IEFycmF5KG4pLGQ9ci53b3JkcztkLmxlbmd0aD1uLHRoaXMuY29udmVydDEzYih0LndvcmRzLHQubGVuZ3RoLGEsbiksdGhpcy5jb252ZXJ0MTNiKGUud29yZHMsZS5sZW5ndGgsdSxuKSx0aGlzLnRyYW5zZm9ybShhLG8sZixzLG4saSksdGhpcy50cmFuc2Zvcm0odSxvLGgsYyxuLGkpO2Zvcih2YXIgbD0wO2w8bjtsKyspe3ZhciBwPWZbbF0qaFtsXS1zW2xdKmNbbF07c1tsXT1mW2xdKmNbbF0rc1tsXSpoW2xdLGZbbF09cH1yZXR1cm4gdGhpcy5jb25qdWdhdGUoZixzLG4pLHRoaXMudHJhbnNmb3JtKGYscyxkLG8sbixpKSx0aGlzLmNvbmp1Z2F0ZShkLG8sbiksdGhpcy5ub3JtYWxpemUxM2IoZCxuKSxyLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxyLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aCxyLnN0cmlwKCl9LG8ucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHRoaXMubXVsVG8odCxlKX0sby5wcm90b3R5cGUubXVsZj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbyhudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLGModGhpcyx0LGUpfSxvLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkubXVsVG8odCx0aGlzKX0sby5wcm90b3R5cGUuaW11bG49ZnVuY3Rpb24odCl7bihcIm51bWJlclwiPT10eXBlb2YgdCksbih0PDY3MTA4ODY0KTtmb3IodmFyIGU9MCxyPTA7cjx0aGlzLmxlbmd0aDtyKyspe3ZhciBpPSgwfHRoaXMud29yZHNbcl0pKnQsbz0oNjcxMDg4NjMmaSkrKDY3MTA4ODYzJmUpO2U+Pj0yNixlKz1pLzY3MTA4ODY0fDAsZSs9bz4+PjI2LHRoaXMud29yZHNbcl09NjcxMDg4NjMmb31yZXR1cm4gMCE9PWUmJih0aGlzLndvcmRzW3JdPWUsdGhpcy5sZW5ndGgrKyksdGhpc30sby5wcm90b3R5cGUubXVsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKHQpfSxvLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdWwodGhpcyl9LG8ucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSl9LG8ucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXt2YXIgZT1zKHQpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gbmV3IG8oMSk7Zm9yKHZhciByPXRoaXMsbj0wO248ZS5sZW5ndGgmJjA9PT1lW25dO24rKyxyPXIuc3FyKCkpO2lmKCsrbjxlLmxlbmd0aClmb3IodmFyIGk9ci5zcXIoKTtuPGUubGVuZ3RoO24rKyxpPWkuc3FyKCkpMCE9PWVbbl0mJihyPXIubXVsKGkpKTtyZXR1cm4gcn0sby5wcm90b3R5cGUuaXVzaGxuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlLHI9dCUyNixpPSh0LXIpLzI2LG89NjcxMDg4NjM+Pj4yNi1yPDwyNi1yO2lmKDAhPT1yKXt2YXIgYT0wO2ZvcihlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciBmPXRoaXMud29yZHNbZV0mbyxzPSgwfHRoaXMud29yZHNbZV0pLWY8PHI7dGhpcy53b3Jkc1tlXT1zfGEsYT1mPj4+MjYtcn1hJiYodGhpcy53b3Jkc1tlXT1hLHRoaXMubGVuZ3RoKyspfWlmKDAhPT1pKXtmb3IoZT10aGlzLmxlbmd0aC0xO2U+PTA7ZS0tKXRoaXMud29yZHNbZStpXT10aGlzLndvcmRzW2VdO2ZvcihlPTA7ZTxpO2UrKyl0aGlzLndvcmRzW2VdPTA7dGhpcy5sZW5ndGgrPWl9cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXNobG49ZnVuY3Rpb24odCl7cmV0dXJuIG4oMD09PXRoaXMubmVnYXRpdmUpLHRoaXMuaXVzaGxuKHQpfSxvLnByb3RvdHlwZS5pdXNocm49ZnVuY3Rpb24odCxlLHIpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBpO2k9ZT8oZS1lJTI2KS8yNjowO3ZhciBvPXQlMjYsYT1NYXRoLm1pbigodC1vKS8yNix0aGlzLmxlbmd0aCksZj02NzEwODg2M142NzEwODg2Mz4+Pm88PG8scz1yO2lmKGktPWEsaT1NYXRoLm1heCgwLGkpLHMpe2Zvcih2YXIgdT0wO3U8YTt1Kyspcy53b3Jkc1t1XT10aGlzLndvcmRzW3VdO3MubGVuZ3RoPWF9aWYoMD09PWEpO2Vsc2UgaWYodGhpcy5sZW5ndGg+YSlmb3IodGhpcy5sZW5ndGgtPWEsdT0wO3U8dGhpcy5sZW5ndGg7dSsrKXRoaXMud29yZHNbdV09dGhpcy53b3Jkc1t1K2FdO2Vsc2UgdGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTE7dmFyIGg9MDtmb3IodT10aGlzLmxlbmd0aC0xO3U+PTAmJigwIT09aHx8dT49aSk7dS0tKXt2YXIgYz0wfHRoaXMud29yZHNbdV07dGhpcy53b3Jkc1t1XT1oPDwyNi1vfGM+Pj5vLGg9YyZmfXJldHVybiBzJiYwIT09aCYmKHMud29yZHNbcy5sZW5ndGgrK109aCksMD09PXRoaXMubGVuZ3RoJiYodGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTEpLHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUuaXNocm49ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuKDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hybih0LGUscil9LG8ucHJvdG90eXBlLnNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbih0KX0sby5wcm90b3R5cGUudXNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4odCl9LG8ucHJvdG90eXBlLnNocm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybih0KX0sby5wcm90b3R5cGUudXNocm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4odCl9LG8ucHJvdG90eXBlLnRlc3RuPWZ1bmN0aW9uKHQpe24oXCJudW1iZXJcIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPXQlMjYscj0odC1lKS8yNixpPTE8PGU7aWYodGhpcy5sZW5ndGg8PXIpcmV0dXJuITE7dmFyIG89dGhpcy53b3Jkc1tyXTtyZXR1cm4hIShvJmkpfSxvLnByb3RvdHlwZS5pbWFza249ZnVuY3Rpb24odCl7bihcIm51bWJlclwiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixyPSh0LWUpLzI2O2lmKG4oMD09PXRoaXMubmVnYXRpdmUsXCJpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnNcIiksdGhpcy5sZW5ndGg8PXIpcmV0dXJuIHRoaXM7aWYoMCE9PWUmJnIrKyx0aGlzLmxlbmd0aD1NYXRoLm1pbihyLHRoaXMubGVuZ3RoKSwwIT09ZSl7dmFyIGk9NjcxMDg4NjNeNjcxMDg4NjM+Pj5lPDxlO3RoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0mPWl9cmV0dXJuIHRoaXMuc3RyaXAoKX0sby5wcm90b3R5cGUubWFza249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24odCl9LG8ucHJvdG90eXBlLmlhZGRuPWZ1bmN0aW9uKHQpe3JldHVybiBuKFwibnVtYmVyXCI9PXR5cGVvZiB0KSxuKHQ8NjcxMDg4NjQpLHQ8MD90aGlzLmlzdWJuKC10KTowIT09dGhpcy5uZWdhdGl2ZT8xPT09dGhpcy5sZW5ndGgmJigwfHRoaXMud29yZHNbMF0pPHQ/KHRoaXMud29yZHNbMF09dC0oMHx0aGlzLndvcmRzWzBdKSx0aGlzLm5lZ2F0aXZlPTAsdGhpcyk6KHRoaXMubmVnYXRpdmU9MCx0aGlzLmlzdWJuKHQpLHRoaXMubmVnYXRpdmU9MSx0aGlzKTp0aGlzLl9pYWRkbih0KX0sby5wcm90b3R5cGUuX2lhZGRuPWZ1bmN0aW9uKHQpe3RoaXMud29yZHNbMF0rPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aCYmdGhpcy53b3Jkc1tlXT49NjcxMDg4NjQ7ZSsrKXRoaXMud29yZHNbZV0tPTY3MTA4ODY0LGU9PT10aGlzLmxlbmd0aC0xP3RoaXMud29yZHNbZSsxXT0xOnRoaXMud29yZHNbZSsxXSsrO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxlKzEpLHRoaXN9LG8ucHJvdG90eXBlLmlzdWJuPWZ1bmN0aW9uKHQpe2lmKG4oXCJudW1iZXJcIj09dHlwZW9mIHQpLG4odDw2NzEwODg2NCksdDwwKXJldHVybiB0aGlzLmlhZGRuKC10KTtpZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZG4odCksdGhpcy5uZWdhdGl2ZT0xLHRoaXM7aWYodGhpcy53b3Jkc1swXS09dCwxPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08MCl0aGlzLndvcmRzWzBdPS10aGlzLndvcmRzWzBdLHRoaXMubmVnYXRpdmU9MTtlbHNlIGZvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbZV08MDtlKyspdGhpcy53b3Jkc1tlXSs9NjcxMDg4NjQsdGhpcy53b3Jkc1tlKzFdLT0xO3JldHVybiB0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLmFkZG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbih0KX0sby5wcm90b3R5cGUuc3Vibj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKHQpfSxvLnByb3RvdHlwZS5pYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzfSxvLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKX0sby5wcm90b3R5cGUuX2lzaGxuc3VibXVsPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxvPXQubGVuZ3RoK3I7dGhpcy5fZXhwYW5kKG8pO3ZhciBhLGY9MDtmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKXthPSgwfHRoaXMud29yZHNbaStyXSkrZjt2YXIgcz0oMHx0LndvcmRzW2ldKSplO2EtPTY3MTA4ODYzJnMsZj0oYT4+MjYpLShzLzY3MTA4ODY0fDApLHRoaXMud29yZHNbaStyXT02NzEwODg2MyZhfWZvcig7aTx0aGlzLmxlbmd0aC1yO2krKylhPSgwfHRoaXMud29yZHNbaStyXSkrZixmPWE+PjI2LHRoaXMud29yZHNbaStyXT02NzEwODg2MyZhO2lmKDA9PT1mKXJldHVybiB0aGlzLnN0cmlwKCk7Zm9yKG4oZj09PS0xKSxmPTAsaT0wO2k8dGhpcy5sZW5ndGg7aSsrKWE9LSgwfHRoaXMud29yZHNbaV0pK2YsZj1hPj4yNix0aGlzLndvcmRzW2ldPTY3MTA4ODYzJmE7cmV0dXJuIHRoaXMubmVnYXRpdmU9MSx0aGlzLnN0cmlwKCl9LG8ucHJvdG90eXBlLl93b3JkRGl2PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5sZW5ndGgtdC5sZW5ndGgsbj10aGlzLmNsb25lKCksaT10LGE9MHxpLndvcmRzW2kubGVuZ3RoLTFdLGY9dGhpcy5fY291bnRCaXRzKGEpO3I9MjYtZiwwIT09ciYmKGk9aS51c2hsbihyKSxuLml1c2hsbihyKSxhPTB8aS53b3Jkc1tpLmxlbmd0aC0xXSk7dmFyIHMsdT1uLmxlbmd0aC1pLmxlbmd0aDtpZihcIm1vZFwiIT09ZSl7cz1uZXcgbyhudWxsKSxzLmxlbmd0aD11KzEscy53b3Jkcz1uZXcgQXJyYXkocy5sZW5ndGgpO2Zvcih2YXIgaD0wO2g8cy5sZW5ndGg7aCsrKXMud29yZHNbaF09MH12YXIgYz1uLmNsb25lKCkuX2lzaGxuc3VibXVsKGksMSx1KTswPT09Yy5uZWdhdGl2ZSYmKG49YyxzJiYocy53b3Jkc1t1XT0xKSk7Zm9yKHZhciBkPXUtMTtkPj0wO2QtLSl7dmFyIGw9NjcxMDg4NjQqKDB8bi53b3Jkc1tpLmxlbmd0aCtkXSkrKDB8bi53b3Jkc1tpLmxlbmd0aCtkLTFdKTtmb3IobD1NYXRoLm1pbihsL2F8MCw2NzEwODg2Myksbi5faXNobG5zdWJtdWwoaSxsLGQpOzAhPT1uLm5lZ2F0aXZlOylsLS0sbi5uZWdhdGl2ZT0wLG4uX2lzaGxuc3VibXVsKGksMSxkKSxuLmlzWmVybygpfHwobi5uZWdhdGl2ZV49MSk7cyYmKHMud29yZHNbZF09bCl9cmV0dXJuIHMmJnMuc3RyaXAoKSxuLnN0cmlwKCksXCJkaXZcIiE9PWUmJjAhPT1yJiZuLml1c2hybihyKSx7ZGl2OnN8fG51bGwsbW9kOm59fSxvLnByb3RvdHlwZS5kaXZtb2Q9ZnVuY3Rpb24odCxlLHIpe2lmKG4oIXQuaXNaZXJvKCkpLHRoaXMuaXNaZXJvKCkpcmV0dXJue2RpdjpuZXcgbygwKSxtb2Q6bmV3IG8oMCl9O3ZhciBpLGEsZjtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmUmJjA9PT10Lm5lZ2F0aXZlPyhmPXRoaXMubmVnKCkuZGl2bW9kKHQsZSksXCJtb2RcIiE9PWUmJihpPWYuZGl2Lm5lZygpKSxcImRpdlwiIT09ZSYmKGE9Zi5tb2QubmVnKCksciYmMCE9PWEubmVnYXRpdmUmJmEuaWFkZCh0KSkse2RpdjppLG1vZDphfSk6MD09PXRoaXMubmVnYXRpdmUmJjAhPT10Lm5lZ2F0aXZlPyhmPXRoaXMuZGl2bW9kKHQubmVnKCksZSksXCJtb2RcIiE9PWUmJihpPWYuZGl2Lm5lZygpKSx7ZGl2OmksbW9kOmYubW9kfSk6MCE9PSh0aGlzLm5lZ2F0aXZlJnQubmVnYXRpdmUpPyhmPXRoaXMubmVnKCkuZGl2bW9kKHQubmVnKCksZSksXCJkaXZcIiE9PWUmJihhPWYubW9kLm5lZygpLHImJjAhPT1hLm5lZ2F0aXZlJiZhLmlzdWIodCkpLHtkaXY6Zi5kaXYsbW9kOmF9KTp0Lmxlbmd0aD50aGlzLmxlbmd0aHx8dGhpcy5jbXAodCk8MD97ZGl2Om5ldyBvKDApLG1vZDp0aGlzfToxPT09dC5sZW5ndGg/XCJkaXZcIj09PWU/e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm51bGx9OlwibW9kXCI9PT1lP3tkaXY6bnVsbCxtb2Q6bmV3IG8odGhpcy5tb2RuKHQud29yZHNbMF0pKX06e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm5ldyBvKHRoaXMubW9kbih0LndvcmRzWzBdKSl9OnRoaXMuX3dvcmREaXYodCxlKX0sby5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LFwiZGl2XCIsITEpLmRpdn0sby5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LFwibW9kXCIsITEpLm1vZH0sby5wcm90b3R5cGUudW1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXZtb2QodCxcIm1vZFwiLCEwKS5tb2R9LG8ucHJvdG90eXBlLmRpdlJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGl2bW9kKHQpO2lmKGUubW9kLmlzWmVybygpKXJldHVybiBlLmRpdjt2YXIgcj0wIT09ZS5kaXYubmVnYXRpdmU/ZS5tb2QuaXN1Yih0KTplLm1vZCxuPXQudXNocm4oMSksaT10LmFuZGxuKDEpLG89ci5jbXAobik7cmV0dXJuIG88MHx8MT09PWkmJjA9PT1vP2UuZGl2OjAhPT1lLmRpdi5uZWdhdGl2ZT9lLmRpdi5pc3VibigxKTplLmRpdi5pYWRkbigxKX0sby5wcm90b3R5cGUubW9kbj1mdW5jdGlvbih0KXtuKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9KDE8PDI2KSV0LHI9MCxpPXRoaXMubGVuZ3RoLTE7aT49MDtpLS0pcj0oZSpyKygwfHRoaXMud29yZHNbaV0pKSV0O3JldHVybiByfSxvLnByb3RvdHlwZS5pZGl2bj1mdW5jdGlvbih0KXtuKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBpPSgwfHRoaXMud29yZHNbcl0pKzY3MTA4ODY0KmU7dGhpcy53b3Jkc1tyXT1pL3R8MCxlPWkldH1yZXR1cm4gdGhpcy5zdHJpcCgpfSxvLnByb3RvdHlwZS5kaXZuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaWRpdm4odCl9LG8ucHJvdG90eXBlLmVnY2Q9ZnVuY3Rpb24odCl7bigwPT09dC5uZWdhdGl2ZSksbighdC5pc1plcm8oKSk7dmFyIGU9dGhpcyxyPXQuY2xvbmUoKTtlPTAhPT1lLm5lZ2F0aXZlP2UudW1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciBpPW5ldyBvKDEpLGE9bmV3IG8oMCksZj1uZXcgbygwKSxzPW5ldyBvKDEpLHU9MDtlLmlzRXZlbigpJiZyLmlzRXZlbigpOyllLml1c2hybigxKSxyLml1c2hybigxKSwrK3U7Zm9yKHZhciBoPXIuY2xvbmUoKSxjPWUuY2xvbmUoKTshZS5pc1plcm8oKTspe2Zvcih2YXIgZD0wLGw9MTswPT09KGUud29yZHNbMF0mbCkmJmQ8MjY7KytkLGw8PD0xKTtpZihkPjApZm9yKGUuaXVzaHJuKGQpO2QtLSA+MDspKGkuaXNPZGQoKXx8YS5pc09kZCgpKSYmKGkuaWFkZChoKSxhLmlzdWIoYykpLGkuaXVzaHJuKDEpLGEuaXVzaHJuKDEpO2Zvcih2YXIgcD0wLGI9MTswPT09KHIud29yZHNbMF0mYikmJnA8MjY7KytwLGI8PD0xKTtpZihwPjApZm9yKHIuaXVzaHJuKHApO3AtLSA+MDspKGYuaXNPZGQoKXx8cy5pc09kZCgpKSYmKGYuaWFkZChoKSxzLmlzdWIoYykpLGYuaXVzaHJuKDEpLHMuaXVzaHJuKDEpO2UuY21wKHIpPj0wPyhlLmlzdWIociksaS5pc3ViKGYpLGEuaXN1YihzKSk6KHIuaXN1YihlKSxmLmlzdWIoaSkscy5pc3ViKGEpKX1yZXR1cm57YTpmLGI6cyxnY2Q6ci5pdXNobG4odSl9fSxvLnByb3RvdHlwZS5faW52bXA9ZnVuY3Rpb24odCl7bigwPT09dC5uZWdhdGl2ZSksbighdC5pc1plcm8oKSk7dmFyIGU9dGhpcyxyPXQuY2xvbmUoKTtlPTAhPT1lLm5lZ2F0aXZlP2UudW1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciBpPW5ldyBvKDEpLGE9bmV3IG8oMCksZj1yLmNsb25lKCk7ZS5jbXBuKDEpPjAmJnIuY21wbigxKT4wOyl7Zm9yKHZhciBzPTAsdT0xOzA9PT0oZS53b3Jkc1swXSZ1KSYmczwyNjsrK3MsdTw8PTEpO2lmKHM+MClmb3IoZS5pdXNocm4ocyk7cy0tID4wOylpLmlzT2RkKCkmJmkuaWFkZChmKSxpLml1c2hybigxKTtmb3IodmFyIGg9MCxjPTE7MD09PShyLndvcmRzWzBdJmMpJiZoPDI2OysraCxjPDw9MSk7aWYoaD4wKWZvcihyLml1c2hybihoKTtoLS0gPjA7KWEuaXNPZGQoKSYmYS5pYWRkKGYpLGEuaXVzaHJuKDEpO2UuY21wKHIpPj0wPyhlLmlzdWIociksaS5pc3ViKGEpKTooci5pc3ViKGUpLGEuaXN1YihpKSl9dmFyIGQ7cmV0dXJuIGQ9MD09PWUuY21wbigxKT9pOmEsZC5jbXBuKDApPDAmJmQuaWFkZCh0KSxkfSxvLnByb3RvdHlwZS5nY2Q9ZnVuY3Rpb24odCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdC5hYnMoKTtpZih0LmlzWmVybygpKXJldHVybiB0aGlzLmFicygpO3ZhciBlPXRoaXMuY2xvbmUoKSxyPXQuY2xvbmUoKTtlLm5lZ2F0aXZlPTAsci5uZWdhdGl2ZT0wO2Zvcih2YXIgbj0wO2UuaXNFdmVuKCkmJnIuaXNFdmVuKCk7bisrKWUuaXVzaHJuKDEpLHIuaXVzaHJuKDEpO2Zvcig7Oyl7Zm9yKDtlLmlzRXZlbigpOyllLml1c2hybigxKTtmb3IoO3IuaXNFdmVuKCk7KXIuaXVzaHJuKDEpO3ZhciBpPWUuY21wKHIpO2lmKGk8MCl7dmFyIG89ZTtlPXIscj1vfWVsc2UgaWYoMD09PWl8fDA9PT1yLmNtcG4oMSkpYnJlYWs7ZS5pc3ViKHIpfXJldHVybiByLml1c2hsbihuKX0sby5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZ2NkKHQpLmEudW1vZCh0KX0sby5wcm90b3R5cGUuaXNFdmVuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT0oMSZ0aGlzLndvcmRzWzBdKX0sby5wcm90b3R5cGUuaXNPZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PSgxJnRoaXMud29yZHNbMF0pfSxvLnByb3RvdHlwZS5hbmRsbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53b3Jkc1swXSZ0fSxvLnByb3RvdHlwZS5iaW5jbj1mdW5jdGlvbih0KXtuKFwibnVtYmVyXCI9PXR5cGVvZiB0KTt2YXIgZT10JTI2LHI9KHQtZSkvMjYsaT0xPDxlO2lmKHRoaXMubGVuZ3RoPD1yKXJldHVybiB0aGlzLl9leHBhbmQocisxKSx0aGlzLndvcmRzW3JdfD1pLHRoaXM7Zm9yKHZhciBvPWksYT1yOzAhPT1vJiZhPHRoaXMubGVuZ3RoO2ErKyl7dmFyIGY9MHx0aGlzLndvcmRzW2FdO2YrPW8sbz1mPj4+MjYsZiY9NjcxMDg4NjMsdGhpcy53b3Jkc1thXT1mfXJldHVybiAwIT09byYmKHRoaXMud29yZHNbYV09byx0aGlzLmxlbmd0aCsrKSx0aGlzfSxvLnByb3RvdHlwZS5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubGVuZ3RoJiYwPT09dGhpcy53b3Jkc1swXX0sby5wcm90b3R5cGUuY21wbj1mdW5jdGlvbih0KXt2YXIgZT10PDA7aWYoMCE9PXRoaXMubmVnYXRpdmUmJiFlKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiZlKXJldHVybiAxO3RoaXMuc3RyaXAoKTt2YXIgcjtpZih0aGlzLmxlbmd0aD4xKXI9MTtlbHNle2UmJih0PS10KSxuKHQ8PTY3MTA4ODYzLFwiTnVtYmVyIGlzIHRvbyBiaWdcIik7dmFyIGk9MHx0aGlzLndvcmRzWzBdO3I9aT09PXQ/MDppPHQ/LTE6MX1yZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/MHwtcjpyfSxvLnByb3RvdHlwZS5jbXA9ZnVuY3Rpb24odCl7aWYoMCE9PXRoaXMubmVnYXRpdmUmJjA9PT10Lm5lZ2F0aXZlKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZSlyZXR1cm4gMTt2YXIgZT10aGlzLnVjbXAodCk7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlPzB8LWU6ZX0sby5wcm90b3R5cGUudWNtcD1mdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD50Lmxlbmd0aClyZXR1cm4gMTtpZih0aGlzLmxlbmd0aDx0Lmxlbmd0aClyZXR1cm4tMTtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBuPTB8dGhpcy53b3Jkc1tyXSxpPTB8dC53b3Jkc1tyXTtpZihuIT09aSl7bjxpP2U9LTE6bj5pJiYoZT0xKTticmVha319cmV0dXJuIGV9LG8ucHJvdG90eXBlLmd0bj1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXRoaXMuY21wbih0KX0sby5wcm90b3R5cGUuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10aGlzLmNtcCh0KX0sby5wcm90b3R5cGUuZ3Rlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXBuKHQpPj0wfSxvLnByb3RvdHlwZS5ndGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPj0wfSxvLnByb3RvdHlwZS5sdG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wbih0KT09PS0xfSxvLnByb3RvdHlwZS5sdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk9PT0tMX0sby5wcm90b3R5cGUubHRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXBuKHQpPD0wfSxvLnByb3RvdHlwZS5sdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPD0wfSxvLnByb3RvdHlwZS5lcW49ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmNtcG4odCl9LG8ucHJvdG90eXBlLmVxPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5jbXAodCl9LG8ucmVkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbSh0KX0sby5wcm90b3R5cGUudG9SZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4oIXRoaXMucmVkLFwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSxuKDA9PT10aGlzLm5lZ2F0aXZlLFwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXNcIiksdC5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKHQpfSxvLnByb3RvdHlwZS5mcm9tUmVkPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0XCIpLHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpfSxvLnByb3RvdHlwZS5fZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVkPXQsdGhpc30sby5wcm90b3R5cGUuZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4oIXRoaXMucmVkLFwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSx0aGlzLl9mb3JjZVJlZCh0KX0sby5wcm90b3R5cGUucmVkQWRkPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5hZGQodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSUFkZD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLmlhZGQodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU3ViPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5zdWIodGhpcyx0KX0sby5wcm90b3R5cGUucmVkSVN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCxcInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLmlzdWIodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU2hsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5zaGwodGhpcyx0KX0sby5wcm90b3R5cGUucmVkTXVsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLm11bCh0aGlzLHQpfSxvLnByb3RvdHlwZS5yZWRJTXVsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLFwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLmltdWwodGhpcyx0KX0sby5wcm90b3R5cGUucmVkU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcih0aGlzKX0sby5wcm90b3R5cGUucmVkSVNxcj1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaXNxcih0aGlzKX0sby5wcm90b3R5cGUucmVkU3FydD1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FydCh0aGlzKX0sby5wcm90b3R5cGUucmVkSW52bT1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLFwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaW52bSh0aGlzKX0sby5wcm90b3R5cGUucmVkTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsXCJyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLm5lZyh0aGlzKX0sby5wcm90b3R5cGUucmVkUG93PWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkJiYhdC5yZWQsXCJyZWRQb3cobm9ybWFsTnVtKVwiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5wb3codGhpcyx0KX07dmFyIEE9e2syNTY6bnVsbCxwMjI0Om51bGwscDE5MjpudWxsLHAyNTUxOTpudWxsfTtsLnByb3RvdHlwZS5fdG1wPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG8obnVsbCk7cmV0dXJuIHQud29yZHM9bmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4vMTMpKSx0fSxsLnByb3RvdHlwZS5pcmVkdWNlPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dDtkbyB0aGlzLnNwbGl0KHIsdGhpcy50bXApLHI9dGhpcy5pbXVsSyhyKSxyPXIuaWFkZCh0aGlzLnRtcCksZT1yLmJpdExlbmd0aCgpO3doaWxlKGU+dGhpcy5uKTt2YXIgbj1lPHRoaXMubj8tMTpyLnVjbXAodGhpcy5wKTtyZXR1cm4gMD09PW4/KHIud29yZHNbMF09MCxyLmxlbmd0aD0xKTpuPjA/ci5pc3ViKHRoaXMucCk6ci5zdHJpcCgpLHJ9LGwucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7dC5pdXNocm4odGhpcy5uLDAsZSl9LGwucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe3JldHVybiB0LmltdWwodGhpcy5rKX0saShwLGwpLHAucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTQxOTQzMDMsbj1NYXRoLm1pbih0Lmxlbmd0aCw5KSxpPTA7aTxuO2krKyllLndvcmRzW2ldPXQud29yZHNbaV07aWYoZS5sZW5ndGg9bix0Lmxlbmd0aDw9OSlyZXR1cm4gdC53b3Jkc1swXT0wLHZvaWQodC5sZW5ndGg9MSk7dmFyIG89dC53b3Jkc1s5XTtmb3IoZS53b3Jkc1tlLmxlbmd0aCsrXT1vJnIsaT0xMDtpPHQubGVuZ3RoO2krKyl7dmFyIGE9MHx0LndvcmRzW2ldO3Qud29yZHNbaS0xMF09KGEmcik8PDR8bz4+PjIyLG89YX1vPj4+PTIyLHQud29yZHNbaS0xMF09bywwPT09byYmdC5sZW5ndGg+MTA/dC5sZW5ndGgtPTEwOnQubGVuZ3RoLT05fSxwLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXt0LndvcmRzW3QubGVuZ3RoXT0wLHQud29yZHNbdC5sZW5ndGgrMV09MCx0Lmxlbmd0aCs9Mjtmb3IodmFyIGU9MCxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPTB8dC53b3Jkc1tyXTtlKz05Nzcqbix0LndvcmRzW3JdPTY3MTA4ODYzJmUsZT02NCpuKyhlLzY3MTA4ODY0fDApfXJldHVybiAwPT09dC53b3Jkc1t0Lmxlbmd0aC0xXSYmKHQubGVuZ3RoLS0sMD09PXQud29yZHNbdC5sZW5ndGgtMV0mJnQubGVuZ3RoLS0pLHR9LGkoYixsKSxpKHYsbCksaSh5LGwpLHkucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49MTkqKDB8dC53b3Jkc1tyXSkrZSxpPTY3MTA4ODYzJm47bj4+Pj0yNix0LndvcmRzW3JdPWksZT1ufXJldHVybiAwIT09ZSYmKHQud29yZHNbdC5sZW5ndGgrK109ZSksdH0sby5fcHJpbWU9ZnVuY3Rpb24gdChlKXtpZihBW2VdKXJldHVybiBBW2VdO3ZhciB0O2lmKFwiazI1NlwiPT09ZSl0PW5ldyBwO2Vsc2UgaWYoXCJwMjI0XCI9PT1lKXQ9bmV3IGI7ZWxzZSBpZihcInAxOTJcIj09PWUpdD1uZXcgdjtlbHNle2lmKFwicDI1NTE5XCIhPT1lKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gcHJpbWUgXCIrZSk7dD1uZXcgeX1yZXR1cm4gQVtlXT10LHR9LG0ucHJvdG90eXBlLl92ZXJpZnkxPWZ1bmN0aW9uKHQpe24oMD09PXQubmVnYXRpdmUsXCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlc1wiKSxuKHQucmVkLFwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKX0sbS5wcm90b3R5cGUuX3ZlcmlmeTI9ZnVuY3Rpb24odCxlKXtuKDA9PT0odC5uZWdhdGl2ZXxlLm5lZ2F0aXZlKSxcInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzXCIpLG4odC5yZWQmJnQucmVkPT09ZS5yZWQsXCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpfSxtLnByb3RvdHlwZS5pbW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnByaW1lP3RoaXMucHJpbWUuaXJlZHVjZSh0KS5fZm9yY2VSZWQodGhpcyk6dC51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNaZXJvKCk/dC5jbG9uZSgpOnRoaXMubS5zdWIodCkuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5hZGQoZSk7cmV0dXJuIHIuY21wKHRoaXMubSk+PTAmJnIuaXN1Yih0aGlzLm0pLHIuX2ZvcmNlUmVkKHRoaXMpfSxtLnByb3RvdHlwZS5pYWRkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuaWFkZChlKTtyZXR1cm4gci5jbXAodGhpcy5tKT49MCYmci5pc3ViKHRoaXMubSkscn0sbS5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuc3ViKGUpO3JldHVybiByLmNtcG4oMCk8MCYmci5pYWRkKHRoaXMubSksci5fZm9yY2VSZWQodGhpcyl9LG0ucHJvdG90eXBlLmlzdWI9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5pc3ViKGUpO3JldHVybiByLmNtcG4oMCk8MCYmci5pYWRkKHRoaXMubSkscn0sbS5wcm90b3R5cGUuc2hsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3ZlcmlmeTEodCksdGhpcy5pbW9kKHQudXNobG4oZSkpfSxtLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3ZlcmlmeTIodCxlKSx0aGlzLmltb2QodC5pbXVsKGUpKX0sbS5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3ZlcmlmeTIodCxlKSx0aGlzLmltb2QodC5tdWwoZSkpfSxtLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmltdWwodCx0LmNsb25lKCkpfSxtLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubXVsKHQsdCl9LG0ucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24odCl7aWYodC5pc1plcm8oKSlyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPXRoaXMubS5hbmRsbigzKTtpZihuKGUlMj09PTEpLDM9PT1lKXt2YXIgcj10aGlzLm0uYWRkKG5ldyBvKDEpKS5pdXNocm4oMik7cmV0dXJuIHRoaXMucG93KHQscil9Zm9yKHZhciBpPXRoaXMubS5zdWJuKDEpLGE9MDshaS5pc1plcm8oKSYmMD09PWkuYW5kbG4oMSk7KWErKyxpLml1c2hybigxKTtuKCFpLmlzWmVybygpKTt2YXIgZj1uZXcgbygxKS50b1JlZCh0aGlzKSxzPWYucmVkTmVnKCksdT10aGlzLm0uc3VibigxKS5pdXNocm4oMSksaD10aGlzLm0uYml0TGVuZ3RoKCk7Zm9yKGg9bmV3IG8oMipoKmgpLnRvUmVkKHRoaXMpOzAhPT10aGlzLnBvdyhoLHUpLmNtcChzKTspaC5yZWRJQWRkKHMpO2Zvcih2YXIgYz10aGlzLnBvdyhoLGkpLGQ9dGhpcy5wb3codCxpLmFkZG4oMSkuaXVzaHJuKDEpKSxsPXRoaXMucG93KHQsaSkscD1hOzAhPT1sLmNtcChmKTspe2Zvcih2YXIgYj1sLHY9MDswIT09Yi5jbXAoZik7disrKWI9Yi5yZWRTcXIoKTtuKHY8cCk7dmFyIHk9dGhpcy5wb3coYyxuZXcgbygxKS5pdXNobG4ocC12LTEpKTtkPWQucmVkTXVsKHkpLGM9eS5yZWRTcXIoKSxsPWwucmVkTXVsKGMpLHA9dn1yZXR1cm4gZH0sbS5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10Ll9pbnZtcCh0aGlzLm0pO3JldHVybiAwIT09ZS5uZWdhdGl2ZT8oZS5uZWdhdGl2ZT0wLHRoaXMuaW1vZChlKS5yZWROZWcoKSk6dGhpcy5pbW9kKGUpfSxtLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCxlKXtpZihlLmlzWmVybygpKXJldHVybiBuZXcgbygxKTtpZigwPT09ZS5jbXBuKDEpKXJldHVybiB0LmNsb25lKCk7dmFyIHI9NCxuPW5ldyBBcnJheSgxPDxyKTtuWzBdPW5ldyBvKDEpLnRvUmVkKHRoaXMpLG5bMV09dDtmb3IodmFyIGk9MjtpPG4ubGVuZ3RoO2krKyluW2ldPXRoaXMubXVsKG5baS0xXSx0KTt2YXIgYT1uWzBdLGY9MCxzPTAsdT1lLmJpdExlbmd0aCgpJTI2O2ZvcigwPT09dSYmKHU9MjYpLGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSl7Zm9yKHZhciBoPWUud29yZHNbaV0sYz11LTE7Yz49MDtjLS0pe3ZhciBkPWg+PmMmMTthIT09blswXSYmKGE9dGhpcy5zcXIoYSkpLDAhPT1kfHwwIT09Zj8oZjw8PTEsZnw9ZCxzKyssKHM9PT1yfHwwPT09aSYmMD09PWMpJiYoYT10aGlzLm11bChhLG5bZl0pLHM9MCxmPTApKTpzPTB9dT0yNn1yZXR1cm4gYX0sbS5wcm90b3R5cGUuY29udmVydFRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQudW1vZCh0aGlzLm0pO3JldHVybiBlPT09dD9lLmNsb25lKCk6ZX0sbS5wcm90b3R5cGUuY29udmVydEZyb209ZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9uZSgpO3JldHVybiBlLnJlZD1udWxsLGV9LG8ubW9udD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGcodCl9LGkoZyxtKSxnLnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW1vZCh0LnVzaGxuKHRoaXMuc2hpZnQpKX0sZy5wcm90b3R5cGUuY29udmVydEZyb209ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbW9kKHQubXVsKHRoaXMucmludikpO3JldHVybiBlLnJlZD1udWxsLGV9LGcucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24odCxlKXtpZih0LmlzWmVybygpfHxlLmlzWmVybygpKXJldHVybiB0LndvcmRzWzBdPTAsdC5sZW5ndGg9MSx0O3ZhciByPXQuaW11bChlKSxuPXIubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLGk9ci5pc3ViKG4pLml1c2hybih0aGlzLnNoaWZ0KSxvPWk7cmV0dXJuIGkuY21wKHRoaXMubSk+PTA/bz1pLmlzdWIodGhpcy5tKTppLmNtcG4oMCk8MCYmKG89aS5pYWRkKHRoaXMubSkpLG8uX2ZvcmNlUmVkKHRoaXMpfSxnLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtpZih0LmlzWmVybygpfHxlLmlzWmVybygpKXJldHVybiBuZXcgbygwKS5fZm9yY2VSZWQodGhpcyk7dmFyIHI9dC5tdWwoZSksbj1yLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSxpPXIuaXN1YihuKS5pdXNocm4odGhpcy5zaGlmdCksYT1pO3JldHVybiBpLmNtcCh0aGlzLm0pPj0wP2E9aS5pc3ViKHRoaXMubSk6aS5jbXBuKDApPDAmJihhPWkuaWFkZCh0aGlzLm0pKSxhLl9mb3JjZVJlZCh0aGlzKX0sZy5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltb2QodC5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO3JldHVybiBlLl9mb3JjZVJlZCh0aGlzKX19KFwidW5kZWZpbmVkXCI9PXR5cGVvZiB0fHx0LHRoaXMpfSkuY2FsbChlLHIoOTIpKHQpKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0LG4pe3ZhciBpPXIoMTQ5KSxvPXIoNTc2KTtlLnBia2RmMj1mdW5jdGlvbih0LHIsbixpLGEsZil7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgYSYmKGY9YSxhPXZvaWQgMCksbyhuLGkpLFwiZnVuY3Rpb25cIiE9dHlwZW9mIGYpdGhyb3cgbmV3IEVycm9yKFwiTm8gY2FsbGJhY2sgcHJvdmlkZWQgdG8gcGJrZGYyXCIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmKG51bGwsZS5wYmtkZjJTeW5jKHQscixuLGksYSkpfSl9O3ZhciBhO2lmKHQuYnJvd3NlcilhPVwidXRmLThcIjtlbHNle3ZhciBmPXBhcnNlSW50KHQudmVyc2lvbi5zcGxpdChcIi5cIilbMF0uc2xpY2UoMSksMTApO2E9Zj49Nj9cInV0Zi04XCI6XCJiaW5hcnlcIn1lLnBia2RmMlN5bmM9ZnVuY3Rpb24odCxlLHIsZixzKXtuLmlzQnVmZmVyKHQpfHwodD1uZXcgbih0LGEpKSxuLmlzQnVmZmVyKGUpfHwoZT1uZXcgbihlLGEpKSxvKHIsZikscz1zfHxcInNoYTFcIjt2YXIgdSxoPTEsYz1uZXcgbihmKSxkPW5ldyBuKGUubGVuZ3RoKzQpO2UuY29weShkLDAsMCxlLmxlbmd0aCk7Zm9yKHZhciBsLHAsYj0xO2I8PWg7YisrKXtkLndyaXRlVUludDMyQkUoYixlLmxlbmd0aCk7dmFyIHY9aShzLHQpLnVwZGF0ZShkKS5kaWdlc3QoKTt1fHwodT12Lmxlbmd0aCxwPW5ldyBuKHUpLGg9TWF0aC5jZWlsKGYvdSksbD1mLShoLTEpKnUpLHYuY29weShwLDAsMCx1KTtmb3IodmFyIHk9MTt5PHI7eSsrKXt2PWkocyx0KS51cGRhdGUodikuZGlnZXN0KCk7Zm9yKHZhciBtPTA7bTx1O20rKylwW21dXj12W21dfXZhciBnPShiLTEpKnUsdz1iPT09aD9sOnU7cC5jb3B5KGMsZywwLHcpfXJldHVybiBjfX0pLmNhbGwoZSxyKDI2KSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSl7ZVtcImFlcy0xMjgtZWNiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjAsbW9kZTpcIkVDQlwiLHR5cGU6XCJibG9ja1wifSxlW1wiYWVzLTE5Mi1lY2JcIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MCxtb2RlOlwiRUNCXCIsdHlwZTpcImJsb2NrXCJ9LGVbXCJhZXMtMjU2LWVjYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjowLG1vZGU6XCJFQ0JcIix0eXBlOlwiYmxvY2tcIn0sZVtcImFlcy0xMjgtY2JjXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjE2LG1vZGU6XCJDQkNcIix0eXBlOlwiYmxvY2tcIn0sZVtcImFlcy0xOTItY2JjXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTkyLGl2OjE2LG1vZGU6XCJDQkNcIix0eXBlOlwiYmxvY2tcIn0sZVtcImFlcy0yNTYtY2JjXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MjU2LGl2OjE2LG1vZGU6XCJDQkNcIix0eXBlOlwiYmxvY2tcIn0sZS5hZXMxMjg9ZVtcImFlcy0xMjgtY2JjXCJdLGUuYWVzMTkyPWVbXCJhZXMtMTkyLWNiY1wiXSxlLmFlczI1Nj1lW1wiYWVzLTI1Ni1jYmNcIl0sZVtcImFlcy0xMjgtY2ZiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjE2LG1vZGU6XCJDRkJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTkyLWNmYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ0ZCXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTI1Ni1jZmJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTYsbW9kZTpcIkNGQlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtY2ZiOFwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxNixtb2RlOlwiQ0ZCOFwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xOTItY2ZiOFwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ0ZCOFwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0yNTYtY2ZiOFwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjoxNixtb2RlOlwiQ0ZCOFwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtY2ZiMVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjEyOCxpdjoxNixtb2RlOlwiQ0ZCMVwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xOTItY2ZiMVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ0ZCMVwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0yNTYtY2ZiMVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjoxNixtb2RlOlwiQ0ZCMVwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtb2ZiXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjE2LG1vZGU6XCJPRkJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTkyLW9mYlwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiT0ZCXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTI1Ni1vZmJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTYsbW9kZTpcIk9GQlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtY3RyXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjE2LG1vZGU6XCJDVFJcIix0eXBlOlwic3RyZWFtXCJ9LGVbXCJhZXMtMTkyLWN0clwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjE5MixpdjoxNixtb2RlOlwiQ1RSXCIsdHlwZTpcInN0cmVhbVwifSxlW1wiYWVzLTI1Ni1jdHJcIl09e2NpcGhlcjpcIkFFU1wiLGtleToyNTYsaXY6MTYsbW9kZTpcIkNUUlwiLHR5cGU6XCJzdHJlYW1cIn0sZVtcImFlcy0xMjgtZ2NtXCJdPXtjaXBoZXI6XCJBRVNcIixrZXk6MTI4LGl2OjEyLG1vZGU6XCJHQ01cIix0eXBlOlwiYXV0aFwifSxlW1wiYWVzLTE5Mi1nY21cIl09e2NpcGhlcjpcIkFFU1wiLGtleToxOTIsaXY6MTIsbW9kZTpcIkdDTVwiLHR5cGU6XCJhdXRoXCJ9LGVbXCJhZXMtMjU2LWdjbVwiXT17Y2lwaGVyOlwiQUVTXCIsa2V5OjI1NixpdjoxMixtb2RlOlwiR0NNXCIsdHlwZTpcImF1dGhcIn19LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LHIsbixvKXtlLmlzQnVmZmVyKHQpfHwodD1uZXcgZSh0LFwiYmluYXJ5XCIpKSxyJiYhZS5pc0J1ZmZlcihyKSYmKHI9bmV3IGUocixcImJpbmFyeVwiKSksbi89OCxvPW98fDA7Zm9yKHZhciBhLGYscz0wLHU9MCxoPW5ldyBlKG4pLGM9bmV3IGUobyksZD0wLGw9W107Oyl7aWYoZCsrPjAmJmwucHVzaChhKSxsLnB1c2godCksciYmbC5wdXNoKHIpLGE9aShlLmNvbmNhdChsKSksbD1bXSxmPTAsbj4wKWZvcig7Oyl7aWYoMD09PW4pYnJlYWs7aWYoZj09PWEubGVuZ3RoKWJyZWFrO2hbcysrXT1hW2ZdLG4tLSxmKyt9aWYobz4wJiZmIT09YS5sZW5ndGgpZm9yKDs7KXtpZigwPT09bylicmVhaztpZihmPT09YS5sZW5ndGgpYnJlYWs7Y1t1KytdPWFbZl0sby0tLGYrK31pZigwPT09biYmMD09PW8pYnJlYWt9Zm9yKGY9MDtmPGEubGVuZ3RoO2YrKylhW2ZdPTA7cmV0dXJue2tleTpoLGl2OmN9fXZhciBpPXIoMTA1KTt0LmV4cG9ydHM9bn0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQpe3RoaXMuYWZ0ZXJUcmFuc2Zvcm09ZnVuY3Rpb24oZSxyKXtyZXR1cm4gaSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBpKHQsZSxyKXt2YXIgbj10Ll90cmFuc2Zvcm1TdGF0ZTtuLnRyYW5zZm9ybWluZz0hMTt2YXIgaT1uLndyaXRlY2I7aWYoIWkpcmV0dXJuIHQuZW1pdChcImVycm9yXCIsbmV3IEVycm9yKFwibm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3NcIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPT1yJiZ2b2lkIDAhPT1yJiZ0LnB1c2gociksaShlKTt2YXIgbz10Ll9yZWFkYWJsZVN0YXRlO28ucmVhZGluZz0hMSwoby5uZWVkUmVhZGFibGV8fG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFyaykmJnQuX3JlYWQoby5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBvKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXJldHVybiBuZXcgbyh0KTtmLmNhbGwodGhpcyx0KSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT1uZXcgbih0aGlzKTt2YXIgZT10aGlzO3RoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoXCJmdW5jdGlvblwiPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQuZmx1c2gmJih0aGlzLl9mbHVzaD10LmZsdXNoKSksdGhpcy5vbmNlKFwicHJlZmluaXNoXCIsZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLl9mbHVzaD90aGlzLl9mbHVzaChmdW5jdGlvbih0KXthKGUsdCl9KTphKGUpfSl9ZnVuY3Rpb24gYSh0LGUpe2lmKGUpcmV0dXJuIHQuZW1pdChcImVycm9yXCIsZSk7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXQuX3RyYW5zZm9ybVN0YXRlO2lmKHIubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMFwiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoXCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nXCIpO3JldHVybiB0LnB1c2gobnVsbCl9dC5leHBvcnRzPW87dmFyIGY9cig1MSkscz1yKDczKTtzLmluaGVyaXRzPXIoNzQpLHMuaW5oZXJpdHMobyxmKSxvLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsZi5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sby5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpfSxvLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sby5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PWUud3JpdGVjaHVuayYmZS53cml0ZWNiJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaSgpe31mdW5jdGlvbiBvKHQsZSxyKXt0aGlzLmNodW5rPXQsdGhpcy5lbmNvZGluZz1lLHRoaXMuY2FsbGJhY2s9cix0aGlzLm5leHQ9bnVsbH1mdW5jdGlvbiBhKHQsZSl7Uj1SfHxyKDUxKSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgUiYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC53cml0YWJsZU9iamVjdE1vZGUpO3ZhciBuPXQuaGlnaFdhdGVyTWFyayxpPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9bnx8MD09PW4/bjppLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITE7dmFyIG89dC5kZWNvZGVTdHJpbmdzPT09ITE7dGhpcy5kZWNvZGVTdHJpbmdzPSFvLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHxcInV0ZjhcIix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpe2IoZSx0KX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgUyh0aGlzKX1mdW5jdGlvbiBmKHQpe3JldHVybiBSPVJ8fHIoNTEpLHRoaXMgaW5zdGFuY2VvZiBmfHx0aGlzIGluc3RhbmNlb2YgUj8odGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgYSh0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQud3JpdGUmJih0aGlzLl93cml0ZT10LndyaXRlKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLHZvaWQgeC5jYWxsKHRoaXMpKTpuZXcgZih0KX1mdW5jdGlvbiBzKHQsZSl7dmFyIHI9bmV3IEVycm9yKFwid3JpdGUgYWZ0ZXIgZW5kXCIpO3QuZW1pdChcImVycm9yXCIsciksRShlLHIpfWZ1bmN0aW9uIHUodCxlLHIsbil7dmFyIGk9ITAsbz0hMTtyZXR1cm4gbnVsbD09PXI/bz1uZXcgVHlwZUVycm9yKFwiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW1cIik6Qi5pc0J1ZmZlcihyKXx8XCJzdHJpbmdcIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcihcIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmtcIikpLG8mJih0LmVtaXQoXCJlcnJvclwiLG8pLEUobixvKSxpPSExKSxpfWZ1bmN0aW9uIGgodCxlLHIpe3JldHVybiB0Lm9iamVjdE1vZGV8fHQuZGVjb2RlU3RyaW5ncz09PSExfHxcInN0cmluZ1wiIT10eXBlb2YgZXx8KGU9Ty5mcm9tKGUscikpLGV9ZnVuY3Rpb24gYyh0LGUscixuLGkpe3I9aChlLHIsbiksQi5pc0J1ZmZlcihyKSYmKG49XCJidWZmZXJcIik7dmFyIGE9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGg7ZS5sZW5ndGgrPWE7dmFyIGY9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO2lmKGZ8fChlLm5lZWREcmFpbj0hMCksZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIHM9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD1uZXcgbyhyLG4saSkscz9zLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgZCh0LGUsITEsYSxyLG4saSk7cmV0dXJuIGZ9ZnVuY3Rpb24gZCh0LGUscixuLGksbyxhKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPWEsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIGwodCxlLHIsbixpKXstLWUucGVuZGluZ2NiLHI/RShpLG4pOmkobiksdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KFwiZXJyb3JcIixuKX1mdW5jdGlvbiBwKHQpe3Qud3JpdGluZz0hMSx0LndyaXRlY2I9bnVsbCx0Lmxlbmd0aC09dC53cml0ZWxlbix0LndyaXRlbGVuPTB9ZnVuY3Rpb24gYih0LGUpe3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj1yLnN5bmMsaT1yLndyaXRlY2I7aWYocChyKSxlKWwodCxyLG4sZSxpKTtlbHNle3ZhciBvPWcocik7b3x8ci5jb3JrZWR8fHIuYnVmZmVyUHJvY2Vzc2luZ3x8IXIuYnVmZmVyZWRSZXF1ZXN0fHxtKHQsciksbj9BKHYsdCxyLG8saSk6dih0LHIsbyxpKX19ZnVuY3Rpb24gdih0LGUscixuKXtyfHx5KHQsZSksZS5wZW5kaW5nY2ItLSxuKCksXyh0LGUpfWZ1bmN0aW9uIHkodCxlKXswPT09ZS5sZW5ndGgmJmUubmVlZERyYWluJiYoZS5uZWVkRHJhaW49ITEsdC5lbWl0KFwiZHJhaW5cIikpfWZ1bmN0aW9uIG0odCxlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHI9ZS5idWZmZXJlZFJlcXVlc3Q7aWYodC5fd3JpdGV2JiZyJiZyLm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXI7Zm9yKHZhciBhPTA7cjspaVthXT1yLHI9ci5uZXh0LGErPTE7ZCh0LGUsITAsZS5sZW5ndGgsaSxcIlwiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgUyhlKX1lbHNle2Zvcig7cjspe3ZhciBmPXIuY2h1bmsscz1yLmVuY29kaW5nLHU9ci5jYWxsYmFjayxoPWUub2JqZWN0TW9kZT8xOmYubGVuZ3RoO2lmKGQodCxlLCExLGgsZixzLHUpLHI9ci5uZXh0LGUud3JpdGluZylicmVha31udWxsPT09ciYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsZS5idWZmZXJlZFJlcXVlc3Q9cixlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiB3KHQsZSl7ZS5wcmVmaW5pc2hlZHx8KGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KFwicHJlZmluaXNoXCIpKX1mdW5jdGlvbiBfKHQsZSl7dmFyIHI9ZyhlKTtyZXR1cm4gciYmKDA9PT1lLnBlbmRpbmdjYj8odyh0LGUpLGUuZmluaXNoZWQ9ITAsdC5lbWl0KFwiZmluaXNoXCIpKTp3KHQsZSkpLHJ9ZnVuY3Rpb24gTSh0LGUscil7ZS5lbmRpbmc9ITAsXyh0LGUpLHImJihlLmZpbmlzaGVkP0Uocik6dC5vbmNlKFwiZmluaXNoXCIscikpLGUuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX1mdW5jdGlvbiBTKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fXQuZXhwb3J0cz1mO3ZhciBFPXIoMTU3KSxBPSFlLmJyb3dzZXImJltcInYwLjEwXCIsXCJ2MC45LlwiXS5pbmRleE9mKGUudmVyc2lvbi5zbGljZSgwLDUpKT4tMT9uOkU7Zi5Xcml0YWJsZVN0YXRlPWE7dmFyIGs9cig3Myk7ay5pbmhlcml0cz1yKDc0KTt2YXIgeCxJPXtkZXByZWNhdGU6cig1OTgpfTshZnVuY3Rpb24oKXt0cnl7eD1yKDMxKX1jYXRjaCh0KXt9ZmluYWxseXt4fHwoeD1yKDExMCkuRXZlbnRFbWl0dGVyKX19KCk7dmFyIEI9cigxKS5CdWZmZXIsTz1yKDE1Nik7ay5pbmhlcml0cyhmLHgpO3ZhciBSO2EucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxlPVtdO3Q7KWUucHVzaCh0KSx0PXQubmV4dDtyZXR1cm4gZX0sZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpJLmRlcHJlY2F0ZShmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSxcIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuXCIpfSl9Y2F0Y2godCl7fX0oKTt2YXIgUjtmLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KFwiZXJyb3JcIixuZXcgRXJyb3IoXCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlXCIpKX0sZi5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsbz0hMTtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksQi5pc0J1ZmZlcih0KT9lPVwiYnVmZmVyXCI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLFwiZnVuY3Rpb25cIiE9dHlwZW9mIHImJihyPWkpLG4uZW5kZWQ/cyh0aGlzLHIpOnUodGhpcyxuLHQscikmJihuLnBlbmRpbmdjYisrLG89Yyh0aGlzLG4sdCxlLHIpKSxvfSxmLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd3JpdGFibGVTdGF0ZTt0LmNvcmtlZCsrfSxmLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8bSh0aGlzLHQpKX0sZi5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0JiYodD10LnRvTG93ZXJDYXNlKCkpLCEoW1wiaGV4XCIsXCJ1dGY4XCIsXCJ1dGYtOFwiLFwiYXNjaWlcIixcImJpbmFyeVwiLFwiYmFzZTY0XCIsXCJ1Y3MyXCIsXCJ1Y3MtMlwiLFwidXRmMTZsZVwiLFwidXRmLTE2bGVcIixcInJhd1wiXS5pbmRleE9mKCh0K1wiXCIpLnRvTG93ZXJDYXNlKCkpPi0xKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sZi5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXtyKG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKSl9LGYucHJvdG90eXBlLl93cml0ZXY9bnVsbCxmLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7XCJmdW5jdGlvblwiPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxlPW51bGwpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT09dCYmdm9pZCAwIT09dCYmdGhpcy53cml0ZSh0LGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8bi5maW5pc2hlZHx8TSh0aGlzLG4scil9fSkuY2FsbChlLHIoMjYpLHIoMTU4KS5zZXRJbW1lZGlhdGUpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKHQpe3ZhciBuPXIoMSksaT1uLkJ1ZmZlcixvPW4uU2xvd0J1ZmZlcixhPW4ua01heExlbmd0aHx8MjE0NzQ4MzY0NztlLmFsbG9jPWZ1bmN0aW9uKHQsZSxyKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBpLmFsbG9jKXJldHVybiBpLmFsbG9jKHQsZSxyKTtpZihcIm51bWJlclwiPT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKFwiZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVtYmVyXCIpO2lmKFwibnVtYmVyXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJzaXplIG11c3QgYmUgYSBudW1iZXJcIik7aWYodD5hKXRocm93IG5ldyBSYW5nZUVycm9yKFwic2l6ZSBpcyB0b28gbGFyZ2VcIik7dmFyIG49cixvPWU7dm9pZCAwPT09byYmKG49dm9pZCAwLG89MCk7dmFyIGY9bmV3IGkodCk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIG8pZm9yKHZhciBzPW5ldyBpKG8sbiksdT1zLmxlbmd0aCxoPS0xOysraDx0OylmW2hdPXNbaCV1XTtlbHNlIGYuZmlsbChvKTtyZXR1cm4gZn0sZS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBpLmFsbG9jVW5zYWZlKXJldHVybiBpLmFsbG9jVW5zYWZlKHQpO2lmKFwibnVtYmVyXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJzaXplIG11c3QgYmUgYSBudW1iZXJcIik7aWYodD5hKXRocm93IG5ldyBSYW5nZUVycm9yKFwic2l6ZSBpcyB0b28gbGFyZ2VcIik7cmV0dXJuIG5ldyBpKHQpfSxlLmZyb209ZnVuY3Rpb24oZSxyLG4pe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGkuZnJvbSYmKCF0LlVpbnQ4QXJyYXl8fFVpbnQ4QXJyYXkuZnJvbSE9PWkuZnJvbSkpcmV0dXJuIGkuZnJvbShlLHIsbik7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIG5ldyBpKGUscik7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe3ZhciBvPXI7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBpKGUpO1widW5kZWZpbmVkXCI9PXR5cGVvZiBvJiYobz0wKTt2YXIgYT1uO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhJiYoYT1lLmJ5dGVMZW5ndGgtbyksbz49ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kc1wiKTtpZihhPmUuYnl0ZUxlbmd0aC1vKXRocm93IG5ldyBSYW5nZUVycm9yKFwiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kc1wiKTtyZXR1cm4gbmV3IGkoZS5zbGljZShvLG8rYSkpfWlmKGkuaXNCdWZmZXIoZSkpe3ZhciBmPW5ldyBpKGUubGVuZ3RoKTtyZXR1cm4gZS5jb3B5KGYsMCwwLGUubGVuZ3RoKSxmfWlmKGUpe2lmKEFycmF5LmlzQXJyYXkoZSl8fFwidW5kZWZpbmVkXCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8XCJsZW5ndGhcImluIGUpcmV0dXJuIG5ldyBpKGUpO2lmKFwiQnVmZmVyXCI9PT1lLnR5cGUmJkFycmF5LmlzQXJyYXkoZS5kYXRhKSlyZXR1cm4gbmV3IGkoZS5kYXRhKX10aHJvdyBuZXcgVHlwZUVycm9yKFwiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LlwiKX0sZS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgaS5hbGxvY1Vuc2FmZVNsb3cpcmV0dXJuIGkuYWxsb2NVbnNhZmVTbG93KHQpO2lmKFwibnVtYmVyXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJzaXplIG11c3QgYmUgYSBudW1iZXJcIik7aWYodD49YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNpemUgaXMgdG9vIGxhcmdlXCIpO3JldHVybiBuZXcgbyh0KX19KS5jYWxsKGUscigzOSkpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIodCxyLG4saSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7dmFyIG8sYSxmPWFyZ3VtZW50cy5sZW5ndGg7c3dpdGNoKGYpe2Nhc2UgMDpjYXNlIDE6cmV0dXJuIGUubmV4dFRpY2sodCk7Y2FzZSAyOnJldHVybiBlLm5leHRUaWNrKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwscil9KTtjYXNlIDM6cmV0dXJuIGUubmV4dFRpY2soZnVuY3Rpb24oKXt0LmNhbGwobnVsbCxyLG4pfSk7Y2FzZSA0OnJldHVybiBlLm5leHRUaWNrKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwscixuLGkpfSk7ZGVmYXVsdDpmb3Iobz1uZXcgQXJyYXkoZi0xKSxhPTA7YTxvLmxlbmd0aDspb1thKytdPWFyZ3VtZW50c1thXTtyZXR1cm4gZS5uZXh0VGljayhmdW5jdGlvbigpe3QuYXBwbHkobnVsbCxvKX0pfX0hZS52ZXJzaW9ufHwwPT09ZS52ZXJzaW9uLmluZGV4T2YoXCJ2MC5cIil8fDA9PT1lLnZlcnNpb24uaW5kZXhPZihcInYxLlwiKSYmMCE9PWUudmVyc2lvbi5pbmRleE9mKFwidjEuOC5cIik/dC5leHBvcnRzPXI6dC5leHBvcnRzPWUubmV4dFRpY2s7XG59KS5jYWxsKGUscigyNikpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gaSh0LGUpe3RoaXMuX2lkPXQsdGhpcy5fY2xlYXJGbj1lfXZhciBvPXIoMjYpLm5leHRUaWNrLGE9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LGY9QXJyYXkucHJvdG90eXBlLnNsaWNlLHM9e30sdT0wO2Uuc2V0VGltZW91dD1mdW5jdGlvbigpe3JldHVybiBuZXcgaShhLmNhbGwoc2V0VGltZW91dCx3aW5kb3csYXJndW1lbnRzKSxjbGVhclRpbWVvdXQpfSxlLnNldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKGEuY2FsbChzZXRJbnRlcnZhbCx3aW5kb3csYXJndW1lbnRzKSxjbGVhckludGVydmFsKX0sZS5jbGVhclRpbWVvdXQ9ZS5jbGVhckludGVydmFsPWZ1bmN0aW9uKHQpe3QuY2xvc2UoKX0saS5wcm90b3R5cGUudW5yZWY9aS5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKCl7fSxpLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyRm4uY2FsbCh3aW5kb3csdGhpcy5faWQpfSxlLmVucm9sbD1mdW5jdGlvbih0LGUpe2NsZWFyVGltZW91dCh0Ll9pZGxlVGltZW91dElkKSx0Ll9pZGxlVGltZW91dD1lfSxlLnVuZW5yb2xsPWZ1bmN0aW9uKHQpe2NsZWFyVGltZW91dCh0Ll9pZGxlVGltZW91dElkKSx0Ll9pZGxlVGltZW91dD0tMX0sZS5fdW5yZWZBY3RpdmU9ZS5hY3RpdmU9ZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KHQuX2lkbGVUaW1lb3V0SWQpO3ZhciBlPXQuX2lkbGVUaW1lb3V0O2U+PTAmJih0Ll9pZGxlVGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Ll9vblRpbWVvdXQmJnQuX29uVGltZW91dCgpfSxlKSl9LGUuc2V0SW1tZWRpYXRlPVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dDpmdW5jdGlvbih0KXt2YXIgcj11Kyssbj0hKGFyZ3VtZW50cy5sZW5ndGg8MikmJmYuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIHNbcl09ITAsbyhmdW5jdGlvbigpe3Nbcl0mJihuP3QuYXBwbHkobnVsbCxuKTp0LmNhbGwobnVsbCksZS5jbGVhckltbWVkaWF0ZShyKSl9KSxyfSxlLmNsZWFySW1tZWRpYXRlPVwiZnVuY3Rpb25cIj09dHlwZW9mIG4/bjpmdW5jdGlvbih0KXtkZWxldGUgc1t0XX19KS5jYWxsKGUscigxNTgpLnNldEltbWVkaWF0ZSxyKDE1OCkuY2xlYXJJbW1lZGlhdGUpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1yKDYyKSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbih0aGlzLGUpLGkodGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gbyhlLHQpLGV9KGEpO3QuZXhwb3J0cz1mfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1yKDYyKSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbih0aGlzLGUpLGkodGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gbyhlLHQpLGV9KGEpO3QuZXhwb3J0cz1mfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbj1lW3JdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gciYmdChlLnByb3RvdHlwZSxyKSxuJiZ0KGUsbiksZX19KCksbz1yKDI1NykuQmVyLGE9NjU1MzcsZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtuKHRoaXMsdCl9cmV0dXJuIGkodCxudWxsLFt7a2V5OlwibW9kdWx1c1RvUGVtXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoMD09PXRbMF0pdGhyb3cgbmV3IEVycm9yKFwiTW9kdWx1cyBtYXkgbm90IHN0YXJ0IHdpdGggemVyb1wiKTsxMjgmdFswXSYmKHQ9ZS5jb25jYXQoW25ldyBlKFswXSksdF0pKTt2YXIgcj1uZXcgby5Xcml0ZXI7cmV0dXJuIHIuc3RhcnRTZXF1ZW5jZSgpLHIud3JpdGVCdWZmZXIodCwyKSxyLndyaXRlSW50KGEpLHIuZW5kU2VxdWVuY2UoKSxcIi0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLVxcblwiK3IuYnVmZmVyLnRvU3RyaW5nKFwiYmFzZTY0XCIpLm1hdGNoKC8uezEsNjR9L2cpLmpvaW4oXCJcXG5cIikrXCJcXG4tLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tXFxuXCJ9fSx7a2V5OlwibW9kdWx1c0Zyb21Qcml2YXRlS2V5XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIHI9dC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLVwiLFwiXCIpLnJlcGxhY2UoXCItLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLVwiLFwiXCIpLnJlcGxhY2UoL1xccyt8XFxuXFxyfFxcbnxcXHIkL2dtLFwiXCIpLG49bmV3IGUocixcImJhc2U2NFwiKSxpPW5ldyBvLlJlYWRlcihuKTtpLnJlYWRTZXF1ZW5jZSgpLGkucmVhZFN0cmluZygyLCEwKTt2YXIgYT1pLnJlYWRTdHJpbmcoMiwhMCk7cmV0dXJuIDA9PT1hWzBdP2Euc2xpY2UoMSk6YX19XSksdH0oKTt0LmV4cG9ydHM9Zn0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtyKDI4MSksdC5leHBvcnRzPXIoMTYzKS5OdW1iZXIuaXNJbnRlZ2VyfSxmdW5jdGlvbih0LGUpe3ZhciByPXQuZXhwb3J0cz17dmVyc2lvbjpcIjIuNC4wXCJ9O1wibnVtYmVyXCI9PXR5cGVvZiBfX2UmJihfX2U9cil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3ZhciByPXQuZXhwb3J0cz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJnNlbGYuTWF0aD09TWF0aD9zZWxmOkZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcIm51bWJlclwiPT10eXBlb2YgX19nJiYoX19nPXIpfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoXCJudW1iZXJcIiE9dHlwZW9mIHQmJlwiTnVtYmVyXCIhPW4odCkpdGhyb3cgVHlwZUVycm9yKGUpO3JldHVybit0fX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMTEpLGk9cig0Nyksbz1yKDEwKTt0LmV4cG9ydHM9W10uY29weVdpdGhpbnx8ZnVuY3Rpb24odCxlKXt2YXIgcj1uKHRoaXMpLGE9byhyLmxlbmd0aCksZj1pKHQsYSkscz1pKGUsYSksdT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCxoPU1hdGgubWluKCh2b2lkIDA9PT11P2E6aSh1LGEpKS1zLGEtZiksYz0xO2ZvcihzPGYmJmY8cytoJiYoYz0tMSxzKz1oLTEsZis9aC0xKTtoLS0gPjA7KXMgaW4gcj9yW2ZdPXJbc106ZGVsZXRlIHJbZl0sZis9YyxzKz1jO3JldHVybiByfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciByPVtdO3JldHVybiBuKHQsITEsci5wdXNoLHIsZSkscn19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDEzKSxpPXIoMTEpLG89cig2NSksYT1yKDEwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIsZixzKXtuKGUpO3ZhciB1PWkodCksaD1vKHUpLGM9YSh1Lmxlbmd0aCksZD1zP2MtMTowLGw9cz8tMToxO2lmKHI8Milmb3IoOzspe2lmKGQgaW4gaCl7Zj1oW2RdLGQrPWw7YnJlYWt9aWYoZCs9bCxzP2Q8MDpjPD1kKXRocm93IFR5cGVFcnJvcihcIlJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWVcIil9Zm9yKDtzP2Q+PTA6Yz5kO2QrPWwpZCBpbiBoJiYoZj1lKGYsaFtkXSxkLHUpKTtyZXR1cm4gZn19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDEzKSxpPXIoNiksbz1yKDgyKSxhPVtdLnNsaWNlLGY9e30scz1mdW5jdGlvbih0LGUscil7aWYoIShlIGluIGYpKXtmb3IodmFyIG49W10saT0wO2k8ZTtpKyspbltpXT1cImFbXCIraStcIl1cIjtmW2VdPUZ1bmN0aW9uKFwiRixhXCIsXCJyZXR1cm4gbmV3IEYoXCIrbi5qb2luKFwiLFwiKStcIilcIil9cmV0dXJuIGZbZV0odCxyKX07dC5leHBvcnRzPUZ1bmN0aW9uLmJpbmR8fGZ1bmN0aW9uKHQpe3ZhciBlPW4odGhpcykscj1hLmNhbGwoYXJndW1lbnRzLDEpLGY9ZnVuY3Rpb24oKXt2YXIgbj1yLmNvbmNhdChhLmNhbGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmP3MoZSxuLmxlbmd0aCxuKTpvKGUsbix0KX07cmV0dXJuIGkoZS5wcm90b3R5cGUpJiYoZi5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGZ9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cig5KS5mLGk9cig0Miksbz1yKDQ1KSxhPXIoMzMpLGY9cig0MCkscz1yKDI0KSx1PXIoNTUpLGg9cigxMjgpLGM9cigxNzcpLGQ9cig0NiksbD1yKDgpLHA9cigzNikuZmFzdEtleSxiPWw/XCJfc1wiOlwic2l6ZVwiLHY9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXAoZSk7aWYoXCJGXCIhPT1uKXJldHVybiB0Ll9pW25dO2ZvcihyPXQuX2Y7cjtyPXIubilpZihyLms9PWUpcmV0dXJuIHJ9O3QuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24odCxlLHIsaCl7dmFyIGM9dChmdW5jdGlvbih0LG4pe2YodCxjLGUsXCJfaVwiKSx0Ll9pPWkobnVsbCksdC5fZj12b2lkIDAsdC5fbD12b2lkIDAsdFtiXT0wLHZvaWQgMCE9biYmdShuLHIsdFtoXSx0KX0pO3JldHVybiBvKGMucHJvdG90eXBlLHtjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9dC5faSxyPXQuX2Y7cjtyPXIubilyLnI9ITAsci5wJiYoci5wPXIucC5uPXZvaWQgMCksZGVsZXRlIGVbci5pXTt0Ll9mPXQuX2w9dm9pZCAwLHRbYl09MH0sZGVsZXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj12KGUsdCk7aWYocil7dmFyIG49ci5uLGk9ci5wO2RlbGV0ZSBlLl9pW3IuaV0sci5yPSEwLGkmJihpLm49biksbiYmKG4ucD1pKSxlLl9mPT1yJiYoZS5fZj1uKSxlLl9sPT1yJiYoZS5fbD1pKSxlW2JdLS19cmV0dXJuISFyfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2YodGhpcyxjLFwiZm9yRWFjaFwiKTtmb3IodmFyIGUscj1hKHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMyk7ZT1lP2Uubjp0aGlzLl9mOylmb3IocihlLnYsZS5rLHRoaXMpO2UmJmUucjspZT1lLnB9LGhhczpmdW5jdGlvbih0KXtyZXR1cm4hIXYodGhpcyx0KX19KSxsJiZuKGMucHJvdG90eXBlLFwic2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcyh0aGlzW2JdKX19KSxjfSxkZWY6ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksbz12KHQsZSk7cmV0dXJuIG8/by52PXI6KHQuX2w9bz17aTppPXAoZSwhMCksazplLHY6cixwOm49dC5fbCxuOnZvaWQgMCxyOiExfSx0Ll9mfHwodC5fZj1vKSxuJiYobi5uPW8pLHRbYl0rKyxcIkZcIiE9PWkmJih0Ll9pW2ldPW8pKSx0fSxnZXRFbnRyeTp2LHNldFN0cm9uZzpmdW5jdGlvbih0LGUscil7aCh0LGUsZnVuY3Rpb24odCxlKXt0aGlzLl90PXQsdGhpcy5faz1lLHRoaXMuX2w9dm9pZCAwfSxmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9dC5fayxyPXQuX2w7ciYmci5yOylyPXIucDtyZXR1cm4gdC5fdCYmKHQuX2w9cj1yP3Iubjp0Ll90Ll9mKT9cImtleXNcIj09ZT9jKDAsci5rKTpcInZhbHVlc1wiPT1lP2MoMCxyLnYpOmMoMCxbci5rLHIudl0pOih0Ll90PXZvaWQgMCxjKDEpKX0scj9cImVudHJpZXNcIjpcInZhbHVlc1wiLCFyLCEwKSxkKGUpfX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDY0KSxpPXIoMTY4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7aWYobih0aGlzKSE9dCl0aHJvdyBUeXBlRXJyb3IodCtcIiN0b0pTT04gaXNuJ3QgZ2VuZXJpY1wiKTtyZXR1cm4gaSh0aGlzKX19fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cig0NSksaT1yKDM2KS5nZXRXZWFrLG89cigzKSxhPXIoNiksZj1yKDQwKSxzPXIoNTUpLHU9cigyNyksaD1yKDEyKSxjPXUoNSksZD11KDYpLGw9MCxwPWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9sfHwodC5fbD1uZXcgYil9LGI9ZnVuY3Rpb24oKXt0aGlzLmE9W119LHY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYyh0LmEsZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT1lfSl9O2IucHJvdG90eXBlPXtnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dih0aGlzLHQpO2lmKGUpcmV0dXJuIGVbMV19LGhhczpmdW5jdGlvbih0KXtyZXR1cm4hIXYodGhpcyx0KX0sc2V0OmZ1bmN0aW9uKHQsZSl7dmFyIHI9dih0aGlzLHQpO3I/clsxXT1lOnRoaXMuYS5wdXNoKFt0LGVdKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe3ZhciBlPWQodGhpcy5hLGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPT09dH0pO3JldHVybn5lJiZ0aGlzLmEuc3BsaWNlKGUsMSksISF+ZX19LHQuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24odCxlLHIsbyl7dmFyIHU9dChmdW5jdGlvbih0LG4pe2YodCx1LGUsXCJfaVwiKSx0Ll9pPWwrKyx0Ll9sPXZvaWQgMCx2b2lkIDAhPW4mJnMobixyLHRbb10sdCl9KTtyZXR1cm4gbih1LnByb3RvdHlwZSx7ZGVsZXRlOmZ1bmN0aW9uKHQpe2lmKCFhKHQpKXJldHVybiExO3ZhciBlPWkodCk7cmV0dXJuIGU9PT0hMD9wKHRoaXMpLmRlbGV0ZSh0KTplJiZoKGUsdGhpcy5faSkmJmRlbGV0ZSBlW3RoaXMuX2ldfSxoYXM6ZnVuY3Rpb24odCl7aWYoIWEodCkpcmV0dXJuITE7dmFyIGU9aSh0KTtyZXR1cm4gZT09PSEwP3AodGhpcykuaGFzKHQpOmUmJmgoZSx0aGlzLl9pKX19KSx1fSxkZWY6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWkobyhlKSwhMCk7cmV0dXJuIG49PT0hMD9wKHQpLnNldChlLHIpOm5bdC5faV09cix0fSx1ZnN0b3JlOnB9fSxmdW5jdGlvbih0LGUscil7dC5leHBvcnRzPSFyKDgpJiYhcig1KShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkocigxMjApKFwiZGl2XCIpLFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDYpLGk9TWF0aC5mbG9vcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIW4odCkmJmlzRmluaXRlKHQpJiZpKHQpPT09dH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDMpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUscixpKXt0cnl7cmV0dXJuIGk/ZShuKHIpWzBdLHJbMV0pOmUocil9Y2F0Y2goZSl7dmFyIG89dC5yZXR1cm47dGhyb3cgdm9pZCAwIT09byYmbihvLmNhbGwodCkpLGV9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57dmFsdWU6ZSxkb25lOiEhdH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1NYXRoLmxvZzFwfHxmdW5jdGlvbih0KXtyZXR1cm4odD0rdCk+LTFlLTgmJnQ8MWUtOD90LXQqdC8yOk1hdGgubG9nKDErdCl9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cig0NCksaT1yKDg2KSxvPXIoNjYpLGE9cigxMSksZj1yKDY1KSxzPU9iamVjdC5hc3NpZ247dC5leHBvcnRzPSFzfHxyKDUpKGZ1bmN0aW9uKCl7dmFyIHQ9e30sZT17fSxyPVN5bWJvbCgpLG49XCJhYmNkZWZnaGlqa2xtbm9wcXJzdFwiO3JldHVybiB0W3JdPTcsbi5zcGxpdChcIlwiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dH0pLDchPXMoe30sdClbcl18fE9iamVjdC5rZXlzKHMoe30sZSkpLmpvaW4oXCJcIikhPW59KT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1hKHQpLHM9YXJndW1lbnRzLmxlbmd0aCx1PTEsaD1pLmYsYz1vLmY7cz51Oylmb3IodmFyIGQsbD1mKGFyZ3VtZW50c1t1KytdKSxwPWg/bihsKS5jb25jYXQoaChsKSk6bihsKSxiPXAubGVuZ3RoLHY9MDtiPnY7KWMuY2FsbChsLGQ9cFt2KytdKSYmKHJbZF09bFtkXSk7cmV0dXJuIHJ9OnN9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDkpLGk9cigzKSxvPXIoNDQpO3QuZXhwb3J0cz1yKDgpP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7aSh0KTtmb3IodmFyIHIsYT1vKGUpLGY9YS5sZW5ndGgscz0wO2Y+czspbi5mKHQscj1hW3MrK10sZVtyXSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxNyksaT1yKDQzKS5mLG89e30udG9TdHJpbmcsYT1cIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzP09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdyk6W10sZj1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGkodCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBhJiZcIltvYmplY3QgV2luZG93XVwiPT1vLmNhbGwodCk/Zih0KTppKG4odCkpfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTIpLGk9cigxNyksbz1yKDc4KSghMSksYT1yKDEzMykoXCJJRV9QUk9UT1wiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgcixmPWkodCkscz0wLHU9W107Zm9yKHIgaW4gZilyIT1hJiZuKGYscikmJnUucHVzaChyKTtmb3IoO2UubGVuZ3RoPnM7KW4oZixyPWVbcysrXSkmJih+byh1LHIpfHx1LnB1c2gocikpO3JldHVybiB1fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNDQpLGk9cigxNyksbz1yKDY2KS5mO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciByLGE9aShlKSxmPW4oYSkscz1mLmxlbmd0aCx1PTAsaD1bXTtzPnU7KW8uY2FsbChhLHI9Zlt1KytdKSYmaC5wdXNoKHQ/W3IsYVtyXV06YVtyXSk7cmV0dXJuIGh9fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNDMpLGk9cig4Niksbz1yKDMpLGE9cig0KS5SZWZsZWN0O3QuZXhwb3J0cz1hJiZhLm93bktleXN8fGZ1bmN0aW9uKHQpe3ZhciBlPW4uZihvKHQpKSxyPWkuZjtyZXR1cm4gcj9lLmNvbmNhdChyKHQpKTplfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNCkucGFyc2VGbG9hdCxpPXIoNTgpLnRyaW07dC5leHBvcnRzPTEvbihyKDEzOCkrXCItMFwiKSE9PS0oMS8wKT9mdW5jdGlvbih0KXt2YXIgZT1pKFN0cmluZyh0KSwzKSxyPW4oZSk7cmV0dXJuIDA9PT1yJiZcIi1cIj09ZS5jaGFyQXQoMCk/LTA6cn06bn0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNCkucGFyc2VJbnQsaT1yKDU4KS50cmltLG89cigxMzgpLGE9L15bXFwtK10/MFt4WF0vO3QuZXhwb3J0cz04IT09bihvK1wiMDhcIil8fDIyIT09bihvK1wiMHgxNlwiKT9mdW5jdGlvbih0LGUpe3ZhciByPWkoU3RyaW5nKHQpLDMpO3JldHVybiBuKHIsZT4+PjB8fChhLnRlc3Qocik/MTY6MTApKX06bn0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9T2JqZWN0LmlzfHxmdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZT8wIT09dHx8MS90PT09MS9lOnQhPXQmJmUhPWV9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxMCksaT1yKDEzNyksbz1yKDI0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIsYSl7dmFyIGY9U3RyaW5nKG8odCkpLHM9Zi5sZW5ndGgsdT12b2lkIDA9PT1yP1wiIFwiOlN0cmluZyhyKSxoPW4oZSk7aWYoaDw9c3x8XCJcIj09dSlyZXR1cm4gZjt2YXIgYz1oLXMsZD1pLmNhbGwodSxNYXRoLmNlaWwoYy91Lmxlbmd0aCkpO3JldHVybiBkLmxlbmd0aD5jJiYoZD1kLnNsaWNlKDAsYykpLGE/ZCtmOmYrZH19LGZ1bmN0aW9uKHQsZSxyKXtlLmY9cig3KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMTcxKTt0LmV4cG9ydHM9cig3OSkoXCJNYXBcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwKX19LHtnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9bi5nZXRFbnRyeSh0aGlzLHQpO3JldHVybiBlJiZlLnZ9LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiBuLmRlZih0aGlzLDA9PT10PzA6dCxlKX19LG4sITApfSxmdW5jdGlvbih0LGUscil7cig4KSYmXCJnXCIhPS8uL2cuZmxhZ3MmJnIoOSkuZihSZWdFeHAucHJvdG90eXBlLFwiZmxhZ3NcIix7Y29uZmlndXJhYmxlOiEwLGdldDpyKDgxKX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigxNzEpO3QuZXhwb3J0cz1yKDc5KShcIlNldFwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApfX0se2FkZDpmdW5jdGlvbih0KXtyZXR1cm4gbi5kZWYodGhpcyx0PTA9PT10PzA6dCx0KX19LG4pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG4saT1yKDI3KSgwKSxvPXIoMTUpLGE9cigzNiksZj1yKDE3OSkscz1yKDE3MyksdT1yKDYpLGg9YS5nZXRXZWFrLGM9T2JqZWN0LmlzRXh0ZW5zaWJsZSxkPXMudWZzdG9yZSxsPXt9LHA9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSxiPXtnZXQ6ZnVuY3Rpb24odCl7aWYodSh0KSl7dmFyIGU9aCh0KTtyZXR1cm4gZT09PSEwP2QodGhpcykuZ2V0KHQpOmU/ZVt0aGlzLl9pXTp2b2lkIDB9fSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcy5kZWYodGhpcyx0LGUpfX0sdj10LmV4cG9ydHM9cig3OSkoXCJXZWFrTWFwXCIscCxiLHMsITAsITApOzchPShuZXcgdikuc2V0KChPYmplY3QuZnJlZXplfHxPYmplY3QpKGwpLDcpLmdldChsKSYmKG49cy5nZXRDb25zdHJ1Y3RvcihwKSxmKG4ucHJvdG90eXBlLGIpLGEuTkVFRD0hMCxpKFtcImRlbGV0ZVwiLFwiaGFzXCIsXCJnZXRcIixcInNldFwiXSxmdW5jdGlvbih0KXt2YXIgZT12LnByb3RvdHlwZSxyPWVbdF07byhlLHQsZnVuY3Rpb24oZSxpKXtpZih1KGUpJiYhYyhlKSl7dGhpcy5fZnx8KHRoaXMuX2Y9bmV3IG4pO3ZhciBvPXRoaXMuX2ZbdF0oZSxpKTtyZXR1cm5cInNldFwiPT10P3RoaXM6b31yZXR1cm4gci5jYWxsKHRoaXMsZSxpKX0pfSkpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCl7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIit0K1wiJy5cIil9ci5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuW119LHIucmVzb2x2ZT1yLHQuZXhwb3J0cz1yLHIuaWQ9MTk0fSxmdW5jdGlvbih0LGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIG4odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIWV8fFwib2JqZWN0XCIhPXR5cGVvZiBlJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiBpKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9dmFyIG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyKHRoaXMsZSk7dmFyIGk9bih0aGlzLE9iamVjdC5nZXRQcm90b3R5cGVPZihlKS5jYWxsKHRoaXMpKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksXCJtZXNzYWdlXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOnZvaWQgMCE9PXQ/U3RyaW5nKHQpOlwiXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxcIm5hbWVcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6aS5jb25zdHJ1Y3Rvci5uYW1lfSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGksaS5jb25zdHJ1Y3RvciksaX1yZXR1cm4gaShlLHQpLGV9KEVycm9yKTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLHIpe3IoNDg2KSx0LmV4cG9ydHM9cigxOTcpLk51bWJlci5pc0ludGVnZXJ9LGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5leHBvcnRzPXt2ZXJzaW9uOlwiMi40LjBcIn07XCJudW1iZXJcIj09dHlwZW9mIF9fZSYmKF9fZT1yKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMjAwKSxpPXIoMTk3KSxvPXIoNDc4KSxhPXIoNDgwKSxmPVwicHJvdG90eXBlXCIscz1mdW5jdGlvbih0LGUscil7dmFyIHUsaCxjLGQ9dCZzLkYsbD10JnMuRyxwPXQmcy5TLGI9dCZzLlAsdj10JnMuQix5PXQmcy5XLG09bD9pOmlbZV18fChpW2VdPXt9KSxnPW1bZl0sdz1sP246cD9uW2VdOihuW2VdfHx7fSlbZl07bCYmKHI9ZSk7Zm9yKHUgaW4gciloPSFkJiZ3JiZ2b2lkIDAhPT13W3VdLGgmJnUgaW4gbXx8KGM9aD93W3VdOnJbdV0sbVt1XT1sJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiB3W3VdP3JbdV06diYmaD9vKGMsbik6eSYmd1t1XT09Yz9mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihlLHIsbil7aWYodGhpcyBpbnN0YW5jZW9mIHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZSk7Y2FzZSAyOnJldHVybiBuZXcgdChlLHIpfXJldHVybiBuZXcgdChlLHIsbil9cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gZVtmXT10W2ZdLGV9KGMpOmImJlwiZnVuY3Rpb25cIj09dHlwZW9mIGM/byhGdW5jdGlvbi5jYWxsLGMpOmMsYiYmKChtLnZpcnR1YWx8fChtLnZpcnR1YWw9e30pKVt1XT1jLHQmcy5SJiZnJiYhZ1t1XSYmYShnLHUsYykpKX07cy5GPTEscy5HPTIscy5TPTQscy5QPTgscy5CPTE2LHMuVz0zMixzLlU9NjQscy5SPTEyOCx0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKHQpe3JldHVybiEwfX19LGZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5leHBvcnRzPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5NYXRoPT1NYXRoP3dpbmRvdzpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1wibnVtYmVyXCI9PXR5cGVvZiBfX2cmJihfX2c9cil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt0LmV4cG9ydHM9cig0NzMpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUpey8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIG4odCxlKXtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTAsbz1NYXRoLm1pbihyLG4pO2k8bzsrK2kpaWYodFtpXSE9PWVbaV0pe3I9dFtpXSxuPWVbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfWZ1bmN0aW9uIGkodCl7cmV0dXJuIGUuQnVmZmVyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLkJ1ZmZlci5pc0J1ZmZlcj9lLkJ1ZmZlci5pc0J1ZmZlcih0KTohKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIWkodCkmJihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLkFycmF5QnVmZmVyJiYoXCJmdW5jdGlvblwiPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyh0KTohIXQmJih0IGluc3RhbmNlb2YgRGF0YVZpZXd8fCEhKHQuYnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkpKX1mdW5jdGlvbiBmKHQpe2lmKHcuaXNGdW5jdGlvbih0KSl7aWYoUylyZXR1cm4gdC5uYW1lO3ZhciBlPXQudG9TdHJpbmcoKSxyPWUubWF0Y2goQSk7cmV0dXJuIHImJnJbMV19fWZ1bmN0aW9uIHModCxlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD90Lmxlbmd0aDxlP3Q6dC5zbGljZSgwLGUpOnR9ZnVuY3Rpb24gdSh0KXtpZihTfHwhdy5pc0Z1bmN0aW9uKHQpKXJldHVybiB3Lmluc3BlY3QodCk7dmFyIGU9Zih0KSxyPWU/XCI6IFwiK2U6XCJcIjtyZXR1cm5cIltGdW5jdGlvblwiK3IrXCJdXCJ9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gcyh1KHQuYWN0dWFsKSwxMjgpK1wiIFwiK3Qub3BlcmF0b3IrXCIgXCIrcyh1KHQuZXhwZWN0ZWQpLDEyOCl9ZnVuY3Rpb24gYyh0LGUscixuLGkpe3Rocm93IG5ldyBFLkFzc2VydGlvbkVycm9yKHttZXNzYWdlOnIsYWN0dWFsOnQsZXhwZWN0ZWQ6ZSxvcGVyYXRvcjpuLHN0YWNrU3RhcnRGdW5jdGlvbjppfSl9ZnVuY3Rpb24gZCh0LGUpe3R8fGModCwhMCxlLFwiPT1cIixFLm9rKX1mdW5jdGlvbiBsKHQsZSxyLGYpe2lmKHQ9PT1lKXJldHVybiEwO2lmKGkodCkmJmkoZSkpcmV0dXJuIDA9PT1uKHQsZSk7aWYody5pc0RhdGUodCkmJncuaXNEYXRlKGUpKXJldHVybiB0LmdldFRpbWUoKT09PWUuZ2V0VGltZSgpO2lmKHcuaXNSZWdFeHAodCkmJncuaXNSZWdFeHAoZSkpcmV0dXJuIHQuc291cmNlPT09ZS5zb3VyY2UmJnQuZ2xvYmFsPT09ZS5nbG9iYWwmJnQubXVsdGlsaW5lPT09ZS5tdWx0aWxpbmUmJnQubGFzdEluZGV4PT09ZS5sYXN0SW5kZXgmJnQuaWdub3JlQ2FzZT09PWUuaWdub3JlQ2FzZTtpZihudWxsIT09dCYmXCJvYmplY3RcIj09dHlwZW9mIHR8fG51bGwhPT1lJiZcIm9iamVjdFwiPT10eXBlb2YgZSl7aWYoYSh0KSYmYShlKSYmbyh0KT09PW8oZSkmJiEodCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheXx8dCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkpcmV0dXJuIDA9PT1uKG5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxuZXcgVWludDhBcnJheShlLmJ1ZmZlcikpO2lmKGkodCkhPT1pKGUpKXJldHVybiExO2Y9Znx8e2FjdHVhbDpbXSxleHBlY3RlZDpbXX07dmFyIHM9Zi5hY3R1YWwuaW5kZXhPZih0KTtyZXR1cm4gcyE9PS0xJiZzPT09Zi5leHBlY3RlZC5pbmRleE9mKGUpfHwoZi5hY3R1YWwucHVzaCh0KSxmLmV4cGVjdGVkLnB1c2goZSksYih0LGUscixmKSl9cmV0dXJuIHI/dD09PWU6dD09ZX1mdW5jdGlvbiBwKHQpe3JldHVyblwiW29iamVjdCBBcmd1bWVudHNdXCI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBiKHQsZSxyLG4pe2lmKG51bGw9PT10fHx2b2lkIDA9PT10fHxudWxsPT09ZXx8dm9pZCAwPT09ZSlyZXR1cm4hMTtpZih3LmlzUHJpbWl0aXZlKHQpfHx3LmlzUHJpbWl0aXZlKGUpKXJldHVybiB0PT09ZTtpZihyJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpcmV0dXJuITE7dmFyIGk9cCh0KSxvPXAoZSk7aWYoaSYmIW98fCFpJiZvKXJldHVybiExO2lmKGkpcmV0dXJuIHQ9TS5jYWxsKHQpLGU9TS5jYWxsKGUpLGwodCxlLHIpO3ZhciBhLGYscz1rKHQpLHU9ayhlKTtpZihzLmxlbmd0aCE9PXUubGVuZ3RoKXJldHVybiExO2ZvcihzLnNvcnQoKSx1LnNvcnQoKSxmPXMubGVuZ3RoLTE7Zj49MDtmLS0paWYoc1tmXSE9PXVbZl0pcmV0dXJuITE7Zm9yKGY9cy5sZW5ndGgtMTtmPj0wO2YtLSlpZihhPXNbZl0sIWwodFthXSxlW2FdLHIsbikpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gdih0LGUscil7bCh0LGUsITApJiZjKHQsZSxyLFwibm90RGVlcFN0cmljdEVxdWFsXCIsdil9ZnVuY3Rpb24geSh0LGUpe2lmKCF0fHwhZSlyZXR1cm4hMTtpZihcIltvYmplY3QgUmVnRXhwXVwiPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpcmV0dXJuIGUudGVzdCh0KTt0cnl7aWYodCBpbnN0YW5jZW9mIGUpcmV0dXJuITB9Y2F0Y2godCl7fXJldHVybiFFcnJvci5pc1Byb3RvdHlwZU9mKGUpJiZlLmNhbGwoe30sdCk9PT0hMH1mdW5jdGlvbiBtKHQpe3ZhciBlO3RyeXt0KCl9Y2F0Y2godCl7ZT10fXJldHVybiBlfWZ1bmN0aW9uIGcodCxlLHIsbil7dmFyIGk7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJsb2NrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XCJzdHJpbmdcIj09dHlwZW9mIHImJihuPXIscj1udWxsKSxpPW0oZSksbj0ociYmci5uYW1lP1wiIChcIityLm5hbWUrXCIpLlwiOlwiLlwiKSsobj9cIiBcIituOlwiLlwiKSx0JiYhaSYmYyhpLHIsXCJNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvblwiK24pO3ZhciBvPVwic3RyaW5nXCI9PXR5cGVvZiBuLGE9IXQmJncuaXNFcnJvcihpKSxmPSF0JiZpJiYhcjtpZigoYSYmbyYmeShpLHIpfHxmKSYmYyhpLHIsXCJHb3QgdW53YW50ZWQgZXhjZXB0aW9uXCIrbiksdCYmaSYmciYmIXkoaSxyKXx8IXQmJmkpdGhyb3cgaX12YXIgdz1yKDYwNiksXz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LE09QXJyYXkucHJvdG90eXBlLnNsaWNlLFM9ZnVuY3Rpb24oKXtyZXR1cm5cImZvb1wiPT09ZnVuY3Rpb24oKXt9Lm5hbWV9KCksRT10LmV4cG9ydHM9ZCxBPS9cXHMqZnVuY3Rpb25cXHMrKFteXFwoXFxzXSopXFxzKi87RS5Bc3NlcnRpb25FcnJvcj1mdW5jdGlvbih0KXt0aGlzLm5hbWU9XCJBc3NlcnRpb25FcnJvclwiLHRoaXMuYWN0dWFsPXQuYWN0dWFsLHRoaXMuZXhwZWN0ZWQ9dC5leHBlY3RlZCx0aGlzLm9wZXJhdG9yPXQub3BlcmF0b3IsdC5tZXNzYWdlPyh0aGlzLm1lc3NhZ2U9dC5tZXNzYWdlLHRoaXMuZ2VuZXJhdGVkTWVzc2FnZT0hMSk6KHRoaXMubWVzc2FnZT1oKHRoaXMpLHRoaXMuZ2VuZXJhdGVkTWVzc2FnZT0hMCk7dmFyIGU9dC5zdGFja1N0YXJ0RnVuY3Rpb258fGM7aWYoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxlKTtlbHNle3ZhciByPW5ldyBFcnJvcjtpZihyLnN0YWNrKXt2YXIgbj1yLnN0YWNrLGk9ZihlKSxvPW4uaW5kZXhPZihcIlxcblwiK2kpO2lmKG8+PTApe3ZhciBhPW4uaW5kZXhPZihcIlxcblwiLG8rMSk7bj1uLnN1YnN0cmluZyhhKzEpfXRoaXMuc3RhY2s9bn19fSx3LmluaGVyaXRzKEUuQXNzZXJ0aW9uRXJyb3IsRXJyb3IpLEUuZmFpbD1jLEUub2s9ZCxFLmVxdWFsPWZ1bmN0aW9uKHQsZSxyKXt0IT1lJiZjKHQsZSxyLFwiPT1cIixFLmVxdWFsKX0sRS5ub3RFcXVhbD1mdW5jdGlvbih0LGUscil7dD09ZSYmYyh0LGUscixcIiE9XCIsRS5ub3RFcXVhbCl9LEUuZGVlcEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtsKHQsZSwhMSl8fGModCxlLHIsXCJkZWVwRXF1YWxcIixFLmRlZXBFcXVhbCl9LEUuZGVlcFN0cmljdEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtsKHQsZSwhMCl8fGModCxlLHIsXCJkZWVwU3RyaWN0RXF1YWxcIixFLmRlZXBTdHJpY3RFcXVhbCl9LEUubm90RGVlcEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtsKHQsZSwhMSkmJmModCxlLHIsXCJub3REZWVwRXF1YWxcIixFLm5vdERlZXBFcXVhbCl9LEUubm90RGVlcFN0cmljdEVxdWFsPXYsRS5zdHJpY3RFcXVhbD1mdW5jdGlvbih0LGUscil7dCE9PWUmJmModCxlLHIsXCI9PT1cIixFLnN0cmljdEVxdWFsKX0sRS5ub3RTdHJpY3RFcXVhbD1mdW5jdGlvbih0LGUscil7dD09PWUmJmModCxlLHIsXCIhPT1cIixFLm5vdFN0cmljdEVxdWFsKX0sRS50aHJvd3M9ZnVuY3Rpb24odCxlLHIpe2coITAsdCxlLHIpfSxFLmRvZXNOb3RUaHJvdz1mdW5jdGlvbih0LGUscil7ZyghMSx0LGUscil9LEUuaWZFcnJvcj1mdW5jdGlvbih0KXtpZih0KXRocm93IHR9O3ZhciBrPU9iamVjdC5rZXlzfHxmdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIHIgaW4gdClfLmNhbGwodCxyKSYmZS5wdXNoKHIpO3JldHVybiBlfX0pLmNhbGwoZSxyKDM5KSl9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LHIsaSxmKXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSlyZXR1cm4gbmV3IG4odCxyLGkpO2EuY2FsbCh0aGlzKSx0aGlzLl9maW5JRD1lLmNvbmNhdChbaSxuZXcgZShbMCwwLDAsMV0pXSksaT1lLmNvbmNhdChbaSxuZXcgZShbMCwwLDAsMl0pXSksdGhpcy5fY2lwaGVyPW5ldyBvLkFFUyhyKSx0aGlzLl9wcmV2PW5ldyBlKGkubGVuZ3RoKSx0aGlzLl9jYWNoZT1uZXcgZShcIlwiKSx0aGlzLl9zZWNDYWNoZT1uZXcgZShcIlwiKSx0aGlzLl9kZWNyeXB0PWYsdGhpcy5fYWxlbj0wLHRoaXMuX2xlbj0wLGkuY29weSh0aGlzLl9wcmV2KSx0aGlzLl9tb2RlPXQ7dmFyIHU9bmV3IGUoNCk7dS5maWxsKDApLHRoaXMuX2doYXNoPW5ldyBzKHRoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2sodSkpLHRoaXMuX2F1dGhUYWc9bnVsbCx0aGlzLl9jYWxsZWQ9ITF9ZnVuY3Rpb24gaSh0LGUpe3ZhciByPTA7dC5sZW5ndGghPT1lLmxlbmd0aCYmcisrO2Zvcih2YXIgbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCksaT0tMTsrK2k8bjspcis9dFtpXV5lW2ldO3JldHVybiByfXZhciBvPXIoOTQpLGE9cig5NyksZj1yKDIpLHM9cig0OTcpLHU9cig2Nyk7ZihuLGEpLHQuZXhwb3J0cz1uLG4ucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7aWYoIXRoaXMuX2NhbGxlZCYmdGhpcy5fYWxlbil7dmFyIHI9MTYtdGhpcy5fYWxlbiUxNjtyPDE2JiYocj1uZXcgZShyKSxyLmZpbGwoMCksdGhpcy5fZ2hhc2gudXBkYXRlKHIpKX10aGlzLl9jYWxsZWQ9ITA7dmFyIG49dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsdCk7cmV0dXJuIHRoaXMuX2RlY3J5cHQ/dGhpcy5fZ2hhc2gudXBkYXRlKHQpOnRoaXMuX2doYXNoLnVwZGF0ZShuKSx0aGlzLl9sZW4rPXQubGVuZ3RoLG59LG4ucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe2lmKHRoaXMuX2RlY3J5cHQmJiF0aGlzLl9hdXRoVGFnKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YVwiKTt2YXIgdD11KHRoaXMuX2doYXNoLmZpbmFsKDgqdGhpcy5fYWxlbiw4KnRoaXMuX2xlbiksdGhpcy5fY2lwaGVyLmVuY3J5cHRCbG9jayh0aGlzLl9maW5JRCkpO2lmKHRoaXMuX2RlY3J5cHQpe2lmKGkodCx0aGlzLl9hdXRoVGFnKSl0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBzdGF0ZSBvciB1bmFibGUgdG8gYXV0aGVudGljYXRlIGRhdGFcIil9ZWxzZSB0aGlzLl9hdXRoVGFnPXQ7dGhpcy5fY2lwaGVyLnNjcnViKCl9LG4ucHJvdG90eXBlLmdldEF1dGhUYWc9ZnVuY3Rpb24oKXtpZighdGhpcy5fZGVjcnlwdCYmZS5pc0J1ZmZlcih0aGlzLl9hdXRoVGFnKSlyZXR1cm4gdGhpcy5fYXV0aFRhZzt0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0aW5nIHRvIGdldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKX0sbi5wcm90b3R5cGUuc2V0QXV0aFRhZz1mdW5jdGlvbih0KXtpZighdGhpcy5fZGVjcnlwdCl0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0aW5nIHRvIHNldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKTt0aGlzLl9hdXRoVGFnPXR9LG4ucHJvdG90eXBlLnNldEFBRD1mdW5jdGlvbih0KXtpZih0aGlzLl9jYWxsZWQpdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGluZyB0byBzZXQgQUFEIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpO3RoaXMuX2doYXNoLnVwZGF0ZSh0KSx0aGlzLl9hbGVuKz10Lmxlbmd0aH19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2Nyk7ZS5lbmNyeXB0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9bihlLHQuX3ByZXYpO3JldHVybiB0Ll9wcmV2PXQuX2NpcGhlci5lbmNyeXB0QmxvY2sociksdC5fcHJldn0sZS5kZWNyeXB0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fcHJldjt0Ll9wcmV2PWU7dmFyIGk9dC5fY2lwaGVyLmRlY3J5cHRCbG9jayhlKTtyZXR1cm4gbihpLHIpfX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUscixuKXt2YXIgbz1yLmxlbmd0aCxhPWkocixlLl9jYWNoZSk7cmV0dXJuIGUuX2NhY2hlPWUuX2NhY2hlLnNsaWNlKG8pLGUuX3ByZXY9dC5jb25jYXQoW2UuX3ByZXYsbj9yOmFdKSxhfXZhciBpPXIoNjcpO2UuZW5jcnlwdD1mdW5jdGlvbihlLHIsaSl7Zm9yKHZhciBvLGE9bmV3IHQoXCJcIik7ci5sZW5ndGg7KXtpZigwPT09ZS5fY2FjaGUubGVuZ3RoJiYoZS5fY2FjaGU9ZS5fY2lwaGVyLmVuY3J5cHRCbG9jayhlLl9wcmV2KSxlLl9wcmV2PW5ldyB0KFwiXCIpKSwhKGUuX2NhY2hlLmxlbmd0aDw9ci5sZW5ndGgpKXthPXQuY29uY2F0KFthLG4oZSxyLGkpXSk7YnJlYWt9bz1lLl9jYWNoZS5sZW5ndGgsYT10LmNvbmNhdChbYSxuKGUsci5zbGljZSgwLG8pLGkpXSkscj1yLnNsaWNlKG8pfXJldHVybiBhfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gcih0LGUscil7Zm9yKHZhciBpLG8sYSxmPS0xLHM9OCx1PTA7KytmPHM7KWk9dC5fY2lwaGVyLmVuY3J5cHRCbG9jayh0Ll9wcmV2KSxvPWUmMTw8Ny1mPzEyODowLGE9aVswXV5vLHUrPSgxMjgmYSk+PmYlOCx0Ll9wcmV2PW4odC5fcHJldixyP286YSk7cmV0dXJuIHV9ZnVuY3Rpb24gbihlLHIpe3ZhciBuPWUubGVuZ3RoLGk9LTEsbz1uZXcgdChlLmxlbmd0aCk7Zm9yKGU9dC5jb25jYXQoW2UsbmV3IHQoW3JdKV0pOysraTxuOylvW2ldPWVbaV08PDF8ZVtpKzFdPj43O3JldHVybiBvfWUuZW5jcnlwdD1mdW5jdGlvbihlLG4saSl7Zm9yKHZhciBvPW4ubGVuZ3RoLGE9bmV3IHQobyksZj0tMTsrK2Y8bzspYVtmXT1yKGUsbltmXSxpKTtyZXR1cm4gYX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoZSxyLG4pe3ZhciBpPWUuX2NpcGhlci5lbmNyeXB0QmxvY2soZS5fcHJldiksbz1pWzBdXnI7cmV0dXJuIGUuX3ByZXY9dC5jb25jYXQoW2UuX3ByZXYuc2xpY2UoMSksbmV3IHQoW24/cjpvXSldKSxvfWUuZW5jcnlwdD1mdW5jdGlvbihlLG4saSl7Zm9yKHZhciBvPW4ubGVuZ3RoLGE9bmV3IHQobyksZj0tMTsrK2Y8bzspYVtmXT1yKGUsbltmXSxpKTtyZXR1cm4gYX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUpe2UuZW5jcnlwdD1mdW5jdGlvbih0LGUpe3JldHVybiB0Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKGUpfSxlLmRlY3J5cHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fY2lwaGVyLmRlY3J5cHRCbG9jayhlKX19LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5fcHJldj10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpLHQuX3ByZXZ9dmFyIGk9cig2Nyk7ZS5lbmNyeXB0PWZ1bmN0aW9uKGUscil7Zm9yKDtlLl9jYWNoZS5sZW5ndGg8ci5sZW5ndGg7KWUuX2NhY2hlPXQuY29uY2F0KFtlLl9jYWNoZSxuKGUpXSk7dmFyIG89ZS5fY2FjaGUuc2xpY2UoMCxyLmxlbmd0aCk7cmV0dXJuIGUuX2NhY2hlPWUuX2NhY2hlLnNsaWNlKHIubGVuZ3RoKSxpKHIsbyl9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQscixhLGYpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj8oby5jYWxsKHRoaXMpLHRoaXMuX2NpcGhlcj1uZXcgaS5BRVMociksdGhpcy5fcHJldj1uZXcgZShhLmxlbmd0aCksdGhpcy5fY2FjaGU9bmV3IGUoXCJcIiksdGhpcy5fc2VjQ2FjaGU9bmV3IGUoXCJcIiksdGhpcy5fZGVjcnlwdD1mLGEuY29weSh0aGlzLl9wcmV2KSx2b2lkKHRoaXMuX21vZGU9dCkpOm5ldyBuKHQscixhKX12YXIgaT1yKDk0KSxvPXIoOTcpLGE9cigyKTthKG4sbyksdC5leHBvcnRzPW4sbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsdCx0aGlzLl9kZWNyeXB0KX0sbi5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dGhpcy5fY2lwaGVyLnNjcnViKCl9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiOyhmdW5jdGlvbih0KXtlW1wiUlNBLVNIQTIyNFwiXT1lLnNoYTIyNFdpdGhSU0FFbmNyeXB0aW9uPXtzaWduOlwicnNhXCIsaGFzaDpcInNoYTIyNFwiLGlkOm5ldyB0KFwiMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWNcIixcImhleFwiKX0sZVtcIlJTQS1TSEEyNTZcIl09ZS5zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbj17c2lnbjpcInJzYVwiLGhhc2g6XCJzaGEyNTZcIixpZDpuZXcgdChcIjMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwXCIsXCJoZXhcIil9LGVbXCJSU0EtU0hBMzg0XCJdPWUuc2hhMzg0V2l0aFJTQUVuY3J5cHRpb249e3NpZ246XCJyc2FcIixoYXNoOlwic2hhMzg0XCIsaWQ6bmV3IHQoXCIzMDQxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDIwNTAwMDQzMFwiLFwiaGV4XCIpfSxlW1wiUlNBLVNIQTUxMlwiXT1lLnNoYTUxMldpdGhSU0FFbmNyeXB0aW9uPXtzaWduOlwicnNhXCIsaGFzaDpcInNoYTUxMlwiLGlkOm5ldyB0KFwiMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDBcIixcImhleFwiKX0sZVtcIlJTQS1TSEExXCJdPXtzaWduOlwicnNhXCIsaGFzaDpcInNoYTFcIixpZDpuZXcgdChcIjMwMjEzMDA5MDYwNTJiMGUwMzAyMWEwNTAwMDQxNFwiLFwiaGV4XCIpfSxlW1wiZWNkc2Etd2l0aC1TSEExXCJdPXtzaWduOlwiZWNkc2FcIixoYXNoOlwic2hhMVwiLGlkOm5ldyB0KFwiXCIsXCJoZXhcIil9LGUuRFNBPWVbXCJEU0EtU0hBMVwiXT1lW1wiRFNBLVNIQVwiXT17c2lnbjpcImRzYVwiLGhhc2g6XCJzaGExXCIsaWQ6bmV3IHQoXCJcIixcImhleFwiKX0sZVtcIkRTQS1TSEEyMjRcIl09ZVtcIkRTQS1XSVRILVNIQTIyNFwiXT17c2lnbjpcImRzYVwiLGhhc2g6XCJzaGEyMjRcIixpZDpuZXcgdChcIlwiLFwiaGV4XCIpfSxlW1wiRFNBLVNIQTI1NlwiXT1lW1wiRFNBLVdJVEgtU0hBMjU2XCJdPXtzaWduOlwiZHNhXCIsaGFzaDpcInNoYTI1NlwiLGlkOm5ldyB0KFwiXCIsXCJoZXhcIil9LGVbXCJEU0EtU0hBMzg0XCJdPWVbXCJEU0EtV0lUSC1TSEEzODRcIl09e3NpZ246XCJkc2FcIixoYXNoOlwic2hhMzg0XCIsaWQ6bmV3IHQoXCJcIixcImhleFwiKX0sZVtcIkRTQS1TSEE1MTJcIl09ZVtcIkRTQS1XSVRILVNIQTUxMlwiXT17c2lnbjpcImRzYVwiLGhhc2g6XCJzaGE1MTJcIixpZDpuZXcgdChcIlwiLFwiaGV4XCIpfSxlW1wiRFNBLVJJUEVNRDE2MFwiXT17c2lnbjpcImRzYVwiLGhhc2g6XCJybWQxNjBcIixpZDpuZXcgdChcIlwiLFwiaGV4XCIpfSxlW1wiUlNBLVJJUEVNRDE2MFwiXT1lLnJpcGVtZDE2MFdpdGhSU0E9e3NpZ246XCJyc2FcIixoYXNoOlwicm1kMTYwXCIsaWQ6bmV3IHQoXCIzMDIxMzAwOTA2MDUyYjI0MDMwMjAxMDUwMDA0MTRcIixcImhleFwiKX0sZVtcIlJTQS1NRDVcIl09ZS5tZDVXaXRoUlNBRW5jcnlwdGlvbj17c2lnbjpcInJzYVwiLGhhc2g6XCJtZDVcIixpZDpuZXcgdChcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDUwNTAwMDQxMFwiLFwiaGV4XCIpfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7ZVtcIjEuMy4xMzIuMC4xMFwiXT1cInNlY3AyNTZrMVwiLGVbXCIxLjMuMTMyLjAuMzNcIl09XCJwMjI0XCIsZVtcIjEuMi44NDAuMTAwNDUuMy4xLjFcIl09XCJwMTkyXCIsZVtcIjEuMi44NDAuMTAwNDUuMy4xLjdcIl09XCJwMjU2XCIsZVtcIjEuMy4xMzIuMC4zNFwiXT1cInAzODRcIixlW1wiMS4zLjEzMi4wLjM1XCJdPVwicDUyMVwifSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7dmFyIHI7XCJvYmplY3RcIiE9dHlwZW9mIHR8fGUuaXNCdWZmZXIodCl8fChyPXQucGFzc3BocmFzZSx0PXQua2V5KSxcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9bmV3IGUodCkpO3ZhciBuLGEscz1mKHQsciksdT1zLnRhZyxoPXMuZGF0YTtzd2l0Y2godSl7Y2FzZVwiUFVCTElDIEtFWVwiOnN3aXRjaChhPW8uUHVibGljS2V5LmRlY29kZShoLFwiZGVyXCIpLG49YS5hbGdvcml0aG0uYWxnb3JpdGhtLmpvaW4oXCIuXCIpKXtjYXNlXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiOnJldHVybiBvLlJTQVB1YmxpY0tleS5kZWNvZGUoYS5zdWJqZWN0UHVibGljS2V5LmRhdGEsXCJkZXJcIik7Y2FzZVwiMS4yLjg0MC4xMDA0NS4yLjFcIjpyZXR1cm4gYS5zdWJqZWN0UHJpdmF0ZUtleT1hLnN1YmplY3RQdWJsaWNLZXkse3R5cGU6XCJlY1wiLGRhdGE6YX07Y2FzZVwiMS4yLjg0MC4xMDA0MC40LjFcIjpyZXR1cm4gYS5hbGdvcml0aG0ucGFyYW1zLnB1Yl9rZXk9by5EU0FwYXJhbS5kZWNvZGUoYS5zdWJqZWN0UHVibGljS2V5LmRhdGEsXCJkZXJcIikse3R5cGU6XCJkc2FcIixkYXRhOmEuYWxnb3JpdGhtLnBhcmFtc307ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGtleSBpZCBcIituKX10aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGtleSB0eXBlIFwiK3UpO2Nhc2VcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiOmg9by5FbmNyeXB0ZWRQcml2YXRlS2V5LmRlY29kZShoLFwiZGVyXCIpLGg9aShoLHIpO2Nhc2VcIlBSSVZBVEUgS0VZXCI6c3dpdGNoKGE9by5Qcml2YXRlS2V5LmRlY29kZShoLFwiZGVyXCIpLG49YS5hbGdvcml0aG0uYWxnb3JpdGhtLmpvaW4oXCIuXCIpKXtjYXNlXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiOnJldHVybiBvLlJTQVByaXZhdGVLZXkuZGVjb2RlKGEuc3ViamVjdFByaXZhdGVLZXksXCJkZXJcIik7Y2FzZVwiMS4yLjg0MC4xMDA0NS4yLjFcIjpyZXR1cm57Y3VydmU6YS5hbGdvcml0aG0uY3VydmUscHJpdmF0ZUtleTpvLkVDUHJpdmF0ZUtleS5kZWNvZGUoYS5zdWJqZWN0UHJpdmF0ZUtleSxcImRlclwiKS5wcml2YXRlS2V5fTtjYXNlXCIxLjIuODQwLjEwMDQwLjQuMVwiOnJldHVybiBhLmFsZ29yaXRobS5wYXJhbXMucHJpdl9rZXk9by5EU0FwYXJhbS5kZWNvZGUoYS5zdWJqZWN0UHJpdmF0ZUtleSxcImRlclwiKSx7dHlwZTpcImRzYVwiLHBhcmFtczphLmFsZ29yaXRobS5wYXJhbXN9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBrZXkgaWQgXCIrbil9dGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBrZXkgdHlwZSBcIit1KTtjYXNlXCJSU0EgUFVCTElDIEtFWVwiOnJldHVybiBvLlJTQVB1YmxpY0tleS5kZWNvZGUoaCxcImRlclwiKTtjYXNlXCJSU0EgUFJJVkFURSBLRVlcIjpyZXR1cm4gby5SU0FQcml2YXRlS2V5LmRlY29kZShoLFwiZGVyXCIpO2Nhc2VcIkRTQSBQUklWQVRFIEtFWVwiOnJldHVybnt0eXBlOlwiZHNhXCIscGFyYW1zOm8uRFNBUHJpdmF0ZUtleS5kZWNvZGUoaCxcImRlclwiKX07Y2FzZVwiRUMgUFJJVkFURSBLRVlcIjpyZXR1cm4gaD1vLkVDUHJpdmF0ZUtleS5kZWNvZGUoaCxcImRlclwiKSx7Y3VydmU6aC5wYXJhbWV0ZXJzLnZhbHVlLHByaXZhdGVLZXk6aC5wcml2YXRlS2V5fTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcInVua25vd24ga2V5IHR5cGUgXCIrdSl9fWZ1bmN0aW9uIGkodCxyKXt2YXIgbj10LmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuc2FsdCxpPXBhcnNlSW50KHQuYWxnb3JpdGhtLmRlY3J5cHQua2RlLmtkZXBhcmFtcy5pdGVycy50b1N0cmluZygpLDEwKSxvPWFbdC5hbGdvcml0aG0uZGVjcnlwdC5jaXBoZXIuYWxnby5qb2luKFwiLlwiKV0sZj10LmFsZ29yaXRobS5kZWNyeXB0LmNpcGhlci5pdixoPXQuc3ViamVjdFByaXZhdGVLZXksYz1wYXJzZUludChvLnNwbGl0KFwiLVwiKVsxXSwxMCkvOCxkPXUucGJrZGYyU3luYyhyLG4saSxjKSxsPXMuY3JlYXRlRGVjaXBoZXJpdihvLGQsZikscD1bXTtyZXR1cm4gcC5wdXNoKGwudXBkYXRlKGgpKSxwLnB1c2gobC5maW5hbCgpKSxlLmNvbmNhdChwKX12YXIgbz1yKDUyOCksYT1yKDQ2NiksZj1yKDUyOSkscz1yKDIxOSksdT1yKDE1MSk7dC5leHBvcnRzPW4sbi5zaWduYXR1cmU9by5zaWduYXR1cmV9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBhLmNhbGwodGhpcyxlKSxmLmlzQnVmZmVyKHQpPyh0aGlzLmJhc2U9dCx0aGlzLm9mZnNldD0wLHZvaWQodGhpcy5sZW5ndGg9dC5sZW5ndGgpKTp2b2lkIHRoaXMuZXJyb3IoXCJJbnB1dCBub3QgQnVmZmVyXCIpfWZ1bmN0aW9uIGkodCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXRoaXMubGVuZ3RoPTAsdGhpcy52YWx1ZT10Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGl8fCh0PW5ldyBpKHQsZSkpLHRoaXMubGVuZ3RoKz10Lmxlbmd0aCx0fSx0aGlzKTtlbHNlIGlmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZighKDA8PXQmJnQ8PTI1NSkpcmV0dXJuIGUuZXJyb3IoXCJub24tYnl0ZSBFbmNvZGVyQnVmZmVyIHZhbHVlXCIpO3RoaXMudmFsdWU9dCx0aGlzLmxlbmd0aD0xfWVsc2UgaWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpdGhpcy52YWx1ZT10LHRoaXMubGVuZ3RoPWYuYnl0ZUxlbmd0aCh0KTtlbHNle2lmKCFmLmlzQnVmZmVyKHQpKXJldHVybiBlLmVycm9yKFwiVW5zdXBwb3J0ZWQgdHlwZTogXCIrdHlwZW9mIHQpO3RoaXMudmFsdWU9dCx0aGlzLmxlbmd0aD10Lmxlbmd0aH19dmFyIG89cigyKSxhPXIoNjgpLlJlcG9ydGVyLGY9cigxKS5CdWZmZXI7byhuLGEpLGUuRGVjb2RlckJ1ZmZlcj1uLG4ucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oKXtyZXR1cm57b2Zmc2V0OnRoaXMub2Zmc2V0LHJlcG9ydGVyOmEucHJvdG90eXBlLnNhdmUuY2FsbCh0aGlzKX19LG4ucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG4odGhpcy5iYXNlKTtyZXR1cm4gZS5vZmZzZXQ9dC5vZmZzZXQsZS5sZW5ndGg9dGhpcy5vZmZzZXQsdGhpcy5vZmZzZXQ9dC5vZmZzZXQsYS5wcm90b3R5cGUucmVzdG9yZS5jYWxsKHRoaXMsdC5yZXBvcnRlciksZX0sbi5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9mZnNldD09PXRoaXMubGVuZ3RofSxuLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub2Zmc2V0KzE8PXRoaXMubGVuZ3RoP3RoaXMuYmFzZS5yZWFkVUludDgodGhpcy5vZmZzZXQrKywhMCk6dGhpcy5lcnJvcih0fHxcIkRlY29kZXJCdWZmZXIgb3ZlcnJ1blwiKX0sbi5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcy5vZmZzZXQrdDw9dGhpcy5sZW5ndGgpKXJldHVybiB0aGlzLmVycm9yKGV8fFwiRGVjb2RlckJ1ZmZlciBvdmVycnVuXCIpO3ZhciByPW5ldyBuKHRoaXMuYmFzZSk7cmV0dXJuIHIuX3JlcG9ydGVyU3RhdGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZSxyLm9mZnNldD10aGlzLm9mZnNldCxyLmxlbmd0aD10aGlzLm9mZnNldCt0LHRoaXMub2Zmc2V0Kz10LHJ9LG4ucHJvdG90eXBlLnJhdz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5iYXNlLnNsaWNlKHQ/dC5vZmZzZXQ6dGhpcy5vZmZzZXQsdGhpcy5sZW5ndGgpfSxlLkVuY29kZXJCdWZmZXI9aSxpLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR8fCh0PW5ldyBmKHRoaXMubGVuZ3RoKSksZXx8KGU9MCksMD09PXRoaXMubGVuZ3RoP3Q6KEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSk/dGhpcy52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3Iuam9pbih0LGUpLGUrPXIubGVuZ3RofSk6KFwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLnZhbHVlP3RbZV09dGhpcy52YWx1ZTpcInN0cmluZ1wiPT10eXBlb2YgdGhpcy52YWx1ZT90LndyaXRlKHRoaXMudmFsdWUsZSk6Zi5pc0J1ZmZlcih0aGlzLnZhbHVlKSYmdGhpcy52YWx1ZS5jb3B5KHQsZSksZSs9dGhpcy5sZW5ndGgpLHQpfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPWU7bi5fcmV2ZXJzZT1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihyKXsoMHxyKT09ciYmKHJ8PTApO3ZhciBuPXRbcl07ZVtuXT1yfSksZX0sbi5kZXI9cig1MzMpfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXt0aGlzLmVuYz1cImRlclwiLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5lbnRpdHk9dCx0aGlzLnRyZWU9bmV3IGksdGhpcy50cmVlLl9pbml0KHQuYm9keSl9ZnVuY3Rpb24gaSh0KXt1Lk5vZGUuY2FsbCh0aGlzLFwiZGVyXCIsdCl9ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXQucmVhZFVJbnQ4KGUpO2lmKHQuaXNFcnJvcihyKSlyZXR1cm4gcjt2YXIgbj1jLnRhZ0NsYXNzW3I+PjZdLGk9MD09PSgzMiZyKTtpZigzMT09PSgzMSZyKSl7dmFyIG89cjtmb3Iocj0wOzEyOD09PSgxMjgmbyk7KXtpZihvPXQucmVhZFVJbnQ4KGUpLHQuaXNFcnJvcihvKSlyZXR1cm4gbztyPDw9NyxyfD0xMjcmb319ZWxzZSByJj0zMTt2YXIgYT1jLnRhZ1tyXTtyZXR1cm57Y2xzOm4scHJpbWl0aXZlOmksdGFnOnIsdGFnU3RyOmF9fWZ1bmN0aW9uIGEodCxlLHIpe3ZhciBuPXQucmVhZFVJbnQ4KHIpO2lmKHQuaXNFcnJvcihuKSlyZXR1cm4gbjtpZighZSYmMTI4PT09bilyZXR1cm4gbnVsbDtpZigwPT09KDEyOCZuKSlyZXR1cm4gbjt2YXIgaT0xMjcmbjtpZihpPj00KXJldHVybiB0LmVycm9yKFwibGVuZ3RoIG9jdGVjdCBpcyB0b28gbG9uZ1wiKTtuPTA7Zm9yKHZhciBvPTA7bzxpO28rKyl7bjw8PTg7dmFyIGE9dC5yZWFkVUludDgocik7aWYodC5pc0Vycm9yKGEpKXJldHVybiBhO258PWF9cmV0dXJuIG59dmFyIGY9cigyKSxzPXIoMTAwKSx1PXMuYmFzZSxoPXMuYmlnbnVtLGM9cy5jb25zdGFudHMuZGVyO3QuZXhwb3J0cz1uLG4ucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbih0LGUpe3JldHVybiB0IGluc3RhbmNlb2YgdS5EZWNvZGVyQnVmZmVyfHwodD1uZXcgdS5EZWNvZGVyQnVmZmVyKHQsZSkpLHRoaXMudHJlZS5fZGVjb2RlKHQsZSl9LGYoaSx1Lk5vZGUpLGkucHJvdG90eXBlLl9wZWVrVGFnPWZ1bmN0aW9uKHQsZSxyKXtpZih0LmlzRW1wdHkoKSlyZXR1cm4hMTt2YXIgbj10LnNhdmUoKSxpPW8odCwnRmFpbGVkIHRvIHBlZWsgdGFnOiBcIicrZSsnXCInKTtyZXR1cm4gdC5pc0Vycm9yKGkpP2k6KHQucmVzdG9yZShuKSxpLnRhZz09PWV8fGkudGFnU3RyPT09ZXx8aS50YWdTdHIrXCJvZlwiPT09ZXx8cil9LGkucHJvdG90eXBlLl9kZWNvZGVUYWc9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPW8odCwnRmFpbGVkIHRvIGRlY29kZSB0YWcgb2YgXCInK2UrJ1wiJyk7aWYodC5pc0Vycm9yKG4pKXJldHVybiBuO3ZhciBpPWEodCxuLnByaW1pdGl2ZSwnRmFpbGVkIHRvIGdldCBsZW5ndGggb2YgXCInK2UrJ1wiJyk7aWYodC5pc0Vycm9yKGkpKXJldHVybiBpO2lmKCFyJiZuLnRhZyE9PWUmJm4udGFnU3RyIT09ZSYmbi50YWdTdHIrXCJvZlwiIT09ZSlyZXR1cm4gdC5lcnJvcignRmFpbGVkIHRvIG1hdGNoIHRhZzogXCInK2UrJ1wiJyk7aWYobi5wcmltaXRpdmV8fG51bGwhPT1pKXJldHVybiB0LnNraXAoaSwnRmFpbGVkIHRvIG1hdGNoIGJvZHkgb2Y6IFwiJytlKydcIicpO3ZhciBmPXQuc2F2ZSgpLHM9dGhpcy5fc2tpcFVudGlsRW5kKHQsJ0ZhaWxlZCB0byBza2lwIGluZGVmaW5pdGUgbGVuZ3RoIGJvZHk6IFwiJyt0aGlzLnRhZysnXCInKTtyZXR1cm4gdC5pc0Vycm9yKHMpP3M6KGk9dC5vZmZzZXQtZi5vZmZzZXQsdC5yZXN0b3JlKGYpLHQuc2tpcChpLCdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInK2UrJ1wiJykpfSxpLnByb3RvdHlwZS5fc2tpcFVudGlsRW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKDs7KXt2YXIgcj1vKHQsZSk7aWYodC5pc0Vycm9yKHIpKXJldHVybiByO3ZhciBuPWEodCxyLnByaW1pdGl2ZSxlKTtpZih0LmlzRXJyb3IobikpcmV0dXJuIG47dmFyIGk7aWYoaT1yLnByaW1pdGl2ZXx8bnVsbCE9PW4/dC5za2lwKG4pOnRoaXMuX3NraXBVbnRpbEVuZCh0LGUpLHQuaXNFcnJvcihpKSlyZXR1cm4gaTtpZihcImVuZFwiPT09ci50YWdTdHIpYnJlYWt9fSxpLnByb3RvdHlwZS5fZGVjb2RlTGlzdD1mdW5jdGlvbih0LGUscixuKXtmb3IodmFyIGk9W107IXQuaXNFbXB0eSgpOyl7dmFyIG89dGhpcy5fcGVla1RhZyh0LFwiZW5kXCIpO2lmKHQuaXNFcnJvcihvKSlyZXR1cm4gbzt2YXIgYT1yLmRlY29kZSh0LFwiZGVyXCIsbik7aWYodC5pc0Vycm9yKGEpJiZvKWJyZWFrO2kucHVzaChhKX1yZXR1cm4gaX0saS5wcm90b3R5cGUuX2RlY29kZVN0cj1mdW5jdGlvbih0LGUpe2lmKFwiYml0c3RyXCI9PT1lKXt2YXIgcj10LnJlYWRVSW50OCgpO3JldHVybiB0LmlzRXJyb3Iocik/cjp7dW51c2VkOnIsZGF0YTp0LnJhdygpfX1pZihcImJtcHN0clwiPT09ZSl7dmFyIG49dC5yYXcoKTtpZihuLmxlbmd0aCUyPT09MSlyZXR1cm4gdC5lcnJvcihcIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBibXBzdHIgbGVuZ3RoIG1pc21hdGNoXCIpO2Zvcih2YXIgaT1cIlwiLG89MDtvPG4ubGVuZ3RoLzI7bysrKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUobi5yZWFkVUludDE2QkUoMipvKSk7cmV0dXJuIGl9aWYoXCJudW1zdHJcIj09PWUpe3ZhciBhPXQucmF3KCkudG9TdHJpbmcoXCJhc2NpaVwiKTtyZXR1cm4gdGhpcy5faXNOdW1zdHIoYSk/YTp0LmVycm9yKFwiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzXCIpfWlmKFwib2N0c3RyXCI9PT1lKXJldHVybiB0LnJhdygpO2lmKFwicHJpbnRzdHJcIj09PWUpe3ZhciBmPXQucmF3KCkudG9TdHJpbmcoXCJhc2NpaVwiKTtyZXR1cm4gdGhpcy5faXNQcmludHN0cihmKT9mOnQuZXJyb3IoXCJEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogcHJpbnRzdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVyc1wiKX1yZXR1cm4vc3RyJC8udGVzdChlKT90LnJhdygpLnRvU3RyaW5nKCk6dC5lcnJvcihcIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBcIitlK1wiIHVuc3VwcG9ydGVkXCIpfSxpLnByb3RvdHlwZS5fZGVjb2RlT2JqaWQ9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbixpPVtdLG89MDshdC5pc0VtcHR5KCk7KXt2YXIgYT10LnJlYWRVSW50OCgpO288PD03LG98PTEyNyZhLDA9PT0oMTI4JmEpJiYoaS5wdXNoKG8pLG89MCl9MTI4JmEmJmkucHVzaChvKTt2YXIgZj1pWzBdLzQwfDAscz1pWzBdJTQwO2lmKG49cj9pOltmLHNdLmNvbmNhdChpLnNsaWNlKDEpKSxlKXt2YXIgdT1lW24uam9pbihcIiBcIildO3ZvaWQgMD09PXUmJih1PWVbbi5qb2luKFwiLlwiKV0pLHZvaWQgMCE9PXUmJihuPXUpfXJldHVybiBufSxpLnByb3RvdHlwZS5fZGVjb2RlVGltZT1mdW5jdGlvbih0LGUpe3ZhciByPXQucmF3KCkudG9TdHJpbmcoKTtpZihcImdlbnRpbWVcIj09PWUpdmFyIG49MHxyLnNsaWNlKDAsNCksaT0wfHIuc2xpY2UoNCw2KSxvPTB8ci5zbGljZSg2LDgpLGE9MHxyLnNsaWNlKDgsMTApLGY9MHxyLnNsaWNlKDEwLDEyKSxzPTB8ci5zbGljZSgxMiwxNCk7ZWxzZXtpZihcInV0Y3RpbWVcIiE9PWUpcmV0dXJuIHQuZXJyb3IoXCJEZWNvZGluZyBcIitlK1wiIHRpbWUgaXMgbm90IHN1cHBvcnRlZCB5ZXRcIik7dmFyIG49MHxyLnNsaWNlKDAsMiksaT0wfHIuc2xpY2UoMiw0KSxvPTB8ci5zbGljZSg0LDYpLGE9MHxyLnNsaWNlKDYsOCksZj0wfHIuc2xpY2UoOCwxMCkscz0wfHIuc2xpY2UoMTAsMTIpO249bjw3MD8yZTMrbjoxOTAwK259cmV0dXJuIERhdGUuVVRDKG4saS0xLG8sYSxmLHMsMCl9LGkucHJvdG90eXBlLl9kZWNvZGVOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSxpLnByb3RvdHlwZS5fZGVjb2RlQm9vbD1mdW5jdGlvbih0KXt2YXIgZT10LnJlYWRVSW50OCgpO3JldHVybiB0LmlzRXJyb3IoZSk/ZTowIT09ZX0saS5wcm90b3R5cGUuX2RlY29kZUludD1mdW5jdGlvbih0LGUpe3ZhciByPXQucmF3KCksbj1uZXcgaChyKTtyZXR1cm4gZSYmKG49ZVtuLnRvU3RyaW5nKDEwKV18fG4pLG59LGkucHJvdG90eXBlLl91c2U9ZnVuY3Rpb24odCxlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYodD10KGUpKSx0Ll9nZXREZWNvZGVyKFwiZGVyXCIpLnRyZWV9fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXt0aGlzLmVuYz1cImRlclwiLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5lbnRpdHk9dCx0aGlzLnRyZWU9bmV3IGksdGhpcy50cmVlLl9pbml0KHQuYm9keSl9ZnVuY3Rpb24gaSh0KXtoLk5vZGUuY2FsbCh0aGlzLFwiZGVyXCIsdCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdDwxMD9cIjBcIit0OnR9ZnVuY3Rpb24gYSh0LGUscixuKXt2YXIgaTtpZihcInNlcW9mXCI9PT10P3Q9XCJzZXFcIjpcInNldG9mXCI9PT10JiYodD1cInNldFwiKSxjLnRhZ0J5TmFtZS5oYXNPd25Qcm9wZXJ0eSh0KSlpPWMudGFnQnlOYW1lW3RdO2Vsc2V7aWYoXCJudW1iZXJcIiE9dHlwZW9mIHR8fCgwfHQpIT09dClyZXR1cm4gbi5lcnJvcihcIlVua25vd24gdGFnOiBcIit0KTtpPXR9cmV0dXJuIGk+PTMxP24uZXJyb3IoXCJNdWx0aS1vY3RldCB0YWcgZW5jb2RpbmcgdW5zdXBwb3J0ZWRcIik6KGV8fChpfD0zMiksaXw9Yy50YWdDbGFzc0J5TmFtZVtyfHxcInVuaXZlcnNhbFwiXTw8Nil9dmFyIGY9cigyKSxzPXIoMSkuQnVmZmVyLHU9cigxMDApLGg9dS5iYXNlLGM9dS5jb25zdGFudHMuZGVyO3QuZXhwb3J0cz1uLG4ucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRyZWUuX2VuY29kZSh0LGUpLmpvaW4oKX0sZihpLGguTm9kZSksaS5wcm90b3R5cGUuX2VuY29kZUNvbXBvc2l0ZT1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1hKHQsZSxyLHRoaXMucmVwb3J0ZXIpO2lmKG4ubGVuZ3RoPDEyOCl7dmFyIG89bmV3IHMoMik7cmV0dXJuIG9bMF09aSxvWzFdPW4ubGVuZ3RoLHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoW28sbl0pfWZvcih2YXIgZj0xLHU9bi5sZW5ndGg7dT49MjU2O3U+Pj04KWYrKzt2YXIgbz1uZXcgcygyK2YpO29bMF09aSxvWzFdPTEyOHxmO2Zvcih2YXIgdT0xK2YsaD1uLmxlbmd0aDtoPjA7dS0tLGg+Pj04KW9bdV09MjU1Jmg7cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoW28sbl0pfSxpLnByb3RvdHlwZS5fZW5jb2RlU3RyPWZ1bmN0aW9uKHQsZSl7aWYoXCJiaXRzdHJcIj09PWUpcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWzB8dC51bnVzZWQsdC5kYXRhXSk7aWYoXCJibXBzdHJcIj09PWUpe2Zvcih2YXIgcj1uZXcgcygyKnQubGVuZ3RoKSxuPTA7bjx0Lmxlbmd0aDtuKyspci53cml0ZVVJbnQxNkJFKHQuY2hhckNvZGVBdChuKSwyKm4pO3JldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHIpfXJldHVyblwibnVtc3RyXCI9PT1lP3RoaXMuX2lzTnVtc3RyKHQpP3RoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk6dGhpcy5yZXBvcnRlci5lcnJvcihcIkVuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBudW1zdHIgc3VwcG9ydHMgb25seSBkaWdpdHMgYW5kIHNwYWNlXCIpOlwicHJpbnRzdHJcIj09PWU/dGhpcy5faXNQcmludHN0cih0KT90aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpOnRoaXMucmVwb3J0ZXIuZXJyb3IoXCJFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogcHJpbnRzdHIgc3VwcG9ydHMgb25seSBsYXRpbiB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzLCBkaWdpdHMsIHNwYWNlLCBhcG9zdHJvcGhlLCBsZWZ0IGFuZCByaWd0aCBwYXJlbnRoZXNpcywgcGx1cyBzaWduLCBjb21tYSwgaHlwaGVuLCBkb3QsIHNsYXNoLCBjb2xvbiwgZXF1YWwgc2lnbiwgcXVlc3Rpb24gbWFya1wiKTovc3RyJC8udGVzdChlKT90aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpOnRoaXMucmVwb3J0ZXIuZXJyb3IoXCJFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogXCIrZStcIiB1bnN1cHBvcnRlZFwiKX0saS5wcm90b3R5cGUuX2VuY29kZU9iamlkPWZ1bmN0aW9uKHQsZSxyKXtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7aWYoIWUpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoXCJzdHJpbmcgb2JqaWQgZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIGZvdW5kXCIpO2lmKCFlLmhhc093blByb3BlcnR5KHQpKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKFwib2JqaWQgbm90IGZvdW5kIGluIHZhbHVlcyBtYXBcIik7dD1lW3RdLnNwbGl0KC9bXFxzXFwuXSsvZyk7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXXw9MH1lbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3Q9dC5zbGljZSgpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl18PTB9aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoXCJvYmppZCgpIHNob3VsZCBiZSBlaXRoZXIgYXJyYXkgb3Igc3RyaW5nLCBnb3Q6IFwiK0pTT04uc3RyaW5naWZ5KHQpKTtpZighcil7aWYodFsxXT49NDApcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoXCJTZWNvbmQgb2JqaWQgaWRlbnRpZmllciBPT0JcIik7dC5zcGxpY2UoMCwyLDQwKnRbMF0rdFsxXSl9Zm9yKHZhciBpPTAsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgbz10W25dO2ZvcihpKys7bz49MTI4O28+Pj03KWkrK31mb3IodmFyIGE9bmV3IHMoaSksZj1hLmxlbmd0aC0xLG49dC5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIG89dFtuXTtmb3IoYVtmLS1dPTEyNyZvOyhvPj49Nyk+MDspYVtmLS1dPTEyOHwxMjcmb31yZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihhKX0saS5wcm90b3R5cGUuX2VuY29kZVRpbWU9ZnVuY3Rpb24odCxlKXt2YXIgcixuPW5ldyBEYXRlKHQpO3JldHVyblwiZ2VudGltZVwiPT09ZT9yPVtvKG4uZ2V0RnVsbFllYXIoKSksbyhuLmdldFVUQ01vbnRoKCkrMSksbyhuLmdldFVUQ0RhdGUoKSksbyhuLmdldFVUQ0hvdXJzKCkpLG8obi5nZXRVVENNaW51dGVzKCkpLG8obi5nZXRVVENTZWNvbmRzKCkpLFwiWlwiXS5qb2luKFwiXCIpOlwidXRjdGltZVwiPT09ZT9yPVtvKG4uZ2V0RnVsbFllYXIoKSUxMDApLG8obi5nZXRVVENNb250aCgpKzEpLG8obi5nZXRVVENEYXRlKCkpLG8obi5nZXRVVENIb3VycygpKSxvKG4uZ2V0VVRDTWludXRlcygpKSxvKG4uZ2V0VVRDU2Vjb25kcygpKSxcIlpcIl0uam9pbihcIlwiKTp0aGlzLnJlcG9ydGVyLmVycm9yKFwiRW5jb2RpbmcgXCIrZStcIiB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQgeWV0XCIpLHRoaXMuX2VuY29kZVN0cihyLFwib2N0c3RyXCIpfSxpLnByb3RvdHlwZS5fZW5jb2RlTnVsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFwiXCIpfSxpLnByb3RvdHlwZS5fZW5jb2RlSW50PWZ1bmN0aW9uKHQsZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2lmKCFlKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKFwiU3RyaW5nIGludCBvciBlbnVtIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcFwiKTtpZighZS5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcihcIlZhbHVlcyBtYXAgZG9lc24ndCBjb250YWluOiBcIitKU09OLnN0cmluZ2lmeSh0KSk7dD1lW3RdfWlmKFwibnVtYmVyXCIhPXR5cGVvZiB0JiYhcy5pc0J1ZmZlcih0KSl7dmFyIHI9dC50b0FycmF5KCk7IXQuc2lnbiYmMTI4JnJbMF0mJnIudW5zaGlmdCgwKSx0PW5ldyBzKHIpfWlmKHMuaXNCdWZmZXIodCkpe3ZhciBuPXQubGVuZ3RoOzA9PT10Lmxlbmd0aCYmbisrO3ZhciBpPW5ldyBzKG4pO3JldHVybiB0LmNvcHkoaSksMD09PXQubGVuZ3RoJiYoaVswXT0wKSx0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGkpfWlmKHQ8MTI4KXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpO2lmKHQ8MjU2KXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLHRdKTtmb3IodmFyIG49MSxvPXQ7bz49MjU2O28+Pj04KW4rKztmb3IodmFyIGk9bmV3IEFycmF5KG4pLG89aS5sZW5ndGgtMTtvPj0wO28tLSlpW29dPTI1NSZ0LHQ+Pj04O3JldHVybiAxMjgmaVswXSYmaS51bnNoaWZ0KDApLHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIobmV3IHMoaSkpfSxpLnByb3RvdHlwZS5fZW5jb2RlQm9vbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih0PzI1NTowKX0saS5wcm90b3R5cGUuX3VzZT1mdW5jdGlvbih0LGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJih0PXQoZSkpLHQuX2dldEVuY29kZXIoXCJkZXJcIikudHJlZX0saS5wcm90b3R5cGUuX3NraXBEZWZhdWx0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09aS5kZWZhdWx0KXJldHVybiExO3ZhciBvPXQuam9pbigpO2lmKHZvaWQgMD09PWkuZGVmYXVsdEJ1ZmZlciYmKGkuZGVmYXVsdEJ1ZmZlcj10aGlzLl9lbmNvZGVWYWx1ZShpLmRlZmF1bHQsZSxyKS5qb2luKCkpLG8ubGVuZ3RoIT09aS5kZWZhdWx0QnVmZmVyLmxlbmd0aClyZXR1cm4hMTtmb3Iobj0wO248by5sZW5ndGg7bisrKWlmKG9bbl0hPT1pLmRlZmF1bHRCdWZmZXJbbl0pcmV0dXJuITE7cmV0dXJuITB9fSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxyLGksZil7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpcmV0dXJuIG5ldyBuKHQscixpKTthLmNhbGwodGhpcyksdGhpcy5fZmluSUQ9ZS5jb25jYXQoW2ksbmV3IGUoWzAsMCwwLDFdKV0pLGk9ZS5jb25jYXQoW2ksbmV3IGUoWzAsMCwwLDJdKV0pLHRoaXMuX2NpcGhlcj1uZXcgby5BRVMociksdGhpcy5fcHJldj1uZXcgZShpLmxlbmd0aCksdGhpcy5fY2FjaGU9bmV3IGUoXCJcIiksdGhpcy5fc2VjQ2FjaGU9bmV3IGUoXCJcIiksdGhpcy5fZGVjcnlwdD1mLHRoaXMuX2FsZW49MCx0aGlzLl9sZW49MCxpLmNvcHkodGhpcy5fcHJldiksdGhpcy5fbW9kZT10O3ZhciB1PW5ldyBlKDQpO3UuZmlsbCgwKSx0aGlzLl9naGFzaD1uZXcgcyh0aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHUpKSx0aGlzLl9hdXRoVGFnPW51bGwsdGhpcy5fY2FsbGVkPSExfWZ1bmN0aW9uIGkodCxlKXt2YXIgcj0wO3QubGVuZ3RoIT09ZS5sZW5ndGgmJnIrKztmb3IodmFyIG49TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpLGk9LTE7KytpPG47KXIrPXRbaV1eZVtpXTtyZXR1cm4gcn12YXIgbz1yKDEwMSksYT1yKDEwMyksZj1yKDIpLHM9cig1NDEpLHU9cig2OSk7ZihuLGEpLHQuZXhwb3J0cz1uLG4ucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7aWYoIXRoaXMuX2NhbGxlZCYmdGhpcy5fYWxlbil7dmFyIHI9MTYtdGhpcy5fYWxlbiUxNjtyPDE2JiYocj1uZXcgZShyKSxyLmZpbGwoMCksdGhpcy5fZ2hhc2gudXBkYXRlKHIpKX10aGlzLl9jYWxsZWQ9ITA7dmFyIG49dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsdCk7cmV0dXJuIHRoaXMuX2RlY3J5cHQ/dGhpcy5fZ2hhc2gudXBkYXRlKHQpOnRoaXMuX2doYXNoLnVwZGF0ZShuKSx0aGlzLl9sZW4rPXQubGVuZ3RoLG59LG4ucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe2lmKHRoaXMuX2RlY3J5cHQmJiF0aGlzLl9hdXRoVGFnKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YVwiKTt2YXIgdD11KHRoaXMuX2doYXNoLmZpbmFsKDgqdGhpcy5fYWxlbiw4KnRoaXMuX2xlbiksdGhpcy5fY2lwaGVyLmVuY3J5cHRCbG9jayh0aGlzLl9maW5JRCkpO2lmKHRoaXMuX2RlY3J5cHQpe2lmKGkodCx0aGlzLl9hdXRoVGFnKSl0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBzdGF0ZSBvciB1bmFibGUgdG8gYXV0aGVudGljYXRlIGRhdGFcIil9ZWxzZSB0aGlzLl9hdXRoVGFnPXQ7dGhpcy5fY2lwaGVyLnNjcnViKCl9LG4ucHJvdG90eXBlLmdldEF1dGhUYWc9ZnVuY3Rpb24oKXtpZighdGhpcy5fZGVjcnlwdCYmZS5pc0J1ZmZlcih0aGlzLl9hdXRoVGFnKSlyZXR1cm4gdGhpcy5fYXV0aFRhZzt0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0aW5nIHRvIGdldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKX0sbi5wcm90b3R5cGUuc2V0QXV0aFRhZz1mdW5jdGlvbih0KXtpZighdGhpcy5fZGVjcnlwdCl0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0aW5nIHRvIHNldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKTt0aGlzLl9hdXRoVGFnPXR9LG4ucHJvdG90eXBlLnNldEFBRD1mdW5jdGlvbih0KXtpZih0aGlzLl9jYWxsZWQpdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGluZyB0byBzZXQgQUFEIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpO3RoaXMuX2doYXNoLnVwZGF0ZSh0KSx0aGlzLl9hbGVuKz10Lmxlbmd0aH19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbigpe3JldHVybiBPYmplY3Qua2V5cyhhKX12YXIgaT1yKDU0MCk7ZS5jcmVhdGVDaXBoZXI9ZS5DaXBoZXI9aS5jcmVhdGVDaXBoZXIsZS5jcmVhdGVDaXBoZXJpdj1lLkNpcGhlcml2PWkuY3JlYXRlQ2lwaGVyaXY7dmFyIG89cig1MzkpO2UuY3JlYXRlRGVjaXBoZXI9ZS5EZWNpcGhlcj1vLmNyZWF0ZURlY2lwaGVyLGUuY3JlYXRlRGVjaXBoZXJpdj1lLkRlY2lwaGVyaXY9by5jcmVhdGVEZWNpcGhlcml2O3ZhciBhPXIoMTQ3KTtlLmxpc3RDaXBoZXJzPWUuZ2V0Q2lwaGVycz1ufSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2OSk7ZS5lbmNyeXB0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9bihlLHQuX3ByZXYpO3JldHVybiB0Ll9wcmV2PXQuX2NpcGhlci5lbmNyeXB0QmxvY2sociksdC5fcHJldn0sZS5kZWNyeXB0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fcHJldjt0Ll9wcmV2PWU7dmFyIGk9dC5fY2lwaGVyLmRlY3J5cHRCbG9jayhlKTtyZXR1cm4gbihpLHIpfX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUscixuKXt2YXIgbz1yLmxlbmd0aCxhPWkocixlLl9jYWNoZSk7cmV0dXJuIGUuX2NhY2hlPWUuX2NhY2hlLnNsaWNlKG8pLGUuX3ByZXY9dC5jb25jYXQoW2UuX3ByZXYsbj9yOmFdKSxhfXZhciBpPXIoNjkpO2UuZW5jcnlwdD1mdW5jdGlvbihlLHIsaSl7Zm9yKHZhciBvLGE9bmV3IHQoXCJcIik7ci5sZW5ndGg7KXtpZigwPT09ZS5fY2FjaGUubGVuZ3RoJiYoZS5fY2FjaGU9ZS5fY2lwaGVyLmVuY3J5cHRCbG9jayhlLl9wcmV2KSxlLl9wcmV2PW5ldyB0KFwiXCIpKSwhKGUuX2NhY2hlLmxlbmd0aDw9ci5sZW5ndGgpKXthPXQuY29uY2F0KFthLG4oZSxyLGkpXSk7YnJlYWt9bz1lLl9jYWNoZS5sZW5ndGgsYT10LmNvbmNhdChbYSxuKGUsci5zbGljZSgwLG8pLGkpXSkscj1yLnNsaWNlKG8pfXJldHVybiBhfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gcih0LGUscil7Zm9yKHZhciBpLG8sYSxmPS0xLHM9OCx1PTA7KytmPHM7KWk9dC5fY2lwaGVyLmVuY3J5cHRCbG9jayh0Ll9wcmV2KSxvPWUmMTw8Ny1mPzEyODowLGE9aVswXV5vLHUrPSgxMjgmYSk+PmYlOCx0Ll9wcmV2PW4odC5fcHJldixyP286YSk7cmV0dXJuIHV9ZnVuY3Rpb24gbihlLHIpe3ZhciBuPWUubGVuZ3RoLGk9LTEsbz1uZXcgdChlLmxlbmd0aCk7Zm9yKGU9dC5jb25jYXQoW2UsbmV3IHQoW3JdKV0pOysraTxuOylvW2ldPWVbaV08PDF8ZVtpKzFdPj43O3JldHVybiBvfWUuZW5jcnlwdD1mdW5jdGlvbihlLG4saSl7Zm9yKHZhciBvPW4ubGVuZ3RoLGE9bmV3IHQobyksZj0tMTsrK2Y8bzspYVtmXT1yKGUsbltmXSxpKTtyZXR1cm4gYX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoZSxyLG4pe3ZhciBpPWUuX2NpcGhlci5lbmNyeXB0QmxvY2soZS5fcHJldiksbz1pWzBdXnI7cmV0dXJuIGUuX3ByZXY9dC5jb25jYXQoW2UuX3ByZXYuc2xpY2UoMSksbmV3IHQoW24/cjpvXSldKSxvfWUuZW5jcnlwdD1mdW5jdGlvbihlLG4saSl7Zm9yKHZhciBvPW4ubGVuZ3RoLGE9bmV3IHQobyksZj0tMTsrK2Y8bzspYVtmXT1yKGUsbltmXSxpKTtyZXR1cm4gYX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUpe2UuZW5jcnlwdD1mdW5jdGlvbih0LGUpe3JldHVybiB0Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKGUpfSxlLmRlY3J5cHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fY2lwaGVyLmRlY3J5cHRCbG9jayhlKX19LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5fcHJldj10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpLHQuX3ByZXZ9dmFyIGk9cig2OSk7ZS5lbmNyeXB0PWZ1bmN0aW9uKGUscil7Zm9yKDtlLl9jYWNoZS5sZW5ndGg8ci5sZW5ndGg7KWUuX2NhY2hlPXQuY29uY2F0KFtlLl9jYWNoZSxuKGUpXSk7dmFyIG89ZS5fY2FjaGUuc2xpY2UoMCxyLmxlbmd0aCk7cmV0dXJuIGUuX2NhY2hlPWUuX2NhY2hlLnNsaWNlKHIubGVuZ3RoKSxpKHIsbyl9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQscixhLGYpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj8oby5jYWxsKHRoaXMpLHRoaXMuX2NpcGhlcj1uZXcgaS5BRVMociksdGhpcy5fcHJldj1uZXcgZShhLmxlbmd0aCksdGhpcy5fY2FjaGU9bmV3IGUoXCJcIiksdGhpcy5fc2VjQ2FjaGU9bmV3IGUoXCJcIiksdGhpcy5fZGVjcnlwdD1mLGEuY29weSh0aGlzLl9wcmV2KSx2b2lkKHRoaXMuX21vZGU9dCkpOm5ldyBuKHQscixhKX12YXIgaT1yKDEwMSksbz1yKDEwMyksYT1yKDIpO2EobixvKSx0LmV4cG9ydHM9bixuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcyx0LHRoaXMuX2RlY3J5cHQpfSxuLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXt0aGlzLl9jaXBoZXIuc2NydWIoKX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmluaXQoKSx0aGlzLl93PWwsYy5jYWxsKHRoaXMsNjQsNTYpfWZ1bmN0aW9uIGkodCxlLHIpe3JldHVybiByXnQmKGVecil9ZnVuY3Rpb24gbyh0LGUscil7cmV0dXJuIHQmZXxyJih0fGUpfWZ1bmN0aW9uIGEodCl7cmV0dXJuKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKX1mdW5jdGlvbiBmKHQpe3JldHVybih0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KX1mdW5jdGlvbiBzKHQpe3JldHVybih0Pj4+N3x0PDwyNSleKHQ+Pj4xOHx0PDwxNCledD4+PjN9ZnVuY3Rpb24gdSh0KXtyZXR1cm4odD4+PjE3fHQ8PDE1KV4odD4+PjE5fHQ8PDEzKV50Pj4+MTB9dmFyIGg9cigyKSxjPXIoNjApLGQ9WzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0sbD1uZXcgQXJyYXkoNjQpO2gobixjKSxuLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2E9MTc3OTAzMzcwMyx0aGlzLl9iPTMxNDQxMzQyNzcsdGhpcy5fYz0xMDEzOTA0MjQyLHRoaXMuX2Q9Mjc3MzQ4MDc2Mix0aGlzLl9lPTEzNTk4OTMxMTksdGhpcy5fZj0yNjAwODIyOTI0LHRoaXMuX2c9NTI4NzM0NjM1LHRoaXMuX2g9MTU0MTQ1OTIyNSx0aGlzfSxuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl93LHI9MHx0aGlzLl9hLG49MHx0aGlzLl9iLGg9MHx0aGlzLl9jLGM9MHx0aGlzLl9kLGw9MHx0aGlzLl9lLHA9MHx0aGlzLl9mLGI9MHx0aGlzLl9nLHY9MHx0aGlzLl9oLHk9MDt5PDE2OysreSllW3ldPXQucmVhZEludDMyQkUoNCp5KTtmb3IoO3k8NjQ7Kyt5KWVbeV09dShlW3ktMl0pK2VbeS03XStzKGVbeS0xNV0pK2VbeS0xNl18MDtmb3IodmFyIG09MDttPDY0OysrbSl7dmFyIGc9ditmKGwpK2kobCxwLGIpK2RbbV0rZVttXXwwLHc9YShyKStvKHIsbixoKXwwO3Y9YixiPXAscD1sLGw9YytnfDAsYz1oLGg9bixuPXIscj1nK3d8MH10aGlzLl9hPXIrdGhpcy5fYXwwLHRoaXMuX2I9bit0aGlzLl9ifDAsdGhpcy5fYz1oK3RoaXMuX2N8MCx0aGlzLl9kPWMrdGhpcy5fZHwwLHRoaXMuX2U9bCt0aGlzLl9lfDAsdGhpcy5fZj1wK3RoaXMuX2Z8MCx0aGlzLl9nPWIrdGhpcy5fZ3wwLHRoaXMuX2g9dit0aGlzLl9ofDB9LG4ucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGUoMzIpO3JldHVybiB0LndyaXRlSW50MzJCRSh0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKHRoaXMuX2IsNCksdC53cml0ZUludDMyQkUodGhpcy5fYyw4KSx0LndyaXRlSW50MzJCRSh0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSh0aGlzLl9lLDE2KSx0LndyaXRlSW50MzJCRSh0aGlzLl9mLDIwKSx0LndyaXRlSW50MzJCRSh0aGlzLl9nLDI0KSx0LndyaXRlSW50MzJCRSh0aGlzLl9oLDI4KSx0fSx0LmV4cG9ydHM9bn0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3RoaXMuaW5pdCgpLHRoaXMuX3c9dixwLmNhbGwodGhpcywxMjgsMTEyKX1mdW5jdGlvbiBpKHQsZSxyKXtyZXR1cm4gcl50JihlXnIpfWZ1bmN0aW9uIG8odCxlLHIpe3JldHVybiB0JmV8ciYodHxlKX1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuKHQ+Pj4yOHxlPDw0KV4oZT4+PjJ8dDw8MzApXihlPj4+N3x0PDwyNSl9ZnVuY3Rpb24gZih0LGUpe3JldHVybih0Pj4+MTR8ZTw8MTgpXih0Pj4+MTh8ZTw8MTQpXihlPj4+OXx0PDwyMyl9ZnVuY3Rpb24gcyh0LGUpe3JldHVybih0Pj4+MXxlPDwzMSleKHQ+Pj44fGU8PDI0KV50Pj4+N31mdW5jdGlvbiB1KHQsZSl7cmV0dXJuKHQ+Pj4xfGU8PDMxKV4odD4+Pjh8ZTw8MjQpXih0Pj4+N3xlPDwyNSl9ZnVuY3Rpb24gaCh0LGUpe3JldHVybih0Pj4+MTl8ZTw8MTMpXihlPj4+Mjl8dDw8MyledD4+PjZ9ZnVuY3Rpb24gYyh0LGUpe3JldHVybih0Pj4+MTl8ZTw8MTMpXihlPj4+Mjl8dDw8MyleKHQ+Pj42fGU8PDI2KX1mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIHQ+Pj4wPGU+Pj4wPzE6MH12YXIgbD1yKDIpLHA9cig2MCksYj1bMTExNjM1MjQwOCwzNjA5NzY3NDU4LDE4OTk0NDc0NDEsNjAyODkxNzI1LDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSwzOTIxMDA5NTczLDIxNzMyOTU1NDgsOTYxOTg3MTYzLDQwODE2Mjg0NzIsMTUwODk3MDk5MywzMDUzODM0MjY1LDI0NTM2MzU3NDgsMjkzNzY3MTU3OSwyODcwNzYzMjIxLDM2NjQ2MDk1NjAsMzYyNDM4MTA4MCwyNzM0ODgzMzk0LDMxMDU5ODQwMSwxMTY0OTk2NTQyLDYwNzIyNTI3OCwxMzIzNjEwNzY0LDE0MjY4ODE5ODcsMzU5MDMwNDk5NCwxOTI1MDc4Mzg4LDQwNjgxODIzODMsMjE2MjA3ODIwNiw5OTEzMzYxMTMsMjYxNDg4ODEwMyw2MzM4MDMzMTcsMzI0ODIyMjU4MCwzNDc5Nzc0ODY4LDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCw0MDIyMjI0Nzc0LDk0NDcxMTEzOSwyNjQzNDcwNzgsMjM0MTI2Mjc3Myw2MDQ4MDc2MjgsMjAwNzgwMDkzMyw3NzAyNTU5ODMsMTQ5NTk5MDkwMSwxMjQ5MTUwMTIyLDE4NTY0MzEyMzUsMTU1NTA4MTY5MiwzMTc1MjE4MTMyLDE5OTYwNjQ5ODYsMjE5ODk1MDgzNywyNTU0MjIwODgyLDM5OTk3MTkzMzksMjgyMTgzNDM0OSw3NjY3ODQwMTYsMjk1Mjk5NjgwOCwyNTY2NTk0ODc5LDMyMTAzMTM2NzEsMzIwMzMzNzk1NiwzMzM2NTcxODkxLDEwMzQ0NTcwMjYsMzU4NDUyODcxMSwyNDY2OTQ4OTAxLDExMzkyNjk5MywzNzU4MzI2MzgzLDMzODI0MTg5NSwxNjg3MTc5MzYsNjY2MzA3MjA1LDExODgxNzk5NjQsNzczNTI5OTEyLDE1NDYwNDU3MzQsMTI5NDc1NzM3MiwxNTIyODA1NDg1LDEzOTYxODIyOTEsMjY0MzgzMzgyMywxNjk1MTgzNzAwLDIzNDM1MjczOTAsMTk4NjY2MTA1MSwxMDE0NDc3NDgwLDIxNzcwMjYzNTAsMTIwNjc1OTE0MiwyNDU2OTU2MDM3LDM0NDA3NzYyNywyNzMwNDg1OTIxLDEyOTA4NjM0NjAsMjgyMDMwMjQxMSwzMTU4NDU0MjczLDMyNTk3MzA4MDAsMzUwNTk1MjY1NywzMzQ1NzY0NzcxLDEwNjIxNzAwOCwzNTE2MDY1ODE3LDM2MDYwMDgzNDQsMzYwMDM1MjgwNCwxNDMyNzI1Nzc2LDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCwyNzU0MjMzNDQsODUxMTY5NzIwLDQzMDIyNzczNCwzMTAwODIzNzUyLDUwNjk0ODYxNiwxMzYzMjU4MTk1LDY1OTA2MDU1NiwzNzUwNjg1NTkzLDg4Mzk5Nzg3NywzNzg1MDUwMjgwLDk1ODEzOTU3MSwzMzE4MzA3NDI3LDEzMjI4MjIyMTgsMzgxMjcyMzQwMywxNTM3MDAyMDYzLDIwMDMwMzQ5OTUsMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5LDE5NTU1NjIyMjIsMTU3NTk5MDAxMiwyMDI0MTA0ODE1LDExMjU1OTI5MjgsMjIyNzczMDQ1MiwyNzE2OTA0MzA2LDIzNjE4NTI0MjQsNDQyNzc2MDQ0LDI0Mjg0MzY0NzQsNTkzNjk4MzQ0LDI3NTY3MzQxODcsMzczMzExMDI0OSwzMjA0MDMxNDc5LDI5OTkzNTE1NzMsMzMyOTMyNTI5OCwzODE1OTIwNDI3LDMzOTE1Njk2MTQsMzkyODM4MzkwMCwzNTE1MjY3MjcxLDU2NjI4MDcxMSwzOTQwMTg3NjA2LDM0NTQwNjk1MzQsNDExODYzMDI3MSw0MDAwMjM5OTkyLDExNjQxODQ3NCwxOTE0MTM4NTU0LDE3NDI5MjQyMSwyNzMxMDU1MjcwLDI4OTM4MDM1NiwzMjAzOTkzMDA2LDQ2MDM5MzI2OSwzMjA2MjAzMTUsNjg1NDcxNzMzLDU4NzQ5NjgzNiw4NTIxNDI5NzEsMTA4Njc5Mjg1MSwxMDE3MDM2Mjk4LDM2NTU0MzEwMCwxMTI2MDAwNTgwLDI2MTgyOTc2NzYsMTI4ODAzMzQ3MCwzNDA5ODU1MTU4LDE1MDE1MDU5NDgsNDIzNDUwOTg2NiwxNjA3MTY3OTE1LDk4NzE2NzQ2OCwxODE2NDAyMzE2LDEyNDYxODk1OTFdLHY9bmV3IEFycmF5KDE2MCk7bChuLHApLG4ucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWg9MTc3OTAzMzcwMyx0aGlzLl9iaD0zMTQ0MTM0Mjc3LHRoaXMuX2NoPTEwMTM5MDQyNDIsdGhpcy5fZGg9Mjc3MzQ4MDc2Mix0aGlzLl9laD0xMzU5ODkzMTE5LHRoaXMuX2ZoPTI2MDA4MjI5MjQsdGhpcy5fZ2g9NTI4NzM0NjM1LHRoaXMuX2hoPTE1NDE0NTkyMjUsdGhpcy5fYWw9NDA4OTIzNTcyMCx0aGlzLl9ibD0yMjI3ODczNTk1LHRoaXMuX2NsPTQyNzExNzU3MjMsdGhpcy5fZGw9MTU5NTc1MDEyOSx0aGlzLl9lbD0yOTE3NTY1MTM3LHRoaXMuX2ZsPTcyNTUxMTE5OSx0aGlzLl9nbD00MjE1Mzg5NTQ3LHRoaXMuX2hsPTMyNzAzMzIwOSx0aGlzfSxuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl93LHI9MHx0aGlzLl9haCxuPTB8dGhpcy5fYmgsbD0wfHRoaXMuX2NoLHA9MHx0aGlzLl9kaCx2PTB8dGhpcy5fZWgseT0wfHRoaXMuX2ZoLG09MHx0aGlzLl9naCxnPTB8dGhpcy5faGgsdz0wfHRoaXMuX2FsLF89MHx0aGlzLl9ibCxNPTB8dGhpcy5fY2wsUz0wfHRoaXMuX2RsLEU9MHx0aGlzLl9lbCxBPTB8dGhpcy5fZmwsaz0wfHRoaXMuX2dsLHg9MHx0aGlzLl9obCxJPTA7STwzMjtJKz0yKWVbSV09dC5yZWFkSW50MzJCRSg0KkkpLGVbSSsxXT10LnJlYWRJbnQzMkJFKDQqSSs0KTtmb3IoO0k8MTYwO0krPTIpe3ZhciBCPWVbSS0zMF0sTz1lW0ktMzArMV0sUj1zKEIsTyksUD11KE8sQik7XG5CPWVbSS00XSxPPWVbSS00KzFdO3ZhciBUPWgoQixPKSxqPWMoTyxCKSxDPWVbSS0xNF0sTj1lW0ktMTQrMV0sTD1lW0ktMzJdLFU9ZVtJLTMyKzFdLHo9UCtOfDAsRD1SK0MrZCh6LFApfDA7ej16K2p8MCxEPUQrVCtkKHosail8MCx6PXorVXwwLEQ9RCtMK2QoeixVKXwwLGVbSV09RCxlW0krMV09en1mb3IodmFyIHE9MDtxPDE2MDtxKz0yKXtEPWVbcV0sej1lW3ErMV07dmFyIEY9byhyLG4sbCksSz1vKHcsXyxNKSxHPWEocix3KSxWPWEodyxyKSxIPWYodixFKSxYPWYoRSx2KSxZPWJbcV0sVz1iW3ErMV0sWj1pKHYseSxtKSxKPWkoRSxBLGspLCQ9eCtYfDAsUT1nK0grZCgkLHgpfDA7JD0kK0p8MCxRPVErWitkKCQsSil8MCwkPSQrV3wwLFE9UStZK2QoJCxXKXwwLCQ9JCt6fDAsUT1RK0QrZCgkLHopfDA7dmFyIHR0PVYrS3wwLGV0PUcrRitkKHR0LFYpfDA7Zz1tLHg9ayxtPXksaz1BLHk9dixBPUUsRT1TKyR8MCx2PXArUStkKEUsUyl8MCxwPWwsUz1NLGw9bixNPV8sbj1yLF89dyx3PSQrdHR8MCxyPVErZXQrZCh3LCQpfDB9dGhpcy5fYWw9dGhpcy5fYWwrd3wwLHRoaXMuX2JsPXRoaXMuX2JsK198MCx0aGlzLl9jbD10aGlzLl9jbCtNfDAsdGhpcy5fZGw9dGhpcy5fZGwrU3wwLHRoaXMuX2VsPXRoaXMuX2VsK0V8MCx0aGlzLl9mbD10aGlzLl9mbCtBfDAsdGhpcy5fZ2w9dGhpcy5fZ2wra3wwLHRoaXMuX2hsPXRoaXMuX2hsK3h8MCx0aGlzLl9haD10aGlzLl9haCtyK2QodGhpcy5fYWwsdyl8MCx0aGlzLl9iaD10aGlzLl9iaCtuK2QodGhpcy5fYmwsXyl8MCx0aGlzLl9jaD10aGlzLl9jaCtsK2QodGhpcy5fY2wsTSl8MCx0aGlzLl9kaD10aGlzLl9kaCtwK2QodGhpcy5fZGwsUyl8MCx0aGlzLl9laD10aGlzLl9laCt2K2QodGhpcy5fZWwsRSl8MCx0aGlzLl9maD10aGlzLl9maCt5K2QodGhpcy5fZmwsQSl8MCx0aGlzLl9naD10aGlzLl9naCttK2QodGhpcy5fZ2wsayl8MCx0aGlzLl9oaD10aGlzLl9oaCtnK2QodGhpcy5faGwseCl8MH0sbi5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXtyLndyaXRlSW50MzJCRSh0LG4pLHIud3JpdGVJbnQzMkJFKGUsbis0KX12YXIgcj1uZXcgZSg2NCk7cmV0dXJuIHQodGhpcy5fYWgsdGhpcy5fYWwsMCksdCh0aGlzLl9iaCx0aGlzLl9ibCw4KSx0KHRoaXMuX2NoLHRoaXMuX2NsLDE2KSx0KHRoaXMuX2RoLHRoaXMuX2RsLDI0KSx0KHRoaXMuX2VoLHRoaXMuX2VsLDMyKSx0KHRoaXMuX2ZoLHRoaXMuX2ZsLDQwKSx0KHRoaXMuX2doLHRoaXMuX2dsLDQ4KSx0KHRoaXMuX2hoLHRoaXMuX2hsLDU2KSxyfSx0LmV4cG9ydHM9bn0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKCl7aWYobnVsbCE9PWcpcmV0dXJuIGc7dmFyIHQ9MTA0ODU3NixlPVtdO2VbMF09Mjtmb3IodmFyIHI9MSxuPTM7bjx0O24rPTIpe2Zvcih2YXIgaT1NYXRoLmNlaWwoTWF0aC5zcXJ0KG4pKSxvPTA7bzxyJiZlW29dPD1pJiZuJWVbb10hPT0wO28rKyk7ciE9PW8mJmVbb108PWl8fChlW3IrK109bil9cmV0dXJuIGc9ZSxlfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlPW4oKSxyPTA7cjxlLmxlbmd0aDtyKyspaWYoMD09PXQubW9kbihlW3JdKSlyZXR1cm4gMD09PXQuY21wbihlW3JdKTtyZXR1cm4hMH1mdW5jdGlvbiBvKHQpe3ZhciBlPXMubW9udCh0KTtyZXR1cm4gMD09PWwudG9SZWQoZSkucmVkUG93KHQuc3VibigxKSkuZnJvbVJlZCgpLmNtcG4oMSl9ZnVuY3Rpb24gYSh0LGUpe2lmKHQ8MTYpcmV0dXJuIG5ldyBzKDI9PT1lfHw1PT09ZT9bMTQwLDEyM106WzE0MCwzOV0pO2U9bmV3IHMoZSk7Zm9yKHZhciByLG47Oyl7Zm9yKHI9bmV3IHMoZihNYXRoLmNlaWwodC84KSkpO3IuYml0TGVuZ3RoKCk+dDspci5pc2hybigxKTtpZihyLmlzRXZlbigpJiZyLmlhZGQoZCksci50ZXN0bigxKXx8ci5pYWRkKGwpLGUuY21wKGwpKXtpZighZS5jbXAocCkpZm9yKDtyLm1vZChiKS5jbXAodik7KXIuaWFkZChtKX1lbHNlIGZvcig7ci5tb2QodSkuY21wKHkpOylyLmlhZGQobSk7aWYobj1yLnNocm4oMSksaShuKSYmaShyKSYmbyhuKSYmbyhyKSYmYy50ZXN0KG4pJiZjLnRlc3QocikpcmV0dXJuIHJ9fXZhciBmPXIoNjEpO3QuZXhwb3J0cz1hLGEuc2ltcGxlU2lldmU9aSxhLmZlcm1hdFRlc3Q9bzt2YXIgcz1yKDE1MCksdT1uZXcgcygyNCksaD1yKDIzMCksYz1uZXcgaCxkPW5ldyBzKDEpLGw9bmV3IHMoMikscD1uZXcgcyg1KSxiPShuZXcgcygxNiksbmV3IHMoOCksbmV3IHMoMTApKSx2PW5ldyBzKDMpLHk9KG5ldyBzKDcpLG5ldyBzKDExKSksbT1uZXcgcyg0KSxnPShuZXcgcygxMiksbnVsbCl9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3RoaXMucmFuZD10fHxuZXcgby5SYW5kfXZhciBpPXIoMTUwKSxvPXIoNTc1KTt0LmV4cG9ydHM9bixuLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCl9LG4ucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXQuYml0TGVuZ3RoKCkscj10aGlzLnJhbmQuZ2VuZXJhdGUoTWF0aC5jZWlsKGUvOCkpO3JbMF18PTM7dmFyIG49NyZlO3JldHVybiAwIT09biYmKHJbci5sZW5ndGgtMV0+Pj03LW4pLG5ldyBpKHIpfSxuLnByb3RvdHlwZS50ZXN0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10LmJpdExlbmd0aCgpLG89aS5tb250KHQpLGE9bmV3IGkoMSkudG9SZWQobyk7ZXx8KGU9TWF0aC5tYXgoMSxuLzQ4fDApKTtmb3IodmFyIGY9dC5zdWJuKDEpLHM9Zi5zdWJuKDEpLHU9MDshZi50ZXN0bih1KTt1KyspO2Zvcih2YXIgaD10LnNocm4odSksYz1mLnRvUmVkKG8pLGQ9ITA7ZT4wO2UtLSl7dmFyIGw9dGhpcy5fcmFuZChzKTtyJiZyKGwpO3ZhciBwPWwudG9SZWQobykucmVkUG93KGgpO2lmKDAhPT1wLmNtcChhKSYmMCE9PXAuY21wKGMpKXtmb3IodmFyIGI9MTtiPHU7YisrKXtpZihwPXAucmVkU3FyKCksMD09PXAuY21wKGEpKXJldHVybiExO2lmKDA9PT1wLmNtcChjKSlicmVha31pZihiPT09dSlyZXR1cm4hMX19cmV0dXJuIGR9LG4ucHJvdG90eXBlLmdldERpdmlzb3I9ZnVuY3Rpb24odCxlKXt2YXIgcj10LmJpdExlbmd0aCgpLG49aS5tb250KHQpLG89bmV3IGkoMSkudG9SZWQobik7ZXx8KGU9TWF0aC5tYXgoMSxyLzQ4fDApKTtmb3IodmFyIGE9dC5zdWJuKDEpLGY9YS5zdWJuKDEpLHM9MDshYS50ZXN0bihzKTtzKyspO2Zvcih2YXIgdT10LnNocm4ocyksaD1hLnRvUmVkKG4pO2U+MDtlLS0pe3ZhciBjPXRoaXMuX3JhbmQoZiksZD10LmdjZChjKTtpZigwIT09ZC5jbXBuKDEpKXJldHVybiBkO3ZhciBsPWMudG9SZWQobikucmVkUG93KHUpO2lmKDAhPT1sLmNtcChvKSYmMCE9PWwuY21wKGgpKXtmb3IodmFyIHA9MTtwPHM7cCsrKXtpZihsPWwucmVkU3FyKCksMD09PWwuY21wKG8pKXJldHVybiBsLmZyb21SZWQoKS5zdWJuKDEpLmdjZCh0KTtpZigwPT09bC5jbXAoaCkpYnJlYWt9aWYocD09PXMpcmV0dXJuIGw9bC5yZWRTcXIoKSxsLmZyb21SZWQoKS5zdWJuKDEpLmdjZCh0KX19cmV0dXJuITF9fSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7dmFyIHI9bmV3IGUoNCk7cmV0dXJuIHIud3JpdGVVSW50MzJCRSh0LDApLHJ9dmFyIGk9cig1OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7Zm9yKHZhciBvLGE9bmV3IGUoXCJcIiksZj0wO2EubGVuZ3RoPHI7KW89bihmKyspLGE9ZS5jb25jYXQoW2EsaShcInNoYTFcIikudXBkYXRlKHQpLnVwZGF0ZShvKS5kaWdlc3QoKV0pO3JldHVybiBhLnNsaWNlKDAscil9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe3ZhciBlPW8odCkscj1lLnRvUmVkKGEubW9udCh0Lm1vZHVsdXMpKS5yZWRQb3cobmV3IGEodC5wdWJsaWNFeHBvbmVudCkpLmZyb21SZWQoKTtyZXR1cm57YmxpbmRlcjpyLHVuYmxpbmRlcjplLmludm0odC5tb2R1bHVzKX19ZnVuY3Rpb24gaSh0LHIpe3ZhciBpPW4ociksbz1yLm1vZHVsdXMuYnl0ZUxlbmd0aCgpLGY9KGEubW9udChyLm1vZHVsdXMpLG5ldyBhKHQpLm11bChpLmJsaW5kZXIpLnVtb2Qoci5tb2R1bHVzKSkscz1mLnRvUmVkKGEubW9udChyLnByaW1lMSkpLHU9Zi50b1JlZChhLm1vbnQoci5wcmltZTIpKSxoPXIuY29lZmZpY2llbnQsYz1yLnByaW1lMSxkPXIucHJpbWUyLGw9cy5yZWRQb3coci5leHBvbmVudDEpLHA9dS5yZWRQb3coci5leHBvbmVudDIpO2w9bC5mcm9tUmVkKCkscD1wLmZyb21SZWQoKTt2YXIgYj1sLmlzdWIocCkuaW11bChoKS51bW9kKGMpO3JldHVybiBiLmltdWwoZCkscC5pYWRkKGIpLG5ldyBlKHAuaW11bChpLnVuYmxpbmRlcikudW1vZChyLm1vZHVsdXMpLnRvQXJyYXkoITEsbykpfWZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlPXQubW9kdWx1cy5ieXRlTGVuZ3RoKCkscj1uZXcgYShmKGUpKTtyLmNtcCh0Lm1vZHVsdXMpPj0wfHwhci51bW9kKHQucHJpbWUxKXx8IXIudW1vZCh0LnByaW1lMik7KXI9bmV3IGEoZihlKSk7cmV0dXJuIHJ9dmFyIGE9cig3MCksZj1yKDYxKTt0LmV4cG9ydHM9aSxpLmdldHI9b30pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0KXt2YXIgcjtcIm9iamVjdFwiIT10eXBlb2YgdHx8ZS5pc0J1ZmZlcih0KXx8KHI9dC5wYXNzcGhyYXNlLHQ9dC5rZXkpLFwic3RyaW5nXCI9PXR5cGVvZiB0JiYodD1uZXcgZSh0KSk7dmFyIG4sYSxzPWYodCxyKSx1PXMudGFnLGg9cy5kYXRhO3N3aXRjaCh1KXtjYXNlXCJQVUJMSUMgS0VZXCI6c3dpdGNoKGE9by5QdWJsaWNLZXkuZGVjb2RlKGgsXCJkZXJcIiksbj1hLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbihcIi5cIikpe2Nhc2VcIjEuMi44NDAuMTEzNTQ5LjEuMS4xXCI6cmV0dXJuIG8uUlNBUHVibGljS2V5LmRlY29kZShhLnN1YmplY3RQdWJsaWNLZXkuZGF0YSxcImRlclwiKTtjYXNlXCIxLjIuODQwLjEwMDQ1LjIuMVwiOnJldHVybiBhLnN1YmplY3RQcml2YXRlS2V5PWEuc3ViamVjdFB1YmxpY0tleSx7dHlwZTpcImVjXCIsZGF0YTphfTtjYXNlXCIxLjIuODQwLjEwMDQwLjQuMVwiOnJldHVybiBhLmFsZ29yaXRobS5wYXJhbXMucHViX2tleT1vLkRTQXBhcmFtLmRlY29kZShhLnN1YmplY3RQdWJsaWNLZXkuZGF0YSxcImRlclwiKSx7dHlwZTpcImRzYVwiLGRhdGE6YS5hbGdvcml0aG0ucGFyYW1zfTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcInVua25vd24ga2V5IGlkIFwiK24pfXRocm93IG5ldyBFcnJvcihcInVua25vd24ga2V5IHR5cGUgXCIrdSk7Y2FzZVwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCI6aD1vLkVuY3J5cHRlZFByaXZhdGVLZXkuZGVjb2RlKGgsXCJkZXJcIiksaD1pKGgscik7Y2FzZVwiUFJJVkFURSBLRVlcIjpzd2l0Y2goYT1vLlByaXZhdGVLZXkuZGVjb2RlKGgsXCJkZXJcIiksbj1hLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbihcIi5cIikpe2Nhc2VcIjEuMi44NDAuMTEzNTQ5LjEuMS4xXCI6cmV0dXJuIG8uUlNBUHJpdmF0ZUtleS5kZWNvZGUoYS5zdWJqZWN0UHJpdmF0ZUtleSxcImRlclwiKTtjYXNlXCIxLjIuODQwLjEwMDQ1LjIuMVwiOnJldHVybntjdXJ2ZTphLmFsZ29yaXRobS5jdXJ2ZSxwcml2YXRlS2V5Om8uRUNQcml2YXRlS2V5LmRlY29kZShhLnN1YmplY3RQcml2YXRlS2V5LFwiZGVyXCIpLnByaXZhdGVLZXl9O2Nhc2VcIjEuMi44NDAuMTAwNDAuNC4xXCI6cmV0dXJuIGEuYWxnb3JpdGhtLnBhcmFtcy5wcml2X2tleT1vLkRTQXBhcmFtLmRlY29kZShhLnN1YmplY3RQcml2YXRlS2V5LFwiZGVyXCIpLHt0eXBlOlwiZHNhXCIscGFyYW1zOmEuYWxnb3JpdGhtLnBhcmFtc307ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGtleSBpZCBcIituKX10aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGtleSB0eXBlIFwiK3UpO2Nhc2VcIlJTQSBQVUJMSUMgS0VZXCI6cmV0dXJuIG8uUlNBUHVibGljS2V5LmRlY29kZShoLFwiZGVyXCIpO2Nhc2VcIlJTQSBQUklWQVRFIEtFWVwiOnJldHVybiBvLlJTQVByaXZhdGVLZXkuZGVjb2RlKGgsXCJkZXJcIik7Y2FzZVwiRFNBIFBSSVZBVEUgS0VZXCI6cmV0dXJue3R5cGU6XCJkc2FcIixwYXJhbXM6by5EU0FQcml2YXRlS2V5LmRlY29kZShoLFwiZGVyXCIpfTtjYXNlXCJFQyBQUklWQVRFIEtFWVwiOnJldHVybiBoPW8uRUNQcml2YXRlS2V5LmRlY29kZShoLFwiZGVyXCIpLHtjdXJ2ZTpoLnBhcmFtZXRlcnMudmFsdWUscHJpdmF0ZUtleTpoLnByaXZhdGVLZXl9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBrZXkgdHlwZSBcIit1KX19ZnVuY3Rpb24gaSh0LHIpe3ZhciBuPXQuYWxnb3JpdGhtLmRlY3J5cHQua2RlLmtkZXBhcmFtcy5zYWx0LGk9cGFyc2VJbnQodC5hbGdvcml0aG0uZGVjcnlwdC5rZGUua2RlcGFyYW1zLml0ZXJzLnRvU3RyaW5nKCksMTApLG89YVt0LmFsZ29yaXRobS5kZWNyeXB0LmNpcGhlci5hbGdvLmpvaW4oXCIuXCIpXSxmPXQuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLml2LGg9dC5zdWJqZWN0UHJpdmF0ZUtleSxjPXBhcnNlSW50KG8uc3BsaXQoXCItXCIpWzFdLDEwKS84LGQ9dS5wYmtkZjJTeW5jKHIsbixpLGMpLGw9cy5jcmVhdGVEZWNpcGhlcml2KG8sZCxmKSxwPVtdO3JldHVybiBwLnB1c2gobC51cGRhdGUoaCkpLHAucHVzaChsLmZpbmFsKCkpLGUuY29uY2F0KHApfXZhciBvPXIoNTc4KSxhPXIoNDY5KSxmPXIoNTc5KSxzPXIoMjM5KSx1PXIoMTUxKTt0LmV4cG9ydHM9bixuLnNpZ25hdHVyZT1vLnNpZ25hdHVyZX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGEuY2FsbCh0aGlzLGUpLGYuaXNCdWZmZXIodCk/KHRoaXMuYmFzZT10LHRoaXMub2Zmc2V0PTAsdm9pZCh0aGlzLmxlbmd0aD10Lmxlbmd0aCkpOnZvaWQgdGhpcy5lcnJvcihcIklucHV0IG5vdCBCdWZmZXJcIil9ZnVuY3Rpb24gaSh0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhpcy5sZW5ndGg9MCx0aGlzLnZhbHVlPXQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgaXx8KHQ9bmV3IGkodCxlKSksdGhpcy5sZW5ndGgrPXQubGVuZ3RoLHR9LHRoaXMpO2Vsc2UgaWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKCEoMDw9dCYmdDw9MjU1KSlyZXR1cm4gZS5lcnJvcihcIm5vbi1ieXRlIEVuY29kZXJCdWZmZXIgdmFsdWVcIik7dGhpcy52YWx1ZT10LHRoaXMubGVuZ3RoPTF9ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgdCl0aGlzLnZhbHVlPXQsdGhpcy5sZW5ndGg9Zi5ieXRlTGVuZ3RoKHQpO2Vsc2V7aWYoIWYuaXNCdWZmZXIodCkpcmV0dXJuIGUuZXJyb3IoXCJVbnN1cHBvcnRlZCB0eXBlOiBcIit0eXBlb2YgdCk7dGhpcy52YWx1ZT10LHRoaXMubGVuZ3RoPXQubGVuZ3RofX12YXIgbz1yKDIpLGE9cig3MSkuUmVwb3J0ZXIsZj1yKDEpLkJ1ZmZlcjtvKG4sYSksZS5EZWNvZGVyQnVmZmVyPW4sbi5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbigpe3JldHVybntvZmZzZXQ6dGhpcy5vZmZzZXQscmVwb3J0ZXI6YS5wcm90b3R5cGUuc2F2ZS5jYWxsKHRoaXMpfX0sbi5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbih0aGlzLmJhc2UpO3JldHVybiBlLm9mZnNldD10Lm9mZnNldCxlLmxlbmd0aD10aGlzLm9mZnNldCx0aGlzLm9mZnNldD10Lm9mZnNldCxhLnByb3RvdHlwZS5yZXN0b3JlLmNhbGwodGhpcyx0LnJlcG9ydGVyKSxlfSxuLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2Zmc2V0PT09dGhpcy5sZW5ndGh9LG4ucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vZmZzZXQrMTw9dGhpcy5sZW5ndGg/dGhpcy5iYXNlLnJlYWRVSW50OCh0aGlzLm9mZnNldCsrLCEwKTp0aGlzLmVycm9yKHR8fFwiRGVjb2RlckJ1ZmZlciBvdmVycnVuXCIpfSxuLnByb3RvdHlwZS5za2lwPWZ1bmN0aW9uKHQsZSl7aWYoISh0aGlzLm9mZnNldCt0PD10aGlzLmxlbmd0aCkpcmV0dXJuIHRoaXMuZXJyb3IoZXx8XCJEZWNvZGVyQnVmZmVyIG92ZXJydW5cIik7dmFyIHI9bmV3IG4odGhpcy5iYXNlKTtyZXR1cm4gci5fcmVwb3J0ZXJTdGF0ZT10aGlzLl9yZXBvcnRlclN0YXRlLHIub2Zmc2V0PXRoaXMub2Zmc2V0LHIubGVuZ3RoPXRoaXMub2Zmc2V0K3QsdGhpcy5vZmZzZXQrPXQscn0sbi5wcm90b3R5cGUucmF3PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmJhc2Uuc2xpY2UodD90Lm9mZnNldDp0aGlzLm9mZnNldCx0aGlzLmxlbmd0aCl9LGUuRW5jb2RlckJ1ZmZlcj1pLGkucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdHx8KHQ9bmV3IGYodGhpcy5sZW5ndGgpKSxlfHwoZT0wKSwwPT09dGhpcy5sZW5ndGg/dDooQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKT90aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24ocil7ci5qb2luKHQsZSksZSs9ci5sZW5ndGh9KTooXCJudW1iZXJcIj09dHlwZW9mIHRoaXMudmFsdWU/dFtlXT10aGlzLnZhbHVlOlwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLnZhbHVlP3Qud3JpdGUodGhpcy52YWx1ZSxlKTpmLmlzQnVmZmVyKHRoaXMudmFsdWUpJiZ0aGlzLnZhbHVlLmNvcHkodCxlKSxlKz10aGlzLmxlbmd0aCksdCl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49ZTtuLl9yZXZlcnNlPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpeygwfHIpPT1yJiYocnw9MCk7dmFyIG49dFtyXTtlW25dPXJ9KSxlfSxuLmRlcj1yKDU4Myl9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3RoaXMuZW5jPVwiZGVyXCIsdGhpcy5uYW1lPXQubmFtZSx0aGlzLmVudGl0eT10LHRoaXMudHJlZT1uZXcgaSx0aGlzLnRyZWUuX2luaXQodC5ib2R5KX1mdW5jdGlvbiBpKHQpe3UuTm9kZS5jYWxsKHRoaXMsXCJkZXJcIix0KX1mdW5jdGlvbiBvKHQsZSl7dmFyIHI9dC5yZWFkVUludDgoZSk7aWYodC5pc0Vycm9yKHIpKXJldHVybiByO3ZhciBuPWMudGFnQ2xhc3Nbcj4+Nl0saT0wPT09KDMyJnIpO2lmKDMxPT09KDMxJnIpKXt2YXIgbz1yO2ZvcihyPTA7MTI4PT09KDEyOCZvKTspe2lmKG89dC5yZWFkVUludDgoZSksdC5pc0Vycm9yKG8pKXJldHVybiBvO3I8PD03LHJ8PTEyNyZvfX1lbHNlIHImPTMxO3ZhciBhPWMudGFnW3JdO3JldHVybntjbHM6bixwcmltaXRpdmU6aSx0YWc6cix0YWdTdHI6YX19ZnVuY3Rpb24gYSh0LGUscil7dmFyIG49dC5yZWFkVUludDgocik7aWYodC5pc0Vycm9yKG4pKXJldHVybiBuO2lmKCFlJiYxMjg9PT1uKXJldHVybiBudWxsO2lmKDA9PT0oMTI4Jm4pKXJldHVybiBuO3ZhciBpPTEyNyZuO2lmKGk+PTQpcmV0dXJuIHQuZXJyb3IoXCJsZW5ndGggb2N0ZWN0IGlzIHRvbyBsb25nXCIpO249MDtmb3IodmFyIG89MDtvPGk7bysrKXtuPDw9ODt2YXIgYT10LnJlYWRVSW50OChyKTtpZih0LmlzRXJyb3IoYSkpcmV0dXJuIGE7bnw9YX1yZXR1cm4gbn12YXIgZj1yKDIpLHM9cigxMDYpLHU9cy5iYXNlLGg9cy5iaWdudW0sYz1zLmNvbnN0YW50cy5kZXI7dC5leHBvcnRzPW4sbi5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiB1LkRlY29kZXJCdWZmZXJ8fCh0PW5ldyB1LkRlY29kZXJCdWZmZXIodCxlKSksdGhpcy50cmVlLl9kZWNvZGUodCxlKX0sZihpLHUuTm9kZSksaS5wcm90b3R5cGUuX3BlZWtUYWc9ZnVuY3Rpb24odCxlLHIpe2lmKHQuaXNFbXB0eSgpKXJldHVybiExO3ZhciBuPXQuc2F2ZSgpLGk9byh0LCdGYWlsZWQgdG8gcGVlayB0YWc6IFwiJytlKydcIicpO3JldHVybiB0LmlzRXJyb3IoaSk/aToodC5yZXN0b3JlKG4pLGkudGFnPT09ZXx8aS50YWdTdHI9PT1lfHxpLnRhZ1N0citcIm9mXCI9PT1lfHxyKX0saS5wcm90b3R5cGUuX2RlY29kZVRhZz1mdW5jdGlvbih0LGUscil7dmFyIG49byh0LCdGYWlsZWQgdG8gZGVjb2RlIHRhZyBvZiBcIicrZSsnXCInKTtpZih0LmlzRXJyb3IobikpcmV0dXJuIG47dmFyIGk9YSh0LG4ucHJpbWl0aXZlLCdGYWlsZWQgdG8gZ2V0IGxlbmd0aCBvZiBcIicrZSsnXCInKTtpZih0LmlzRXJyb3IoaSkpcmV0dXJuIGk7aWYoIXImJm4udGFnIT09ZSYmbi50YWdTdHIhPT1lJiZuLnRhZ1N0citcIm9mXCIhPT1lKXJldHVybiB0LmVycm9yKCdGYWlsZWQgdG8gbWF0Y2ggdGFnOiBcIicrZSsnXCInKTtpZihuLnByaW1pdGl2ZXx8bnVsbCE9PWkpcmV0dXJuIHQuc2tpcChpLCdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInK2UrJ1wiJyk7dmFyIGY9dC5zYXZlKCkscz10aGlzLl9za2lwVW50aWxFbmQodCwnRmFpbGVkIHRvIHNraXAgaW5kZWZpbml0ZSBsZW5ndGggYm9keTogXCInK3RoaXMudGFnKydcIicpO3JldHVybiB0LmlzRXJyb3Iocyk/czooaT10Lm9mZnNldC1mLm9mZnNldCx0LnJlc3RvcmUoZiksdC5za2lwKGksJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicrZSsnXCInKSl9LGkucHJvdG90eXBlLl9za2lwVW50aWxFbmQ9ZnVuY3Rpb24odCxlKXtmb3IoOzspe3ZhciByPW8odCxlKTtpZih0LmlzRXJyb3IocikpcmV0dXJuIHI7dmFyIG49YSh0LHIucHJpbWl0aXZlLGUpO2lmKHQuaXNFcnJvcihuKSlyZXR1cm4gbjt2YXIgaTtpZihpPXIucHJpbWl0aXZlfHxudWxsIT09bj90LnNraXAobik6dGhpcy5fc2tpcFVudGlsRW5kKHQsZSksdC5pc0Vycm9yKGkpKXJldHVybiBpO2lmKFwiZW5kXCI9PT1yLnRhZ1N0cilicmVha319LGkucHJvdG90eXBlLl9kZWNvZGVMaXN0PWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgaT1bXTshdC5pc0VtcHR5KCk7KXt2YXIgbz10aGlzLl9wZWVrVGFnKHQsXCJlbmRcIik7aWYodC5pc0Vycm9yKG8pKXJldHVybiBvO3ZhciBhPXIuZGVjb2RlKHQsXCJkZXJcIixuKTtpZih0LmlzRXJyb3IoYSkmJm8pYnJlYWs7aS5wdXNoKGEpfXJldHVybiBpfSxpLnByb3RvdHlwZS5fZGVjb2RlU3RyPWZ1bmN0aW9uKHQsZSl7aWYoXCJiaXRzdHJcIj09PWUpe3ZhciByPXQucmVhZFVJbnQ4KCk7cmV0dXJuIHQuaXNFcnJvcihyKT9yOnt1bnVzZWQ6cixkYXRhOnQucmF3KCl9fWlmKFwiYm1wc3RyXCI9PT1lKXt2YXIgbj10LnJhdygpO2lmKG4ubGVuZ3RoJTI9PT0xKXJldHVybiB0LmVycm9yKFwiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IGJtcHN0ciBsZW5ndGggbWlzbWF0Y2hcIik7Zm9yKHZhciBpPVwiXCIsbz0wO288bi5sZW5ndGgvMjtvKyspaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuLnJlYWRVSW50MTZCRSgyKm8pKTtyZXR1cm4gaX1pZihcIm51bXN0clwiPT09ZSl7dmFyIGE9dC5yYXcoKS50b1N0cmluZyhcImFzY2lpXCIpO3JldHVybiB0aGlzLl9pc051bXN0cihhKT9hOnQuZXJyb3IoXCJEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogbnVtc3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnNcIil9aWYoXCJvY3RzdHJcIj09PWUpcmV0dXJuIHQucmF3KCk7aWYoXCJwcmludHN0clwiPT09ZSl7dmFyIGY9dC5yYXcoKS50b1N0cmluZyhcImFzY2lpXCIpO3JldHVybiB0aGlzLl9pc1ByaW50c3RyKGYpP2Y6dC5lcnJvcihcIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBwcmludHN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzXCIpfXJldHVybi9zdHIkLy50ZXN0KGUpP3QucmF3KCkudG9TdHJpbmcoKTp0LmVycm9yKFwiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IFwiK2UrXCIgdW5zdXBwb3J0ZWRcIil9LGkucHJvdG90eXBlLl9kZWNvZGVPYmppZD1mdW5jdGlvbih0LGUscil7Zm9yKHZhciBuLGk9W10sbz0wOyF0LmlzRW1wdHkoKTspe3ZhciBhPXQucmVhZFVJbnQ4KCk7bzw8PTcsb3w9MTI3JmEsMD09PSgxMjgmYSkmJihpLnB1c2gobyksbz0wKX0xMjgmYSYmaS5wdXNoKG8pO3ZhciBmPWlbMF0vNDB8MCxzPWlbMF0lNDA7aWYobj1yP2k6W2Ysc10uY29uY2F0KGkuc2xpY2UoMSkpLGUpe3ZhciB1PWVbbi5qb2luKFwiIFwiKV07dm9pZCAwPT09dSYmKHU9ZVtuLmpvaW4oXCIuXCIpXSksdm9pZCAwIT09dSYmKG49dSl9cmV0dXJuIG59LGkucHJvdG90eXBlLl9kZWNvZGVUaW1lPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5yYXcoKS50b1N0cmluZygpO2lmKFwiZ2VudGltZVwiPT09ZSl2YXIgbj0wfHIuc2xpY2UoMCw0KSxpPTB8ci5zbGljZSg0LDYpLG89MHxyLnNsaWNlKDYsOCksYT0wfHIuc2xpY2UoOCwxMCksZj0wfHIuc2xpY2UoMTAsMTIpLHM9MHxyLnNsaWNlKDEyLDE0KTtlbHNle2lmKFwidXRjdGltZVwiIT09ZSlyZXR1cm4gdC5lcnJvcihcIkRlY29kaW5nIFwiK2UrXCIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldFwiKTt2YXIgbj0wfHIuc2xpY2UoMCwyKSxpPTB8ci5zbGljZSgyLDQpLG89MHxyLnNsaWNlKDQsNiksYT0wfHIuc2xpY2UoNiw4KSxmPTB8ci5zbGljZSg4LDEwKSxzPTB8ci5zbGljZSgxMCwxMik7bj1uPDcwPzJlMytuOjE5MDArbn1yZXR1cm4gRGF0ZS5VVEMobixpLTEsbyxhLGYscywwKX0saS5wcm90b3R5cGUuX2RlY29kZU51bGw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGx9LGkucHJvdG90eXBlLl9kZWNvZGVCb29sPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVhZFVJbnQ4KCk7cmV0dXJuIHQuaXNFcnJvcihlKT9lOjAhPT1lfSxpLnByb3RvdHlwZS5fZGVjb2RlSW50PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5yYXcoKSxuPW5ldyBoKHIpO3JldHVybiBlJiYobj1lW24udG9TdHJpbmcoMTApXXx8biksbn0saS5wcm90b3R5cGUuX3VzZT1mdW5jdGlvbih0LGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJih0PXQoZSkpLHQuX2dldERlY29kZXIoXCJkZXJcIikudHJlZX19LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3RoaXMuZW5jPVwiZGVyXCIsdGhpcy5uYW1lPXQubmFtZSx0aGlzLmVudGl0eT10LHRoaXMudHJlZT1uZXcgaSx0aGlzLnRyZWUuX2luaXQodC5ib2R5KX1mdW5jdGlvbiBpKHQpe2guTm9kZS5jYWxsKHRoaXMsXCJkZXJcIix0KX1mdW5jdGlvbiBvKHQpe3JldHVybiB0PDEwP1wiMFwiK3Q6dH1mdW5jdGlvbiBhKHQsZSxyLG4pe3ZhciBpO2lmKFwic2Vxb2ZcIj09PXQ/dD1cInNlcVwiOlwic2V0b2ZcIj09PXQmJih0PVwic2V0XCIpLGMudGFnQnlOYW1lLmhhc093blByb3BlcnR5KHQpKWk9Yy50YWdCeU5hbWVbdF07ZWxzZXtpZihcIm51bWJlclwiIT10eXBlb2YgdHx8KDB8dCkhPT10KXJldHVybiBuLmVycm9yKFwiVW5rbm93biB0YWc6IFwiK3QpO2k9dH1yZXR1cm4gaT49MzE/bi5lcnJvcihcIk11bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZFwiKTooZXx8KGl8PTMyKSxpfD1jLnRhZ0NsYXNzQnlOYW1lW3J8fFwidW5pdmVyc2FsXCJdPDw2KX12YXIgZj1yKDIpLHM9cigxKS5CdWZmZXIsdT1yKDEwNiksaD11LmJhc2UsYz11LmNvbnN0YW50cy5kZXI7dC5leHBvcnRzPW4sbi5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudHJlZS5fZW5jb2RlKHQsZSkuam9pbigpfSxmKGksaC5Ob2RlKSxpLnByb3RvdHlwZS5fZW5jb2RlQ29tcG9zaXRlPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWEodCxlLHIsdGhpcy5yZXBvcnRlcik7aWYobi5sZW5ndGg8MTI4KXt2YXIgbz1uZXcgcygyKTtyZXR1cm4gb1swXT1pLG9bMV09bi5sZW5ndGgsdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbbyxuXSl9Zm9yKHZhciBmPTEsdT1uLmxlbmd0aDt1Pj0yNTY7dT4+PTgpZisrO3ZhciBvPW5ldyBzKDIrZik7b1swXT1pLG9bMV09MTI4fGY7Zm9yKHZhciB1PTErZixoPW4ubGVuZ3RoO2g+MDt1LS0saD4+PTgpb1t1XT0yNTUmaDtyZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbbyxuXSl9LGkucHJvdG90eXBlLl9lbmNvZGVTdHI9ZnVuY3Rpb24odCxlKXtpZihcImJpdHN0clwiPT09ZSlyZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbMHx0LnVudXNlZCx0LmRhdGFdKTtpZihcImJtcHN0clwiPT09ZSl7Zm9yKHZhciByPW5ldyBzKDIqdC5sZW5ndGgpLG49MDtuPHQubGVuZ3RoO24rKylyLndyaXRlVUludDE2QkUodC5jaGFyQ29kZUF0KG4pLDIqbik7cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIocil9cmV0dXJuXCJudW1zdHJcIj09PWU/dGhpcy5faXNOdW1zdHIodCk/dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih0KTp0aGlzLnJlcG9ydGVyLmVycm9yKFwiRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciBzdXBwb3J0cyBvbmx5IGRpZ2l0cyBhbmQgc3BhY2VcIik6XCJwcmludHN0clwiPT09ZT90aGlzLl9pc1ByaW50c3RyKHQpP3RoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk6dGhpcy5yZXBvcnRlci5lcnJvcihcIkVuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBwcmludHN0ciBzdXBwb3J0cyBvbmx5IGxhdGluIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMsIGRpZ2l0cywgc3BhY2UsIGFwb3N0cm9waGUsIGxlZnQgYW5kIHJpZ3RoIHBhcmVudGhlc2lzLCBwbHVzIHNpZ24sIGNvbW1hLCBoeXBoZW4sIGRvdCwgc2xhc2gsIGNvbG9uLCBlcXVhbCBzaWduLCBxdWVzdGlvbiBtYXJrXCIpOi9zdHIkLy50ZXN0KGUpP3RoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk6dGhpcy5yZXBvcnRlci5lcnJvcihcIkVuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBcIitlK1wiIHVuc3VwcG9ydGVkXCIpfSxpLnByb3RvdHlwZS5fZW5jb2RlT2JqaWQ9ZnVuY3Rpb24odCxlLHIpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXtpZighZSlyZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcihcInN0cmluZyBvYmppZCBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAgZm91bmRcIik7aWYoIWUuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoXCJvYmppZCBub3QgZm91bmQgaW4gdmFsdWVzIG1hcFwiKTt0PWVbdF0uc3BsaXQoL1tcXHNcXC5dKy9nKTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dfD0wfWVsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dD10LnNsaWNlKCk7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXXw9MH1pZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcihcIm9iamlkKCkgc2hvdWxkIGJlIGVpdGhlciBhcnJheSBvciBzdHJpbmcsIGdvdDogXCIrSlNPTi5zdHJpbmdpZnkodCkpO2lmKCFyKXtpZih0WzFdPj00MClyZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcihcIlNlY29uZCBvYmppZCBpZGVudGlmaWVyIE9PQlwiKTt0LnNwbGljZSgwLDIsNDAqdFswXSt0WzFdKX1mb3IodmFyIGk9MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvPXRbbl07Zm9yKGkrKztvPj0xMjg7bz4+PTcpaSsrfWZvcih2YXIgYT1uZXcgcyhpKSxmPWEubGVuZ3RoLTEsbj10Lmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgbz10W25dO2ZvcihhW2YtLV09MTI3Jm87KG8+Pj03KT4wOylhW2YtLV09MTI4fDEyNyZvfXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGEpfSxpLnByb3RvdHlwZS5fZW5jb2RlVGltZT1mdW5jdGlvbih0LGUpe3ZhciByLG49bmV3IERhdGUodCk7cmV0dXJuXCJnZW50aW1lXCI9PT1lP3I9W28obi5nZXRGdWxsWWVhcigpKSxvKG4uZ2V0VVRDTW9udGgoKSsxKSxvKG4uZ2V0VVRDRGF0ZSgpKSxvKG4uZ2V0VVRDSG91cnMoKSksbyhuLmdldFVUQ01pbnV0ZXMoKSksbyhuLmdldFVUQ1NlY29uZHMoKSksXCJaXCJdLmpvaW4oXCJcIik6XCJ1dGN0aW1lXCI9PT1lP3I9W28obi5nZXRGdWxsWWVhcigpJTEwMCksbyhuLmdldFVUQ01vbnRoKCkrMSksbyhuLmdldFVUQ0RhdGUoKSksbyhuLmdldFVUQ0hvdXJzKCkpLG8obi5nZXRVVENNaW51dGVzKCkpLG8obi5nZXRVVENTZWNvbmRzKCkpLFwiWlwiXS5qb2luKFwiXCIpOnRoaXMucmVwb3J0ZXIuZXJyb3IoXCJFbmNvZGluZyBcIitlK1wiIHRpbWUgaXMgbm90IHN1cHBvcnRlZCB5ZXRcIiksdGhpcy5fZW5jb2RlU3RyKHIsXCJvY3RzdHJcIil9LGkucHJvdG90eXBlLl9lbmNvZGVOdWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoXCJcIil9LGkucHJvdG90eXBlLl9lbmNvZGVJbnQ9ZnVuY3Rpb24odCxlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7aWYoIWUpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoXCJTdHJpbmcgaW50IG9yIGVudW0gZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwXCIpO2lmKCFlLmhhc093blByb3BlcnR5KHQpKXJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKFwiVmFsdWVzIG1hcCBkb2Vzbid0IGNvbnRhaW46IFwiK0pTT04uc3RyaW5naWZ5KHQpKTt0PWVbdF19aWYoXCJudW1iZXJcIiE9dHlwZW9mIHQmJiFzLmlzQnVmZmVyKHQpKXt2YXIgcj10LnRvQXJyYXkoKTshdC5zaWduJiYxMjgmclswXSYmci51bnNoaWZ0KDApLHQ9bmV3IHMocil9aWYocy5pc0J1ZmZlcih0KSl7dmFyIG49dC5sZW5ndGg7MD09PXQubGVuZ3RoJiZuKys7dmFyIGk9bmV3IHMobik7cmV0dXJuIHQuY29weShpKSwwPT09dC5sZW5ndGgmJihpWzBdPTApLHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoaSl9aWYodDwxMjgpcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodCk7aWYodDwyNTYpcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWzAsdF0pO2Zvcih2YXIgbj0xLG89dDtvPj0yNTY7bz4+PTgpbisrO2Zvcih2YXIgaT1uZXcgQXJyYXkobiksbz1pLmxlbmd0aC0xO28+PTA7by0tKWlbb109MjU1JnQsdD4+PTg7cmV0dXJuIDEyOCZpWzBdJiZpLnVuc2hpZnQoMCksdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihuZXcgcyhpKSl9LGkucHJvdG90eXBlLl9lbmNvZGVCb29sPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQ/MjU1OjApfSxpLnByb3RvdHlwZS5fdXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHQ9dChlKSksdC5fZ2V0RW5jb2RlcihcImRlclwiKS50cmVlfSxpLnByb3RvdHlwZS5fc2tpcERlZmF1bHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGk9dGhpcy5fYmFzZVN0YXRlO2lmKG51bGw9PT1pLmRlZmF1bHQpcmV0dXJuITE7dmFyIG89dC5qb2luKCk7aWYodm9pZCAwPT09aS5kZWZhdWx0QnVmZmVyJiYoaS5kZWZhdWx0QnVmZmVyPXRoaXMuX2VuY29kZVZhbHVlKGkuZGVmYXVsdCxlLHIpLmpvaW4oKSksby5sZW5ndGghPT1pLmRlZmF1bHRCdWZmZXIubGVuZ3RoKXJldHVybiExO2ZvcihuPTA7bjxvLmxlbmd0aDtuKyspaWYob1tuXSE9PWkuZGVmYXVsdEJ1ZmZlcltuXSlyZXR1cm4hMTtyZXR1cm4hMH19LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LHIsaSxmKXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSlyZXR1cm4gbmV3IG4odCxyLGkpO2EuY2FsbCh0aGlzKSx0aGlzLl9maW5JRD1lLmNvbmNhdChbaSxuZXcgZShbMCwwLDAsMV0pXSksaT1lLmNvbmNhdChbaSxuZXcgZShbMCwwLDAsMl0pXSksdGhpcy5fY2lwaGVyPW5ldyBvLkFFUyhyKSx0aGlzLl9wcmV2PW5ldyBlKGkubGVuZ3RoKSx0aGlzLl9jYWNoZT1uZXcgZShcIlwiKSx0aGlzLl9zZWNDYWNoZT1uZXcgZShcIlwiKSx0aGlzLl9kZWNyeXB0PWYsdGhpcy5fYWxlbj0wLHRoaXMuX2xlbj0wLGkuY29weSh0aGlzLl9wcmV2KSx0aGlzLl9tb2RlPXQ7dmFyIHU9bmV3IGUoNCk7dS5maWxsKDApLHRoaXMuX2doYXNoPW5ldyBzKHRoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2sodSkpLHRoaXMuX2F1dGhUYWc9bnVsbCx0aGlzLl9jYWxsZWQ9ITF9ZnVuY3Rpb24gaSh0LGUpe3ZhciByPTA7dC5sZW5ndGghPT1lLmxlbmd0aCYmcisrO2Zvcih2YXIgbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCksaT0tMTsrK2k8bjspcis9dFtpXV5lW2ldO3JldHVybiByfXZhciBvPXIoMTA3KSxhPXIoMTA5KSxmPXIoMikscz1yKDU5MSksdT1yKDcyKTtmKG4sYSksdC5leHBvcnRzPW4sbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXtpZighdGhpcy5fY2FsbGVkJiZ0aGlzLl9hbGVuKXt2YXIgcj0xNi10aGlzLl9hbGVuJTE2O3I8MTYmJihyPW5ldyBlKHIpLHIuZmlsbCgwKSx0aGlzLl9naGFzaC51cGRhdGUocikpfXRoaXMuX2NhbGxlZD0hMDt2YXIgbj10aGlzLl9tb2RlLmVuY3J5cHQodGhpcyx0KTtyZXR1cm4gdGhpcy5fZGVjcnlwdD90aGlzLl9naGFzaC51cGRhdGUodCk6dGhpcy5fZ2hhc2gudXBkYXRlKG4pLHRoaXMuX2xlbis9dC5sZW5ndGgsbn0sbi5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7aWYodGhpcy5fZGVjcnlwdCYmIXRoaXMuX2F1dGhUYWcpdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgc3RhdGUgb3IgdW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBkYXRhXCIpO3ZhciB0PXUodGhpcy5fZ2hhc2guZmluYWwoOCp0aGlzLl9hbGVuLDgqdGhpcy5fbGVuKSx0aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHRoaXMuX2ZpbklEKSk7aWYodGhpcy5fZGVjcnlwdCl7aWYoaSh0LHRoaXMuX2F1dGhUYWcpKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YVwiKX1lbHNlIHRoaXMuX2F1dGhUYWc9dDt0aGlzLl9jaXBoZXIuc2NydWIoKX0sbi5wcm90b3R5cGUuZ2V0QXV0aFRhZz1mdW5jdGlvbigpe2lmKCF0aGlzLl9kZWNyeXB0JiZlLmlzQnVmZmVyKHRoaXMuX2F1dGhUYWcpKXJldHVybiB0aGlzLl9hdXRoVGFnO3Rocm93IG5ldyBFcnJvcihcIkF0dGVtcHRpbmcgdG8gZ2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpfSxuLnByb3RvdHlwZS5zZXRBdXRoVGFnPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9kZWNyeXB0KXRocm93IG5ldyBFcnJvcihcIkF0dGVtcHRpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpO3RoaXMuX2F1dGhUYWc9dH0sbi5wcm90b3R5cGUuc2V0QUFEPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2NhbGxlZCl0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0aW5nIHRvIHNldCBBQUQgaW4gdW5zdXBwb3J0ZWQgc3RhdGVcIik7dGhpcy5fZ2hhc2gudXBkYXRlKHQpLHRoaXMuX2FsZW4rPXQubGVuZ3RofX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKCl7cmV0dXJuIE9iamVjdC5rZXlzKGEpfXZhciBpPXIoNTkwKTtlLmNyZWF0ZUNpcGhlcj1lLkNpcGhlcj1pLmNyZWF0ZUNpcGhlcixlLmNyZWF0ZUNpcGhlcml2PWUuQ2lwaGVyaXY9aS5jcmVhdGVDaXBoZXJpdjt2YXIgbz1yKDU4OSk7ZS5jcmVhdGVEZWNpcGhlcj1lLkRlY2lwaGVyPW8uY3JlYXRlRGVjaXBoZXIsZS5jcmVhdGVEZWNpcGhlcml2PWUuRGVjaXBoZXJpdj1vLmNyZWF0ZURlY2lwaGVyaXY7dmFyIGE9cigxNTIpO2UubGlzdENpcGhlcnM9ZS5nZXRDaXBoZXJzPW59LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDcyKTtlLmVuY3J5cHQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1uKGUsdC5fcHJldik7cmV0dXJuIHQuX3ByZXY9dC5fY2lwaGVyLmVuY3J5cHRCbG9jayhyKSx0Ll9wcmV2fSxlLmRlY3J5cHQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9wcmV2O3QuX3ByZXY9ZTt2YXIgaT10Ll9jaXBoZXIuZGVjcnlwdEJsb2NrKGUpO3JldHVybiBuKGkscil9fSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSxyLG4pe3ZhciBvPXIubGVuZ3RoLGE9aShyLGUuX2NhY2hlKTtyZXR1cm4gZS5fY2FjaGU9ZS5fY2FjaGUuc2xpY2UobyksZS5fcHJldj10LmNvbmNhdChbZS5fcHJldixuP3I6YV0pLGF9dmFyIGk9cig3Mik7ZS5lbmNyeXB0PWZ1bmN0aW9uKGUscixpKXtmb3IodmFyIG8sYT1uZXcgdChcIlwiKTtyLmxlbmd0aDspe2lmKDA9PT1lLl9jYWNoZS5sZW5ndGgmJihlLl9jYWNoZT1lLl9jaXBoZXIuZW5jcnlwdEJsb2NrKGUuX3ByZXYpLGUuX3ByZXY9bmV3IHQoXCJcIikpLCEoZS5fY2FjaGUubGVuZ3RoPD1yLmxlbmd0aCkpe2E9dC5jb25jYXQoW2EsbihlLHIsaSldKTticmVha31vPWUuX2NhY2hlLmxlbmd0aCxhPXQuY29uY2F0KFthLG4oZSxyLnNsaWNlKDAsbyksaSldKSxyPXIuc2xpY2Uobyl9cmV0dXJuIGF9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiByKHQsZSxyKXtmb3IodmFyIGksbyxhLGY9LTEscz04LHU9MDsrK2Y8czspaT10Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpLG89ZSYxPDw3LWY/MTI4OjAsYT1pWzBdXm8sdSs9KDEyOCZhKT4+ZiU4LHQuX3ByZXY9bih0Ll9wcmV2LHI/bzphKTtyZXR1cm4gdX1mdW5jdGlvbiBuKGUscil7dmFyIG49ZS5sZW5ndGgsaT0tMSxvPW5ldyB0KGUubGVuZ3RoKTtmb3IoZT10LmNvbmNhdChbZSxuZXcgdChbcl0pXSk7KytpPG47KW9baV09ZVtpXTw8MXxlW2krMV0+Pjc7cmV0dXJuIG99ZS5lbmNyeXB0PWZ1bmN0aW9uKGUsbixpKXtmb3IodmFyIG89bi5sZW5ndGgsYT1uZXcgdChvKSxmPS0xOysrZjxvOylhW2ZdPXIoZSxuW2ZdLGkpO3JldHVybiBhfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gcihlLHIsbil7dmFyIGk9ZS5fY2lwaGVyLmVuY3J5cHRCbG9jayhlLl9wcmV2KSxvPWlbMF1ecjtyZXR1cm4gZS5fcHJldj10LmNvbmNhdChbZS5fcHJldi5zbGljZSgxKSxuZXcgdChbbj9yOm9dKV0pLG99ZS5lbmNyeXB0PWZ1bmN0aW9uKGUsbixpKXtmb3IodmFyIG89bi5sZW5ndGgsYT1uZXcgdChvKSxmPS0xOysrZjxvOylhW2ZdPXIoZSxuW2ZdLGkpO3JldHVybiBhfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSl7ZS5lbmNyeXB0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX2NpcGhlci5lbmNyeXB0QmxvY2soZSl9LGUuZGVjcnlwdD1mdW5jdGlvbih0LGUpe3JldHVybiB0Ll9jaXBoZXIuZGVjcnlwdEJsb2NrKGUpfX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe3JldHVybiB0Ll9wcmV2PXQuX2NpcGhlci5lbmNyeXB0QmxvY2sodC5fcHJldiksdC5fcHJldn12YXIgaT1yKDcyKTtlLmVuY3J5cHQ9ZnVuY3Rpb24oZSxyKXtmb3IoO2UuX2NhY2hlLmxlbmd0aDxyLmxlbmd0aDspZS5fY2FjaGU9dC5jb25jYXQoW2UuX2NhY2hlLG4oZSldKTt2YXIgbz1lLl9jYWNoZS5zbGljZSgwLHIubGVuZ3RoKTtyZXR1cm4gZS5fY2FjaGU9ZS5fY2FjaGUuc2xpY2Uoci5sZW5ndGgpLGkocixvKX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxyLGEsZil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuPyhvLmNhbGwodGhpcyksdGhpcy5fY2lwaGVyPW5ldyBpLkFFUyhyKSx0aGlzLl9wcmV2PW5ldyBlKGEubGVuZ3RoKSx0aGlzLl9jYWNoZT1uZXcgZShcIlwiKSx0aGlzLl9zZWNDYWNoZT1uZXcgZShcIlwiKSx0aGlzLl9kZWNyeXB0PWYsYS5jb3B5KHRoaXMuX3ByZXYpLHZvaWQodGhpcy5fbW9kZT10KSk6bmV3IG4odCxyLGEpfXZhciBpPXIoMTA3KSxvPXIoMTA5KSxhPXIoMik7YShuLG8pLHQuZXhwb3J0cz1uLG4ucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLHQsdGhpcy5fZGVjcnlwdCl9LG4ucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3RoaXMuX2NpcGhlci5zY3J1YigpfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LHIpe3JldHVybiBuZXcgZSh0LnRvUmVkKGkubW9udChyLm1vZHVsdXMpKS5yZWRQb3cobmV3IGkoci5wdWJsaWNFeHBvbmVudCkpLmZyb21SZWQoKS50b0FycmF5KCkpfXZhciBpPXIoNzApO3QuZXhwb3J0cz1ufSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGgsbj0tMTsrK248cjspdFtuXV49ZVtuXTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj92b2lkIGkuY2FsbCh0aGlzLHQpOm5ldyBuKHQpfXQuZXhwb3J0cz1uO3ZhciBpPXIoMTU0KSxvPXIoNzMpO28uaW5oZXJpdHM9cig3NCksby5pbmhlcml0cyhuLGkpLG4ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUscil7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXI/dC5wcmVwZW5kTGlzdGVuZXIoZSxyKTp2b2lkKHQuX2V2ZW50cyYmdC5fZXZlbnRzW2VdP08odC5fZXZlbnRzW2VdKT90Ll9ldmVudHNbZV0udW5zaGlmdChyKTp0Ll9ldmVudHNbZV09W3IsdC5fZXZlbnRzW2VdXTp0Lm9uKGUscikpfWZ1bmN0aW9uIGkodCxlKXtEPUR8fHIoNTEpLHQ9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBEJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIG49dC5oaWdoV2F0ZXJNYXJrLGk9dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1ufHwwPT09bj9uOmksdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMuYnVmZmVyPW5ldyB6LHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8XCJ1dGY4XCIsdGhpcy5yYW5PdXQ9ITEsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKFV8fChVPXIoNTIpLlN0cmluZ0RlY29kZXIpLHRoaXMuZGVjb2Rlcj1uZXcgVSh0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIEQ9RHx8cig1MSksdGhpcyBpbnN0YW5jZW9mIG8/KHRoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IGkodCx0aGlzKSx0aGlzLnJlYWRhYmxlPSEwLHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSx2b2lkIFIuY2FsbCh0aGlzKSk6bmV3IG8odCl9ZnVuY3Rpb24gYSh0LGUscixuLGkpe3ZhciBvPWgoZSxyKTtpZihvKXQuZW1pdChcImVycm9yXCIsbyk7ZWxzZSBpZihudWxsPT09cillLnJlYWRpbmc9ITEsYyh0LGUpO2Vsc2UgaWYoZS5vYmplY3RNb2RlfHxyJiZyLmxlbmd0aD4wKWlmKGUuZW5kZWQmJiFpKXt2YXIgYT1uZXcgRXJyb3IoXCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRlwiKTt0LmVtaXQoXCJlcnJvclwiLGEpfWVsc2UgaWYoZS5lbmRFbWl0dGVkJiZpKXt2YXIgcz1uZXcgRXJyb3IoXCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudFwiKTt0LmVtaXQoXCJlcnJvclwiLHMpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdChcImRhdGFcIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsaT9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJmQodCkpKSxwKHQsZSl9ZWxzZSBpfHwoZS5yZWFkaW5nPSExKTtyZXR1cm4gZihlKX1mdW5jdGlvbiBmKHQpe3JldHVybiF0LmVuZGVkJiYodC5uZWVkUmVhZGFibGV8fHQubGVuZ3RoPHQuaGlnaFdhdGVyTWFya3x8MD09PXQubGVuZ3RoKX1mdW5jdGlvbiBzKHQpe3JldHVybiB0Pj1xP3Q9cToodC0tLHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0KyspLHR9ZnVuY3Rpb24gdSh0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT09dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPXModCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIGgodCxlKXt2YXIgcj1udWxsO3JldHVybiBULmlzQnVmZmVyKGUpfHxcInN0cmluZ1wiPT10eXBlb2YgZXx8bnVsbD09PWV8fHZvaWQgMD09PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcihcIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmtcIikpLHJ9ZnVuY3Rpb24gYyh0LGUpe2lmKCFlLmVuZGVkKXtpZihlLmRlY29kZXIpe3ZhciByPWUuZGVjb2Rlci5lbmQoKTtyJiZyLmxlbmd0aCYmKGUuYnVmZmVyLnB1c2gociksZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoKX1lLmVuZGVkPSEwLGQodCl9fWZ1bmN0aW9uIGQodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KEwoXCJlbWl0UmVhZGFibGVcIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz9CKGwsdCk6bCh0KSl9ZnVuY3Rpb24gbCh0KXtMKFwiZW1pdCByZWFkYWJsZVwiKSx0LmVtaXQoXCJyZWFkYWJsZVwiKSx3KHQpfWZ1bmN0aW9uIHAodCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCxCKGIsdCxlKSl9ZnVuY3Rpb24gYih0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aDshZS5yZWFkaW5nJiYhZS5mbG93aW5nJiYhZS5lbmRlZCYmZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrJiYoTChcIm1heWJlUmVhZE1vcmUgcmVhZCAwXCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gdih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO0woXCJwaXBlT25EcmFpblwiLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZQKHQsXCJkYXRhXCIpJiYoZS5mbG93aW5nPSEwLHcodCkpfX1mdW5jdGlvbiB5KHQpe0woXCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDBcIiksdC5yZWFkKDApfWZ1bmN0aW9uIG0odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLEIoZyx0LGUpKX1mdW5jdGlvbiBnKHQsZSl7ZS5yZWFkaW5nfHwoTChcInJlc3VtZSByZWFkIDBcIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoXCJyZXN1bWVcIiksdyh0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiB3KHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKEwoXCJmbG93XCIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJm51bGwhPT10LnJlYWQoKTspO31mdW5jdGlvbiBfKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiBudWxsO3ZhciByO3JldHVybiBlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbihcIlwiKToxPT09ZS5idWZmZXIubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YTplLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnI9TSh0LGUuYnVmZmVyLGUuZGVjb2Rlcikscn1mdW5jdGlvbiBNKHQsZSxyKXt2YXIgbjtyZXR1cm4gdDxlLmhlYWQuZGF0YS5sZW5ndGg/KG49ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6bj10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpyP1ModCxlKTpFKHQsZSksbn1mdW5jdGlvbiBTKHQsZSl7dmFyIHI9ZS5oZWFkLG49MSxpPXIuZGF0YTtmb3IodC09aS5sZW5ndGg7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoaSs9YT09PW8ubGVuZ3RoP286by5zbGljZSgwLHQpLHQtPWEsMD09PXQpe2E9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKGEpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9ZnVuY3Rpb24gRSh0LGUpe3ZhciByPWouYWxsb2NVbnNhZmUodCksbj1lLmhlYWQsaT0xO2ZvcihuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLGE9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShyLHIubGVuZ3RoLXQsMCxhKSx0LT1hLDA9PT10KXthPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShhKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfWZ1bmN0aW9uIEEodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtpZihlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignXCJlbmRSZWFkYWJsZSgpXCIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLEIoayxlLHQpKX1mdW5jdGlvbiBrKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoXCJlbmRcIikpfWZ1bmN0aW9uIHgodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspZSh0W3JdLHIpfWZ1bmN0aW9uIEkodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9dC5leHBvcnRzPW87dmFyIEI9cigxNTcpLE89cig1OTcpO28uUmVhZGFibGVTdGF0ZT1pO3ZhciBSLFA9KHIoMTEwKS5FdmVudEVtaXR0ZXIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lcnMoZSkubGVuZ3RofSk7IWZ1bmN0aW9uKCl7dHJ5e1I9cigzMSl9Y2F0Y2godCl7fWZpbmFsbHl7Unx8KFI9cigxMTApLkV2ZW50RW1pdHRlcil9fSgpO3ZhciBUPXIoMSkuQnVmZmVyLGo9cigxNTYpLEM9cig3Myk7Qy5pbmhlcml0cz1yKDc0KTt2YXIgTj1yKDYxMiksTD12b2lkIDA7TD1OJiZOLmRlYnVnbG9nP04uZGVidWdsb2coXCJzdHJlYW1cIik6ZnVuY3Rpb24oKXt9O3ZhciBVLHo9cig1OTYpO0MuaW5oZXJpdHMobyxSKTt2YXIgRCxEO28ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByLm9iamVjdE1vZGV8fFwic3RyaW5nXCIhPXR5cGVvZiB0fHwoZT1lfHxyLmRlZmF1bHRFbmNvZGluZyxlIT09ci5lbmNvZGluZyYmKHQ9ai5mcm9tKHQsZSksZT1cIlwiKSksYSh0aGlzLHIsdCxlLCExKX0sby5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiBhKHRoaXMsZSx0LFwiXCIsITApfSxvLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9PT0hMX0sby5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIFV8fChVPXIoNTIpLlN0cmluZ0RlY29kZXIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1uZXcgVSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307dmFyIHE9ODM4ODYwODtvLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe0woXCJyZWFkXCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gTChcInJlYWQ6IGVtaXRSZWFkYWJsZVwiLGUubGVuZ3RoLGUuZW5kZWQpLDA9PT1lLmxlbmd0aCYmZS5lbmRlZD9BKHRoaXMpOmQodGhpcyksbnVsbDtpZih0PXUodCxlKSwwPT09dCYmZS5lbmRlZClyZXR1cm4gMD09PWUubGVuZ3RoJiZBKHRoaXMpLG51bGw7dmFyIG49ZS5uZWVkUmVhZGFibGU7TChcIm5lZWQgcmVhZGFibGVcIixuKSwoMD09PWUubGVuZ3RofHxlLmxlbmd0aC10PGUuaGlnaFdhdGVyTWFyaykmJihuPSEwLEwoXCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFya1wiLG4pKSxlLmVuZGVkfHxlLnJlYWRpbmc/KG49ITEsTChcInJlYWRpbmcgb3IgZW5kZWRcIixuKSk6biYmKEwoXCJkbyByZWFkXCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD11KHIsZSkpKTt2YXIgaTtyZXR1cm4gaT10PjA/Xyh0LGUpOm51bGwsbnVsbD09PWk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmQSh0aGlzKSksbnVsbCE9PWkmJnRoaXMuZW1pdChcImRhdGFcIixpKSxpfSxvLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoXCJlcnJvclwiLG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKSl9LG8ucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxyKXtmdW5jdGlvbiBpKHQpe0woXCJvbnVucGlwZVwiKSx0PT09ZCYmYSgpfWZ1bmN0aW9uIG8oKXtMKFwib25lbmRcIiksdC5lbmQoKX1mdW5jdGlvbiBhKCl7TChcImNsZWFudXBcIiksdC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsdSksdC5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGgpLHQucmVtb3ZlTGlzdGVuZXIoXCJkcmFpblwiLHkpLHQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHMpLHQucmVtb3ZlTGlzdGVuZXIoXCJ1bnBpcGVcIixpKSxkLnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsbyksZC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLGEpLGQucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsZiksbT0hMCwhbC5hd2FpdERyYWlufHx0Ll93cml0YWJsZVN0YXRlJiYhdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fHkoKX1mdW5jdGlvbiBmKGUpe0woXCJvbmRhdGFcIiksZz0hMTt2YXIgcj10LndyaXRlKGUpOyExIT09cnx8Z3x8KCgxPT09bC5waXBlc0NvdW50JiZsLnBpcGVzPT09dHx8bC5waXBlc0NvdW50PjEmJkkobC5waXBlcyx0KSE9PS0xKSYmIW0mJihMKFwiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlXCIsZC5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxkLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxnPSEwKSxkLnBhdXNlKCkpfWZ1bmN0aW9uIHMoZSl7TChcIm9uZXJyb3JcIixlKSxjKCksdC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIscyksMD09PVAodCxcImVycm9yXCIpJiZ0LmVtaXQoXCJlcnJvclwiLGUpfWZ1bmN0aW9uIHUoKXt0LnJlbW92ZUxpc3RlbmVyKFwiZmluaXNoXCIsaCksYygpfWZ1bmN0aW9uIGgoKXtMKFwib25maW5pc2hcIiksdC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsdSksYygpfWZ1bmN0aW9uIGMoKXtMKFwidW5waXBlXCIpLGQudW5waXBlKHQpfXZhciBkPXRoaXMsbD10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChsLnBpcGVzQ291bnQpe2Nhc2UgMDpsLnBpcGVzPXQ7YnJlYWs7Y2FzZSAxOmwucGlwZXM9W2wucGlwZXMsdF07YnJlYWs7ZGVmYXVsdDpsLnBpcGVzLnB1c2godCl9bC5waXBlc0NvdW50Kz0xLEwoXCJwaXBlIGNvdW50PSVkIG9wdHM9JWpcIixsLnBpcGVzQ291bnQscik7dmFyIHA9KCFyfHxyLmVuZCE9PSExKSYmdCE9PWUuc3Rkb3V0JiZ0IT09ZS5zdGRlcnIsYj1wP286YTtsLmVuZEVtaXR0ZWQ/QihiKTpkLm9uY2UoXCJlbmRcIixiKSx0Lm9uKFwidW5waXBlXCIsaSk7dmFyIHk9dihkKTt0Lm9uKFwiZHJhaW5cIix5KTt2YXIgbT0hMSxnPSExO3JldHVybiBkLm9uKFwiZGF0YVwiLGYpLG4odCxcImVycm9yXCIscyksdC5vbmNlKFwiY2xvc2VcIix1KSx0Lm9uY2UoXCJmaW5pc2hcIixoKSx0LmVtaXQoXCJwaXBlXCIsZCksbC5mbG93aW5nfHwoTChcInBpcGUgcmVzdW1lXCIpLGQucmVzdW1lKCkpLHR9LG8ucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXM/dGhpczoodHx8KHQ9ZS5waXBlcyksZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMSx0JiZ0LmVtaXQoXCJ1bnBpcGVcIix0aGlzKSx0aGlzKTtpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KFwidW5waXBlXCIsdGhpcyk7cmV0dXJuIHRoaXN9dmFyIG89SShlLnBpcGVzLHQpO3JldHVybiBvPT09LTE/dGhpczooZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KFwidW5waXBlXCIsdGhpcyksdGhpcyl9LG8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9Ui5wcm90b3R5cGUub24uY2FsbCh0aGlzLHQsZSk7aWYoXCJkYXRhXCI9PT10KXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyE9PSExJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoXCJyZWFkYWJsZVwiPT09dCl7dmFyIG49dGhpcy5fcmVhZGFibGVTdGF0ZTtuLmVuZEVtaXR0ZWR8fG4ucmVhZGFibGVMaXN0ZW5pbmd8fChuLnJlYWRhYmxlTGlzdGVuaW5nPW4ubmVlZFJlYWRhYmxlPSEwLG4uZW1pdHRlZFJlYWRhYmxlPSExLG4ucmVhZGluZz9uLmxlbmd0aCYmZCh0aGlzLG4pOkIoeSx0aGlzKSl9cmV0dXJuIHJ9LG8ucHJvdG90eXBlLmFkZExpc3RlbmVyPW8ucHJvdG90eXBlLm9uLG8ucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHQuZmxvd2luZ3x8KEwoXCJyZXN1bWVcIiksdC5mbG93aW5nPSEwLG0odGhpcyx0KSksdGhpc30sby5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gTChcImNhbGwgcGF1c2UgZmxvd2luZz0lalwiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJihMKFwicGF1c2VcIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdChcInBhdXNlXCIpKSx0aGlzfSxvLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj0hMSxuPXRoaXM7dC5vbihcImVuZFwiLGZ1bmN0aW9uKCl7aWYoTChcIndyYXBwZWQgZW5kXCIpLGUuZGVjb2RlciYmIWUuZW5kZWQpe3ZhciB0PWUuZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmbi5wdXNoKHQpfW4ucHVzaChudWxsKX0pLHQub24oXCJkYXRhXCIsZnVuY3Rpb24oaSl7aWYoTChcIndyYXBwZWQgZGF0YVwiKSxlLmRlY29kZXImJihpPWUuZGVjb2Rlci53cml0ZShpKSksKCFlLm9iamVjdE1vZGV8fG51bGwhPT1pJiZ2b2lkIDAhPT1pKSYmKGUub2JqZWN0TW9kZXx8aSYmaS5sZW5ndGgpKXt2YXIgbz1uLnB1c2goaSk7b3x8KHI9ITAsdC5wYXVzZSgpKX19KTtmb3IodmFyIGkgaW4gdCl2b2lkIDA9PT10aGlzW2ldJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0W2ldJiYodGhpc1tpXT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdFtlXS5hcHBseSh0LGFyZ3VtZW50cyl9fShpKSk7dmFyIG89W1wiZXJyb3JcIixcImNsb3NlXCIsXCJkZXN0cm95XCIsXCJwYXVzZVwiLFwicmVzdW1lXCJdO3JldHVybiB4KG8sZnVuY3Rpb24oZSl7dC5vbihlLG4uZW1pdC5iaW5kKG4sZSkpfSksbi5fcmVhZD1mdW5jdGlvbihlKXtMKFwid3JhcHBlZCBfcmVhZFwiLGUpLHImJihyPSExLHQucmVzdW1lKCkpfSxufSxvLl9mcm9tTGlzdD1ffSkuY2FsbChlLHIoMjYpKX0sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7ZnVuY3Rpb24gQ29udGV4dCgpe312YXIgaW5kZXhPZj1fX3dlYnBhY2tfcmVxdWlyZV9fKDYwNyksT2JqZWN0X2tleXM9ZnVuY3Rpb24odCl7aWYoT2JqZWN0LmtleXMpcmV0dXJuIE9iamVjdC5rZXlzKHQpO3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaChyKTtyZXR1cm4gZX0sZm9yRWFjaD1mdW5jdGlvbih0LGUpe2lmKHQuZm9yRWFjaClyZXR1cm4gdC5mb3JFYWNoKGUpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKWUodFtyXSxyLHQpfSxkZWZpbmVQcm9wPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sXCJfXCIse30pLGZ1bmN0aW9uKHQsZSxyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLFxuY29uZmlndXJhYmxlOiEwLHZhbHVlOnJ9KX19Y2F0Y2godCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXt0W2VdPXJ9fX0oKSxnbG9iYWxzPVtcIkFycmF5XCIsXCJCb29sZWFuXCIsXCJEYXRlXCIsXCJFcnJvclwiLFwiRXZhbEVycm9yXCIsXCJGdW5jdGlvblwiLFwiSW5maW5pdHlcIixcIkpTT05cIixcIk1hdGhcIixcIk5hTlwiLFwiTnVtYmVyXCIsXCJPYmplY3RcIixcIlJhbmdlRXJyb3JcIixcIlJlZmVyZW5jZUVycm9yXCIsXCJSZWdFeHBcIixcIlN0cmluZ1wiLFwiU3ludGF4RXJyb3JcIixcIlR5cGVFcnJvclwiLFwiVVJJRXJyb3JcIixcImRlY29kZVVSSVwiLFwiZGVjb2RlVVJJQ29tcG9uZW50XCIsXCJlbmNvZGVVUklcIixcImVuY29kZVVSSUNvbXBvbmVudFwiLFwiZXNjYXBlXCIsXCJldmFsXCIsXCJpc0Zpbml0ZVwiLFwiaXNOYU5cIixcInBhcnNlRmxvYXRcIixcInBhcnNlSW50XCIsXCJ1bmRlZmluZWRcIixcInVuZXNjYXBlXCJdO0NvbnRleHQucHJvdG90eXBlPXt9O3ZhciBTY3JpcHQ9ZXhwb3J0cy5TY3JpcHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBTY3JpcHQ/dm9pZCh0aGlzLmNvZGU9dCk6bmV3IFNjcmlwdCh0KX07U2NyaXB0LnByb3RvdHlwZS5ydW5JbkNvbnRleHQ9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgQ29udGV4dCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm5lZWRzIGEgJ2NvbnRleHQnIGFyZ3VtZW50LlwiKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO2Uuc3R5bGV8fChlLnN0eWxlPXt9KSxlLnN0eWxlLmRpc3BsYXk9XCJub25lXCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgcj1lLmNvbnRlbnRXaW5kb3csbj1yLmV2YWwsaT1yLmV4ZWNTY3JpcHQ7IW4mJmkmJihpLmNhbGwocixcIm51bGxcIiksbj1yLmV2YWwpLGZvckVhY2goT2JqZWN0X2tleXModCksZnVuY3Rpb24oZSl7cltlXT10W2VdfSksZm9yRWFjaChnbG9iYWxzLGZ1bmN0aW9uKGUpe3RbZV0mJihyW2VdPXRbZV0pfSk7dmFyIG89T2JqZWN0X2tleXMociksYT1uLmNhbGwocix0aGlzLmNvZGUpO3JldHVybiBmb3JFYWNoKE9iamVjdF9rZXlzKHIpLGZ1bmN0aW9uKGUpeyhlIGluIHR8fGluZGV4T2YobyxlKT09PS0xKSYmKHRbZV09cltlXSl9KSxmb3JFYWNoKGdsb2JhbHMsZnVuY3Rpb24oZSl7ZSBpbiB0fHxkZWZpbmVQcm9wKHQsZSxyW2VdKX0pLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksYX0sU2NyaXB0LnByb3RvdHlwZS5ydW5JblRoaXNDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIGV2YWwodGhpcy5jb2RlKX0sU2NyaXB0LnByb3RvdHlwZS5ydW5Jbk5ld0NvbnRleHQ9ZnVuY3Rpb24odCl7dmFyIGU9U2NyaXB0LmNyZWF0ZUNvbnRleHQodCkscj10aGlzLnJ1bkluQ29udGV4dChlKTtyZXR1cm4gZm9yRWFjaChPYmplY3Rfa2V5cyhlKSxmdW5jdGlvbihyKXt0W3JdPWVbcl19KSxyfSxmb3JFYWNoKE9iamVjdF9rZXlzKFNjcmlwdC5wcm90b3R5cGUpLGZ1bmN0aW9uKHQpe2V4cG9ydHNbdF09U2NyaXB0W3RdPWZ1bmN0aW9uKGUpe3ZhciByPVNjcmlwdChlKTtyZXR1cm4gclt0XS5hcHBseShyLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX19KSxleHBvcnRzLmNyZWF0ZVNjcmlwdD1mdW5jdGlvbih0KXtyZXR1cm4gZXhwb3J0cy5TY3JpcHQodCl9LGV4cG9ydHMuY3JlYXRlQ29udGV4dD1TY3JpcHQuY3JlYXRlQ29udGV4dD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQ29udGV4dDtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmZm9yRWFjaChPYmplY3Rfa2V5cyh0KSxmdW5jdGlvbihyKXtlW3JdPXRbcl19KSxlfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiOyhmdW5jdGlvbihlKXt2YXIgbj1yKDc1KSxpPXIoNjMpLG89cigxMTUpLGE9cigyNjQpLGY9cigyNjMpLHM9cigyNjYpLHU9cigyNjUpLGg9cigyNjIpLGM9cigxMTYpLGQ9bmV3IGUoMCksbD1mdW5jdGlvbih0KXt2YXIgZT1uLmZyb21VcmkodCk7cmV0dXJuIGUudmFsaWRhdGUoKX0scD1mdW5jdGlvbih0LHIsbil7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIG4mJihuPWQpLCFlLmlzQnVmZmVyKG4pKXRocm93IG5ldyBFcnJvcihcIk1lc3NhZ2UgbXVzdCBiZSBwcm92aWRlZCBhcyBhIEJ1ZmZlclwiKTt2YXIgbz1pLmZyb21VcmkodCksYT1vLmdldENvbmRpdGlvblVyaSgpO2lmKGEhPT1yKXRocm93IG5ldyBFcnJvcihcIkZ1bGZpbGxtZW50IGRvZXMgbm90IG1hdGNoIGNvbmRpdGlvbiAoZXhwZWN0ZWQ6IFwiK3IrXCIsIGFjdHVhbDogXCIrYStcIilcIik7cmV0dXJuIG8udmFsaWRhdGUobil9LGI9ZnVuY3Rpb24odCl7dmFyIGU9aS5mcm9tVXJpKHQpO3JldHVybiBlLmdldENvbmRpdGlvblVyaSgpfTtvLnJlZ2lzdGVyVHlwZShhKSxvLnJlZ2lzdGVyVHlwZShmKSxvLnJlZ2lzdGVyVHlwZShzKSxvLnJlZ2lzdGVyVHlwZSh1KSxvLnJlZ2lzdGVyVHlwZShoKSx0LmV4cG9ydHM9e0NvbmRpdGlvbjpuLEZ1bGZpbGxtZW50OmksVHlwZVJlZ2lzdHJ5Om8sUHJlaW1hZ2VTaGEyNTY6YSxSc2FTaGEyNTY6dSxQcmVmaXhTaGEyNTY6ZixUaHJlc2hvbGRTaGEyNTY6cyxFZDI1NTE5OmgsdmFsaWRhdGVDb25kaXRpb246bCx2YWxpZGF0ZUZ1bGZpbGxtZW50OnAsZnVsZmlsbG1lbnRUb0NvbmRpdGlvbjpiLGJhc2U2NHVybDpjLGZyb21Db25kaXRpb25Vcmk6bi5mcm9tVXJpLmJpbmQobiksZnJvbUNvbmRpdGlvbkJpbmFyeTpuLmZyb21CaW5hcnkuYmluZChuKSxmcm9tRnVsZmlsbG1lbnRVcmk6aS5mcm9tVXJpLmJpbmQoaSksZnJvbUZ1bGZpbGxtZW50QmluYXJ5OmkuZnJvbUJpbmFyeS5iaW5kKGkpfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUscil7dFtlXXx8T2JqZWN0W25dKHQsZSx7d3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwLHZhbHVlOnJ9KX1pZihyKDQ2MSkscigyNjgpLHIoMjY5KSx0Ll9iYWJlbFBvbHlmaWxsKXRocm93IG5ldyBFcnJvcihcIm9ubHkgb25lIGluc3RhbmNlIG9mIGJhYmVsLXBvbHlmaWxsIGlzIGFsbG93ZWRcIik7dC5fYmFiZWxQb2x5ZmlsbD0hMDt2YXIgbj1cImRlZmluZVByb3BlcnR5XCI7ZShTdHJpbmcucHJvdG90eXBlLFwicGFkTGVmdFwiLFwiXCIucGFkU3RhcnQpLGUoU3RyaW5nLnByb3RvdHlwZSxcInBhZFJpZ2h0XCIsXCJcIi5wYWRFbmQpLFwicG9wLHJldmVyc2Usc2hpZnQsa2V5cyx2YWx1ZXMsZW50cmllcyxpbmRleE9mLGV2ZXJ5LHNvbWUsZm9yRWFjaCxtYXAsZmlsdGVyLGZpbmQsZmluZEluZGV4LGluY2x1ZGVzLGpvaW4sc2xpY2UsY29uY2F0LHB1c2gsc3BsaWNlLHVuc2hpZnQsc29ydCxsYXN0SW5kZXhPZixyZWR1Y2UscmVkdWNlUmlnaHQsY29weVdpdGhpbixmaWxsXCIuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24odCl7W11bdF0mJmUoQXJyYXksdCxGdW5jdGlvbi5jYWxsLmJpbmQoW11bdF0pKX0pfSkuY2FsbChlLHIoMzkpKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTExKSxpPXIoMTEyKSxvPXIoMjU1KSxhPXIoMjU2KTt0LmV4cG9ydHM9e1JlYWRlcjpvLFdyaXRlcjphfTtmb3IodmFyIGYgaW4gaSlpLmhhc093blByb3BlcnR5KGYpJiYodC5leHBvcnRzW2ZdPWlbZl0pO2Zvcih2YXIgcyBpbiBuKW4uaGFzT3duUHJvcGVydHkocykmJih0LmV4cG9ydHNbc109bltzXSl9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0KXtpZighdHx8IWUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcImRhdGEgbXVzdCBiZSBhIG5vZGUgQnVmZmVyXCIpO3RoaXMuX2J1Zj10LHRoaXMuX3NpemU9dC5sZW5ndGgsdGhpcy5fbGVuPTAsdGhpcy5fb2Zmc2V0PTB9dmFyIGk9cigyMDIpLG89cigxMTIpLGE9cigxMTEpLGY9YS5uZXdJbnZhbGlkQXNuMUVycm9yO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxcImxlbmd0aFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZW59fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLFwib2Zmc2V0XCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29mZnNldH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsXCJyZW1haW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemUtdGhpcy5fb2Zmc2V0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxcImJ1ZmZlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVmLnNsaWNlKHRoaXMuX29mZnNldCl9fSksbi5wcm90b3R5cGUucmVhZEJ5dGU9ZnVuY3Rpb24odCl7aWYodGhpcy5fc2l6ZS10aGlzLl9vZmZzZXQ8MSlyZXR1cm4gbnVsbDt2YXIgZT0yNTUmdGhpcy5fYnVmW3RoaXMuX29mZnNldF07cmV0dXJuIHR8fCh0aGlzLl9vZmZzZXQrPTEpLGV9LG4ucHJvdG90eXBlLnBlZWs9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkQnl0ZSghMCl9LG4ucHJvdG90eXBlLnJlYWRMZW5ndGg9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCYmKHQ9dGhpcy5fb2Zmc2V0KSx0Pj10aGlzLl9zaXplKXJldHVybiBudWxsO3ZhciBlPTI1NSZ0aGlzLl9idWZbdCsrXTtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtpZigxMjg9PSgxMjgmZSkpe2lmKGUmPTEyNywwPT1lKXRocm93IGYoXCJJbmRlZmluaXRlIGxlbmd0aCBub3Qgc3VwcG9ydGVkXCIpO2lmKGU+NCl0aHJvdyBmKFwiZW5jb2RpbmcgdG9vIGxvbmdcIik7aWYodGhpcy5fc2l6ZS10PGUpcmV0dXJuIG51bGw7dGhpcy5fbGVuPTA7Zm9yKHZhciByPTA7cjxlO3IrKyl0aGlzLl9sZW49KHRoaXMuX2xlbjw8OCkrKDI1NSZ0aGlzLl9idWZbdCsrXSl9ZWxzZSB0aGlzLl9sZW49ZTtyZXR1cm4gdH0sbi5wcm90b3R5cGUucmVhZFNlcXVlbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGVlaygpO2lmKG51bGw9PT1lKXJldHVybiBudWxsO2lmKHZvaWQgMCE9PXQmJnQhPT1lKXRocm93IGYoXCJFeHBlY3RlZCAweFwiK3QudG9TdHJpbmcoMTYpK1wiOiBnb3QgMHhcIitlLnRvU3RyaW5nKDE2KSk7dmFyIHI9dGhpcy5yZWFkTGVuZ3RoKHRoaXMuX29mZnNldCsxKTtyZXR1cm4gbnVsbD09PXI/bnVsbDoodGhpcy5fb2Zmc2V0PXIsZSl9LG4ucHJvdG90eXBlLnJlYWRJbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZFRhZyhvLkludGVnZXIpfSxuLnByb3RvdHlwZS5yZWFkQm9vbGVhbj1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5fcmVhZFRhZyhvLkJvb2xlYW4pfSxuLnByb3RvdHlwZS5yZWFkRW51bWVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZFRhZyhvLkVudW1lcmF0aW9uKX0sbi5wcm90b3R5cGUucmVhZFN0cmluZz1mdW5jdGlvbih0LHIpe3R8fCh0PW8uT2N0ZXRTdHJpbmcpO3ZhciBuPXRoaXMucGVlaygpO2lmKG51bGw9PT1uKXJldHVybiBudWxsO2lmKG4hPT10KXRocm93IGYoXCJFeHBlY3RlZCAweFwiK3QudG9TdHJpbmcoMTYpK1wiOiBnb3QgMHhcIituLnRvU3RyaW5nKDE2KSk7dmFyIGk9dGhpcy5yZWFkTGVuZ3RoKHRoaXMuX29mZnNldCsxKTtpZihudWxsPT09aSlyZXR1cm4gbnVsbDtpZih0aGlzLmxlbmd0aD50aGlzLl9zaXplLWkpcmV0dXJuIG51bGw7aWYodGhpcy5fb2Zmc2V0PWksMD09PXRoaXMubGVuZ3RoKXJldHVybiByP25ldyBlKDApOlwiXCI7dmFyIGE9dGhpcy5fYnVmLnNsaWNlKHRoaXMuX29mZnNldCx0aGlzLl9vZmZzZXQrdGhpcy5sZW5ndGgpO3JldHVybiB0aGlzLl9vZmZzZXQrPXRoaXMubGVuZ3RoLHI/YTphLnRvU3RyaW5nKFwidXRmOFwiKX0sbi5wcm90b3R5cGUucmVhZE9JRD1mdW5jdGlvbih0KXt0fHwodD1vLk9JRCk7dmFyIGU9dGhpcy5yZWFkU3RyaW5nKHQsITApO2lmKG51bGw9PT1lKXJldHVybiBudWxsO2Zvcih2YXIgcj1bXSxuPTAsaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgYT0yNTUmZVtpXTtuPDw9NyxuKz0xMjcmYSwwPT0oMTI4JmEpJiYoci5wdXNoKG4pLG49MCl9cmV0dXJuIG49ci5zaGlmdCgpLHIudW5zaGlmdChuJTQwKSxyLnVuc2hpZnQobi80MD4+MCksci5qb2luKFwiLlwiKX0sbi5wcm90b3R5cGUuX3JlYWRUYWc9ZnVuY3Rpb24odCl7aS5vayh2b2lkIDAhPT10KTt2YXIgZT10aGlzLnBlZWsoKTtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtpZihlIT09dCl0aHJvdyBmKFwiRXhwZWN0ZWQgMHhcIit0LnRvU3RyaW5nKDE2KStcIjogZ290IDB4XCIrZS50b1N0cmluZygxNikpO3ZhciByPXRoaXMucmVhZExlbmd0aCh0aGlzLl9vZmZzZXQrMSk7aWYobnVsbD09PXIpcmV0dXJuIG51bGw7aWYodGhpcy5sZW5ndGg+NCl0aHJvdyBmKFwiSW50ZWdlciB0b28gbG9uZzogXCIrdGhpcy5sZW5ndGgpO2lmKHRoaXMubGVuZ3RoPnRoaXMuX3NpemUtcilyZXR1cm4gbnVsbDt0aGlzLl9vZmZzZXQ9cjtmb3IodmFyIG49dGhpcy5fYnVmW3RoaXMuX29mZnNldF0sbz0wLGE9MDthPHRoaXMubGVuZ3RoO2ErKylvPDw9OCxvfD0yNTUmdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXTtyZXR1cm4gMTI4PT0oMTI4Jm4pJiY0IT09YSYmKG8tPTE8PDgqYSksbz4+MH0sdC5leHBvcnRzPW59KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxlKXtvLm9rKHQpLG8uZXF1YWwodHlwZW9mIHQsXCJvYmplY3RcIiksby5vayhlKSxvLmVxdWFsKHR5cGVvZiBlLFwib2JqZWN0XCIpO3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpO3JldHVybiByLmZvckVhY2goZnVuY3Rpb24ocil7aWYoIWVbcl0pe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLG4pfX0pLGV9ZnVuY3Rpb24gaSh0KXt0PW4ocyx0fHx7fSksdGhpcy5fYnVmPW5ldyBlKHQuc2l6ZXx8MTAyNCksdGhpcy5fc2l6ZT10aGlzLl9idWYubGVuZ3RoLHRoaXMuX29mZnNldD0wLHRoaXMuX29wdGlvbnM9dCx0aGlzLl9zZXE9W119dmFyIG89cigyMDIpLGE9cigxMTIpLGY9cigxMTEpLHM9KGYubmV3SW52YWxpZEFzbjFFcnJvcix7c2l6ZToxMDI0LGdyb3d0aEZhY3Rvcjo4fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NlcS5sZW5ndGgpdGhyb3cgbmV3IEludmFsaWRBc24xRXJyb3IodGhpcy5fc2VxLmxlbmd0aCtcIiB1bmVuZGVkIHNlcXVlbmNlKHMpXCIpO3JldHVybiB0aGlzLl9idWYuc2xpY2UoMCx0aGlzLl9vZmZzZXQpfX0pLGkucHJvdG90eXBlLndyaXRlQnl0ZT1mdW5jdGlvbih0KXtpZihcIm51bWJlclwiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgbXVzdCBiZSBhIE51bWJlclwiKTt0aGlzLl9lbnN1cmUoMSksdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXT10fSxpLnByb3RvdHlwZS53cml0ZUludD1mdW5jdGlvbih0LGUpe2lmKFwibnVtYmVyXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBtdXN0IGJlIGEgTnVtYmVyXCIpO1wibnVtYmVyXCIhPXR5cGVvZiBlJiYoZT1hLkludGVnZXIpO2Zvcih2YXIgcj00OygwPT09KDQyODY1Nzg2ODgmdCl8fCg0Mjg2NTc4Njg4JnQpPT09LTgzODg2MDgpJiZyPjE7KXItLSx0PDw9ODtpZihyPjQpdGhyb3cgbmV3IEludmFsaWRBc24xRXJyb3IoXCJCRVIgaW50cyBjYW5ub3QgYmUgPiAweGZmZmZmZmZmXCIpO2Zvcih0aGlzLl9lbnN1cmUoMityKSx0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdPWUsdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXT1yO3ItLSA+MDspdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXT0oNDI3ODE5MDA4MCZ0KT4+PjI0LHQ8PD04fSxpLnByb3RvdHlwZS53cml0ZU51bGw9ZnVuY3Rpb24oKXt0aGlzLndyaXRlQnl0ZShhLk51bGwpLHRoaXMud3JpdGVCeXRlKDApfSxpLnByb3RvdHlwZS53cml0ZUVudW1lcmF0aW9uPWZ1bmN0aW9uKHQsZSl7aWYoXCJudW1iZXJcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IG11c3QgYmUgYSBOdW1iZXJcIik7cmV0dXJuXCJudW1iZXJcIiE9dHlwZW9mIGUmJihlPWEuRW51bWVyYXRpb24pLHRoaXMud3JpdGVJbnQodCxlKX0saS5wcm90b3R5cGUud3JpdGVCb29sZWFuPWZ1bmN0aW9uKHQsZSl7aWYoXCJib29sZWFuXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBtdXN0IGJlIGEgQm9vbGVhblwiKTtcIm51bWJlclwiIT10eXBlb2YgZSYmKGU9YS5Cb29sZWFuKSx0aGlzLl9lbnN1cmUoMyksdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXT1lLHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK109MSx0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdPXQ/MjU1OjB9LGkucHJvdG90eXBlLndyaXRlU3RyaW5nPWZ1bmN0aW9uKHQscil7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgKHdhczogXCIrdHlwZW9mIHQrXCIpXCIpO1wibnVtYmVyXCIhPXR5cGVvZiByJiYocj1hLk9jdGV0U3RyaW5nKTt2YXIgbj1lLmJ5dGVMZW5ndGgodCk7dGhpcy53cml0ZUJ5dGUociksdGhpcy53cml0ZUxlbmd0aChuKSxuJiYodGhpcy5fZW5zdXJlKG4pLHRoaXMuX2J1Zi53cml0ZSh0LHRoaXMuX29mZnNldCksdGhpcy5fb2Zmc2V0Kz1uKX0saS5wcm90b3R5cGUud3JpdGVCdWZmZXI9ZnVuY3Rpb24odCxyKXtpZihcIm51bWJlclwiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKFwidGFnIG11c3QgYmUgYSBudW1iZXJcIik7aWYoIWUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IG11c3QgYmUgYSBidWZmZXJcIik7dGhpcy53cml0ZUJ5dGUociksdGhpcy53cml0ZUxlbmd0aCh0Lmxlbmd0aCksdGhpcy5fZW5zdXJlKHQubGVuZ3RoKSx0LmNvcHkodGhpcy5fYnVmLHRoaXMuX29mZnNldCwwLHQubGVuZ3RoKSx0aGlzLl9vZmZzZXQrPXQubGVuZ3RofSxpLnByb3RvdHlwZS53cml0ZVN0cmluZ0FycmF5PWZ1bmN0aW9uKHQpe2lmKCF0IGluc3RhbmNlb2YgQXJyYXkpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXlbU3RyaW5nXVwiKTt2YXIgZT10aGlzO3QuZm9yRWFjaChmdW5jdGlvbih0KXtlLndyaXRlU3RyaW5nKHQpfSl9LGkucHJvdG90eXBlLndyaXRlT0lEPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0LGUpe2U8MTI4P3QucHVzaChlKTplPDE2Mzg0Pyh0LnB1c2goZT4+Pjd8MTI4KSx0LnB1c2goMTI3JmUpKTplPDIwOTcxNTI/KHQucHVzaChlPj4+MTR8MTI4KSx0LnB1c2goMjU1JihlPj4+N3wxMjgpKSx0LnB1c2goMTI3JmUpKTplPDI2ODQzNTQ1Nj8odC5wdXNoKGU+Pj4yMXwxMjgpLHQucHVzaCgyNTUmKGU+Pj4xNHwxMjgpKSx0LnB1c2goMjU1JihlPj4+N3wxMjgpKSx0LnB1c2goMTI3JmUpKToodC5wdXNoKDI1NSYoZT4+PjI4fDEyOCkpLHQucHVzaCgyNTUmKGU+Pj4yMXwxMjgpKSx0LnB1c2goMjU1JihlPj4+MTR8MTI4KSksdC5wdXNoKDI1NSYoZT4+Pjd8MTI4KSksdC5wdXNoKDEyNyZlKSl9aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmdcIik7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGUmJihlPWEuT0lEKSwhL14oWzAtOV0rXFwuKXszLH1bMC05XSskLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcihcImFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIE9JRCBzdHJpbmdcIik7dmFyIG49dC5zcGxpdChcIi5cIiksaT1bXTtpLnB1c2goNDAqcGFyc2VJbnQoblswXSwxMCkrcGFyc2VJbnQoblsxXSwxMCkpLG4uc2xpY2UoMikuZm9yRWFjaChmdW5jdGlvbih0KXtyKGkscGFyc2VJbnQodCwxMCkpfSk7dmFyIG89dGhpczt0aGlzLl9lbnN1cmUoMitpLmxlbmd0aCksdGhpcy53cml0ZUJ5dGUoZSksdGhpcy53cml0ZUxlbmd0aChpLmxlbmd0aCksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe28ud3JpdGVCeXRlKHQpfSl9LGkucHJvdG90eXBlLndyaXRlTGVuZ3RoPWZ1bmN0aW9uKHQpe2lmKFwibnVtYmVyXCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBtdXN0IGJlIGEgTnVtYmVyXCIpO2lmKHRoaXMuX2Vuc3VyZSg0KSx0PD0xMjcpdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXT10O2Vsc2UgaWYodDw9MjU1KXRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK109MTI5LHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK109dDtlbHNlIGlmKHQ8PTY1NTM1KXRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK109MTMwLHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK109dD4+OCx0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdPXQ7ZWxzZXtpZighKHQ8PTE2Nzc3MjE1KSl0aHJvdyBuZXcgSW52YWxpZEFzbjFFUnJvcihcIkxlbmd0aCB0b28gbG9uZyAoPiA0IGJ5dGVzKVwiKTt0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdPTEzMSx0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdPXQ+PjE2LHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK109dD4+OCx0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdPXR9fSxpLnByb3RvdHlwZS5zdGFydFNlcXVlbmNlPWZ1bmN0aW9uKHQpe1wibnVtYmVyXCIhPXR5cGVvZiB0JiYodD1hLlNlcXVlbmNlfGEuQ29uc3RydWN0b3IpLHRoaXMud3JpdGVCeXRlKHQpLHRoaXMuX3NlcS5wdXNoKHRoaXMuX29mZnNldCksdGhpcy5fZW5zdXJlKDMpLHRoaXMuX29mZnNldCs9M30saS5wcm90b3R5cGUuZW5kU2VxdWVuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zZXEucG9wKCksZT10KzMscj10aGlzLl9vZmZzZXQtZTtpZihyPD0xMjcpdGhpcy5fc2hpZnQoZSxyLC0yKSx0aGlzLl9idWZbdF09cjtlbHNlIGlmKHI8PTI1NSl0aGlzLl9zaGlmdChlLHIsLTEpLHRoaXMuX2J1Zlt0XT0xMjksdGhpcy5fYnVmW3QrMV09cjtlbHNlIGlmKHI8PTY1NTM1KXRoaXMuX2J1Zlt0XT0xMzAsdGhpcy5fYnVmW3QrMV09cj4+OCx0aGlzLl9idWZbdCsyXT1yO2Vsc2V7aWYoIShyPD0xNjc3NzIxNSkpdGhyb3cgbmV3IEludmFsaWRBc24xRXJyb3IoXCJTZXF1ZW5jZSB0b28gbG9uZ1wiKTt0aGlzLl9zaGlmdChlLHIsMSksdGhpcy5fYnVmW3RdPTEzMSx0aGlzLl9idWZbdCsxXT1yPj4xNix0aGlzLl9idWZbdCsyXT1yPj44LHRoaXMuX2J1Zlt0KzNdPXJ9fSxpLnByb3RvdHlwZS5fc2hpZnQ9ZnVuY3Rpb24odCxlLHIpe28ub2sodm9pZCAwIT09dCksby5vayh2b2lkIDAhPT1lKSxvLm9rKHIpLHRoaXMuX2J1Zi5jb3B5KHRoaXMuX2J1Zix0K3IsdCx0K2UpLHRoaXMuX29mZnNldCs9cn0saS5wcm90b3R5cGUuX2Vuc3VyZT1mdW5jdGlvbih0KXtpZihvLm9rKHQpLHRoaXMuX3NpemUtdGhpcy5fb2Zmc2V0PHQpe3ZhciByPXRoaXMuX3NpemUqdGhpcy5fb3B0aW9ucy5ncm93dGhGYWN0b3I7ci10aGlzLl9vZmZzZXQ8dCYmKHIrPXQpO3ZhciBuPW5ldyBlKHIpO3RoaXMuX2J1Zi5jb3B5KG4sMCwwLHRoaXMuX29mZnNldCksdGhpcy5fYnVmPW4sdGhpcy5fc2l6ZT1yfX0sdC5leHBvcnRzPWl9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyNTQpO3QuZXhwb3J0cz17QmVyOm4sQmVyUmVhZGVyOm4uUmVhZGVyLEJlcldyaXRlcjpuLldyaXRlcn19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiByJiZ0KGUucHJvdG90eXBlLHIpLG4mJnQoZSxuKSxlfX0oKSxvPXIoOTMpLGE9cigxMTQpLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe24odGhpcyx0KSxlPWV8fHt9LHRoaXMuaGFzaEFsZ29yaXRobT1lLmhhc2hBbGdvcml0aG18fFwic2hhMjU2XCIsdGhpcy5oYXNoTGVuZ3RoPWEuZ2V0TGVuZ3RoKHRoaXMuaGFzaEFsZ29yaXRobSksdGhpcy5zYWx0TGVuZ3RoPXRoaXMuaGFzaExlbmd0aH1yZXR1cm4gaSh0LFt7a2V5OlwiZ2VuZXJhdGVcIix2YWx1ZTpmdW5jdGlvbih0LHIpe2Zvcih2YXIgbj1uZXcgZShyKSxpPU1hdGguY2VpbChyL3RoaXMuaGFzaExlbmd0aCksYT0wO2E8aTthKyspe3ZhciBmPW5ldyBlKDQpO2Yud3JpdGVJbnQzMkJFKGEsMCk7dmFyIHM9by5jcmVhdGVIYXNoKHRoaXMuaGFzaEFsZ29yaXRobSkudXBkYXRlKHQpLnVwZGF0ZShmKS5kaWdlc3QoKTtzLmNvcHkobixhKnRoaXMuaGFzaExlbmd0aCl9cmV0dXJuIG59fV0pLHR9KCk7dC5leHBvcnRzPWZ9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbj1lW3JdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gciYmdChlLnByb3RvdHlwZSxyKSxuJiZ0KGUsbiksZX19KCksbz1yKDkzKSxhPXIoMjU4KSxmPXIoMjY3KSxzPXIoMTE0KSx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtuKHRoaXMsdCksZT1lfHx7fSx0aGlzLmhhc2hBbGdvcml0aG09ZS5oYXNoQWxnb3JpdGhtfHxcInNoYTI1NlwiLHRoaXMuaGFzaExlbmd0aD1zLmdldExlbmd0aCh0aGlzLmhhc2hBbGdvcml0aG0pLHRoaXMuc2FsdExlbmd0aD10aGlzLmhhc2hMZW5ndGh9cmV0dXJuIGkodCxbe2tleTpcImVuY29kZVwiLHZhbHVlOmZ1bmN0aW9uKHQscil7dmFyIG49TWF0aC5jZWlsKHIvOCksaT1vLmNyZWF0ZUhhc2godGhpcy5oYXNoQWxnb3JpdGhtKS51cGRhdGUodCkuZGlnZXN0KCk7aWYobjx0aGlzLmhhc2hMZW5ndGgrdGhpcy5zYWx0TGVuZ3RoKzIpdGhyb3cgbmV3IEVycm9yKFwiRW5jb2RpbmcgZXJyb3I6IFJTQSBtb2R1bHVzIGlzIHRvbyBzbWFsbCBmb3IgXCIrdGhpcy5oYXNoQWxnb3JpdGhtKTt2YXIgcz1vLnJhbmRvbUJ5dGVzKHRoaXMuc2FsdExlbmd0aCksdT1vLmNyZWF0ZUhhc2godGhpcy5oYXNoQWxnb3JpdGhtKS51cGRhdGUobmV3IGUoOCkuZmlsbCgwKSkudXBkYXRlKGkpLnVwZGF0ZShzKS5kaWdlc3QoKSxoPWUuY29uY2F0KFtuZXcgZShuLXRoaXMuc2FsdExlbmd0aC10aGlzLmhhc2hMZW5ndGgtMikuZmlsbCgwKSxuZXcgZShbMV0pLHNdKSxjPW5ldyBhKHtoYXNoQWxnb3JpdGhtOnRoaXMuaGFzaEFsZ29yaXRobX0pLGQ9Yy5nZW5lcmF0ZSh1LG4tdGhpcy5oYXNoTGVuZ3RoLTEpLGw9ZihoLGQpO3JldHVybiBsWzBdJj0yNTU+Pj44Km4tcixlLmNvbmNhdChbbCx1LG5ldyBlKFsxODhdKV0pfX0se2tleTpcInZlcmlmeVwiLHZhbHVlOmZ1bmN0aW9uKHQscixuKXt2YXIgaT1NYXRoLmNlaWwobi84KSxzPW8uY3JlYXRlSGFzaCh0aGlzLmhhc2hBbGdvcml0aG0pLnVwZGF0ZSh0KS5kaWdlc3QoKTtpZihpPHRoaXMuaGFzaExlbmd0aCt0aGlzLnNhbHRMZW5ndGgrMilyZXR1cm4hMTtpZigxODghPT1yW3IubGVuZ3RoLTFdKXJldHVybiExO3ZhciB1PWktdGhpcy5oYXNoTGVuZ3RoLTEsaD1yLnNsaWNlKDAsdSksYz1yLnNsaWNlKHUsdSt0aGlzLmhhc2hMZW5ndGgpLGQ9MjU1Pj4+OCppLW47aWYoaFswXSZ+ZClyZXR1cm4hMTt2YXIgbD1uZXcgYSh7aGFzaEFsZ29yaXRobTp0aGlzLmhhc2hBbGdvcml0aG19KSxwPWwuZ2VuZXJhdGUoYyxpLXRoaXMuaGFzaExlbmd0aC0xKSxiPWYoaCxwKTtiWzBdJj1kO2Zvcih2YXIgdj1pLXRoaXMuaGFzaExlbmd0aC10aGlzLnNhbHRMZW5ndGgtMix5PTA7eTx2O3krKylpZigwIT09Ylt5XSlyZXR1cm4hMTtpZigxIT09Ylt2XSlyZXR1cm4hMTt2YXIgbT1iLnNsaWNlKGIubGVuZ3RoLXRoaXMuc2FsdExlbmd0aCksZz1vLmNyZWF0ZUhhc2godGhpcy5oYXNoQWxnb3JpdGhtKS51cGRhdGUobmV3IGUoOCkuZmlsbCgwKSkudXBkYXRlKHMpLnVwZGF0ZShtKS5kaWdlc3QoKTtyZXR1cm4gMD09PWUuY29tcGFyZShjLGcpfX1dKSx0fSgpO3UuRU1QVFlfQlVGRkVSPW5ldyBlKDApLHQuZXhwb3J0cz11fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiOyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX12YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksbiYmdChlLG4pLGV9fSgpLG89cig5MyksYT1yKDQ2NCksZj1yKDI1OSkscz1yKDE2MSksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7bih0aGlzLHQpLGU9ZXx8e30sdGhpcy5oYXNoQWxnb3JpdGhtPWUuaGFzaEFsZ29yaXRobXx8XCJzaGEyNTZcIix0aGlzLnBzcz1uZXcgZih7aGFzaEFsZ29yaXRobTp0aGlzLmhhc2hBbGdvcml0aG19KX1yZXR1cm4gaSh0LFt7a2V5Olwic2lnblwiLHZhbHVlOmZ1bmN0aW9uKHIsbil7dmFyIGk9cy5tb2R1bHVzRnJvbVByaXZhdGVLZXkociksZj1pWzBdLnRvU3RyaW5nKDIpLmxlbmd0aCx1PTgqKGkubGVuZ3RoLTEpK2YsaD10aGlzLnBzcy5lbmNvZGUobix1LTEpLGM9aC5sZW5ndGg8aS5sZW5ndGg/ZS5jb25jYXQoW3QuWkVST19CWVRFLGhdKTpoO3JldHVybiBvLnByaXZhdGVFbmNyeXB0KHtrZXk6cixwYWRkaW5nOmEuUlNBX05PX1BBRERJTkd9LGMpfX0se2tleTpcInZlcmlmeVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1zLm1vZHVsdXNUb1BlbSh0KSxpPW8ucHVibGljRGVjcnlwdCh7a2V5Om4scGFkZGluZzphLlJTQV9OT19QQURESU5HfSxyKSxmPXRbMF0udG9TdHJpbmcoMikubGVuZ3RoLHU9OCoodC5sZW5ndGgtMSkrZixoPXUlOD09PTE/aS5zbGljZSgxKTppO3JldHVybiB0aGlzLnBzcy52ZXJpZnkoZSxoLHUtMSl9fV0pLHR9KCk7dS5aRVJPX0JZVEU9bmV3IGUoWzBdKSx0LmV4cG9ydHM9dX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBpKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiFlfHxcIm9iamVjdFwiIT10eXBlb2YgZSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gbyh0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfXZhciBhPXIoNjIpLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBuKHRoaXMsZSksaSh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBvKGUsdCksZX0oYSk7dC5leHBvcnRzPWZ9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksbiYmdChlLG4pLGV9fSgpLGY9cig0ODgpLHM9cig2MyksdT1yKDUzKSxoPXIoMTYwKSxjPXZvaWQgMDt0cnl7Yz1yKDQ2Mil9Y2F0Y2godCl7fXZhciBkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoKXtuKHRoaXMscik7dmFyIHQ9aSh0aGlzLChyLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpKS5jYWxsKHRoaXMpKTtyZXR1cm4gdC5wdWJsaWNLZXk9bnVsbCx0LnNpZ25hdHVyZT1udWxsLHR9cmV0dXJuIG8ocix0KSxhKHIsW3trZXk6XCJzZXRQdWJsaWNLZXlcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighZS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHVibGljIGtleSBtdXN0IGJlIGEgQnVmZmVyLCB3YXM6IFwiK3QpO2lmKDMyIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiUHVibGljIGtleSBtdXN0IGJlIDMyIGJ5dGVzLCB3YXM6IFwiK3QubGVuZ3RoKTt0aGlzLnB1YmxpY0tleT10fX0se2tleTpcInNldFNpZ25hdHVyZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTaWduYXR1cmUgbXVzdCBiZSBhIEJ1ZmZlciwgd2FzOiBcIit0KTtpZig2NCE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIlNpZ25hdHVyZSBtdXN0IGJlIDY0IGJ5dGVzLCB3YXM6IFwiK3QubGVuZ3RoKTt0aGlzLnNpZ25hdHVyZT10fX0se2tleTpcInNpZ25cIix2YWx1ZTpmdW5jdGlvbih0LHIpe2lmKCFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyB1KFwiTWVzc2FnZSBtdXN0IGJlIGEgQnVmZmVyXCIpO2lmKCFlLmlzQnVmZmVyKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGtleSBtdXN0IGJlIGEgQnVmZmVyLCB3YXM6IFwiK3IpO2lmKDMyIT09ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiUHJpdmF0ZSBrZXkgbXVzdCBiZSAzMiBieXRlcywgd2FzOiBcIityLmxlbmd0aCk7aWYoYyl7dmFyIG49Yy5NYWtlS2V5cGFpcihyKTt0aGlzLnNldFB1YmxpY0tleShuLnB1YmxpY0tleSksdGhpcy5zaWduYXR1cmU9Yy5TaWduKHQsbil9ZWxzZXt2YXIgaT1mLnNpZ24ua2V5UGFpci5mcm9tU2VlZChyKTt0aGlzLnNldFB1YmxpY0tleShuZXcgZShpLnB1YmxpY0tleSkpLHRoaXMuc2lnbmF0dXJlPW5ldyBlKGYuc2lnbi5kZXRhY2hlZCh0LGkuc2VjcmV0S2V5KSl9fX0se2tleTpcImdlbmVyYXRlSGFzaFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMucHVibGljS2V5KXRocm93IG5ldyB1KFwiUmVxdWlyZXMgYSBwdWJsaWMga2V5XCIpO3JldHVybiB0aGlzLnB1YmxpY0tleX19LHtrZXk6XCJwYXJzZVBheWxvYWRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnNldFB1YmxpY0tleSh0LnJlYWRPY3RldFN0cmluZyhyLlBVQktFWV9MRU5HVEgpKSx0aGlzLnNldFNpZ25hdHVyZSh0LnJlYWRPY3RldFN0cmluZyhyLlNJR05BVFVSRV9MRU5HVEgpKX19LHtrZXk6XCJ3cml0ZVBheWxvYWRcIix2YWx1ZTpmdW5jdGlvbih0KXt0LndyaXRlT2N0ZXRTdHJpbmcodGhpcy5wdWJsaWNLZXksci5QVUJLRVlfTEVOR1RIKSx0LndyaXRlT2N0ZXRTdHJpbmcodGhpcy5zaWduYXR1cmUsci5TSUdOQVRVUkVfTEVOR1RIKX19LHtrZXk6XCJjYWxjdWxhdGVNYXhGdWxmaWxsbWVudExlbmd0aFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHIuRlVMRklMTE1FTlRfTEVOR1RIfX0se2tleTpcInZhbGlkYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIWUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lc3NhZ2UgbXVzdCBiZSBhIEJ1ZmZlclwiKTt2YXIgcj12b2lkIDA7aWYocj1jP2MuVmVyaWZ5KHQsdGhpcy5zaWduYXR1cmUsdGhpcy5wdWJsaWNLZXkpOmYuc2lnbi5kZXRhY2hlZC52ZXJpZnkodCx0aGlzLnNpZ25hdHVyZSx0aGlzLnB1YmxpY0tleSksciE9PSEwKXRocm93IG5ldyBoKFwiSW52YWxpZCBlZDI1NTE5IHNpZ25hdHVyZVwiKTtyZXR1cm4hMH19XSkscn0ocyk7ZC5UWVBFX0lEPTQsZC5GRUFUVVJFX0JJVE1BU0s9MzIsZC5QVUJLRVlfTEVOR1RIPTMyLGQuU0lHTkFUVVJFX0xFTkdUSD02NCxkLkZVTEZJTExNRU5UX0xFTkdUSD1kLlBVQktFWV9MRU5HVEgrZC5TSUdOQVRVUkVfTEVOR1RILHQuZXhwb3J0cz1kfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiOyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBpKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiFlfHxcIm9iamVjdFwiIT10eXBlb2YgZSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gbyh0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfXZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbj1lW3JdO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gciYmdChlLnByb3RvdHlwZSxyKSxuJiZ0KGUsbiksZX19KCksZj1mdW5jdGlvbiB0KGUscixuKXtudWxsPT09ZSYmKGU9RnVuY3Rpb24ucHJvdG90eXBlKTt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUscik7aWYodm9pZCAwPT09aSl7dmFyIG89T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09bz92b2lkIDA6dChvLHIsbil9aWYoXCJ2YWx1ZVwiaW4gaSlyZXR1cm4gaS52YWx1ZTt2YXIgYT1pLmdldDtpZih2b2lkIDAhPT1hKXJldHVybiBhLmNhbGwobil9LHM9cig3NSksdT1yKDYzKSxoPXIoNzYpLGM9cig5MCksZD1yKDUzKSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoKXtuKHRoaXMscik7dmFyIHQ9aSh0aGlzLChyLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpKS5jYWxsKHRoaXMpKTtyZXR1cm4gdC5zdWJjb25kaXRpb249bnVsbCx0fXJldHVybiBvKHIsdCksYShyLFt7a2V5Olwic2V0U3ViY29uZGl0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpdD1zLmZyb21VcmkodCk7ZWxzZSBpZighKHQgaW5zdGFuY2VvZiBzKSl0aHJvdyBuZXcgRXJyb3IoXCJTdWJjb25kaXRpb25zIG11c3QgYmUgVVJJcyBvciBvYmplY3RzIG9mIHR5cGUgQ29uZGl0aW9uXCIpO3RoaXMuc3ViY29uZGl0aW9uPXR9fSx7a2V5Olwic2V0U3ViZnVsZmlsbG1lbnRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl0PXUuZnJvbVVyaSh0KTtlbHNlIGlmKCEodCBpbnN0YW5jZW9mIHUpKXRocm93IG5ldyBFcnJvcihcIlN1YmZ1bGZpbGxtZW50cyBtdXN0IGJlIG9iamVjdHMgb2YgdHlwZSBGdWxmaWxsbWVudFwiKTt0aGlzLnN1YmNvbmRpdGlvbj10fX0se2tleTpcInNldFByZWZpeFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcmVmaXggbXVzdCBiZSBhIEJ1ZmZlciwgd2FzOiBcIit0KTt0aGlzLnByZWZpeD10fX0se2tleTpcImdldEJpdG1hc2tcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBmKHIucHJvdG90eXBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHIucHJvdG90eXBlKSxcImdldEJpdG1hc2tcIix0aGlzKS5jYWxsKHRoaXMpfHRoaXMuc3ViY29uZGl0aW9uLmdldEJpdG1hc2soKX19LHtrZXk6XCJ3cml0ZUhhc2hQYXlsb2FkXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXRoaXMuc3ViY29uZGl0aW9uKXRocm93IG5ldyBkKFwiUmVxdWlyZXMgc3ViY29uZGl0aW9uXCIpO3Qud3JpdGVWYXJPY3RldFN0cmluZyh0aGlzLnByZWZpeCksdC53cml0ZSh0aGlzLnN1YmNvbmRpdGlvbiBpbnN0YW5jZW9mIHM/dGhpcy5zdWJjb25kaXRpb24uc2VyaWFsaXplQmluYXJ5KCk6dGhpcy5zdWJjb25kaXRpb24uZ2V0Q29uZGl0aW9uQmluYXJ5KCkpfX0se2tleTpcImNhbGN1bGF0ZU1heEZ1bGZpbGxtZW50TGVuZ3RoXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN1YmNvbmRpdGlvbiBpbnN0YW5jZW9mIHM/dGhpcy5zdWJjb25kaXRpb24uZ2V0TWF4RnVsZmlsbG1lbnRMZW5ndGgoKTp0aGlzLnN1YmNvbmRpdGlvbi5nZXRDb25kaXRpb24oKS5nZXRNYXhGdWxmaWxsbWVudExlbmd0aCgpLGU9bmV3IGM7cmV0dXJuIGUud3JpdGVWYXJPY3RldFN0cmluZyh0aGlzLnByZWZpeCksZS5za2lwKHQpLGUuZ2V0U2l6ZSgpfX0se2tleTpcInBhcnNlUGF5bG9hZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2V0UHJlZml4KHQucmVhZFZhck9jdGV0U3RyaW5nKCkpLHRoaXMuc2V0U3ViZnVsZmlsbG1lbnQodS5mcm9tQmluYXJ5KHQpKX19LHtrZXk6XCJ3cml0ZVBheWxvYWRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighKHRoaXMuc3ViY29uZGl0aW9uIGluc3RhbmNlb2YgdSkpdGhyb3cgbmV3IEVycm9yKFwiU3ViY29uZGl0aW9uIG11c3QgYmUgZnVsZmlsbGVkXCIpO3Qud3JpdGVWYXJPY3RldFN0cmluZyh0aGlzLnByZWZpeCksdC53cml0ZSh0aGlzLnN1YmNvbmRpdGlvbi5zZXJpYWxpemVCaW5hcnkoKSl9fSx7a2V5OlwidmFsaWRhdGVcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighKHRoaXMuc3ViY29uZGl0aW9uIGluc3RhbmNlb2YgdSkpdGhyb3cgbmV3IEVycm9yKFwiU3ViY29uZGl0aW9uIGlzIG5vdCBhIGZ1bGZpbGxtZW50XCIpO2lmKCFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyBFcnJvcihcIk1lc3NhZ2UgbXVzdCBiZSBwcm92aWRlZCBhcyBhIEJ1ZmZlciwgd2FzOiBcIit0KTtyZXR1cm4gdGhpcy5zdWJjb25kaXRpb24udmFsaWRhdGUoZS5jb25jYXQoW3RoaXMucHJlZml4LHRdKSl9fV0pLHJ9KGgpO2wuVFlQRV9JRD0xLGwuRkVBVFVSRV9CSVRNQVNLPTUsbC5wcm90b3R5cGUuc2V0U3ViY29uZGl0aW9uVXJpPWwucHJvdG90eXBlLnNldFN1YmNvbmRpdGlvbixsLnByb3RvdHlwZS5zZXRTdWJmdWxmaWxsbWVudFVyaT1sLnByb3RvdHlwZS5zZXRTdWJmdWxmaWxsbWVudCx0LmV4cG9ydHM9bH0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksbiYmdChlLG4pLGV9fSgpLGY9cig3Nikscz1yKDUzKSx1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gbih0aGlzLHIpLGkodGhpcywoci5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihyKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gbyhyLHQpLGEocixbe2tleTpcIndyaXRlSGFzaFBheWxvYWRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdGhpcy5wcmVpbWFnZSl0aHJvdyBuZXcgcyhcIkNvdWxkIG5vdCBjYWxjdWxhdGUgaGFzaCwgbm8gcHJlaW1hZ2UgcHJvdmlkZWRcIik7dC53cml0ZSh0aGlzLnByZWltYWdlKX19LHtrZXk6XCJzZXRQcmVpbWFnZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcmVpbWFnZSBtdXN0IGJlIGEgYnVmZmVyLCB3YXM6IFwiK3QpO3RoaXMucHJlaW1hZ2U9dH19LHtrZXk6XCJwYXJzZVBheWxvYWRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuc2V0UHJlaW1hZ2UodC5yZWFkKGUpKX19LHtrZXk6XCJ3cml0ZVBheWxvYWRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdGhpcy5wcmVpbWFnZSl0aHJvdyBuZXcgcyhcIlByZWltYWdlIG11c3QgYmUgc3BlY2lmaWVkXCIpO3Qud3JpdGUodGhpcy5wcmVpbWFnZSl9fSx7a2V5OlwidmFsaWRhdGVcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hMH19XSkscn0oZik7dS5UWVBFX0lEPTAsdS5GRUFUVVJFX0JJVE1BU0s9Myx0LmV4cG9ydHM9dX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksbiYmdChlLG4pLGV9fSgpLGY9cigyNjApLHM9cigxNjEpLHU9cig3NiksaD1yKDkwKSxjPXIoNTMpLGQ9cigxNjApLGw9bmV3IGYscD1mdW5jdGlvbih0KXtmdW5jdGlvbiByKCl7bih0aGlzLHIpO3ZhciB0PWkodGhpcywoci5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihyKSkuY2FsbCh0aGlzKSk7cmV0dXJuIHQubW9kdWx1cz1udWxsLHQuc2lnbmF0dXJlPW51bGwsdH1yZXR1cm4gbyhyLHQpLGEocixbe2tleTpcIndyaXRlQ29tbW9uSGVhZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXRoaXMubW9kdWx1cyl0aHJvdyBuZXcgYyhcIlJlcXVpcmVzIGEgcHVibGljIG1vZHVsdXNcIik7dC53cml0ZVZhck9jdGV0U3RyaW5nKHRoaXMubW9kdWx1cyl9fSx7a2V5Olwic2V0UHVibGljTW9kdWx1c1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCFlLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJNb2R1bHVzIG11c3QgYmUgYSBidWZmZXIsIHdhczogXCIrdCk7aWYoMD09PXRbMF0pdGhyb3cgbmV3IEVycm9yKFwiTW9kdWx1cyBtYXkgbm90IGNvbnRhaW4gbGVhZGluZyB6ZXJvc1wiKTtpZih0Lmxlbmd0aD41MTJ8fHQubGVuZ3RoPDEyOCl0aHJvdyBuZXcgRXJyb3IoXCJNb2R1bHVzIG11c3QgYmUgYmV0d2VlbiAxMjggYnl0ZXMgKDEwMTcgYml0cykgYW5kIDUxMiBieXRlcyAoNDA5NiBiaXRzKSwgd2FzOiBcIit0Lmxlbmd0aCtcIiBieXRlc1wiKTt0aGlzLm1vZHVsdXM9dH19LHtrZXk6XCJzZXRTaWduYXR1cmVcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighZS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2lnbmF0dXJlIG11c3QgYmUgYSBidWZmZXIsIHdhczogXCIrdCk7dGhpcy5zaWduYXR1cmU9dH19LHtrZXk6XCJzaWduXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLm1vZHVsdXN8fHRoaXMuc2V0UHVibGljTW9kdWx1cyhzLm1vZHVsdXNGcm9tUHJpdmF0ZUtleShlKSksdGhpcy5zaWduYXR1cmU9bC5zaWduKGUsdCl9fSx7a2V5Olwid3JpdGVIYXNoUGF5bG9hZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMud3JpdGVDb21tb25IZWFkZXIodCl9fSx7a2V5OlwicGFyc2VQYXlsb2FkXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5zZXRQdWJsaWNNb2R1bHVzKHQucmVhZFZhck9jdGV0U3RyaW5nKCkpLHRoaXMuc2V0U2lnbmF0dXJlKHQucmVhZFZhck9jdGV0U3RyaW5nKCkpfX0se2tleTpcIndyaXRlUGF5bG9hZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLnNpZ25hdHVyZSl0aHJvdyBuZXcgYyhcIlJlcXVpcmVzIGEgc2lnbmF0dXJlXCIpO3RoaXMud3JpdGVDb21tb25IZWFkZXIodCksdC53cml0ZVZhck9jdGV0U3RyaW5nKHRoaXMuc2lnbmF0dXJlKX19LHtrZXk6XCJjYWxjdWxhdGVNYXhGdWxmaWxsbWVudExlbmd0aFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGg7aWYoIXRoaXMubW9kdWx1cyl0aHJvdyBuZXcgYyhcIlJlcXVpcmVzIGEgcHVibGljIG1vZHVsdXNcIik7cmV0dXJuIHRoaXMud3JpdGVDb21tb25IZWFkZXIodCksdC53cml0ZVZhck9jdGV0U3RyaW5nKHRoaXMubW9kdWx1cyksdC5nZXRTaXplKCl9fSx7a2V5OlwidmFsaWRhdGVcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighZS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgRXJyb3IoXCJNZXNzYWdlIG11c3QgYmUgcHJvdmlkZWQgYXMgYSBCdWZmZXIsIHdhczogXCIrdCk7dmFyIHI9bC52ZXJpZnkodGhpcy5tb2R1bHVzLHQsdGhpcy5zaWduYXR1cmUpO2lmKCFyKXRocm93IG5ldyBkKFwiSW52YWxpZCBSU0Egc2lnbmF0dXJlXCIpO3JldHVybiEwfX1dKSxyfSh1KTtwLlRZUEVfSUQ9MyxwLkZFQVRVUkVfQklUTUFTSz0xNyx0LmV4cG9ydHM9cH0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHImJnQoZS5wcm90b3R5cGUsciksbiYmdChlLG4pLGV9fSgpLGY9ZnVuY3Rpb24gdChlLHIsbil7bnVsbD09PWUmJihlPUZ1bmN0aW9uLnByb3RvdHlwZSk7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHIpO2lmKHZvaWQgMD09PWkpe3ZhciBvPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PW8/dm9pZCAwOnQobyxyLG4pfWlmKFwidmFsdWVcImluIGkpcmV0dXJuIGkudmFsdWU7dmFyIGE9aS5nZXQ7aWYodm9pZCAwIT09YSlyZXR1cm4gYS5jYWxsKG4pfSxzPXIoNzUpLHU9cig2MyksaD1yKDc2KSxjPXIoOTApLGQ9cig5MSksbD1yKDUzKSxwPXIoMTEzKSxiPXIoMTYyKSx2PW5ldyBlKDApLHk9XCJjb25kaXRpb25cIixtPVwiZnVsZmlsbG1lbnRcIixnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoKXtuKHRoaXMscik7dmFyIHQ9aSh0aGlzLChyLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpKS5jYWxsKHRoaXMpKTtyZXR1cm4gdC50aHJlc2hvbGQ9bnVsbCx0LnN1YmNvbmRpdGlvbnM9W10sdH1yZXR1cm4gbyhyLHQpLGEocixbe2tleTpcImFkZFN1YmNvbmRpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpdD1zLmZyb21VcmkodCk7ZWxzZSBpZighKHQgaW5zdGFuY2VvZiBzKSl0aHJvdyBuZXcgRXJyb3IoXCJTdWJjb25kaXRpb25zIG11c3QgYmUgVVJJcyBvciBvYmplY3RzIG9mIHR5cGUgQ29uZGl0aW9uXCIpO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBlKWU9MTtlbHNlIGlmKCFiKGUpfHxlPDEpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgd2VpZ2h0LCBub3QgYW4gaW50ZWdlcjogXCIrZSk7dGhpcy5zdWJjb25kaXRpb25zLnB1c2goe3R5cGU6eSxib2R5OnQsd2VpZ2h0OmV9KX19LHtrZXk6XCJhZGRTdWJmdWxmaWxsbWVudFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpdD11LmZyb21VcmkodCk7ZWxzZSBpZighKHQgaW5zdGFuY2VvZiB1KSl0aHJvdyBuZXcgRXJyb3IoXCJTdWJmdWxmaWxsbWVudHMgbXVzdCBiZSBVUklzIG9yIG9iamVjdHMgb2YgdHlwZSBGdWxmaWxsbWVudFwiKTtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgZSllPTE7ZWxzZSBpZighYihlKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHdlaWdodCwgbm90IGFuIGludGVnZXI6IFwiK2UpO3RoaXMuc3ViY29uZGl0aW9ucy5wdXNoKHt0eXBlOm0sYm9keTp0LHdlaWdodDplfSl9fSx7a2V5Olwic2V0VGhyZXNob2xkXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIWIodCl8fHQ8MSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhyZXNob2xkIG11c3QgYmUgYSBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvLCB3YXM6IFwiK3QpO3RoaXMudGhyZXNob2xkPXR9fSx7a2V5OlwiZ2V0Qml0bWFza1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9ZihyLnByb3RvdHlwZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihyLnByb3RvdHlwZSksXCJnZXRCaXRtYXNrXCIsdGhpcykuY2FsbCh0aGlzKSxlPSEwLG49ITEsaT12b2lkIDA7dHJ5e2Zvcih2YXIgbyxhPXRoaXMuc3ViY29uZGl0aW9uc1tTeW1ib2wuaXRlcmF0b3JdKCk7IShlPShvPWEubmV4dCgpKS5kb25lKTtlPSEwKXt2YXIgcz1vLnZhbHVlO3R8PXMuYm9keS5nZXRCaXRtYXNrKCl9fWNhdGNoKHQpe249ITAsaT10fWZpbmFsbHl7dHJ5eyFlJiZhLnJldHVybiYmYS5yZXR1cm4oKX1maW5hbGx5e2lmKG4pdGhyb3cgaX19cmV0dXJuIHR9fSx7a2V5Olwid3JpdGVIYXNoUGF5bG9hZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLnN1YmNvbmRpdGlvbnMubGVuZ3RoKXRocm93IG5ldyBsKFwiUmVxdWlyZXMgc3ViY29uZGl0aW9uc1wiKTt2YXIgZT10aGlzLnN1YmNvbmRpdGlvbnMubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBkO3JldHVybiBlLndyaXRlVmFyVUludCh0LndlaWdodCksZS53cml0ZSh0LnR5cGU9PT1tP3QuYm9keS5nZXRDb25kaXRpb25CaW5hcnkoKTp0LmJvZHkuc2VyaWFsaXplQmluYXJ5KCkpLGUuZ2V0QnVmZmVyKCl9KSxyPXRoaXMuY29uc3RydWN0b3Iuc29ydEJ1ZmZlcnMoZSk7dC53cml0ZVVJbnQzMih0aGlzLnRocmVzaG9sZCksdC53cml0ZVZhclVJbnQoci5sZW5ndGgpLHIuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdC53cml0ZShlKX0pfX0se2tleTpcImNhbGN1bGF0ZU1heEZ1bGZpbGxtZW50TGVuZ3RoXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9MCxyPXRoaXMuc3ViY29uZGl0aW9ucy5tYXAoZnVuY3Rpb24ocil7dmFyIG49dC5jb25zdHJ1Y3Rvci5wcmVkaWN0U3ViY29uZGl0aW9uTGVuZ3RoKHIpLGk9dC5jb25zdHJ1Y3Rvci5wcmVkaWN0U3ViZnVsZmlsbG1lbnRMZW5ndGgocik7cmV0dXJuIGUrPW4se3dlaWdodDpyLndlaWdodCxzaXplOmktbn19KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUud2VpZ2h0LXQud2VpZ2h0fSksbj1lK3RoaXMuY29uc3RydWN0b3IuY2FsY3VsYXRlV29yc3RDYXNlTGVuZ3RoKHRoaXMudGhyZXNob2xkLHIpO2lmKG49PT0tKDEvMCkpdGhyb3cgbmV3IGwoXCJJbnN1ZmZpY2llbnQgc3ViY29uZGl0aW9ucy93ZWlnaHRzIHRvIG1lZXQgdGhlIHRocmVzaG9sZFwiKTt2YXIgaT1uZXcgYztyZXR1cm4gaS53cml0ZVVJbnQzMih0aGlzLnRocmVzaG9sZCksaS53cml0ZVZhclVJbnQodGhpcy5zdWJjb25kaXRpb25zLmxlbmd0aCksdGhpcy5zdWJjb25kaXRpb25zLmZvckVhY2goZnVuY3Rpb24odCl7aS53cml0ZVVJbnQ4KCksMSE9PXQud2VpZ2h0JiZpLndyaXRlVUludDMyKHQud2VpZ2h0KX0pLGkuc2tpcChuKSxpLmdldFNpemUoKX19LHtrZXk6XCJwYXJzZVBheWxvYWRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnNldFRocmVzaG9sZCh0LnJlYWRWYXJVSW50KCkpO2Zvcih2YXIgZT10LnJlYWRWYXJVSW50KCkscj0wO3I8ZTtyKyspe3ZhciBuPXQucmVhZFZhclVJbnQoKSxpPXQucmVhZFZhck9jdGV0U3RyaW5nKCksbz10LnJlYWRWYXJPY3RldFN0cmluZygpO2lmKGkubGVuZ3RoJiZvLmxlbmd0aCl0aHJvdyBuZXcgcChcIlN1YmNvbmRpdGlvbnMgbWF5IG5vdCBwcm92aWRlIGJvdGggc3ViY29uZGl0aW9uIGFuZCBmdWxmaWxsbWVudC5cIik7aWYoaS5sZW5ndGgpdGhpcy5hZGRTdWJmdWxmaWxsbWVudCh1LmZyb21CaW5hcnkoaSksbik7ZWxzZXtpZighby5sZW5ndGgpdGhyb3cgbmV3IHAoXCJTdWJjb25kaXRpb25zIG11c3QgcHJvdmlkZSBlaXRoZXIgc3ViY29uZGl0aW9uIG9yIGZ1bGZpbGxtZW50LlwiKTt0aGlzLmFkZFN1YmNvbmRpdGlvbihzLmZyb21CaW5hcnkobyksbil9fX19LHtrZXk6XCJ3cml0ZVBheWxvYWRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnN1YmNvbmRpdGlvbnMubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudHlwZT09PW0/T2JqZWN0LmFzc2lnbih7fSx0LHtpbmRleDplLHNpemU6dC5ib2R5LnNlcmlhbGl6ZUJpbmFyeSgpLmxlbmd0aCxvbWl0U2l6ZTp0LmJvZHkuZ2V0Q29uZGl0aW9uQmluYXJ5KCkubGVuZ3RofSk6bnVsbH0pLmZpbHRlcihCb29sZWFuKSxyPXRoaXMuY29uc3RydWN0b3IuY2FsY3VsYXRlU21hbGxlc3RWYWxpZEZ1bGZpbGxtZW50U2V0KHRoaXMudGhyZXNob2xkLGUpLnNldCxuPXRoaXMuc3ViY29uZGl0aW9ucy5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50eXBlPT09bSYmci5pbmRleE9mKGUpPT09LTE/T2JqZWN0LmFzc2lnbih7fSx0LHt0eXBlOnksYm9keTp0LmJvZHkuZ2V0Q29uZGl0aW9uKCl9KTp0fSksaT1uLm1hcChmdW5jdGlvbih0KXt2YXIgZT1uZXcgZDtyZXR1cm4gZS53cml0ZVZhclVJbnQodC53ZWlnaHQpLGUud3JpdGVWYXJPY3RldFN0cmluZyh0LnR5cGU9PT1tP3QuYm9keS5zZXJpYWxpemVCaW5hcnkoKTp2KSxlLndyaXRlVmFyT2N0ZXRTdHJpbmcodC50eXBlPT09eT90LmJvZHkuc2VyaWFsaXplQmluYXJ5KCk6diksZS5nZXRCdWZmZXIoKX0pLG89dGhpcy5jb25zdHJ1Y3Rvci5zb3J0QnVmZmVycyhpKTt0LndyaXRlVmFyVUludCh0aGlzLnRocmVzaG9sZCksdC53cml0ZVZhclVJbnQoby5sZW5ndGgpLG8uZm9yRWFjaCh0LndyaXRlLmJpbmQodCkpfX0se2tleTpcInZhbGlkYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zdWJjb25kaXRpb25zLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT09bX0pLHI9MS8wLG49ZS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gcj1NYXRoLm1pbihyLGUud2VpZ2h0KSx0K2Uud2VpZ2h0fSwwKTtpZihuPHRoaXMudGhyZXNob2xkKXRocm93IG5ldyBFcnJvcihcIlRocmVzaG9sZCBub3QgbWV0XCIpO2lmKHRoaXMudGhyZXNob2xkK3I8PW4pdGhyb3cgbmV3IEVycm9yKFwiRnVsZmlsbG1lbnQgaXMgbm90IG1pbmltYWxcIik7cmV0dXJuIGUuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYm9keS52YWxpZGF0ZSh0KX0pfX1dLFt7a2V5OlwicHJlZGljdFN1YmNvbmRpdGlvbkxlbmd0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGU9PT1tP3QuYm9keS5nZXRDb25kaXRpb25CaW5hcnkoKS5sZW5ndGg6dC5ib2R5LnNlcmlhbGl6ZUJpbmFyeSgpLmxlbmd0aH19LHtrZXk6XCJwcmVkaWN0U3ViZnVsZmlsbG1lbnRMZW5ndGhcIixcbnZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQudHlwZT09PW0/dC5ib2R5LmdldENvbmRpdGlvbigpLmdldE1heEZ1bGZpbGxtZW50TGVuZ3RoKCk6dC5ib2R5LmdldE1heEZ1bGZpbGxtZW50TGVuZ3RoKCkscj1uZXcgYztyZXR1cm4gci53cml0ZVVJbnQxNigpLHIud3JpdGVWYXJPY3RldFN0cmluZyh7bGVuZ3RoOmV9KSxyLmdldFNpemUoKX19LHtrZXk6XCJjYWxjdWxhdGVXb3JzdENhc2VMZW5ndGhcIix2YWx1ZTpmdW5jdGlvbih0LGUscil7aWYocj1yfHwwLHQ8PTApcmV0dXJuIDA7aWYocjxlLmxlbmd0aCl7dmFyIG49ZVtyXTtyZXR1cm4gTWF0aC5tYXgobi5zaXplK3RoaXMuY2FsY3VsYXRlV29yc3RDYXNlTGVuZ3RoKHQtbi53ZWlnaHQsZSxyKzEpLHRoaXMuY2FsY3VsYXRlV29yc3RDYXNlTGVuZ3RoKHQsZSxyKzEpKX1yZXR1cm4tKDEvMCl9fSx7a2V5OlwiY2FsY3VsYXRlU21hbGxlc3RWYWxpZEZ1bGZpbGxtZW50U2V0XCIsdmFsdWU6ZnVuY3Rpb24odCxlLHIpe2lmKHI9cnx8e2luZGV4OjAsc2l6ZTowLHNldDpbXX0sdDw9MClyZXR1cm57c2l6ZTpyLnNpemUsc2V0OnIuc2V0fTtpZihyLmluZGV4PGUubGVuZ3RoKXt2YXIgbj1lW3IuaW5kZXhdLGk9dGhpcy5jYWxjdWxhdGVTbWFsbGVzdFZhbGlkRnVsZmlsbG1lbnRTZXQodC1uLndlaWdodCxlLHtzaXplOnIuc2l6ZStuLnNpemUsaW5kZXg6ci5pbmRleCsxLHNldDpyLnNldC5jb25jYXQobi5pbmRleCl9KSxvPXRoaXMuY2FsY3VsYXRlU21hbGxlc3RWYWxpZEZ1bGZpbGxtZW50U2V0KHQsZSx7c2l6ZTpyLnNpemUrbi5vbWl0U2l6ZSxpbmRleDpyLmluZGV4KzEsc2V0OnIuc2V0fSk7cmV0dXJuIGkuc2l6ZTxvLnNpemU/aTpvfXJldHVybntzaXplOjEvMH19fSx7a2V5Olwic29ydEJ1ZmZlcnNcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5zbGljZSgpLnNvcnQoZnVuY3Rpb24odCxyKXtyZXR1cm4gdC5sZW5ndGghPT1yLmxlbmd0aD90Lmxlbmd0aC1yLmxlbmd0aDplLmNvbXBhcmUodCxyKX0pfX1dKSxyfShoKTtnLlRZUEVfSUQ9MixnLkZFQVRVUkVfQklUTUFTSz05LGcucHJvdG90eXBlLmFkZFN1YmNvbmRpdGlvblVyaT1nLnByb3RvdHlwZS5hZGRTdWJjb25kaXRpb24sZy5wcm90b3R5cGUuYWRkU3ViZnVsZmlsbG1lbnRVcmk9Zy5wcm90b3R5cGUuYWRkU3ViZnVsZmlsbG1lbnQsdC5leHBvcnRzPWd9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIodCxyKXtpZighZS5pc0J1ZmZlcih0KXx8IWUuaXNCdWZmZXIocikpdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnRzIG11c3QgYmUgYnVmZmVyc1wiKTtpZih0Lmxlbmd0aCE9PXIubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIkJ1ZmZlcnMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGhcIik7Zm9yKHZhciBuPW5ldyBlKHQubGVuZ3RoKSxpPTA7aTx0Lmxlbmd0aDtpKyspbltpXT10W2ldXnJbaV07cmV0dXJuIG59dC5leHBvcnRzPXJ9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUscil7IWZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlLHIsbil7dmFyIGk9T2JqZWN0LmNyZWF0ZSgoZXx8bykucHJvdG90eXBlKSxhPW5ldyBwKG58fFtdKTtyZXR1cm4gaS5faW52b2tlPWModCxyLGEpLGl9ZnVuY3Rpb24gaSh0LGUscil7dHJ5e3JldHVybnt0eXBlOlwibm9ybWFsXCIsYXJnOnQuY2FsbChlLHIpfX1jYXRjaCh0KXtyZXR1cm57dHlwZTpcInRocm93XCIsYXJnOnR9fX1mdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGEoKXt9ZnVuY3Rpb24gZigpe31mdW5jdGlvbiBzKHQpe1tcIm5leHRcIixcInRocm93XCIsXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbnZva2UoZSx0KX19KX1mdW5jdGlvbiB1KHQpe3RoaXMuYXJnPXR9ZnVuY3Rpb24gaCh0KXtmdW5jdGlvbiBlKHIsbixvLGEpe3ZhciBmPWkodFtyXSx0LG4pO2lmKFwidGhyb3dcIiE9PWYudHlwZSl7dmFyIHM9Zi5hcmcsaD1zLnZhbHVlO3JldHVybiBoIGluc3RhbmNlb2YgdT9Qcm9taXNlLnJlc29sdmUoaC5hcmcpLnRoZW4oZnVuY3Rpb24odCl7ZShcIm5leHRcIix0LG8sYSl9LGZ1bmN0aW9uKHQpe2UoXCJ0aHJvd1wiLHQsbyxhKX0pOlByb21pc2UucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uKHQpe3MudmFsdWU9dCxvKHMpfSxhKX1hKGYuYXJnKX1mdW5jdGlvbiBuKHQscil7ZnVuY3Rpb24gbigpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLGkpe2UodCxyLG4saSl9KX1yZXR1cm4gbz1vP28udGhlbihuLG4pOm4oKX1cIm9iamVjdFwiPT10eXBlb2YgciYmci5kb21haW4mJihlPXIuZG9tYWluLmJpbmQoZSkpO3ZhciBvO3RoaXMuX2ludm9rZT1ufWZ1bmN0aW9uIGModCxlLHIpe3ZhciBuPUU7cmV0dXJuIGZ1bmN0aW9uKG8sYSl7aWYobj09PWspdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtpZihuPT09eCl7aWYoXCJ0aHJvd1wiPT09byl0aHJvdyBhO3JldHVybiB2KCl9Zm9yKDs7KXt2YXIgZj1yLmRlbGVnYXRlO2lmKGYpe2lmKFwicmV0dXJuXCI9PT1vfHxcInRocm93XCI9PT1vJiZmLml0ZXJhdG9yW29dPT09eSl7ci5kZWxlZ2F0ZT1udWxsO3ZhciBzPWYuaXRlcmF0b3IucmV0dXJuO2lmKHMpe3ZhciB1PWkocyxmLml0ZXJhdG9yLGEpO2lmKFwidGhyb3dcIj09PXUudHlwZSl7bz1cInRocm93XCIsYT11LmFyZztjb250aW51ZX19aWYoXCJyZXR1cm5cIj09PW8pY29udGludWV9dmFyIHU9aShmLml0ZXJhdG9yW29dLGYuaXRlcmF0b3IsYSk7aWYoXCJ0aHJvd1wiPT09dS50eXBlKXtyLmRlbGVnYXRlPW51bGwsbz1cInRocm93XCIsYT11LmFyZztjb250aW51ZX1vPVwibmV4dFwiLGE9eTt2YXIgaD11LmFyZztpZighaC5kb25lKXJldHVybiBuPUEsaDtyW2YucmVzdWx0TmFtZV09aC52YWx1ZSxyLm5leHQ9Zi5uZXh0TG9jLHIuZGVsZWdhdGU9bnVsbH1pZihcIm5leHRcIj09PW8pci5zZW50PXIuX3NlbnQ9YTtlbHNlIGlmKFwidGhyb3dcIj09PW8pe2lmKG49PT1FKXRocm93IG49eCxhO3IuZGlzcGF0Y2hFeGNlcHRpb24oYSkmJihvPVwibmV4dFwiLGE9eSl9ZWxzZVwicmV0dXJuXCI9PT1vJiZyLmFicnVwdChcInJldHVyblwiLGEpO249azt2YXIgdT1pKHQsZSxyKTtpZihcIm5vcm1hbFwiPT09dS50eXBlKXtuPXIuZG9uZT94OkE7dmFyIGg9e3ZhbHVlOnUuYXJnLGRvbmU6ci5kb25lfTtpZih1LmFyZyE9PUkpcmV0dXJuIGg7ci5kZWxlZ2F0ZSYmXCJuZXh0XCI9PT1vJiYoYT15KX1lbHNlXCJ0aHJvd1wiPT09dS50eXBlJiYobj14LG89XCJ0aHJvd1wiLGE9dS5hcmcpfX19ZnVuY3Rpb24gZCh0KXt2YXIgZT17dHJ5TG9jOnRbMF19OzEgaW4gdCYmKGUuY2F0Y2hMb2M9dFsxXSksMiBpbiB0JiYoZS5maW5hbGx5TG9jPXRbMl0sZS5hZnRlckxvYz10WzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChlKX1mdW5jdGlvbiBsKHQpe3ZhciBlPXQuY29tcGxldGlvbnx8e307ZS50eXBlPVwibm9ybWFsXCIsZGVsZXRlIGUuYXJnLHQuY29tcGxldGlvbj1lfWZ1bmN0aW9uIHAodCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOlwicm9vdFwifV0sdC5mb3JFYWNoKGQsdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gYih0KXtpZih0KXt2YXIgZT10W3ddO2lmKGUpcmV0dXJuIGUuY2FsbCh0KTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIHI9LTEsbj1mdW5jdGlvbiBlKCl7Zm9yKDsrK3I8dC5sZW5ndGg7KWlmKG0uY2FsbCh0LHIpKXJldHVybiBlLnZhbHVlPXRbcl0sZS5kb25lPSExLGU7cmV0dXJuIGUudmFsdWU9eSxlLmRvbmU9ITAsZX07cmV0dXJuIG4ubmV4dD1ufX1yZXR1cm57bmV4dDp2fX1mdW5jdGlvbiB2KCl7cmV0dXJue3ZhbHVlOnksZG9uZTohMH19dmFyIHksbT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGc9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSx3PWcuaXRlcmF0b3J8fFwiQEBpdGVyYXRvclwiLF89Zy50b1N0cmluZ1RhZ3x8XCJAQHRvU3RyaW5nVGFnXCIsTT1cIm9iamVjdFwiPT10eXBlb2YgdCxTPWUucmVnZW5lcmF0b3JSdW50aW1lO2lmKFMpcmV0dXJuIHZvaWQoTSYmKHQuZXhwb3J0cz1TKSk7Uz1lLnJlZ2VuZXJhdG9yUnVudGltZT1NP3QuZXhwb3J0czp7fSxTLndyYXA9bjt2YXIgRT1cInN1c3BlbmRlZFN0YXJ0XCIsQT1cInN1c3BlbmRlZFlpZWxkXCIsaz1cImV4ZWN1dGluZ1wiLHg9XCJjb21wbGV0ZWRcIixJPXt9LEI9Zi5wcm90b3R5cGU9by5wcm90b3R5cGU7YS5wcm90b3R5cGU9Qi5jb25zdHJ1Y3Rvcj1mLGYuY29uc3RydWN0b3I9YSxmW19dPWEuZGlzcGxheU5hbWU9XCJHZW5lcmF0b3JGdW5jdGlvblwiLFMuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiZ0LmNvbnN0cnVjdG9yO3JldHVybiEhZSYmKGU9PT1hfHxcIkdlbmVyYXRvckZ1bmN0aW9uXCI9PT0oZS5kaXNwbGF5TmFtZXx8ZS5uYW1lKSl9LFMubWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGYpOih0Ll9fcHJvdG9fXz1mLF8gaW4gdHx8KHRbX109XCJHZW5lcmF0b3JGdW5jdGlvblwiKSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShCKSx0fSxTLmF3cmFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdSh0KX0scyhoLnByb3RvdHlwZSksUy5hc3luYz1mdW5jdGlvbih0LGUscixpKXt2YXIgbz1uZXcgaChuKHQsZSxyLGkpKTtyZXR1cm4gUy5pc0dlbmVyYXRvckZ1bmN0aW9uKGUpP286by5uZXh0KCkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6by5uZXh0KCl9KX0scyhCKSxCW3ddPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEJbX109XCJHZW5lcmF0b3JcIixCLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJbb2JqZWN0IEdlbmVyYXRvcl1cIn0sUy5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaChyKTtyZXR1cm4gZS5yZXZlcnNlKCksZnVuY3Rpb24gcigpe2Zvcig7ZS5sZW5ndGg7KXt2YXIgbj1lLnBvcCgpO2lmKG4gaW4gdClyZXR1cm4gci52YWx1ZT1uLHIuZG9uZT0hMSxyfXJldHVybiByLmRvbmU9ITAscn19LFMudmFsdWVzPWIscC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnAscmVzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9eSx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKGwpLCF0KWZvcih2YXIgZSBpbiB0aGlzKVwidFwiPT09ZS5jaGFyQXQoMCkmJm0uY2FsbCh0aGlzLGUpJiYhaXNOYU4oK2Uuc2xpY2UoMSkpJiYodGhpc1tlXT15KX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgdD10aGlzLnRyeUVudHJpZXNbMF0sZT10LmNvbXBsZXRpb247aWYoXCJ0aHJvd1wiPT09ZS50eXBlKXRocm93IGUuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtyZXR1cm4gby50eXBlPVwidGhyb3dcIixvLmFyZz10LHIubmV4dD1lLCEhbn1pZih0aGlzLmRvbmUpdGhyb3cgdDtmb3IodmFyIHI9dGhpcyxuPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIGk9dGhpcy50cnlFbnRyaWVzW25dLG89aS5jb21wbGV0aW9uO2lmKFwicm9vdFwiPT09aS50cnlMb2MpcmV0dXJuIGUoXCJlbmRcIik7aWYoaS50cnlMb2M8PXRoaXMucHJldil7dmFyIGE9bS5jYWxsKGksXCJjYXRjaExvY1wiKSxmPW0uY2FsbChpLFwiZmluYWxseUxvY1wiKTtpZihhJiZmKXtpZih0aGlzLnByZXY8aS5jYXRjaExvYylyZXR1cm4gZShpLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8aS5maW5hbGx5TG9jKXJldHVybiBlKGkuZmluYWxseUxvYyl9ZWxzZSBpZihhKXtpZih0aGlzLnByZXY8aS5jYXRjaExvYylyZXR1cm4gZShpLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFmKXRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIGUoaS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtyPj0wOy0tcil7dmFyIG49dGhpcy50cnlFbnRyaWVzW3JdO2lmKG4udHJ5TG9jPD10aGlzLnByZXYmJm0uY2FsbChuLFwiZmluYWxseUxvY1wiKSYmdGhpcy5wcmV2PG4uZmluYWxseUxvYyl7dmFyIGk9bjticmVha319aSYmKFwiYnJlYWtcIj09PXR8fFwiY29udGludWVcIj09PXQpJiZpLnRyeUxvYzw9ZSYmZTw9aS5maW5hbGx5TG9jJiYoaT1udWxsKTt2YXIgbz1pP2kuY29tcGxldGlvbjp7fTtyZXR1cm4gby50eXBlPXQsby5hcmc9ZSxpP3RoaXMubmV4dD1pLmZpbmFsbHlMb2M6dGhpcy5jb21wbGV0ZShvKSxJfSxjb21wbGV0ZTpmdW5jdGlvbih0LGUpe2lmKFwidGhyb3dcIj09PXQudHlwZSl0aHJvdyB0LmFyZztcImJyZWFrXCI9PT10LnR5cGV8fFwiY29udGludWVcIj09PXQudHlwZT90aGlzLm5leHQ9dC5hcmc6XCJyZXR1cm5cIj09PXQudHlwZT8odGhpcy5ydmFsPXQuYXJnLHRoaXMubmV4dD1cImVuZFwiKTpcIm5vcm1hbFwiPT09dC50eXBlJiZlJiYodGhpcy5uZXh0PWUpfSxmaW5pc2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIHI9dGhpcy50cnlFbnRyaWVzW2VdO2lmKHIuZmluYWxseUxvYz09PXQpcmV0dXJuIHRoaXMuY29tcGxldGUoci5jb21wbGV0aW9uLHIuYWZ0ZXJMb2MpLGwociksSX19LGNhdGNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciByPXRoaXMudHJ5RW50cmllc1tlXTtpZihyLnRyeUxvYz09PXQpe3ZhciBuPXIuY29tcGxldGlvbjtpZihcInRocm93XCI9PT1uLnR5cGUpe3ZhciBpPW4uYXJnO2wocil9cmV0dXJuIGl9fXRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbih0LGUscil7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOmIodCkscmVzdWx0TmFtZTplLG5leHRMb2M6cn0sSX19fShcIm9iamVjdFwiPT10eXBlb2YgZT9lOlwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3c/d2luZG93Olwib2JqZWN0XCI9PXR5cGVvZiBzZWxmP3NlbGY6dGhpcyl9KS5jYWxsKGUscigzOSkscigyNikpfSxmdW5jdGlvbih0LGUscil7cigyOTApLHQuZXhwb3J0cz1yKDMyKS5SZWdFeHAuZXNjYXBlfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcih0K1wiIGlzIG5vdCBhIGZ1bmN0aW9uIVwiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDc3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIW4odCkpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGFuIG9iamVjdCFcIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyNzApO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUscil7aWYobih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChyKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGwoZSxyKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiB0LmNhbGwoZSxyLG4pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsbixpKXtyZXR1cm4gdC5jYWxsKGUscixuLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNzcpLGk9cigxNjUpLmRvY3VtZW50LG89bihpKSYmbihpLmNyZWF0ZUVsZW1lbnQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbz9pLmNyZWF0ZUVsZW1lbnQodCk6e319fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxNjUpLGk9cigxNjMpLG89cigyNzIpLGE9cigyNzUpLGY9XCJwcm90b3R5cGVcIixzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgdSxoLGMsZD10JnMuRixsPXQmcy5HLHA9dCZzLlMsYj10JnMuUCx2PXQmcy5CLHk9dCZzLlcsbT1sP2k6aVtlXXx8KGlbZV09e30pLGc9bVtmXSx3PWw/bjpwP25bZV06KG5bZV18fHt9KVtmXTtsJiYocj1lKTtmb3IodSBpbiByKWg9IWQmJncmJnZvaWQgMCE9PXdbdV0saCYmdSBpbiBtfHwoYz1oP3dbdV06clt1XSxtW3VdPWwmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIHdbdV0/clt1XTp2JiZoP28oYyxuKTp5JiZ3W3VdPT1jP2Z1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUscixuKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUscil9cmV0dXJuIG5ldyB0KGUscixuKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlW2ZdPXRbZl0sZX0oYyk6YiYmXCJmdW5jdGlvblwiPT10eXBlb2YgYz9vKEZ1bmN0aW9uLmNhbGwsYyk6YyxiJiYoKG0udmlydHVhbHx8KG0udmlydHVhbD17fSkpW3VdPWMsdCZzLlImJmcmJiFnW3VdJiZhKGcsdSxjKSkpfTtzLkY9MSxzLkc9MixzLlM9NCxzLlA9OCxzLkI9MTYscy5XPTMyLHMuVT02NCxzLlI9MTI4LHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyNzgpLGk9cigyNzkpO3QuZXhwb3J0cz1yKDExNyk/ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuLmYodCxlLGkoMSxyKSl9OmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFtlXT1yLHR9fSxmdW5jdGlvbih0LGUscil7dC5leHBvcnRzPSFyKDExNykmJiFyKDE2NCkoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHIoMjczKShcImRpdlwiKSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig3NyksaT1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4hbih0KSYmaXNGaW5pdGUodCkmJmkodCk9PT10fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMjcxKSxpPXIoMjc2KSxvPXIoMjgwKSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmY9cigxMTcpP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbih0LGUscil7aWYobih0KSxlPW8oZSwhMCksbihyKSxpKXRyeXtyZXR1cm4gYSh0LGUscil9Y2F0Y2godCl7fWlmKFwiZ2V0XCJpbiByfHxcInNldFwiaW4gcil0aHJvdyBUeXBlRXJyb3IoXCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCFcIik7cmV0dXJuXCJ2YWx1ZVwiaW4gciYmKHRbZV09ci52YWx1ZSksdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNzcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFuKHQpKXJldHVybiB0O3ZhciByLGk7aWYoZSYmXCJmdW5jdGlvblwiPT10eXBlb2Yocj10LnRvU3RyaW5nKSYmIW4oaT1yLmNhbGwodCkpKXJldHVybiBpO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mKHI9dC52YWx1ZU9mKSYmIW4oaT1yLmNhbGwodCkpKXJldHVybiBpO2lmKCFlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZihyPXQudG9TdHJpbmcpJiYhbihpPXIuY2FsbCh0KSkpcmV0dXJuIGk7dGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMjc0KTtuKG4uUyxcIk51bWJlclwiLHtpc0ludGVnZXI6cigyNzcpfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDYpLGk9cigxMjYpLG89cig3KShcInNwZWNpZXNcIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBpKHQpJiYoZT10LmNvbnN0cnVjdG9yLFwiZnVuY3Rpb25cIiE9dHlwZW9mIGV8fGUhPT1BcnJheSYmIWkoZS5wcm90b3R5cGUpfHwoZT12b2lkIDApLG4oZSkmJihlPWVbb10sbnVsbD09PWUmJihlPXZvaWQgMCkpKSx2b2lkIDA9PT1lP0FycmF5OmV9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyODIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcobih0KSkoZSl9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigzKSxpPXIoMjkpLG89XCJudW1iZXJcIjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoXCJzdHJpbmdcIiE9PXQmJnQhPT1vJiZcImRlZmF1bHRcIiE9PXQpdGhyb3cgVHlwZUVycm9yKFwiSW5jb3JyZWN0IGhpbnRcIik7cmV0dXJuIGkobih0aGlzKSx0IT1vKX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDQ0KSxpPXIoODYpLG89cig2Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW4odCkscj1pLmY7aWYocilmb3IodmFyIGEsZj1yKHQpLHM9by5mLHU9MDtmLmxlbmd0aD51OylzLmNhbGwodCxhPWZbdSsrXSkmJmUucHVzaChhKTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDQ0KSxpPXIoMTcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcixvPWkodCksYT1uKG8pLGY9YS5sZW5ndGgscz0wO2Y+czspaWYob1tyPWFbcysrXV09PT1lKXJldHVybiByfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMjg4KSxpPXIoODIpLG89cigxMyk7dC5leHBvcnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW8odGhpcyksZT1hcmd1bWVudHMubGVuZ3RoLHI9QXJyYXkoZSksYT0wLGY9bi5fLHM9ITE7ZT5hOykoclthXT1hcmd1bWVudHNbYSsrXSk9PT1mJiYocz0hMCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4sbz10aGlzLGE9YXJndW1lbnRzLmxlbmd0aCx1PTAsaD0wO2lmKCFzJiYhYSlyZXR1cm4gaSh0LHIsbyk7aWYobj1yLnNsaWNlKCkscylmb3IoO2U+dTt1Kyspblt1XT09PWYmJihuW3VdPWFyZ3VtZW50c1toKytdKTtmb3IoO2E+aDspbi5wdXNoKGFyZ3VtZW50c1toKytdKTtyZXR1cm4gaSh0LG4sbyl9fX0sZnVuY3Rpb24odCxlLHIpe3QuZXhwb3J0cz1yKDQpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciByPWU9PT1PYmplY3QoZSk/ZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19OmU7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZSh0LHIpfX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigyODkpKC9bXFxcXF4kKis/LigpfFtcXF17fV0vZyxcIlxcXFwkJlwiKTtuKG4uUyxcIlJlZ0V4cFwiLHtlc2NhcGU6ZnVuY3Rpb24odCl7cmV0dXJuIGkodCl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5QLFwiQXJyYXlcIix7Y29weVdpdGhpbjpyKDE2Nyl9KSxyKDU0KShcImNvcHlXaXRoaW5cIil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigyNykoNCk7bihuLlArbi5GKiFyKDI1KShbXS5ldmVyeSwhMCksXCJBcnJheVwiLHtldmVyeTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzWzFdKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlAsXCJBcnJheVwiLHtmaWxsOnIoMTE4KX0pLHIoNTQpKFwiZmlsbFwiKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDI3KSgyKTtuKG4uUCtuLkYqIXIoMjUpKFtdLmZpbHRlciwhMCksXCJBcnJheVwiLHtmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50c1sxXSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigyNykoNiksbz1cImZpbmRJbmRleFwiLGE9ITA7byBpbltdJiZBcnJheSgxKVtvXShmdW5jdGlvbigpe2E9ITF9KSxuKG4uUCtuLkYqYSxcIkFycmF5XCIse2ZpbmRJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLHIoNTQpKG8pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigwKSxpPXIoMjcpKDUpLG89XCJmaW5kXCIsYT0hMDtvIGluW10mJkFycmF5KDEpW29dKGZ1bmN0aW9uKCl7YT0hMX0pLG4obi5QK24uRiphLFwiQXJyYXlcIix7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLHIoNTQpKG8pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigwKSxpPXIoMjcpKDApLG89cigyNSkoW10uZm9yRWFjaCwhMCk7bihuLlArbi5GKiFvLFwiQXJyYXlcIix7Zm9yRWFjaDpmdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzWzFdKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMzMpLGk9cigwKSxvPXIoMTEpLGE9cigxNzYpLGY9cigxMjUpLHM9cigxMCksdT1yKDExOSksaD1yKDE0Mik7aShpLlMraS5GKiFyKDg0KShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSksXCJBcnJheVwiLHtmcm9tOmZ1bmN0aW9uKHQpe3ZhciBlLHIsaSxjLGQ9byh0KSxsPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXM/dGhpczpBcnJheSxwPWFyZ3VtZW50cy5sZW5ndGgsYj1wPjE/YXJndW1lbnRzWzFdOnZvaWQgMCx2PXZvaWQgMCE9PWIseT0wLG09aChkKTtpZih2JiYoYj1uKGIscD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsMikpLHZvaWQgMD09bXx8bD09QXJyYXkmJmYobSkpZm9yKGU9cyhkLmxlbmd0aCkscj1uZXcgbChlKTtlPnk7eSsrKXUocix5LHY/YihkW3ldLHkpOmRbeV0pO2Vsc2UgZm9yKGM9bS5jYWxsKGQpLHI9bmV3IGw7IShpPWMubmV4dCgpKS5kb25lO3krKyl1KHIseSx2P2EoYyxiLFtpLnZhbHVlLHldLCEwKTppLnZhbHVlKTtyZXR1cm4gci5sZW5ndGg9eSxyfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigwKSxpPXIoNzgpKCExKSxvPVtdLmluZGV4T2YsYT0hIW8mJjEvWzFdLmluZGV4T2YoMSwtMCk8MDtuKG4uUCtuLkYqKGF8fCFyKDI1KShvKSksXCJBcnJheVwiLHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBhP28uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOmkodGhpcyx0LGFyZ3VtZW50c1sxXSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiQXJyYXlcIix7aXNBcnJheTpyKDEyNil9KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDE3KSxvPVtdLmpvaW47bihuLlArbi5GKihyKDY1KSE9T2JqZWN0fHwhcigyNSkobykpLFwiQXJyYXlcIix7am9pbjpmdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKGkodGhpcyksdm9pZCAwPT09dD9cIixcIjp0KX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDE3KSxvPXIoMzgpLGE9cigxMCksZj1bXS5sYXN0SW5kZXhPZixzPSEhZiYmMS9bMV0ubGFzdEluZGV4T2YoMSwtMCk8MDtuKG4uUCtuLkYqKHN8fCFyKDI1KShmKSksXCJBcnJheVwiLHtsYXN0SW5kZXhPZjpmdW5jdGlvbih0KXtpZihzKXJldHVybiBmLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MDt2YXIgZT1pKHRoaXMpLHI9YShlLmxlbmd0aCksbj1yLTE7Zm9yKGFyZ3VtZW50cy5sZW5ndGg+MSYmKG49TWF0aC5taW4obixvKGFyZ3VtZW50c1sxXSkpKSxuPDAmJihuPXIrbik7bj49MDtuLS0paWYobiBpbiBlJiZlW25dPT09dClyZXR1cm4gbnx8MDtyZXR1cm4tMX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDI3KSgxKTtuKG4uUCtuLkYqIXIoMjUpKFtdLm1hcCwhMCksXCJBcnJheVwiLHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50c1sxXSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigxMTkpO24obi5TK24uRipyKDUpKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4hKEFycmF5Lm9mLmNhbGwodClpbnN0YW5jZW9mIHQpfSksXCJBcnJheVwiLHtvZjpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyhcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzP3RoaXM6QXJyYXkpKGUpO2U+dDspaShyLHQsYXJndW1lbnRzW3QrK10pO3JldHVybiByLmxlbmd0aD1lLHJ9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigxNjkpO24obi5QK24uRiohcigyNSkoW10ucmVkdWNlUmlnaHQsITApLFwiQXJyYXlcIix7cmVkdWNlUmlnaHQ6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGgsYXJndW1lbnRzWzFdLCEwKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDE2OSk7bihuLlArbi5GKiFyKDI1KShbXS5yZWR1Y2UsITApLFwiQXJyYXlcIix7cmVkdWNlOmZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoLGFyZ3VtZW50c1sxXSwhMSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigxMjMpLG89cigyMyksYT1yKDQ3KSxmPXIoMTApLHM9W10uc2xpY2U7bihuLlArbi5GKnIoNSkoZnVuY3Rpb24oKXtpJiZzLmNhbGwoaSl9KSxcIkFycmF5XCIse3NsaWNlOmZ1bmN0aW9uKHQsZSl7dmFyIHI9Zih0aGlzLmxlbmd0aCksbj1vKHRoaXMpO2lmKGU9dm9pZCAwPT09ZT9yOmUsXCJBcnJheVwiPT1uKXJldHVybiBzLmNhbGwodGhpcyx0LGUpO2Zvcih2YXIgaT1hKHQsciksdT1hKGUsciksaD1mKHUtaSksYz1BcnJheShoKSxkPTA7ZDxoO2QrKyljW2RdPVwiU3RyaW5nXCI9PW4/dGhpcy5jaGFyQXQoaStkKTp0aGlzW2krZF07cmV0dXJuIGN9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigyNykoMyk7bihuLlArbi5GKiFyKDI1KShbXS5zb21lLCEwKSxcIkFycmF5XCIse3NvbWU6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50c1sxXSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigxMyksbz1yKDExKSxhPXIoNSksZj1bXS5zb3J0LHM9WzEsMiwzXTtuKG4uUCtuLkYqKGEoZnVuY3Rpb24oKXtzLnNvcnQodm9pZCAwKX0pfHwhYShmdW5jdGlvbigpe3Muc29ydChudWxsKX0pfHwhcigyNSkoZikpLFwiQXJyYXlcIix7c29ydDpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9mLmNhbGwobyh0aGlzKSk6Zi5jYWxsKG8odGhpcyksaSh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtyKDQ2KShcIkFycmF5XCIpfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKTtuKG4uUyxcIkRhdGVcIix7bm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cig1KSxvPURhdGUucHJvdG90eXBlLmdldFRpbWUsYT1mdW5jdGlvbih0KXtyZXR1cm4gdD45P3Q6XCIwXCIrdH07bihuLlArbi5GKihpKGZ1bmN0aW9uKCl7cmV0dXJuXCIwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVpcIiE9bmV3IERhdGUoLTVlMTMtMSkudG9JU09TdHJpbmcoKX0pfHwhaShmdW5jdGlvbigpe25ldyBEYXRlKE5hTikudG9JU09TdHJpbmcoKX0pKSxcIkRhdGVcIix7dG9JU09TdHJpbmc6ZnVuY3Rpb24oKXtpZighaXNGaW5pdGUoby5jYWxsKHRoaXMpKSl0aHJvdyBSYW5nZUVycm9yKFwiSW52YWxpZCB0aW1lIHZhbHVlXCIpO3ZhciB0PXRoaXMsZT10LmdldFVUQ0Z1bGxZZWFyKCkscj10LmdldFVUQ01pbGxpc2Vjb25kcygpLG49ZTwwP1wiLVwiOmU+OTk5OT9cIitcIjpcIlwiO3JldHVybiBuKyhcIjAwMDAwXCIrTWF0aC5hYnMoZSkpLnNsaWNlKG4/LTY6LTQpK1wiLVwiK2EodC5nZXRVVENNb250aCgpKzEpK1wiLVwiK2EodC5nZXRVVENEYXRlKCkpK1wiVFwiK2EodC5nZXRVVENIb3VycygpKStcIjpcIithKHQuZ2V0VVRDTWludXRlcygpKStcIjpcIithKHQuZ2V0VVRDU2Vjb25kcygpKStcIi5cIisocj45OT9yOlwiMFwiK2EocikpK1wiWlwifX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigwKSxpPXIoMTEpLG89cigyOSk7bihuLlArbi5GKnIoNSkoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PW5ldyBEYXRlKE5hTikudG9KU09OKCl8fDEhPT1EYXRlLnByb3RvdHlwZS50b0pTT04uY2FsbCh7dG9JU09TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gMX19KX0pLFwiRGF0ZVwiLHt0b0pTT046ZnVuY3Rpb24odCl7dmFyIGU9aSh0aGlzKSxyPW8oZSk7cmV0dXJuXCJudW1iZXJcIiE9dHlwZW9mIHJ8fGlzRmluaXRlKHIpP2UudG9JU09TdHJpbmcoKTpudWxsfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig3KShcInRvUHJpbWl0aXZlXCIpLGk9RGF0ZS5wcm90b3R5cGU7biBpbiBpfHxyKDE0KShpLG4scigyODQpKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPURhdGUucHJvdG90eXBlLGk9XCJJbnZhbGlkIERhdGVcIixvPVwidG9TdHJpbmdcIixhPW5bb10sZj1uLmdldFRpbWU7bmV3IERhdGUoTmFOKStcIlwiIT1pJiZyKDE1KShuLG8sZnVuY3Rpb24oKXt2YXIgdD1mLmNhbGwodGhpcyk7cmV0dXJuIHQ9PT10P2EuY2FsbCh0aGlzKTppfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5QLFwiRnVuY3Rpb25cIix7YmluZDpyKDE3MCl9KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoNiksaT1yKDIxKSxvPXIoNykoXCJoYXNJbnN0YW5jZVwiKSxhPUZ1bmN0aW9uLnByb3RvdHlwZTtvIGluIGF8fHIoOSkuZihhLG8se3ZhbHVlOmZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHRoaXN8fCFuKHQpKXJldHVybiExO2lmKCFuKHRoaXMucHJvdG90eXBlKSlyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXM7Zm9yKDt0PWkodCk7KWlmKHRoaXMucHJvdG90eXBlPT09dClyZXR1cm4hMDtyZXR1cm4hMX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoOSkuZixpPXIoMzcpLG89cigxMiksYT1GdW5jdGlvbi5wcm90b3R5cGUsZj0vXlxccypmdW5jdGlvbiAoW14gKF0qKS8scz1cIm5hbWVcIix1PU9iamVjdC5pc0V4dGVuc2libGV8fGZ1bmN0aW9uKCl7cmV0dXJuITB9O3MgaW4gYXx8cig4KSYmbihhLHMse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9dGhpcyxlPShcIlwiK3QpLm1hdGNoKGYpWzFdO3JldHVybiBvKHQscyl8fCF1KHQpfHxuKHQscyxpKDUsZSkpLGV9Y2F0Y2godCl7cmV0dXJuXCJcIn19fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxNzgpLG89TWF0aC5zcXJ0LGE9TWF0aC5hY29zaDtuKG4uUytuLkYqIShhJiY3MTA9PU1hdGguZmxvb3IoYShOdW1iZXIuTUFYX1ZBTFVFKSkmJmEoMS8wKT09MS8wKSxcIk1hdGhcIix7YWNvc2g6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9K3QpPDE/TmFOOnQ+OTQ5MDYyNjUuNjI0MjUxNTY/TWF0aC5sb2codCkrTWF0aC5MTjI6aSh0LTErbyh0LTEpKm8odCsxKSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3JldHVybiBpc0Zpbml0ZSh0PSt0KSYmMCE9dD90PDA/LW4oLXQpOk1hdGgubG9nKHQrTWF0aC5zcXJ0KHQqdCsxKSk6dH12YXIgaT1yKDApLG89TWF0aC5hc2luaDtpKGkuUytpLkYqIShvJiYxL28oMCk+MCksXCJNYXRoXCIse2FzaW5oOm59KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1NYXRoLmF0YW5oO24obi5TK24uRiohKGkmJjEvaSgtMCk8MCksXCJNYXRoXCIse2F0YW5oOmZ1bmN0aW9uKHQpe3JldHVybiAwPT0odD0rdCk/dDpNYXRoLmxvZygoMSt0KS8oMS10KSkvMn19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDEzMCk7bihuLlMsXCJNYXRoXCIse2NicnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGkodD0rdCkqTWF0aC5wb3coTWF0aC5hYnModCksMS8zKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJNYXRoXCIse2NsejMyOmZ1bmN0aW9uKHQpe3JldHVybih0Pj4+PTApPzMxLU1hdGguZmxvb3IoTWF0aC5sb2codCsuNSkqTWF0aC5MT0cyRSk6MzJ9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9TWF0aC5leHA7bihuLlMsXCJNYXRoXCIse2Nvc2g6ZnVuY3Rpb24odCl7cmV0dXJuKGkodD0rdCkraSgtdCkpLzJ9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxMjkpO24obi5TK24uRiooaSE9TWF0aC5leHBtMSksXCJNYXRoXCIse2V4cG0xOml9KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDEzMCksbz1NYXRoLnBvdyxhPW8oMiwtNTIpLGY9bygyLC0yMykscz1vKDIsMTI3KSooMi1mKSx1PW8oMiwtMTI2KSxoPWZ1bmN0aW9uKHQpe3JldHVybiB0KzEvYS0xL2F9O24obi5TLFwiTWF0aFwiLHtmcm91bmQ6ZnVuY3Rpb24odCl7dmFyIGUscixuPU1hdGguYWJzKHQpLG89aSh0KTtyZXR1cm4gbjx1P28qaChuL3UvZikqdSpmOihlPSgxK2YvYSkqbixyPWUtKGUtbikscj5zfHxyIT1yP28qKDEvMCk6bypyKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1NYXRoLmFicztuKG4uUyxcIk1hdGhcIix7aHlwb3Q6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbixvPTAsYT0wLGY9YXJndW1lbnRzLmxlbmd0aCxzPTA7YTxmOylyPWkoYXJndW1lbnRzW2ErK10pLHM8cj8obj1zL3Isbz1vKm4qbisxLHM9cik6cj4wPyhuPXIvcyxvKz1uKm4pOm8rPXI7cmV0dXJuIHM9PT0xLzA/MS8wOnMqTWF0aC5zcXJ0KG8pfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPU1hdGguaW11bDtuKG4uUytuLkYqcig1KShmdW5jdGlvbigpe3JldHVybiBpKDQyOTQ5NjcyOTUsNSkhPS01fHwyIT1pLmxlbmd0aH0pLFwiTWF0aFwiLHtpbXVsOmZ1bmN0aW9uKHQsZSl7dmFyIHI9NjU1MzUsbj0rdCxpPStlLG89ciZuLGE9ciZpO3JldHVybiAwfG8qYSsoKHImbj4+PjE2KSphK28qKHImaT4+PjE2KTw8MTY+Pj4wKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJNYXRoXCIse2xvZzEwOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLkxOMTB9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiTWF0aFwiLHtsb2cxcDpyKDE3OCl9KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJNYXRoXCIse2xvZzI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubG9nKHQpL01hdGguTE4yfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKTtuKG4uUyxcIk1hdGhcIix7c2lnbjpyKDEzMCl9KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDEyOSksbz1NYXRoLmV4cDtuKG4uUytuLkYqcig1KShmdW5jdGlvbigpe3JldHVybiFNYXRoLnNpbmgoLTJlLTE3KSE9LTJlLTE3fSksXCJNYXRoXCIse3Npbmg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQ9K3QpPDE/KGkodCktaSgtdCkpLzI6KG8odC0xKS1vKC10LTEpKSooTWF0aC5FLzIpfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoMTI5KSxvPU1hdGguZXhwO24obi5TLFwiTWF0aFwiLHt0YW5oOmZ1bmN0aW9uKHQpe3ZhciBlPWkodD0rdCkscj1pKC10KTtyZXR1cm4gZT09MS8wPzE6cj09MS8wPy0xOihlLXIpLyhvKHQpK28oLXQpKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJNYXRoXCIse3RydW5jOmZ1bmN0aW9uKHQpe3JldHVybih0PjA/TWF0aC5mbG9vcjpNYXRoLmNlaWwpKHQpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cig0KSxpPXIoMTIpLG89cigyMyksYT1yKDEyNCksZj1yKDI5KSxzPXIoNSksdT1yKDQzKS5mLGg9cigyMCkuZixjPXIoOSkuZixkPXIoNTgpLnRyaW0sbD1cIk51bWJlclwiLHA9bltsXSxiPXAsdj1wLnByb3RvdHlwZSx5PW8ocig0MikodikpPT1sLG09XCJ0cmltXCJpbiBTdHJpbmcucHJvdG90eXBlLGc9ZnVuY3Rpb24odCl7dmFyIGU9Zih0LCExKTtpZihcInN0cmluZ1wiPT10eXBlb2YgZSYmZS5sZW5ndGg+Mil7ZT1tP2UudHJpbSgpOmQoZSwzKTt2YXIgcixuLGksbz1lLmNoYXJDb2RlQXQoMCk7aWYoNDM9PT1vfHw0NT09PW8pe2lmKHI9ZS5jaGFyQ29kZUF0KDIpLDg4PT09cnx8MTIwPT09cilyZXR1cm4gTmFOfWVsc2UgaWYoNDg9PT1vKXtzd2l0Y2goZS5jaGFyQ29kZUF0KDEpKXtjYXNlIDY2OmNhc2UgOTg6bj0yLGk9NDk7YnJlYWs7Y2FzZSA3OTpjYXNlIDExMTpuPTgsaT01NTticmVhaztkZWZhdWx0OnJldHVybitlfWZvcih2YXIgYSxzPWUuc2xpY2UoMiksdT0wLGg9cy5sZW5ndGg7dTxoO3UrKylpZihhPXMuY2hhckNvZGVBdCh1KSxhPDQ4fHxhPmkpcmV0dXJuIE5hTjtyZXR1cm4gcGFyc2VJbnQocyxuKX19cmV0dXJuK2V9O2lmKCFwKFwiIDBvMVwiKXx8IXAoXCIwYjFcIil8fHAoXCIrMHgxXCIpKXtwPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8MT8wOnQscj10aGlzO3JldHVybiByIGluc3RhbmNlb2YgcCYmKHk/cyhmdW5jdGlvbigpe3YudmFsdWVPZi5jYWxsKHIpfSk6byhyKSE9bCk/YShuZXcgYihnKGUpKSxyLHApOmcoZSl9O2Zvcih2YXIgdyxfPXIoOCk/dShiKTpcIk1BWF9WQUxVRSxNSU5fVkFMVUUsTmFOLE5FR0FUSVZFX0lORklOSVRZLFBPU0lUSVZFX0lORklOSVRZLEVQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUixNSU5fU0FGRV9JTlRFR0VSLHBhcnNlRmxvYXQscGFyc2VJbnQsaXNJbnRlZ2VyXCIuc3BsaXQoXCIsXCIpLE09MDtfLmxlbmd0aD5NO00rKylpKGIsdz1fW01dKSYmIWkocCx3KSYmYyhwLHcsaChiLHcpKTtwLnByb3RvdHlwZT12LHYuY29uc3RydWN0b3I9cCxyKDE1KShuLGwscCl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKTtuKG4uUyxcIk51bWJlclwiLHtFUFNJTE9OOk1hdGgucG93KDIsLTUyKX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoNCkuaXNGaW5pdGU7bihuLlMsXCJOdW1iZXJcIix7aXNGaW5pdGU6ZnVuY3Rpb24odCl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIHQmJmkodCl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiTnVtYmVyXCIse2lzSW50ZWdlcjpyKDE3NSl9KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJOdW1iZXJcIix7aXNOYU46ZnVuY3Rpb24odCl7cmV0dXJuIHQhPXR9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxNzUpLG89TWF0aC5hYnM7bihuLlMsXCJOdW1iZXJcIix7aXNTYWZlSW50ZWdlcjpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KSYmbyh0KTw9OTAwNzE5OTI1NDc0MDk5MX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJOdW1iZXJcIix7TUFYX1NBRkVfSU5URUdFUjo5MDA3MTk5MjU0NzQwOTkxfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiTnVtYmVyXCIse01JTl9TQUZFX0lOVEVHRVI6LTkwMDcxOTkyNTQ3NDA5OTF9KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDE4NSk7bihuLlMrbi5GKihOdW1iZXIucGFyc2VGbG9hdCE9aSksXCJOdW1iZXJcIix7cGFyc2VGbG9hdDppfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxODYpO24obi5TK24uRiooTnVtYmVyLnBhcnNlSW50IT1pKSxcIk51bWJlclwiLHtwYXJzZUludDppfSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigzOCksbz1yKDE2NiksYT1yKDEzNyksZj0xLi50b0ZpeGVkLHM9TWF0aC5mbG9vcix1PVswLDAsMCwwLDAsMF0saD1cIk51bWJlci50b0ZpeGVkOiBpbmNvcnJlY3QgaW52b2NhdGlvbiFcIixjPVwiMFwiLGQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1lOysrcjw2OyluKz10KnVbcl0sdVtyXT1uJTFlNyxuPXMobi8xZTcpfSxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT02LHI9MDstLWU+PTA7KXIrPXVbZV0sdVtlXT1zKHIvdCkscj1yJXQqMWU3fSxwPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTYsZT1cIlwiOy0tdD49MDspaWYoXCJcIiE9PWV8fDA9PT10fHwwIT09dVt0XSl7dmFyIHI9U3RyaW5nKHVbdF0pO2U9XCJcIj09PWU/cjplK2EuY2FsbChjLDctci5sZW5ndGgpK3J9cmV0dXJuIGV9LGI9ZnVuY3Rpb24odCxlLHIpe3JldHVybiAwPT09ZT9yOmUlMj09PTE/Yih0LGUtMSxyKnQpOmIodCp0LGUvMixyKX0sdj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPXQ7cj49NDA5NjspZSs9MTIsci89NDA5Njtmb3IoO3I+PTI7KWUrPTEsci89MjtyZXR1cm4gZX07bihuLlArbi5GKighIWYmJihcIjAuMDAwXCIhPT04ZS01LnRvRml4ZWQoMyl8fFwiMVwiIT09LjkudG9GaXhlZCgwKXx8XCIxLjI1XCIhPT0xLjI1NS50b0ZpeGVkKDIpfHxcIjEwMDAwMDAwMDAwMDAwMDAxMjhcIiE9PSgweGRlMGI2YjNhNzY0MDA4MCkudG9GaXhlZCgwKSl8fCFyKDUpKGZ1bmN0aW9uKCl7Zi5jYWxsKHt9KX0pKSxcIk51bWJlclwiLHt0b0ZpeGVkOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixmLHM9byh0aGlzLGgpLHU9aSh0KSx5PVwiXCIsbT1jO2lmKHU8MHx8dT4yMCl0aHJvdyBSYW5nZUVycm9yKGgpO2lmKHMhPXMpcmV0dXJuXCJOYU5cIjtpZihzPD0tMWUyMXx8cz49MWUyMSlyZXR1cm4gU3RyaW5nKHMpO2lmKHM8MCYmKHk9XCItXCIscz0tcykscz4xZS0yMSlpZihlPXYocypiKDIsNjksMSkpLTY5LHI9ZTwwP3MqYigyLC1lLDEpOnMvYigyLGUsMSkscio9NDUwMzU5OTYyNzM3MDQ5NixlPTUyLWUsZT4wKXtmb3IoZCgwLHIpLG49dTtuPj03OylkKDFlNywwKSxuLT03O2ZvcihkKGIoMTAsbiwxKSwwKSxuPWUtMTtuPj0yMzspbCgxPDwyMyksbi09MjM7bCgxPDxuKSxkKDEsMSksbCgyKSxtPXAoKX1lbHNlIGQoMCxyKSxkKDE8PC1lLDApLG09cCgpK2EuY2FsbChjLHUpO3JldHVybiB1PjA/KGY9bS5sZW5ndGgsbT15KyhmPD11P1wiMC5cIithLmNhbGwoYyx1LWYpK206bS5zbGljZSgwLGYtdSkrXCIuXCIrbS5zbGljZShmLXUpKSk6bT15K20sbX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDUpLG89cigxNjYpLGE9MS4udG9QcmVjaXNpb247bihuLlArbi5GKihpKGZ1bmN0aW9uKCl7cmV0dXJuXCIxXCIhPT1hLmNhbGwoMSx2b2lkIDApfSl8fCFpKGZ1bmN0aW9uKCl7YS5jYWxsKHt9KX0pKSxcIk51bWJlclwiLHt0b1ByZWNpc2lvbjpmdW5jdGlvbih0KXt2YXIgZT1vKHRoaXMsXCJOdW1iZXIjdG9QcmVjaXNpb246IGluY29ycmVjdCBpbnZvY2F0aW9uIVwiKTtyZXR1cm4gdm9pZCAwPT09dD9hLmNhbGwoZSk6YS5jYWxsKGUsdCl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TK24uRixcIk9iamVjdFwiLHthc3NpZ246cigxNzkpfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiT2JqZWN0XCIse2NyZWF0ZTpyKDQyKX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKTtuKG4uUytuLkYqIXIoOCksXCJPYmplY3RcIix7ZGVmaW5lUHJvcGVydGllczpyKDE4MCl9KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMrbi5GKiFyKDgpLFwiT2JqZWN0XCIse2RlZmluZVByb3BlcnR5OnIoOSkuZn0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2KSxpPXIoMzYpLm9uRnJlZXplO3IoMjgpKFwiZnJlZXplXCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0JiZuKGUpP3QoaShlKSk6ZX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTcpLGk9cigyMCkuZjtyKDI4KShcImdldE93blByb3BlcnR5RGVzY3JpcHRvclwiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkobih0KSxlKX19KX0sZnVuY3Rpb24odCxlLHIpe3IoMjgpKFwiZ2V0T3duUHJvcGVydHlOYW1lc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIHIoMTgxKS5mfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDExKSxpPXIoMjEpO3IoMjgpKFwiZ2V0UHJvdG90eXBlT2ZcIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShuKHQpKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNik7cigyOCkoXCJpc0V4dGVuc2libGVcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuISFuKGUpJiYoIXR8fHQoZSkpfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2KTtyKDI4KShcImlzRnJvemVuXCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiFuKGUpfHwhIXQmJnQoZSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDYpO3IoMjgpKFwiaXNTZWFsZWRcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIW4oZSl8fCEhdCYmdChlKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJPYmplY3RcIix7aXM6cigxODcpfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDExKSxpPXIoNDQpO3IoMjgpKFwia2V5c1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKG4odCkpfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2KSxpPXIoMzYpLm9uRnJlZXplO3IoMjgpKFwicHJldmVudEV4dGVuc2lvbnNcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm4oZSk/dChpKGUpKTplfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2KSxpPXIoMzYpLm9uRnJlZXplO3IoMjgpKFwic2VhbFwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCYmbihlKT90KGkoZSkpOmV9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiT2JqZWN0XCIse3NldFByb3RvdHlwZU9mOnIoMTMyKS5zZXR9KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoNjQpLGk9e307aVtyKDcpKFwidG9TdHJpbmdUYWdcIildPVwielwiLGkrXCJcIiE9XCJbb2JqZWN0IHpdXCImJnIoMTUpKE9iamVjdC5wcm90b3R5cGUsXCJ0b1N0cmluZ1wiLGZ1bmN0aW9uKCl7cmV0dXJuXCJbb2JqZWN0IFwiK24odGhpcykrXCJdXCJ9LCEwKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDE4NSk7bihuLkcrbi5GKihwYXJzZUZsb2F0IT1pKSx7cGFyc2VGbG9hdDppfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxODYpO24obi5HK24uRioocGFyc2VJbnQhPWkpLHtwYXJzZUludDppfSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbixpLG8sYT1yKDQxKSxmPXIoNCkscz1yKDMzKSx1PXIoNjQpLGg9cigwKSxjPXIoNiksZD1yKDEzKSxsPXIoNDApLHA9cig1NSksYj1yKDEzNCksdj1yKDEzOSkuc2V0LHk9cigxMzEpKCksbT1cIlByb21pc2VcIixnPWYuVHlwZUVycm9yLHc9Zi5wcm9jZXNzLF89ZlttXSx3PWYucHJvY2VzcyxNPVwicHJvY2Vzc1wiPT11KHcpLFM9ZnVuY3Rpb24oKXt9LEU9ISFmdW5jdGlvbigpe3RyeXt2YXIgdD1fLnJlc29sdmUoMSksZT0odC5jb25zdHJ1Y3Rvcj17fSlbcig3KShcInNwZWNpZXNcIildPWZ1bmN0aW9uKHQpe3QoUyxTKX07cmV0dXJuKE18fFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCkmJnQudGhlbihTKWluc3RhbmNlb2YgZX1jYXRjaCh0KXt9fSgpLEE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQ9PT1fJiZlPT09b30saz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4hKCFjKHQpfHxcImZ1bmN0aW9uXCIhPXR5cGVvZihlPXQudGhlbikpJiZlfSx4PWZ1bmN0aW9uKHQpe3JldHVybiBBKF8sdCk/bmV3IEkodCk6bmV3IGkodCl9LEk9aT1mdW5jdGlvbih0KXt2YXIgZSxyO3RoaXMucHJvbWlzZT1uZXcgdChmdW5jdGlvbih0LG4pe2lmKHZvaWQgMCE9PWV8fHZvaWQgMCE9PXIpdGhyb3cgZyhcIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yXCIpO2U9dCxyPW59KSx0aGlzLnJlc29sdmU9ZChlKSx0aGlzLnJlamVjdD1kKHIpfSxCPWZ1bmN0aW9uKHQpe3RyeXt0KCl9Y2F0Y2godCl7cmV0dXJue2Vycm9yOnR9fX0sTz1mdW5jdGlvbih0LGUpe2lmKCF0Ll9uKXt0Ll9uPSEwO3ZhciByPXQuX2M7eShmdW5jdGlvbigpe2Zvcih2YXIgbj10Ll92LGk9MT09dC5fcyxvPTAsYT1mdW5jdGlvbihlKXt2YXIgcixvLGE9aT9lLm9rOmUuZmFpbCxmPWUucmVzb2x2ZSxzPWUucmVqZWN0LHU9ZS5kb21haW47dHJ5e2E/KGl8fCgyPT10Ll9oJiZUKHQpLHQuX2g9MSksYT09PSEwP3I9bjoodSYmdS5lbnRlcigpLHI9YShuKSx1JiZ1LmV4aXQoKSkscj09PWUucHJvbWlzZT9zKGcoXCJQcm9taXNlLWNoYWluIGN5Y2xlXCIpKToobz1rKHIpKT9vLmNhbGwocixmLHMpOmYocikpOnMobil9Y2F0Y2godCl7cyh0KX19O3IubGVuZ3RoPm87KWEocltvKytdKTt0Ll9jPVtdLHQuX249ITEsZSYmIXQuX2gmJlIodCl9KX19LFI9ZnVuY3Rpb24odCl7di5jYWxsKGYsZnVuY3Rpb24oKXt2YXIgZSxyLG4saT10Ll92O2lmKFAodCkmJihlPUIoZnVuY3Rpb24oKXtNP3cuZW1pdChcInVuaGFuZGxlZFJlamVjdGlvblwiLGksdCk6KHI9Zi5vbnVuaGFuZGxlZHJlamVjdGlvbik/cih7cHJvbWlzZTp0LHJlYXNvbjppfSk6KG49Zi5jb25zb2xlKSYmbi5lcnJvciYmbi5lcnJvcihcIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblwiLGkpfSksdC5faD1NfHxQKHQpPzI6MSksdC5fYT12b2lkIDAsZSl0aHJvdyBlLmVycm9yfSl9LFA9ZnVuY3Rpb24odCl7aWYoMT09dC5faClyZXR1cm4hMTtmb3IodmFyIGUscj10Ll9hfHx0Ll9jLG49MDtyLmxlbmd0aD5uOylpZihlPXJbbisrXSxlLmZhaWx8fCFQKGUucHJvbWlzZSkpcmV0dXJuITE7cmV0dXJuITB9LFQ9ZnVuY3Rpb24odCl7di5jYWxsKGYsZnVuY3Rpb24oKXt2YXIgZTtNP3cuZW1pdChcInJlamVjdGlvbkhhbmRsZWRcIix0KTooZT1mLm9ucmVqZWN0aW9uaGFuZGxlZCkmJmUoe3Byb21pc2U6dCxyZWFzb246dC5fdn0pfSl9LGo9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztlLl9kfHwoZS5fZD0hMCxlPWUuX3d8fGUsZS5fdj10LGUuX3M9MixlLl9hfHwoZS5fYT1lLl9jLnNsaWNlKCkpLE8oZSwhMCkpfSxDPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dGhpcztpZighci5fZCl7ci5fZD0hMCxyPXIuX3d8fHI7dHJ5e2lmKHI9PT10KXRocm93IGcoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTsoZT1rKHQpKT95KGZ1bmN0aW9uKCl7dmFyIG49e193OnIsX2Q6ITF9O3RyeXtlLmNhbGwodCxzKEMsbiwxKSxzKGosbiwxKSl9Y2F0Y2godCl7ai5jYWxsKG4sdCl9fSk6KHIuX3Y9dCxyLl9zPTEsTyhyLCExKSl9Y2F0Y2godCl7ai5jYWxsKHtfdzpyLF9kOiExfSx0KX19fTtFfHwoXz1mdW5jdGlvbih0KXtsKHRoaXMsXyxtLFwiX2hcIiksZCh0KSxuLmNhbGwodGhpcyk7dHJ5e3QocyhDLHRoaXMsMSkscyhqLHRoaXMsMSkpfWNhdGNoKHQpe2ouY2FsbCh0aGlzLHQpfX0sbj1mdW5jdGlvbih0KXt0aGlzLl9jPVtdLHRoaXMuX2E9dm9pZCAwLHRoaXMuX3M9MCx0aGlzLl9kPSExLHRoaXMuX3Y9dm9pZCAwLHRoaXMuX2g9MCx0aGlzLl9uPSExfSxuLnByb3RvdHlwZT1yKDQ1KShfLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbih0LGUpe3ZhciByPXgoYih0aGlzLF8pKTtyZXR1cm4gci5vaz1cImZ1bmN0aW9uXCIhPXR5cGVvZiB0fHx0LHIuZmFpbD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlLHIuZG9tYWluPU0/dy5kb21haW46dm9pZCAwLHRoaXMuX2MucHVzaChyKSx0aGlzLl9hJiZ0aGlzLl9hLnB1c2gociksdGhpcy5fcyYmTyh0aGlzLCExKSxyLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfX0pLEk9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbjt0aGlzLnByb21pc2U9dCx0aGlzLnJlc29sdmU9cyhDLHQsMSksdGhpcy5yZWplY3Q9cyhqLHQsMSl9KSxoKGguRytoLlcraC5GKiFFLHtQcm9taXNlOl99KSxyKDU3KShfLG0pLHIoNDYpKG0pLG89cigzMilbbV0saChoLlMraC5GKiFFLG0se3JlamVjdDpmdW5jdGlvbih0KXt2YXIgZT14KHRoaXMpLHI9ZS5yZWplY3Q7cmV0dXJuIHIodCksZS5wcm9taXNlfX0pLGgoaC5TK2guRiooYXx8IUUpLG0se3Jlc29sdmU6ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIF8mJkEodC5jb25zdHJ1Y3Rvcix0aGlzKSlyZXR1cm4gdDt2YXIgZT14KHRoaXMpLHI9ZS5yZXNvbHZlO3JldHVybiByKHQpLGUucHJvbWlzZX19KSxoKGguUytoLkYqIShFJiZyKDg0KShmdW5jdGlvbih0KXtfLmFsbCh0KS5jYXRjaChTKX0pKSxtLHthbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPXgoZSksbj1yLnJlc29sdmUsaT1yLnJlamVjdCxvPUIoZnVuY3Rpb24oKXt2YXIgcj1bXSxvPTAsYT0xO3AodCwhMSxmdW5jdGlvbih0KXt2YXIgZj1vKysscz0hMTtyLnB1c2godm9pZCAwKSxhKyssZS5yZXNvbHZlKHQpLnRoZW4oZnVuY3Rpb24odCl7c3x8KHM9ITAscltmXT10LC0tYXx8bihyKSl9LGkpfSksLS1hfHxuKHIpfSk7cmV0dXJuIG8mJmkoby5lcnJvciksci5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj14KGUpLG49ci5yZWplY3QsaT1CKGZ1bmN0aW9uKCl7cCh0LCExLGZ1bmN0aW9uKHQpe2UucmVzb2x2ZSh0KS50aGVuKHIucmVzb2x2ZSxuKX0pfSk7cmV0dXJuIGkmJm4oaS5lcnJvciksci5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoMTMpLG89cigzKSxhPShyKDQpLlJlZmxlY3R8fHt9KS5hcHBseSxmPUZ1bmN0aW9uLmFwcGx5O24obi5TK24uRiohcig1KShmdW5jdGlvbigpe2EoZnVuY3Rpb24oKXt9KX0pLFwiUmVmbGVjdFwiLHthcHBseTpmdW5jdGlvbih0LGUscil7dmFyIG49aSh0KSxzPW8ocik7cmV0dXJuIGE/YShuLGUscyk6Zi5jYWxsKG4sZSxzKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDQyKSxvPXIoMTMpLGE9cigzKSxmPXIoNikscz1yKDUpLHU9cigxNzApLGg9KHIoNCkuUmVmbGVjdHx8e30pLmNvbnN0cnVjdCxjPXMoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiEoaChmdW5jdGlvbigpe30sW10sdClpbnN0YW5jZW9mIHQpfSksZD0hcyhmdW5jdGlvbigpe2goZnVuY3Rpb24oKXt9KX0pO24obi5TK24uRiooY3x8ZCksXCJSZWZsZWN0XCIse2NvbnN0cnVjdDpmdW5jdGlvbih0LGUpe28odCksYShlKTt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPDM/dDpvKGFyZ3VtZW50c1syXSk7aWYoZCYmIWMpcmV0dXJuIGgodCxlLHIpO2lmKHQ9PXIpe3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGVbMF0pO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdKTtjYXNlIDQ6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10pfXZhciBuPVtudWxsXTtyZXR1cm4gbi5wdXNoLmFwcGx5KG4sZSksbmV3KHUuYXBwbHkodCxuKSl9dmFyIHM9ci5wcm90b3R5cGUsbD1pKGYocyk/czpPYmplY3QucHJvdG90eXBlKSxwPUZ1bmN0aW9uLmFwcGx5LmNhbGwodCxsLGUpO3JldHVybiBmKHApP3A6bH19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoOSksaT1yKDApLG89cigzKSxhPXIoMjkpO2koaS5TK2kuRipyKDUpKGZ1bmN0aW9uKCl7UmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShuLmYoe30sMSx7dmFsdWU6MX0pLDEse3ZhbHVlOjJ9KX0pLFwiUmVmbGVjdFwiLHtkZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbih0LGUscil7byh0KSxlPWEoZSwhMCksbyhyKTt0cnl7cmV0dXJuIG4uZih0LGUsciksITB9Y2F0Y2godCl7cmV0dXJuITF9fX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoMjApLmYsbz1yKDMpO24obi5TLFwiUmVmbGVjdFwiLHtkZWxldGVQcm9wZXJ0eTpmdW5jdGlvbih0LGUpe3ZhciByPWkobyh0KSxlKTtyZXR1cm4hKHImJiFyLmNvbmZpZ3VyYWJsZSkmJmRlbGV0ZSB0W2VdfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigwKSxpPXIoMyksbz1mdW5jdGlvbih0KXt0aGlzLl90PWkodCksdGhpcy5faT0wO3ZhciBlLHI9dGhpcy5faz1bXTtmb3IoZSBpbiB0KXIucHVzaChlKX07cigxMjcpKG8sXCJPYmplY3RcIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcyxyPWUuX2s7ZG8gaWYoZS5faT49ci5sZW5ndGgpcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfTt3aGlsZSghKCh0PXJbZS5faSsrXSlpbiBlLl90KSk7cmV0dXJue3ZhbHVlOnQsZG9uZTohMX19KSxuKG4uUyxcIlJlZmxlY3RcIix7ZW51bWVyYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMjApLGk9cigwKSxvPXIoMyk7aShpLlMsXCJSZWZsZWN0XCIse2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiBuLmYobyh0KSxlKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDIxKSxvPXIoMyk7bihuLlMsXCJSZWZsZWN0XCIse2dldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiBpKG8odCkpfX0pfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3ZhciByLGYsaD1hcmd1bWVudHMubGVuZ3RoPDM/dDphcmd1bWVudHNbMl07cmV0dXJuIHUodCk9PT1oP3RbZV06KHI9aS5mKHQsZSkpP2EocixcInZhbHVlXCIpP3IudmFsdWU6dm9pZCAwIT09ci5nZXQ/ci5nZXQuY2FsbChoKTp2b2lkIDA6cyhmPW8odCkpP24oZixlLGgpOnZvaWQgMH12YXIgaT1yKDIwKSxvPXIoMjEpLGE9cigxMiksZj1yKDApLHM9cig2KSx1PXIoMyk7ZihmLlMsXCJSZWZsZWN0XCIse2dldDpufSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiUmVmbGVjdFwiLHtoYXM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbiB0fX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoMyksbz1PYmplY3QuaXNFeHRlbnNpYmxlO24obi5TLFwiUmVmbGVjdFwiLHtpc0V4dGVuc2libGU6ZnVuY3Rpb24odCl7cmV0dXJuIGkodCksIW98fG8odCl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiUmVmbGVjdFwiLHtvd25LZXlzOnIoMTg0KX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoMyksbz1PYmplY3QucHJldmVudEV4dGVuc2lvbnM7bihuLlMsXCJSZWZsZWN0XCIse3ByZXZlbnRFeHRlbnNpb25zOmZ1bmN0aW9uKHQpe2kodCk7dHJ5e3JldHVybiBvJiZvKHQpLCEwfWNhdGNoKHQpe3JldHVybiExfX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDEzMik7aSYmbihuLlMsXCJSZWZsZWN0XCIse3NldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQsZSl7aS5jaGVjayh0LGUpO3RyeXtyZXR1cm4gaS5zZXQodCxlKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19fSl9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgcyxkLGw9YXJndW1lbnRzLmxlbmd0aDw0P3Q6YXJndW1lbnRzWzNdLHA9by5mKGgodCksZSk7aWYoIXApe2lmKGMoZD1hKHQpKSlyZXR1cm4gbihkLGUscixsKTtwPXUoMCl9cmV0dXJuIGYocCxcInZhbHVlXCIpPyEocC53cml0YWJsZT09PSExfHwhYyhsKSkmJihzPW8uZihsLGUpfHx1KDApLHMudmFsdWU9cixpLmYobCxlLHMpLCEwKTp2b2lkIDAhPT1wLnNldCYmKHAuc2V0LmNhbGwobCxyKSwhMCl9dmFyIGk9cig5KSxvPXIoMjApLGE9cigyMSksZj1yKDEyKSxzPXIoMCksdT1yKDM3KSxoPXIoMyksYz1yKDYpO3Mocy5TLFwiUmVmbGVjdFwiLHtzZXQ6bn0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig0KSxpPXIoMTI0KSxvPXIoOSkuZixhPXIoNDMpLmYsZj1yKDgzKSxzPXIoODEpLHU9bi5SZWdFeHAsaD11LGM9dS5wcm90b3R5cGUsZD0vYS9nLGw9L2EvZyxwPW5ldyB1KGQpIT09ZDtpZihyKDgpJiYoIXB8fHIoNSkoZnVuY3Rpb24oKXtyZXR1cm4gbFtyKDcpKFwibWF0Y2hcIildPSExLHUoZCkhPWR8fHUobCk9PWx8fFwiL2EvaVwiIT11KGQsXCJpXCIpfSkpKXt1PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyBpbnN0YW5jZW9mIHUsbj1mKHQpLG89dm9pZCAwPT09ZTtyZXR1cm4hciYmbiYmdC5jb25zdHJ1Y3Rvcj09PXUmJm8/dDppKHA/bmV3IGgobiYmIW8/dC5zb3VyY2U6dCxlKTpoKChuPXQgaW5zdGFuY2VvZiB1KT90LnNvdXJjZTp0LG4mJm8/cy5jYWxsKHQpOmUpLHI/dGhpczpjLHUpfTtmb3IodmFyIGI9KGZ1bmN0aW9uKHQpe3QgaW4gdXx8byh1LHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaFt0XX0sc2V0OmZ1bmN0aW9uKGUpe2hbdF09ZX19KX0pLHY9YShoKSx5PTA7di5sZW5ndGg+eTspYih2W3krK10pO2MuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZT1jLHIoMTUpKG4sXCJSZWdFeHBcIix1KX1yKDQ2KShcIlJlZ0V4cFwiKX0sZnVuY3Rpb24odCxlLHIpe3IoODApKFwibWF0Y2hcIiwxLGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm5bZnVuY3Rpb24ocil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49dCh0aGlzKSxpPXZvaWQgMD09cj92b2lkIDA6cltlXTtyZXR1cm4gdm9pZCAwIT09aT9pLmNhbGwocixuKTpuZXcgUmVnRXhwKHIpW2VdKFN0cmluZyhuKSl9LHJdfSl9LGZ1bmN0aW9uKHQsZSxyKXtcbnIoODApKFwicmVwbGFjZVwiLDIsZnVuY3Rpb24odCxlLHIpe3JldHVybltmdW5jdGlvbihuLGkpe1widXNlIHN0cmljdFwiO3ZhciBvPXQodGhpcyksYT12b2lkIDA9PW4/dm9pZCAwOm5bZV07cmV0dXJuIHZvaWQgMCE9PWE/YS5jYWxsKG4sbyxpKTpyLmNhbGwoU3RyaW5nKG8pLG4saSl9LHJdfSl9LGZ1bmN0aW9uKHQsZSxyKXtyKDgwKShcInNlYXJjaFwiLDEsZnVuY3Rpb24odCxlLHIpe3JldHVybltmdW5jdGlvbihyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj10KHRoaXMpLGk9dm9pZCAwPT1yP3ZvaWQgMDpyW2VdO3JldHVybiB2b2lkIDAhPT1pP2kuY2FsbChyLG4pOm5ldyBSZWdFeHAocilbZV0oU3RyaW5nKG4pKX0scl19KX0sZnVuY3Rpb24odCxlLHIpe3IoODApKFwic3BsaXRcIiwyLGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgaT1yKDgzKSxvPW4sYT1bXS5wdXNoLGY9XCJzcGxpdFwiLHM9XCJsZW5ndGhcIix1PVwibGFzdEluZGV4XCI7aWYoXCJjXCI9PVwiYWJiY1wiW2ZdKC8oYikqLylbMV18fDQhPVwidGVzdFwiW2ZdKC8oPzopLywtMSlbc118fDIhPVwiYWJcIltmXSgvKD86YWIpKi8pW3NdfHw0IT1cIi5cIltmXSgvKC4/KSguPykvKVtzXXx8XCIuXCJbZl0oLygpKCkvKVtzXT4xfHxcIlwiW2ZdKC8uPy8pW3NdKXt2YXIgaD12b2lkIDA9PT0vKCk/Py8uZXhlYyhcIlwiKVsxXTtuPWZ1bmN0aW9uKHQsZSl7dmFyIHI9U3RyaW5nKHRoaXMpO2lmKHZvaWQgMD09PXQmJjA9PT1lKXJldHVybltdO2lmKCFpKHQpKXJldHVybiBvLmNhbGwocix0LGUpO3ZhciBuLGYsYyxkLGwscD1bXSxiPSh0Lmlnbm9yZUNhc2U/XCJpXCI6XCJcIikrKHQubXVsdGlsaW5lP1wibVwiOlwiXCIpKyh0LnVuaWNvZGU/XCJ1XCI6XCJcIikrKHQuc3RpY2t5P1wieVwiOlwiXCIpLHY9MCx5PXZvaWQgMD09PWU/NDI5NDk2NzI5NTplPj4+MCxtPW5ldyBSZWdFeHAodC5zb3VyY2UsYitcImdcIik7Zm9yKGh8fChuPW5ldyBSZWdFeHAoXCJeXCIrbS5zb3VyY2UrXCIkKD8hXFxcXHMpXCIsYikpOyhmPW0uZXhlYyhyKSkmJihjPWYuaW5kZXgrZlswXVtzXSwhKGM+diYmKHAucHVzaChyLnNsaWNlKHYsZi5pbmRleCkpLCFoJiZmW3NdPjEmJmZbMF0ucmVwbGFjZShuLGZ1bmN0aW9uKCl7Zm9yKGw9MTtsPGFyZ3VtZW50c1tzXS0yO2wrKyl2b2lkIDA9PT1hcmd1bWVudHNbbF0mJihmW2xdPXZvaWQgMCl9KSxmW3NdPjEmJmYuaW5kZXg8cltzXSYmYS5hcHBseShwLGYuc2xpY2UoMSkpLGQ9ZlswXVtzXSx2PWMscFtzXT49eSkpKTspbVt1XT09PWYuaW5kZXgmJm1bdV0rKztyZXR1cm4gdj09PXJbc10/IWQmJm0udGVzdChcIlwiKXx8cC5wdXNoKFwiXCIpOnAucHVzaChyLnNsaWNlKHYpKSxwW3NdPnk/cC5zbGljZSgwLHkpOnB9fWVsc2VcIjBcIltmXSh2b2lkIDAsMClbc10mJihuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PXQmJjA9PT1lP1tdOm8uY2FsbCh0aGlzLHQsZSl9KTtyZXR1cm5bZnVuY3Rpb24ocixpKXt2YXIgbz10KHRoaXMpLGE9dm9pZCAwPT1yP3ZvaWQgMDpyW2VdO3JldHVybiB2b2lkIDAhPT1hP2EuY2FsbChyLG8saSk6bi5jYWxsKFN0cmluZyhvKSxyLGkpfSxuXX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7cigxOTEpO3ZhciBuPXIoMyksaT1yKDgxKSxvPXIoOCksYT1cInRvU3RyaW5nXCIsZj0vLi9bYV0scz1mdW5jdGlvbih0KXtyKDE1KShSZWdFeHAucHJvdG90eXBlLGEsdCwhMCl9O3IoNSkoZnVuY3Rpb24oKXtyZXR1cm5cIi9hL2JcIiE9Zi5jYWxsKHtzb3VyY2U6XCJhXCIsZmxhZ3M6XCJiXCJ9KX0pP3MoZnVuY3Rpb24oKXt2YXIgdD1uKHRoaXMpO3JldHVyblwiL1wiLmNvbmNhdCh0LnNvdXJjZSxcIi9cIixcImZsYWdzXCJpbiB0P3QuZmxhZ3M6IW8mJnQgaW5zdGFuY2VvZiBSZWdFeHA/aS5jYWxsKHQpOnZvaWQgMCl9KTpmLm5hbWUhPWEmJnMoZnVuY3Rpb24oKXtyZXR1cm4gZi5jYWxsKHRoaXMpfSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtyKDE2KShcImFuY2hvclwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCh0aGlzLFwiYVwiLFwibmFtZVwiLGUpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7cigxNikoXCJiaWdcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLFwiYmlnXCIsXCJcIixcIlwiKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3IoMTYpKFwiYmxpbmtcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLFwiYmxpbmtcIixcIlwiLFwiXCIpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7cigxNikoXCJib2xkXCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxcImJcIixcIlwiLFwiXCIpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigwKSxpPXIoMTM1KSghMSk7bihuLlAsXCJTdHJpbmdcIix7Y29kZVBvaW50QXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0KX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDEwKSxvPXIoMTM2KSxhPVwiZW5kc1dpdGhcIixmPVwiXCJbYV07bihuLlArbi5GKnIoMTIyKShhKSxcIlN0cmluZ1wiLHtlbmRzV2l0aDpmdW5jdGlvbih0KXt2YXIgZT1vKHRoaXMsdCxhKSxyPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLG49aShlLmxlbmd0aCkscz12b2lkIDA9PT1yP246TWF0aC5taW4oaShyKSxuKSx1PVN0cmluZyh0KTtyZXR1cm4gZj9mLmNhbGwoZSx1LHMpOmUuc2xpY2Uocy11Lmxlbmd0aCxzKT09PXV9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtyKDE2KShcImZpeGVkXCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxcInR0XCIsXCJcIixcIlwiKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3IoMTYpKFwiZm9udGNvbG9yXCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KHRoaXMsXCJmb250XCIsXCJjb2xvclwiLGUpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7cigxNikoXCJmb250c2l6ZVwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCh0aGlzLFwiZm9udFwiLFwic2l6ZVwiLGUpfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoNDcpLG89U3RyaW5nLmZyb21DaGFyQ29kZSxhPVN0cmluZy5mcm9tQ29kZVBvaW50O24obi5TK24uRiooISFhJiYxIT1hLmxlbmd0aCksXCJTdHJpbmdcIix7ZnJvbUNvZGVQb2ludDpmdW5jdGlvbih0KXtmb3IodmFyIGUscj1bXSxuPWFyZ3VtZW50cy5sZW5ndGgsYT0wO24+YTspe2lmKGU9K2FyZ3VtZW50c1thKytdLGkoZSwxMTE0MTExKSE9PWUpdGhyb3cgUmFuZ2VFcnJvcihlK1wiIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnRcIik7ci5wdXNoKGU8NjU1MzY/byhlKTpvKCgoZS09NjU1MzYpPj4xMCkrNTUyOTYsZSUxMDI0KzU2MzIwKSl9cmV0dXJuIHIuam9pbihcIlwiKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDEzNiksbz1cImluY2x1ZGVzXCI7bihuLlArbi5GKnIoMTIyKShvKSxcIlN0cmluZ1wiLHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4hIX5pKHRoaXMsdCxvKS5pbmRleE9mKHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7cigxNikoXCJpdGFsaWNzXCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxcImlcIixcIlwiLFwiXCIpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigxMzUpKCEwKTtyKDEyOCkoU3RyaW5nLFwiU3RyaW5nXCIsZnVuY3Rpb24odCl7dGhpcy5fdD1TdHJpbmcodCksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fdCxyPXRoaXMuX2k7cmV0dXJuIHI+PWUubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9bihlLHIpLHRoaXMuX2krPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7cigxNikoXCJsaW5rXCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KHRoaXMsXCJhXCIsXCJocmVmXCIsZSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxNyksbz1yKDEwKTtuKG4uUyxcIlN0cmluZ1wiLHtyYXc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWkodC5yYXcpLHI9byhlLmxlbmd0aCksbj1hcmd1bWVudHMubGVuZ3RoLGE9W10sZj0wO3I+ZjspYS5wdXNoKFN0cmluZyhlW2YrK10pKSxmPG4mJmEucHVzaChTdHJpbmcoYXJndW1lbnRzW2ZdKSk7cmV0dXJuIGEuam9pbihcIlwiKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlAsXCJTdHJpbmdcIix7cmVwZWF0OnIoMTM3KX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7cigxNikoXCJzbWFsbFwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsXCJzbWFsbFwiLFwiXCIsXCJcIil9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigxMCksbz1yKDEzNiksYT1cInN0YXJ0c1dpdGhcIixmPVwiXCJbYV07bihuLlArbi5GKnIoMTIyKShhKSxcIlN0cmluZ1wiLHtzdGFydHNXaXRoOmZ1bmN0aW9uKHQpe3ZhciBlPW8odGhpcyx0LGEpLHI9aShNYXRoLm1pbihhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCxlLmxlbmd0aCkpLG49U3RyaW5nKHQpO3JldHVybiBmP2YuY2FsbChlLG4scik6ZS5zbGljZShyLHIrbi5sZW5ndGgpPT09bn19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3IoMTYpKFwic3RyaWtlXCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxcInN0cmlrZVwiLFwiXCIsXCJcIil9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtyKDE2KShcInN1YlwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsXCJzdWJcIixcIlwiLFwiXCIpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7cigxNikoXCJzdXBcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLFwic3VwXCIsXCJcIixcIlwiKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3IoNTgpKFwidHJpbVwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsMyl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDQpLGk9cigxMiksbz1yKDgpLGE9cigwKSxmPXIoMTUpLHM9cigzNikuS0VZLHU9cig1KSxoPXIoODcpLGM9cig1NyksZD1yKDQ4KSxsPXIoNykscD1yKDE4OSksYj1yKDE0MSksdj1yKDI4NikseT1yKDI4NSksbT1yKDEyNiksZz1yKDMpLHc9cigxNyksXz1yKDI5KSxNPXIoMzcpLFM9cig0MiksRT1yKDE4MSksQT1yKDIwKSxrPXIoOSkseD1yKDQ0KSxJPUEuZixCPWsuZixPPUUuZixSPW4uU3ltYm9sLFA9bi5KU09OLFQ9UCYmUC5zdHJpbmdpZnksaj1cInByb3RvdHlwZVwiLEM9bChcIl9oaWRkZW5cIiksTj1sKFwidG9QcmltaXRpdmVcIiksTD17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxVPWgoXCJzeW1ib2wtcmVnaXN0cnlcIiksej1oKFwic3ltYm9sc1wiKSxEPWgoXCJvcC1zeW1ib2xzXCIpLHE9T2JqZWN0W2pdLEY9XCJmdW5jdGlvblwiPT10eXBlb2YgUixLPW4uUU9iamVjdCxHPSFLfHwhS1tqXXx8IUtbal0uZmluZENoaWxkLFY9byYmdShmdW5jdGlvbigpe3JldHVybiA3IT1TKEIoe30sXCJhXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBCKHRoaXMsXCJhXCIse3ZhbHVlOjd9KS5hfX0pKS5hfSk/ZnVuY3Rpb24odCxlLHIpe3ZhciBuPUkocSxlKTtuJiZkZWxldGUgcVtlXSxCKHQsZSxyKSxuJiZ0IT09cSYmQihxLGUsbil9OkIsSD1mdW5jdGlvbih0KXt2YXIgZT16W3RdPVMoUltqXSk7cmV0dXJuIGUuX2s9dCxlfSxYPUYmJlwic3ltYm9sXCI9PXR5cGVvZiBSLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVyblwic3ltYm9sXCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFJ9LFk9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PT09cSYmWShELGUsciksZyh0KSxlPV8oZSwhMCksZyhyKSxpKHosZSk/KHIuZW51bWVyYWJsZT8oaSh0LEMpJiZ0W0NdW2VdJiYodFtDXVtlXT0hMSkscj1TKHIse2VudW1lcmFibGU6TSgwLCExKX0pKTooaSh0LEMpfHxCKHQsQyxNKDEse30pKSx0W0NdW2VdPSEwKSxWKHQsZSxyKSk6Qih0LGUscil9LFc9ZnVuY3Rpb24odCxlKXtnKHQpO2Zvcih2YXIgcixuPXkoZT13KGUpKSxpPTAsbz1uLmxlbmd0aDtvPmk7KVkodCxyPW5baSsrXSxlW3JdKTtyZXR1cm4gdH0sWj1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP1ModCk6VyhTKHQpLGUpfSxKPWZ1bmN0aW9uKHQpe3ZhciBlPUwuY2FsbCh0aGlzLHQ9Xyh0LCEwKSk7cmV0dXJuISh0aGlzPT09cSYmaSh6LHQpJiYhaShELHQpKSYmKCEoZXx8IWkodGhpcyx0KXx8IWkoeix0KXx8aSh0aGlzLEMpJiZ0aGlzW0NdW3RdKXx8ZSl9LCQ9ZnVuY3Rpb24odCxlKXtpZih0PXcodCksZT1fKGUsITApLHQhPT1xfHwhaSh6LGUpfHxpKEQsZSkpe3ZhciByPUkodCxlKTtyZXR1cm4hcnx8IWkoeixlKXx8aSh0LEMpJiZ0W0NdW2VdfHwoci5lbnVtZXJhYmxlPSEwKSxyfX0sUT1mdW5jdGlvbih0KXtmb3IodmFyIGUscj1PKHcodCkpLG49W10sbz0wO3IubGVuZ3RoPm87KWkoeixlPXJbbysrXSl8fGU9PUN8fGU9PXN8fG4ucHVzaChlKTtyZXR1cm4gbn0sdHQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9dD09PXEsbj1PKHI/RDp3KHQpKSxvPVtdLGE9MDtuLmxlbmd0aD5hOykhaSh6LGU9blthKytdKXx8ciYmIWkocSxlKXx8by5wdXNoKHpbZV0pO3JldHVybiBvfTtGfHwoUj1mdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiBSKXRocm93IFR5cGVFcnJvcihcIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciFcIik7dmFyIHQ9ZChhcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCksZT1mdW5jdGlvbihyKXt0aGlzPT09cSYmZS5jYWxsKEQsciksaSh0aGlzLEMpJiZpKHRoaXNbQ10sdCkmJih0aGlzW0NdW3RdPSExKSxWKHRoaXMsdCxNKDEscikpfTtyZXR1cm4gbyYmRyYmVihxLHQse2NvbmZpZ3VyYWJsZTohMCxzZXQ6ZX0pLEgodCl9LGYoUltqXSxcInRvU3RyaW5nXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa30pLEEuZj0kLGsuZj1ZLHIoNDMpLmY9RS5mPVEscig2NikuZj1KLHIoODYpLmY9dHQsbyYmIXIoNDEpJiZmKHEsXCJwcm9wZXJ0eUlzRW51bWVyYWJsZVwiLEosITApLHAuZj1mdW5jdGlvbih0KXtyZXR1cm4gSChsKHQpKX0pLGEoYS5HK2EuVythLkYqIUYse1N5bWJvbDpSfSk7Zm9yKHZhciBldD1cImhhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzXCIuc3BsaXQoXCIsXCIpLHJ0PTA7ZXQubGVuZ3RoPnJ0OylsKGV0W3J0KytdKTtmb3IodmFyIGV0PXgobC5zdG9yZSkscnQ9MDtldC5sZW5ndGg+cnQ7KWIoZXRbcnQrK10pO2EoYS5TK2EuRiohRixcIlN5bWJvbFwiLHtmb3I6ZnVuY3Rpb24odCl7cmV0dXJuIGkoVSx0Kz1cIlwiKT9VW3RdOlVbdF09Uih0KX0sa2V5Rm9yOmZ1bmN0aW9uKHQpe2lmKFgodCkpcmV0dXJuIHYoVSx0KTt0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgYSBzeW1ib2whXCIpfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtHPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtHPSExfX0pLGEoYS5TK2EuRiohRixcIk9iamVjdFwiLHtjcmVhdGU6WixkZWZpbmVQcm9wZXJ0eTpZLGRlZmluZVByb3BlcnRpZXM6VyxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6JCxnZXRPd25Qcm9wZXJ0eU5hbWVzOlEsZ2V0T3duUHJvcGVydHlTeW1ib2xzOnR0fSksUCYmYShhLlMrYS5GKighRnx8dShmdW5jdGlvbigpe3ZhciB0PVIoKTtyZXR1cm5cIltudWxsXVwiIT1UKFt0XSl8fFwie31cIiE9VCh7YTp0fSl8fFwie31cIiE9VChPYmplY3QodCkpfSkpLFwiSlNPTlwiLHtzdHJpbmdpZnk6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCYmIVgodCkpe2Zvcih2YXIgZSxyLG49W3RdLGk9MTthcmd1bWVudHMubGVuZ3RoPmk7KW4ucHVzaChhcmd1bWVudHNbaSsrXSk7cmV0dXJuIGU9blsxXSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiYocj1lKSwhciYmbShlKXx8KGU9ZnVuY3Rpb24odCxlKXtpZihyJiYoZT1yLmNhbGwodGhpcyx0LGUpKSwhWChlKSlyZXR1cm4gZX0pLG5bMV09ZSxULmFwcGx5KFAsbil9fX0pLFJbal1bTl18fHIoMTQpKFJbal0sTixSW2pdLnZhbHVlT2YpLGMoUixcIlN5bWJvbFwiKSxjKE1hdGgsXCJNYXRoXCIsITApLGMobi5KU09OLFwiSlNPTlwiLCEwKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDg4KSxvPXIoMTQwKSxhPXIoMyksZj1yKDQ3KSxzPXIoMTApLHU9cig2KSxoPXIoNCkuQXJyYXlCdWZmZXIsYz1yKDEzNCksZD1vLkFycmF5QnVmZmVyLGw9by5EYXRhVmlldyxwPWkuQUJWJiZoLmlzVmlldyxiPWQucHJvdG90eXBlLnNsaWNlLHY9aS5WSUVXLHk9XCJBcnJheUJ1ZmZlclwiO24obi5HK24uVytuLkYqKGghPT1kKSx7QXJyYXlCdWZmZXI6ZH0pLG4obi5TK24uRiohaS5DT05TVFIseSx7aXNWaWV3OmZ1bmN0aW9uKHQpe3JldHVybiBwJiZwKHQpfHx1KHQpJiZ2IGluIHR9fSksbihuLlArbi5VK24uRipyKDUpKGZ1bmN0aW9uKCl7cmV0dXJuIW5ldyBkKDIpLnNsaWNlKDEsdm9pZCAwKS5ieXRlTGVuZ3RofSkseSx7c2xpY2U6ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1iJiZ2b2lkIDA9PT1lKXJldHVybiBiLmNhbGwoYSh0aGlzKSx0KTtmb3IodmFyIHI9YSh0aGlzKS5ieXRlTGVuZ3RoLG49Zih0LHIpLGk9Zih2b2lkIDA9PT1lP3I6ZSxyKSxvPW5ldyhjKHRoaXMsZCkpKHMoaS1uKSksdT1uZXcgbCh0aGlzKSxoPW5ldyBsKG8pLHA9MDtuPGk7KWguc2V0VWludDgocCsrLHUuZ2V0VWludDgobisrKSk7cmV0dXJuIG99fSkscig0NikoeSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5HK24uVytuLkYqIXIoODgpLkFCVix7RGF0YVZpZXc6cigxNDApLkRhdGFWaWV3fSl9LGZ1bmN0aW9uKHQsZSxyKXtyKDM1KShcIkZsb2F0MzJcIiw0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHQodGhpcyxlLHIsbil9fSl9LGZ1bmN0aW9uKHQsZSxyKXtyKDM1KShcIkZsb2F0NjRcIiw4LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHQodGhpcyxlLHIsbil9fSl9LGZ1bmN0aW9uKHQsZSxyKXtyKDM1KShcIkludDE2XCIsMixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiB0KHRoaXMsZSxyLG4pfX0pfSxmdW5jdGlvbih0LGUscil7cigzNSkoXCJJbnQzMlwiLDQsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gdCh0aGlzLGUscixuKX19KX0sZnVuY3Rpb24odCxlLHIpe3IoMzUpKFwiSW50OFwiLDEsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gdCh0aGlzLGUscixuKX19KX0sZnVuY3Rpb24odCxlLHIpe3IoMzUpKFwiVWludDE2XCIsMixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiB0KHRoaXMsZSxyLG4pfX0pfSxmdW5jdGlvbih0LGUscil7cigzNSkoXCJVaW50MzJcIiw0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIHQodGhpcyxlLHIsbil9fSl9LGZ1bmN0aW9uKHQsZSxyKXtyKDM1KShcIlVpbnQ4XCIsMSxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiB0KHRoaXMsZSxyLG4pfX0pfSxmdW5jdGlvbih0LGUscil7cigzNSkoXCJVaW50OFwiLDEsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gdCh0aGlzLGUscixuKX19LCEwKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMTczKTtyKDc5KShcIldlYWtTZXRcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwKX19LHthZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4uZGVmKHRoaXMsdCwhMCl9fSxuLCExLCEwKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDc4KSghMCk7bihuLlAsXCJBcnJheVwiLHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLHIoNTQpKFwiaW5jbHVkZXNcIil9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxMzEpKCksbz1yKDQpLnByb2Nlc3MsYT1cInByb2Nlc3NcIj09cigyMykobyk7bihuLkcse2FzYXA6ZnVuY3Rpb24odCl7dmFyIGU9YSYmby5kb21haW47aShlP2UuYmluZCh0KTp0KX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDIzKTtuKG4uUyxcIkVycm9yXCIse2lzRXJyb3I6ZnVuY3Rpb24odCl7cmV0dXJuXCJFcnJvclwiPT09aSh0KX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlArbi5SLFwiTWFwXCIse3RvSlNPTjpyKDE3MikoXCJNYXBcIil9KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJNYXRoXCIse2lhZGRoOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXQ+Pj4wLG89ZT4+PjAsYT1yPj4+MDtyZXR1cm4gbysobj4+PjApKygoaSZhfChpfGEpJn4oaSthPj4+MCkpPj4+MzEpfDB9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5TLFwiTWF0aFwiLHtpbXVsaDpmdW5jdGlvbih0LGUpe3ZhciByPTY1NTM1LG49K3QsaT0rZSxvPW4mcixhPWkmcixmPW4+PjE2LHM9aT4+MTYsdT0oZiphPj4+MCkrKG8qYT4+PjE2KTtyZXR1cm4gZipzKyh1Pj4xNikrKChvKnM+Pj4wKSsodSZyKT4+MTYpfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKTtuKG4uUyxcIk1hdGhcIix7aXN1Ymg6ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9dD4+PjAsbz1lPj4+MCxhPXI+Pj4wO3JldHVybiBvLShuPj4+MCktKCh+aSZhfH4oaV5hKSZpLWE+Pj4wKT4+PjMxKXwwfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKTtuKG4uUyxcIk1hdGhcIix7dW11bGg6ZnVuY3Rpb24odCxlKXt2YXIgcj02NTUzNSxuPSt0LGk9K2Usbz1uJnIsYT1pJnIsZj1uPj4+MTYscz1pPj4+MTYsdT0oZiphPj4+MCkrKG8qYT4+PjE2KTtyZXR1cm4gZipzKyh1Pj4+MTYpKygobypzPj4+MCkrKHUmcik+Pj4xNil9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigxMSksbz1yKDEzKSxhPXIoOSk7cig4KSYmbihuLlArcig4NSksXCJPYmplY3RcIix7X19kZWZpbmVHZXR0ZXJfXzpmdW5jdGlvbih0LGUpe2EuZihpKHRoaXMpLHQse2dldDpvKGUpLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigxMSksbz1yKDEzKSxhPXIoOSk7cig4KSYmbihuLlArcig4NSksXCJPYmplY3RcIix7X19kZWZpbmVTZXR0ZXJfXzpmdW5jdGlvbih0LGUpe2EuZihpKHRoaXMpLHQse3NldDpvKGUpLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxODMpKCEwKTtuKG4uUyxcIk9iamVjdFwiLHtlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQpfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigwKSxpPXIoMTg0KSxvPXIoMTcpLGE9cigyMCksZj1yKDExOSk7bihuLlMsXCJPYmplY3RcIix7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczpmdW5jdGlvbih0KXtmb3IodmFyIGUscj1vKHQpLG49YS5mLHM9aShyKSx1PXt9LGg9MDtzLmxlbmd0aD5oOylmKHUsZT1zW2grK10sbihyLGUpKTtyZXR1cm4gdX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDExKSxvPXIoMjkpLGE9cigyMSksZj1yKDIwKS5mO3IoOCkmJm4obi5QK3IoODUpLFwiT2JqZWN0XCIse19fbG9va3VwR2V0dGVyX186ZnVuY3Rpb24odCl7dmFyIGUscj1pKHRoaXMpLG49byh0LCEwKTtkbyBpZihlPWYocixuKSlyZXR1cm4gZS5nZXQ7d2hpbGUocj1hKHIpKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDExKSxvPXIoMjkpLGE9cigyMSksZj1yKDIwKS5mO3IoOCkmJm4obi5QK3IoODUpLFwiT2JqZWN0XCIse19fbG9va3VwU2V0dGVyX186ZnVuY3Rpb24odCl7dmFyIGUscj1pKHRoaXMpLG49byh0LCEwKTtkbyBpZihlPWYocixuKSlyZXR1cm4gZS5zZXQ7d2hpbGUocj1hKHIpKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCksaT1yKDE4MykoITEpO24obi5TLFwiT2JqZWN0XCIse3ZhbHVlczpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDQpLG89cigzMiksYT1yKDEzMSkoKSxmPXIoNykoXCJvYnNlcnZhYmxlXCIpLHM9cigxMyksdT1yKDMpLGg9cig0MCksYz1yKDQ1KSxkPXIoMTQpLGw9cig1NSkscD1sLlJFVFVSTixiPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMDpzKHQpfSx2PWZ1bmN0aW9uKHQpe3ZhciBlPXQuX2M7ZSYmKHQuX2M9dm9pZCAwLGUoKSl9LHk9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQuX299LG09ZnVuY3Rpb24odCl7eSh0KXx8KHQuX289dm9pZCAwLHYodCkpfSxnPWZ1bmN0aW9uKHQsZSl7dSh0KSx0aGlzLl9jPXZvaWQgMCx0aGlzLl9vPXQsdD1uZXcgdyh0aGlzKTt0cnl7dmFyIHI9ZSh0KSxuPXI7bnVsbCE9ciYmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIudW5zdWJzY3JpYmU/cj1mdW5jdGlvbigpe24udW5zdWJzY3JpYmUoKX06cyhyKSx0aGlzLl9jPXIpfWNhdGNoKGUpe3JldHVybiB2b2lkIHQuZXJyb3IoZSl9eSh0aGlzKSYmdih0aGlzKX07Zy5wcm90b3R5cGU9Yyh7fSx7dW5zdWJzY3JpYmU6ZnVuY3Rpb24oKXttKHRoaXMpfX0pO3ZhciB3PWZ1bmN0aW9uKHQpe3RoaXMuX3M9dH07dy5wcm90b3R5cGU9Yyh7fSx7bmV4dDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zO2lmKCF5KGUpKXt2YXIgcj1lLl9vO3RyeXt2YXIgbj1iKHIubmV4dCk7aWYobilyZXR1cm4gbi5jYWxsKHIsdCl9Y2F0Y2godCl7dHJ5e20oZSl9ZmluYWxseXt0aHJvdyB0fX19fSxlcnJvcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zO2lmKHkoZSkpdGhyb3cgdDt2YXIgcj1lLl9vO2UuX289dm9pZCAwO3RyeXt2YXIgbj1iKHIuZXJyb3IpO2lmKCFuKXRocm93IHQ7dD1uLmNhbGwocix0KX1jYXRjaCh0KXt0cnl7dihlKX1maW5hbGx5e3Rocm93IHR9fXJldHVybiB2KGUpLHR9LGNvbXBsZXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3M7aWYoIXkoZSkpe3ZhciByPWUuX287ZS5fbz12b2lkIDA7dHJ5e3ZhciBuPWIoci5jb21wbGV0ZSk7dD1uP24uY2FsbChyLHQpOnZvaWQgMH1jYXRjaCh0KXt0cnl7dihlKX1maW5hbGx5e3Rocm93IHR9fXJldHVybiB2KGUpLHR9fX0pO3ZhciBfPWZ1bmN0aW9uKHQpe2godGhpcyxfLFwiT2JzZXJ2YWJsZVwiLFwiX2ZcIikuX2Y9cyh0KX07YyhfLnByb3RvdHlwZSx7c3Vic2NyaWJlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZyh0LHRoaXMuX2YpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyhvLlByb21pc2V8fGkuUHJvbWlzZSkoZnVuY3Rpb24ocixuKXtzKHQpO3ZhciBpPWUuc3Vic2NyaWJlKHtuZXh0OmZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gdChlKX1jYXRjaCh0KXtuKHQpLGkudW5zdWJzY3JpYmUoKX19LGVycm9yOm4sY29tcGxldGU6cn0pfSl9fSksYyhfLHtmcm9tOmZ1bmN0aW9uKHQpe3ZhciBlPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXM/dGhpczpfLHI9Yih1KHQpW2ZdKTtpZihyKXt2YXIgbj11KHIuY2FsbCh0KSk7cmV0dXJuIG4uY29uc3RydWN0b3I9PT1lP246bmV3IGUoZnVuY3Rpb24odCl7cmV0dXJuIG4uc3Vic2NyaWJlKHQpfSl9cmV0dXJuIG5ldyBlKGZ1bmN0aW9uKGUpe3ZhciByPSExO3JldHVybiBhKGZ1bmN0aW9uKCl7aWYoIXIpe3RyeXtpZihsKHQsITEsZnVuY3Rpb24odCl7aWYoZS5uZXh0KHQpLHIpcmV0dXJuIHB9KT09PXApcmV0dXJufWNhdGNoKHQpe2lmKHIpdGhyb3cgdDtyZXR1cm4gdm9pZCBlLmVycm9yKHQpfWUuY29tcGxldGUoKX19KSxmdW5jdGlvbigpe3I9ITB9fSl9LG9mOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT1hcmd1bWVudHMubGVuZ3RoLHI9QXJyYXkoZSk7dDxlOylyW3RdPWFyZ3VtZW50c1t0KytdO3JldHVybiBuZXcoXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcz90aGlzOl8pKGZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiBhKGZ1bmN0aW9uKCl7aWYoIWUpe2Zvcih2YXIgbj0wO248ci5sZW5ndGg7KytuKWlmKHQubmV4dChyW25dKSxlKXJldHVybjt0LmNvbXBsZXRlKCl9fSksZnVuY3Rpb24oKXtlPSEwfX0pfX0pLGQoXy5wcm90b3R5cGUsZixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksbihuLkcse09ic2VydmFibGU6X30pLHIoNDYpKFwiT2JzZXJ2YWJsZVwiKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMzQpLGk9cigzKSxvPW4ua2V5LGE9bi5zZXQ7bi5leHAoe2RlZmluZU1ldGFkYXRhOmZ1bmN0aW9uKHQsZSxyLG4pe2EodCxlLGkociksbyhuKSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDM0KSxpPXIoMyksbz1uLmtleSxhPW4ubWFwLGY9bi5zdG9yZTtuLmV4cCh7ZGVsZXRlTWV0YWRhdGE6ZnVuY3Rpb24odCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOm8oYXJndW1lbnRzWzJdKSxuPWEoaShlKSxyLCExKTtpZih2b2lkIDA9PT1ufHwhbi5kZWxldGUodCkpcmV0dXJuITE7aWYobi5zaXplKXJldHVybiEwO3ZhciBzPWYuZ2V0KGUpO3JldHVybiBzLmRlbGV0ZShyKSwhIXMuc2l6ZXx8Zi5kZWxldGUoZSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDE5MiksaT1yKDE2OCksbz1yKDM0KSxhPXIoMyksZj1yKDIxKSxzPW8ua2V5cyx1PW8ua2V5LGg9ZnVuY3Rpb24odCxlKXt2YXIgcj1zKHQsZSksbz1mKHQpO2lmKG51bGw9PT1vKXJldHVybiByO3ZhciBhPWgobyxlKTtyZXR1cm4gYS5sZW5ndGg/ci5sZW5ndGg/aShuZXcgbihyLmNvbmNhdChhKSkpOmE6cn07by5leHAoe2dldE1ldGFkYXRhS2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaChhKHQpLGFyZ3VtZW50cy5sZW5ndGg8Mj92b2lkIDA6dShhcmd1bWVudHNbMV0pKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMzQpLGk9cigzKSxvPXIoMjEpLGE9bi5oYXMsZj1uLmdldCxzPW4ua2V5LHU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWEodCxlLHIpO2lmKG4pcmV0dXJuIGYodCxlLHIpO3ZhciBpPW8oZSk7cmV0dXJuIG51bGwhPT1pP3UodCxpLHIpOnZvaWQgMH07bi5leHAoe2dldE1ldGFkYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodCxpKGUpLGFyZ3VtZW50cy5sZW5ndGg8Mz92b2lkIDA6cyhhcmd1bWVudHNbMl0pKX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMzQpLGk9cigzKSxvPW4ua2V5cyxhPW4ua2V5O24uZXhwKHtnZXRPd25NZXRhZGF0YUtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIG8oaSh0KSxhcmd1bWVudHMubGVuZ3RoPDI/dm9pZCAwOmEoYXJndW1lbnRzWzFdKSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDM0KSxpPXIoMyksbz1uLmdldCxhPW4ua2V5O24uZXhwKHtnZXRPd25NZXRhZGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiBvKHQsaShlKSxhcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOmEoYXJndW1lbnRzWzJdKSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDM0KSxpPXIoMyksbz1yKDIxKSxhPW4uaGFzLGY9bi5rZXkscz1mdW5jdGlvbih0LGUscil7dmFyIG49YSh0LGUscik7aWYobilyZXR1cm4hMDt2YXIgaT1vKGUpO3JldHVybiBudWxsIT09aSYmcyh0LGkscil9O24uZXhwKHtoYXNNZXRhZGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiBzKHQsaShlKSxhcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOmYoYXJndW1lbnRzWzJdKSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDM0KSxpPXIoMyksbz1uLmhhcyxhPW4ua2V5O24uZXhwKHtoYXNPd25NZXRhZGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiBvKHQsaShlKSxhcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOmEoYXJndW1lbnRzWzJdKSl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDM0KSxpPXIoMyksbz1yKDEzKSxhPW4ua2V5LGY9bi5zZXQ7bi5leHAoe21ldGFkYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbil7Zih0LGUsKHZvaWQgMCE9PW4/aTpvKShyKSxhKG4pKX19fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApO24obi5QK24uUixcIlNldFwiLHt0b0pTT046cigxNzIpKFwiU2V0XCIpfSl9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj1yKDApLGk9cigxMzUpKCEwKTtuKG4uUCxcIlN0cmluZ1wiLHthdDpmdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigwKSxpPXIoMjQpLG89cigxMCksYT1yKDgzKSxmPXIoODEpLHM9UmVnRXhwLnByb3RvdHlwZSx1PWZ1bmN0aW9uKHQsZSl7dGhpcy5fcj10LHRoaXMuX3M9ZX07cigxMjcpKHUsXCJSZWdFeHAgU3RyaW5nXCIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yLmV4ZWModGhpcy5fcyk7cmV0dXJue3ZhbHVlOnQsZG9uZTpudWxsPT09dH19KSxuKG4uUCxcIlN0cmluZ1wiLHttYXRjaEFsbDpmdW5jdGlvbih0KXtpZihpKHRoaXMpLCFhKHQpKXRocm93IFR5cGVFcnJvcih0K1wiIGlzIG5vdCBhIHJlZ2V4cCFcIik7dmFyIGU9U3RyaW5nKHRoaXMpLHI9XCJmbGFnc1wiaW4gcz9TdHJpbmcodC5mbGFncyk6Zi5jYWxsKHQpLG49bmV3IFJlZ0V4cCh0LnNvdXJjZSx+ci5pbmRleE9mKFwiZ1wiKT9yOlwiZ1wiK3IpO3JldHVybiBuLmxhc3RJbmRleD1vKHQubGFzdEluZGV4KSxuZXcgdShuLGUpfX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG49cigwKSxpPXIoMTg4KTtuKG4uUCxcIlN0cmluZ1wiLHtwYWRFbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLCExKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3ZhciBuPXIoMCksaT1yKDE4OCk7bihuLlAsXCJTdHJpbmdcIix7cGFkU3RhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLCEwKX19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO3IoNTgpKFwidHJpbUxlZnRcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLDEpfX0sXCJ0cmltU3RhcnRcIil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtyKDU4KShcInRyaW1SaWdodFwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsMil9fSxcInRyaW1FbmRcIil9LGZ1bmN0aW9uKHQsZSxyKXtyKDE0MSkoXCJhc3luY0l0ZXJhdG9yXCIpfSxmdW5jdGlvbih0LGUscil7cigxNDEpKFwib2JzZXJ2YWJsZVwiKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMCk7bihuLlMsXCJTeXN0ZW1cIix7Z2xvYmFsOnIoNCl9KX0sZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbj1yKDE0MyksaT1yKDE1KSxvPXIoNCksYT1yKDE0KSxmPXIoNTYpLHM9cig3KSx1PXMoXCJpdGVyYXRvclwiKSxoPXMoXCJ0b1N0cmluZ1RhZ1wiKSxjPWYuQXJyYXksZD1bXCJOb2RlTGlzdFwiLFwiRE9NVG9rZW5MaXN0XCIsXCJNZWRpYUxpc3RcIixcIlN0eWxlU2hlZXRMaXN0XCIsXCJDU1NSdWxlTGlzdFwiXSxsPTA7bDw1O2wrKyl7dmFyIHAsYj1kW2xdLHY9b1tiXSx5PXYmJnYucHJvdG90eXBlO2lmKHkpe3lbdV18fGEoeSx1LGMpLHlbaF18fGEoeSxoLGIpLGZbYl09Yztmb3IocCBpbiBuKXlbcF18fGkoeSxwLG5bcF0sITApfX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDApLGk9cigxMzkpO24obi5HK24uQix7c2V0SW1tZWRpYXRlOmkuc2V0LGNsZWFySW1tZWRpYXRlOmkuY2xlYXJ9KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNCksaT1yKDApLG89cig4MiksYT1yKDI4NyksZj1uLm5hdmlnYXRvcixzPSEhZiYmL01TSUUgLlxcLi8udGVzdChmLnVzZXJBZ2VudCksdT1mdW5jdGlvbih0KXtyZXR1cm4gcz9mdW5jdGlvbihlLHIpe3JldHVybiB0KG8oYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6RnVuY3Rpb24oZSkpLHIpfTp0fTtpKGkuRytpLkIraS5GKnMse3NldFRpbWVvdXQ6dShuLnNldFRpbWVvdXQpLHNldEludGVydmFsOnUobi5zZXRJbnRlcnZhbCl9KX0sZnVuY3Rpb24odCxlLHIpe3IoNDEwKSxyKDM0OSkscigzNTEpLHIoMzUwKSxyKDM1MykscigzNTUpLHIoMzYwKSxyKDM1NCkscigzNTIpLHIoMzYyKSxyKDM2MSkscigzNTcpLHIoMzU4KSxyKDM1NikscigzNDgpLHIoMzU5KSxyKDM2MykscigzNjQpLHIoMzE2KSxyKDMxOCkscigzMTcpLHIoMzY2KSxyKDM2NSkscigzMzYpLHIoMzQ2KSxyKDM0NykscigzMzcpLHIoMzM4KSxyKDMzOSkscigzNDApLHIoMzQxKSxyKDM0MikscigzNDMpLHIoMzQ0KSxyKDM0NSkscigzMTkpLHIoMzIwKSxyKDMyMSkscigzMjIpLHIoMzIzKSxyKDMyNCkscigzMjUpLHIoMzI2KSxyKDMyNykscigzMjgpLHIoMzI5KSxyKDMzMCkscigzMzEpLHIoMzMyKSxyKDMzMykscigzMzQpLHIoMzM1KSxyKDM5Nykscig0MDIpLHIoNDA5KSxyKDQwMCkscigzOTIpLHIoMzkzKSxyKDM5OCkscig0MDMpLHIoNDA1KSxyKDM4OCkscigzODkpLHIoMzkwKSxyKDM5MSkscigzOTQpLHIoMzk1KSxyKDM5NikscigzOTkpLHIoNDAxKSxyKDQwNCkscig0MDYpLHIoNDA3KSxyKDQwOCkscigzMTEpLHIoMzEzKSxyKDMxMikscigzMTUpLHIoMzE0KSxyKDMwMCkscigyOTgpLHIoMzA0KSxyKDMwMSkscigzMDcpLHIoMzA5KSxyKDI5NykscigzMDMpLHIoMjk0KSxyKDMwOCkscigyOTIpLHIoMzA2KSxyKDMwNSkscigyOTkpLHIoMzAyKSxyKDI5MSkscigyOTMpLHIoMjk2KSxyKDI5NSkscigzMTApLHIoMTQzKSxyKDM4MikscigzODcpLHIoMTkxKSxyKDM4MykscigzODQpLHIoMzg1KSxyKDM4NikscigzNjcpLHIoMTkwKSxyKDE5MikscigxOTMpLHIoNDIyKSxyKDQxMSkscig0MTIpLHIoNDE3KSxyKDQyMCkscig0MjEpLHIoNDE1KSxyKDQxOCkscig0MTYpLHIoNDE5KSxyKDQxMykscig0MTQpLHIoMzY4KSxyKDM2OSkscigzNzApLHIoMzcxKSxyKDM3MikscigzNzUpLHIoMzczKSxyKDM3NCkscigzNzYpLHIoMzc3KSxyKDM3OCkscigzNzkpLHIoMzgxKSxyKDM4MCkscig0MjMpLHIoNDQ5KSxyKDQ1Mikscig0NTEpLHIoNDUzKSxyKDQ1NCkscig0NTApLHIoNDU1KSxyKDQ1Nikscig0MzQpLHIoNDM3KSxyKDQzMykscig0MzEpLHIoNDMyKSxyKDQzNSkscig0MzYpLHIoNDI2KSxyKDQ0OCkscig0NTcpLHIoNDI1KSxyKDQyNykscig0MjkpLHIoNDI4KSxyKDQzMCkscig0MzkpLHIoNDQwKSxyKDQ0Mikscig0NDEpLHIoNDQ0KSxyKDQ0Mykscig0NDUpLHIoNDQ2KSxyKDQ0Nykscig0MjQpLHIoNDM4KSxyKDQ2MCkscig0NTkpLHIoNDU4KSx0LmV4cG9ydHM9cigzMil9LGZ1bmN0aW9uKHQsZSxyKXt0LmV4cG9ydHM9cig0NjMpKFwiZWQyNTUxOVwiKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihuLGkpe2Z1bmN0aW9uIG8odCl7XCJzdHJpbmdcIj09dHlwZW9mIHQ/dD17YmluZGluZ3M6dH06dHx8KHQ9e30pLHQuX19wcm90b19fPWMsdC5tb2R1bGVfcm9vdHx8KHQubW9kdWxlX3Jvb3Q9ZS5nZXRSb290KGUuZ2V0RmlsZU5hbWUoKSkpLFwiLm5vZGVcIiE9Zi5leHRuYW1lKHQuYmluZGluZ3MpJiYodC5iaW5kaW5ncys9XCIubm9kZVwiKTtmb3IodmFyIHIsbixpLG89W10sYT0wLHU9dC50cnkubGVuZ3RoO2E8dTthKyspe3I9cy5hcHBseShudWxsLHQudHJ5W2FdLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXXx8ZX0pKSxvLnB1c2gocik7dHJ5e3JldHVybiBuPXQucGF0aD8hZnVuY3Rpb24oKXt2YXIgdD1uZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIG1vZHVsZSBcIi5cIicpO3Rocm93IHQuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIix0fSgpOiFmdW5jdGlvbigpe3ZhciB0PW5ldyBFcnJvcignQ2Fubm90IGZpbmQgbW9kdWxlIFwiLlwiJyk7dGhyb3cgdC5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLHR9KCksdC5wYXRofHwobi5wYXRoPXIpLG59Y2F0Y2godCl7aWYoIS9ub3QgZmluZC9pLnRlc3QodC5tZXNzYWdlKSl0aHJvdyB0fX10aHJvdyBpPW5ldyBFcnJvcihcIkNvdWxkIG5vdCBsb2NhdGUgdGhlIGJpbmRpbmdzIGZpbGUuIFRyaWVkOlxcblwiK28ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFycm93K2V9KS5qb2luKFwiXFxuXCIpKSxpLnRyaWVzPW8saX12YXIgYT1yKDQ4OSksZj1yKDU5NCkscz1mLmpvaW4sdT1mLmRpcm5hbWUsaD1hLmV4aXN0c1N5bmN8fGYuZXhpc3RzU3luYyxjPXthcnJvdzpuLmVudi5OT0RFX0JJTkRJTkdTX0FSUk9XfHxcIiDihpIgXCIsY29tcGlsZWQ6bi5lbnYuTk9ERV9CSU5ESU5HU19DT01QSUxFRF9ESVJ8fFwiY29tcGlsZWRcIixwbGF0Zm9ybTpuLnBsYXRmb3JtLGFyY2g6bi5hcmNoLHZlcnNpb246bi52ZXJzaW9ucy5ub2RlLGJpbmRpbmdzOlwiYmluZGluZ3Mubm9kZVwiLHRyeTpbW1wibW9kdWxlX3Jvb3RcIixcImJ1aWxkXCIsXCJiaW5kaW5nc1wiXSxbXCJtb2R1bGVfcm9vdFwiLFwiYnVpbGRcIixcIkRlYnVnXCIsXCJiaW5kaW5nc1wiXSxbXCJtb2R1bGVfcm9vdFwiLFwiYnVpbGRcIixcIlJlbGVhc2VcIixcImJpbmRpbmdzXCJdLFtcIm1vZHVsZV9yb290XCIsXCJvdXRcIixcIkRlYnVnXCIsXCJiaW5kaW5nc1wiXSxbXCJtb2R1bGVfcm9vdFwiLFwiRGVidWdcIixcImJpbmRpbmdzXCJdLFtcIm1vZHVsZV9yb290XCIsXCJvdXRcIixcIlJlbGVhc2VcIixcImJpbmRpbmdzXCJdLFtcIm1vZHVsZV9yb290XCIsXCJSZWxlYXNlXCIsXCJiaW5kaW5nc1wiXSxbXCJtb2R1bGVfcm9vdFwiLFwiYnVpbGRcIixcImRlZmF1bHRcIixcImJpbmRpbmdzXCJdLFtcIm1vZHVsZV9yb290XCIsXCJjb21waWxlZFwiLFwidmVyc2lvblwiLFwicGxhdGZvcm1cIixcImFyY2hcIixcImJpbmRpbmdzXCJdXX07dC5leHBvcnRzPWU9byxlLmdldEZpbGVOYW1lPWZ1bmN0aW9uKHQpe3ZhciBlLHI9RXJyb3IucHJlcGFyZVN0YWNrVHJhY2Usbj1FcnJvci5zdGFja1RyYWNlTGltaXQsbz17fTtyZXR1cm4gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0PTEwLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPWZ1bmN0aW9uKHIsbil7Zm9yKHZhciBvPTAsYT1uLmxlbmd0aDtvPGE7bysrKWlmKGU9bltvXS5nZXRGaWxlTmFtZSgpLGUhPT1pKXtpZighdClyZXR1cm47aWYoZSE9PXQpcmV0dXJufX0sRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Uobyksby5zdGFjayxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1yLEVycm9yLnN0YWNrVHJhY2VMaW1pdD1uLGV9LGUuZ2V0Um9vdD1mdW5jdGlvbih0KXtmb3IodmFyIGUscj11KHQpOzspe2lmKFwiLlwiPT09ciYmKHI9bi5jd2QoKSksaChzKHIsXCJwYWNrYWdlLmpzb25cIikpfHxoKHMocixcIm5vZGVfbW9kdWxlc1wiKSkpcmV0dXJuIHI7aWYoZT09PXIpdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBtb2R1bGUgcm9vdCBnaXZlbiBmaWxlOiBcIicrdCsnXCIuIERvIHlvdSBoYXZlIGEgYHBhY2thZ2UuanNvbmAgZmlsZT8gJyk7ZT1yLHI9cyhyLFwiLi5cIil9fX0pLmNhbGwoZSxyKDI2KSxcIi9pbmRleC5qc1wiKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e09fUkRPTkxZOjAsT19XUk9OTFk6MSxPX1JEV1I6MixTX0lGTVQ6NjE0NDAsU19JRlJFRzozMjc2OCxTX0lGRElSOjE2Mzg0LFNfSUZDSFI6ODE5MixTX0lGQkxLOjI0NTc2LFNfSUZJRk86NDA5NixTX0lGTE5LOjQwOTYwLFNfSUZTT0NLOjQ5MTUyLE9fQ1JFQVQ6NTEyLE9fRVhDTDoyMDQ4LE9fTk9DVFRZOjEzMTA3MixPX1RSVU5DOjEwMjQsT19BUFBFTkQ6OCxPX0RJUkVDVE9SWToxMDQ4NTc2LE9fTk9GT0xMT1c6MjU2LE9fU1lOQzoxMjgsT19TWU1MSU5LOjIwOTcxNTIsT19OT05CTE9DSzo0LFNfSVJXWFU6NDQ4LFNfSVJVU1I6MjU2LFNfSVdVU1I6MTI4LFNfSVhVU1I6NjQsU19JUldYRzo1NixTX0lSR1JQOjMyLFNfSVdHUlA6MTYsU19JWEdSUDo4LFNfSVJXWE86NyxTX0lST1RIOjQsU19JV09USDoyLFNfSVhPVEg6MSxFMkJJRzo3LEVBQ0NFUzoxMyxFQUREUklOVVNFOjQ4LEVBRERSTk9UQVZBSUw6NDksRUFGTk9TVVBQT1JUOjQ3LEVBR0FJTjozNSxFQUxSRUFEWTozNyxFQkFERjo5LEVCQURNU0c6OTQsRUJVU1k6MTYsRUNBTkNFTEVEOjg5LEVDSElMRDoxMCxFQ09OTkFCT1JURUQ6NTMsRUNPTk5SRUZVU0VEOjYxLEVDT05OUkVTRVQ6NTQsRURFQURMSzoxMSxFREVTVEFERFJSRVE6MzksRURPTTozMyxFRFFVT1Q6NjksRUVYSVNUOjE3LEVGQVVMVDoxNCxFRkJJRzoyNyxFSE9TVFVOUkVBQ0g6NjUsRUlEUk06OTAsRUlMU0VROjkyLEVJTlBST0dSRVNTOjM2LEVJTlRSOjQsRUlOVkFMOjIyLEVJTzo1LEVJU0NPTk46NTYsRUlTRElSOjIxLEVMT09QOjYyLEVNRklMRToyNCxFTUxJTks6MzEsRU1TR1NJWkU6NDAsRU1VTFRJSE9QOjk1LEVOQU1FVE9PTE9ORzo2MyxFTkVURE9XTjo1MCxFTkVUUkVTRVQ6NTIsRU5FVFVOUkVBQ0g6NTEsRU5GSUxFOjIzLEVOT0JVRlM6NTUsRU5PREFUQTo5NixFTk9ERVY6MTksRU5PRU5UOjIsRU5PRVhFQzo4LEVOT0xDSzo3NyxFTk9MSU5LOjk3LEVOT01FTToxMixFTk9NU0c6OTEsRU5PUFJPVE9PUFQ6NDIsRU5PU1BDOjI4LEVOT1NSOjk4LEVOT1NUUjo5OSxFTk9TWVM6NzgsRU5PVENPTk46NTcsRU5PVERJUjoyMCxFTk9URU1QVFk6NjYsRU5PVFNPQ0s6MzgsRU5PVFNVUDo0NSxFTk9UVFk6MjUsRU5YSU86NixFT1BOT1RTVVBQOjEwMixFT1ZFUkZMT1c6ODQsRVBFUk06MSxFUElQRTozMixFUFJPVE86MTAwLEVQUk9UT05PU1VQUE9SVDo0MyxFUFJPVE9UWVBFOjQxLEVSQU5HRTozNCxFUk9GUzozMCxFU1BJUEU6MjksRVNSQ0g6MyxFU1RBTEU6NzAsRVRJTUU6MTAxLEVUSU1FRE9VVDo2MCxFVFhUQlNZOjI2LEVXT1VMREJMT0NLOjM1LEVYREVWOjE4LFNJR0hVUDoxLFNJR0lOVDoyLFNJR1FVSVQ6MyxTSUdJTEw6NCxTSUdUUkFQOjUsU0lHQUJSVDo2LFNJR0lPVDo2LFNJR0JVUzoxMCxTSUdGUEU6OCxTSUdLSUxMOjksU0lHVVNSMTozMCxTSUdTRUdWOjExLFNJR1VTUjI6MzEsU0lHUElQRToxMyxTSUdBTFJNOjE0LFNJR1RFUk06MTUsU0lHQ0hMRDoyMCxTSUdDT05UOjE5LFNJR1NUT1A6MTcsU0lHVFNUUDoxOCxTSUdUVElOOjIxLFNJR1RUT1U6MjIsU0lHVVJHOjE2LFNJR1hDUFU6MjQsU0lHWEZTWjoyNSxTSUdWVEFMUk06MjYsU0lHUFJPRjoyNyxTSUdXSU5DSDoyOCxTSUdJTzoyMyxTSUdTWVM6MTIsU1NMX09QX0FMTDoyMTQ3NDg2NzE5LFNTTF9PUF9BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT046MjYyMTQ0LFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0U6NDE5NDMwNCxTU0xfT1BfQ0lTQ09fQU5ZQ09OTkVDVDozMjc2OCxTU0xfT1BfQ09PS0lFX0VYQ0hBTkdFOjgxOTIsU1NMX09QX0NSWVBUT1BST19UTFNFWFRfQlVHOjIxNDc0ODM2NDgsU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUzoyMDQ4LFNTTF9PUF9FUEhFTUVSQUxfUlNBOjAsU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVDo0LFNTTF9PUF9NSUNST1NPRlRfQklHX1NTTFYzX0JVRkZFUjozMixTU0xfT1BfTUlDUk9TT0ZUX1NFU1NfSURfQlVHOjEsU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkc6MCxTU0xfT1BfTkVUU0NBUEVfQ0FfRE5fQlVHOjUzNjg3MDkxMixTU0xfT1BfTkVUU0NBUEVfQ0hBTExFTkdFX0JVRzoyLFNTTF9PUF9ORVRTQ0FQRV9ERU1PX0NJUEhFUl9DSEFOR0VfQlVHOjEwNzM3NDE4MjQsU1NMX09QX05FVFNDQVBFX1JFVVNFX0NJUEhFUl9DSEFOR0VfQlVHOjgsU1NMX09QX05PX0NPTVBSRVNTSU9OOjEzMTA3MixTU0xfT1BfTk9fUVVFUllfTVRVOjQwOTYsU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OOjY1NTM2LFNTTF9PUF9OT19TU0x2MjoxNjc3NzIxNixTU0xfT1BfTk9fU1NMdjM6MzM1NTQ0MzIsU1NMX09QX05PX1RJQ0tFVDoxNjM4NCxTU0xfT1BfTk9fVExTdjE6NjcxMDg4NjQsU1NMX09QX05PX1RMU3YxXzE6MjY4NDM1NDU2LFNTTF9PUF9OT19UTFN2MV8yOjEzNDIxNzcyOCxTU0xfT1BfUEtDUzFfQ0hFQ0tfMTowLFNTTF9PUF9QS0NTMV9DSEVDS18yOjAsU1NMX09QX1NJTkdMRV9ESF9VU0U6MTA0ODU3NixTU0xfT1BfU0lOR0xFX0VDREhfVVNFOjUyNDI4OCxTU0xfT1BfU1NMRUFZXzA4MF9DTElFTlRfREhfQlVHOjEyOCxTU0xfT1BfU1NMUkVGMl9SRVVTRV9DRVJUX1RZUEVfQlVHOjAsU1NMX09QX1RMU19CTE9DS19QQURESU5HX0JVRzo1MTIsU1NMX09QX1RMU19ENV9CVUc6MjU2LFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHOjgzODg2MDgsRU5HSU5FX01FVEhPRF9EU0E6MixFTkdJTkVfTUVUSE9EX0RIOjQsRU5HSU5FX01FVEhPRF9SQU5EOjgsRU5HSU5FX01FVEhPRF9FQ0RIOjE2LEVOR0lORV9NRVRIT0RfRUNEU0E6MzIsRU5HSU5FX01FVEhPRF9DSVBIRVJTOjY0LEVOR0lORV9NRVRIT0RfRElHRVNUUzoxMjgsRU5HSU5FX01FVEhPRF9TVE9SRToyNTYsRU5HSU5FX01FVEhPRF9QS0VZX01FVEhTOjUxMixFTkdJTkVfTUVUSE9EX1BLRVlfQVNOMV9NRVRIUzoxMDI0LEVOR0lORV9NRVRIT0RfQUxMOjY1NTM1LEVOR0lORV9NRVRIT0RfTk9ORTowLERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUU6MixESF9DSEVDS19QX05PVF9QUklNRToxLERIX1VOQUJMRV9UT19DSEVDS19HRU5FUkFUT1I6NCxESF9OT1RfU1VJVEFCTEVfR0VORVJBVE9SOjgsTlBOX0VOQUJMRUQ6MSxSU0FfUEtDUzFfUEFERElORzoxLFJTQV9TU0xWMjNfUEFERElORzoyLFJTQV9OT19QQURESU5HOjMsUlNBX1BLQ1MxX09BRVBfUEFERElORzo0LFJTQV9YOTMxX1BBRERJTkc6NSxSU0FfUEtDUzFfUFNTX1BBRERJTkc6NixQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQ6MixQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRDo0LFBPSU5UX0NPTlZFUlNJT05fSFlCUklEOjYsRl9PSzowLFJfT0s6NCxXX09LOjIsWF9PSzoxLFVWX1VEUF9SRVVTRUFERFI6NH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXtuYW1lOlwiZWxsaXB0aWNcIix2ZXJzaW9uOlwiNi4zLjJcIixkZXNjcmlwdGlvbjpcIkVDIGNyeXB0b2dyYXBoeVwiLG1haW46XCJsaWIvZWxsaXB0aWMuanNcIixmaWxlczpbXCJsaWJcIl0sc2NyaXB0czp7anNjczpcImpzY3MgYmVuY2htYXJrcy8qLmpzIGxpYi8qLmpzIGxpYi8qKi8qLmpzIGxpYi8qKi8qKi8qLmpzIHRlc3QvaW5kZXguanNcIixqc2hpbnQ6XCJqc2NzIGJlbmNobWFya3MvKi5qcyBsaWIvKi5qcyBsaWIvKiovKi5qcyBsaWIvKiovKiovKi5qcyB0ZXN0L2luZGV4LmpzXCIsbGludDpcIm5wbSBydW4ganNjcyAmJiBucG0gcnVuIGpzaGludFwiLHVuaXQ6XCJpc3RhbmJ1bCB0ZXN0IF9tb2NoYSAtLXJlcG9ydGVyPXNwZWMgdGVzdC9pbmRleC5qc1wiLHRlc3Q6XCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biB1bml0XCIsdmVyc2lvbjpcImdydW50IGRpc3QgJiYgZ2l0IGFkZCBkaXN0L1wifSxyZXBvc2l0b3J5Ont0eXBlOlwiZ2l0XCIsdXJsOlwiZ2l0K3NzaDovL2dpdEBnaXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMuZ2l0XCJ9LGtleXdvcmRzOltcIkVDXCIsXCJFbGxpcHRpY1wiLFwiY3VydmVcIixcIkNyeXB0b2dyYXBoeVwiXSxhdXRob3I6e25hbWU6XCJGZWRvciBJbmR1dG55XCIsZW1haWw6XCJmZWRvckBpbmR1dG55LmNvbVwifSxsaWNlbnNlOlwiTUlUXCIsYnVnczp7dXJsOlwiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMvaXNzdWVzXCJ9LGhvbWVwYWdlOlwiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWNcIixkZXZEZXBlbmRlbmNpZXM6e2JyZnM6XCJeMS40LjNcIixjb3ZlcmFsbHM6XCJeMi4xMS4zXCIsZ3J1bnQ6XCJeMC40LjVcIixcImdydW50LWJyb3dzZXJpZnlcIjpcIl41LjAuMFwiLFwiZ3J1bnQtY29udHJpYi1jb25uZWN0XCI6XCJeMS4wLjBcIixcImdydW50LWNvbnRyaWItY29weVwiOlwiXjEuMC4wXCIsXCJncnVudC1jb250cmliLXVnbGlmeVwiOlwiXjEuMC4xXCIsXCJncnVudC1tb2NoYS1pc3RhbmJ1bFwiOlwiXjMuMC4xXCIsXCJncnVudC1zYXVjZWxhYnNcIjpcIl44LjYuMlwiLGlzdGFuYnVsOlwiXjAuNC4yXCIsanNjczpcIl4yLjkuMFwiLGpzaGludDpcIl4yLjYuMFwiLG1vY2hhOlwiXjIuMS4wXCJ9LGRlcGVuZGVuY2llczp7XCJibi5qc1wiOlwiXjQuNC4wXCIsYnJvcmFuZDpcIl4xLjAuMVwiLFwiaGFzaC5qc1wiOlwiXjEuMC4wXCIsaW5oZXJpdHM6XCJeMi4wLjFcIn0sZ2l0SGVhZDpcImNiYWNlNDY4M2E0YTU0OGRjMDMwNmVmMzY3NTYxNTFhMjAyOTljZDVcIixfaWQ6XCJlbGxpcHRpY0A2LjMuMlwiLF9zaGFzdW06XCJlNGM4MWUwODI5Y2YwYTY1YWI3MGU5OThiODIzMjcyM2I1YzFiYzQ4XCIsX2Zyb206XCJlbGxpcHRpY0A+PTYuMC4wIDw3LjAuMFwiLF9ucG1WZXJzaW9uOlwiMy4xMC4zXCIsX25vZGVWZXJzaW9uOlwiNi4zLjBcIixfbnBtVXNlcjp7bmFtZTpcImluZHV0bnlcIixlbWFpbDpcImZlZG9yQGluZHV0bnkuY29tXCJ9LGRpc3Q6e3NoYXN1bTpcImU0YzgxZTA4MjljZjBhNjVhYjcwZTk5OGI4MjMyNzIzYjVjMWJjNDhcIix0YXJiYWxsOlwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWxsaXB0aWMvLS9lbGxpcHRpYy02LjMuMi50Z3pcIn0sbWFpbnRhaW5lcnM6W3tuYW1lOlwiaW5kdXRueVwiLGVtYWlsOlwiZmVkb3JAaW5kdXRueS5jb21cIn1dLF9ucG1PcGVyYXRpb25hbEludGVybmFsOntob3N0OlwicGFja2FnZXMtMTYtZWFzdC5pbnRlcm5hbC5ucG1qcy5jb21cIix0bXA6XCJ0bXAvZWxsaXB0aWMtNi4zLjIudGd6XzE0NzM5Mzg4MzcyMDVfMC4zMTA4OTAzNDYyOTk4NTY5XCJ9LGRpcmVjdG9yaWVzOnt9LF9yZXNvbHZlZDpcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VsbGlwdGljLy0vZWxsaXB0aWMtNi4zLjIudGd6XCJ9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4xXCI6XCJhZXMtMTI4LWVjYlwiLFwiMi4xNi44NDAuMS4xMDEuMy40LjEuMlwiOlwiYWVzLTEyOC1jYmNcIixcIjIuMTYuODQwLjEuMTAxLjMuNC4xLjNcIjpcImFlcy0xMjgtb2ZiXCIsXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40XCI6XCJhZXMtMTI4LWNmYlwiLFwiMi4xNi44NDAuMS4xMDEuMy40LjEuMjFcIjpcImFlcy0xOTItZWNiXCIsXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMlwiOlwiYWVzLTE5Mi1jYmNcIixcIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIzXCI6XCJhZXMtMTkyLW9mYlwiLFwiMi4xNi44NDAuMS4xMDEuMy40LjEuMjRcIjpcImFlcy0xOTItY2ZiXCIsXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MVwiOlwiYWVzLTI1Ni1lY2JcIixcIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQyXCI6XCJhZXMtMjU2LWNiY1wiLFwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDNcIjpcImFlcy0yNTYtb2ZiXCIsXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40NFwiOlwiYWVzLTI1Ni1jZmJcIn19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXtuYW1lOlwiZWxsaXB0aWNcIix2ZXJzaW9uOlwiNi4zLjJcIixkZXNjcmlwdGlvbjpcIkVDIGNyeXB0b2dyYXBoeVwiLG1haW46XCJsaWIvZWxsaXB0aWMuanNcIixmaWxlczpbXCJsaWJcIl0sc2NyaXB0czp7anNjczpcImpzY3MgYmVuY2htYXJrcy8qLmpzIGxpYi8qLmpzIGxpYi8qKi8qLmpzIGxpYi8qKi8qKi8qLmpzIHRlc3QvaW5kZXguanNcIixqc2hpbnQ6XCJqc2NzIGJlbmNobWFya3MvKi5qcyBsaWIvKi5qcyBsaWIvKiovKi5qcyBsaWIvKiovKiovKi5qcyB0ZXN0L2luZGV4LmpzXCIsbGludDpcIm5wbSBydW4ganNjcyAmJiBucG0gcnVuIGpzaGludFwiLHVuaXQ6XCJpc3RhbmJ1bCB0ZXN0IF9tb2NoYSAtLXJlcG9ydGVyPXNwZWMgdGVzdC9pbmRleC5qc1wiLHRlc3Q6XCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biB1bml0XCIsdmVyc2lvbjpcImdydW50IGRpc3QgJiYgZ2l0IGFkZCBkaXN0L1wifSxyZXBvc2l0b3J5Ont0eXBlOlwiZ2l0XCIsdXJsOlwiZ2l0K3NzaDovL2dpdEBnaXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMuZ2l0XCJ9LGtleXdvcmRzOltcIkVDXCIsXCJFbGxpcHRpY1wiLFwiY3VydmVcIixcIkNyeXB0b2dyYXBoeVwiXSxhdXRob3I6e25hbWU6XCJGZWRvciBJbmR1dG55XCIsZW1haWw6XCJmZWRvckBpbmR1dG55LmNvbVwifSxsaWNlbnNlOlwiTUlUXCIsYnVnczp7dXJsOlwiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMvaXNzdWVzXCJ9LGhvbWVwYWdlOlwiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWNcIixkZXZEZXBlbmRlbmNpZXM6e2JyZnM6XCJeMS40LjNcIixjb3ZlcmFsbHM6XCJeMi4xMS4zXCIsZ3J1bnQ6XCJeMC40LjVcIixcImdydW50LWJyb3dzZXJpZnlcIjpcIl41LjAuMFwiLFwiZ3J1bnQtY29udHJpYi1jb25uZWN0XCI6XCJeMS4wLjBcIixcImdydW50LWNvbnRyaWItY29weVwiOlwiXjEuMC4wXCIsXCJncnVudC1jb250cmliLXVnbGlmeVwiOlwiXjEuMC4xXCIsXCJncnVudC1tb2NoYS1pc3RhbmJ1bFwiOlwiXjMuMC4xXCIsXCJncnVudC1zYXVjZWxhYnNcIjpcIl44LjYuMlwiLGlzdGFuYnVsOlwiXjAuNC4yXCIsanNjczpcIl4yLjkuMFwiLGpzaGludDpcIl4yLjYuMFwiLG1vY2hhOlwiXjIuMS4wXCJ9LGRlcGVuZGVuY2llczp7XCJibi5qc1wiOlwiXjQuNC4wXCIsYnJvcmFuZDpcIl4xLjAuMVwiLFwiaGFzaC5qc1wiOlwiXjEuMC4wXCIsaW5oZXJpdHM6XCJeMi4wLjFcIn0sZ2l0SGVhZDpcImNiYWNlNDY4M2E0YTU0OGRjMDMwNmVmMzY3NTYxNTFhMjAyOTljZDVcIixfaWQ6XCJlbGxpcHRpY0A2LjMuMlwiLF9zaGFzdW06XCJlNGM4MWUwODI5Y2YwYTY1YWI3MGU5OThiODIzMjcyM2I1YzFiYzQ4XCIsX2Zyb206XCJlbGxpcHRpY0A+PTYuMC4wIDw3LjAuMFwiLF9ucG1WZXJzaW9uOlwiMy4xMC4zXCIsX25vZGVWZXJzaW9uOlwiNi4zLjBcIixfbnBtVXNlcjp7bmFtZTpcImluZHV0bnlcIixlbWFpbDpcImZlZG9yQGluZHV0bnkuY29tXCJ9LGRpc3Q6e3NoYXN1bTpcImU0YzgxZTA4MjljZjBhNjVhYjcwZTk5OGI4MjMyNzIzYjVjMWJjNDhcIix0YXJiYWxsOlwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWxsaXB0aWMvLS9lbGxpcHRpYy02LjMuMi50Z3pcIn0sbWFpbnRhaW5lcnM6W3tuYW1lOlwiaW5kdXRueVwiLGVtYWlsOlwiZmVkb3JAaW5kdXRueS5jb21cIn1dLF9ucG1PcGVyYXRpb25hbEludGVybmFsOntob3N0OlwicGFja2FnZXMtMTYtZWFzdC5pbnRlcm5hbC5ucG1qcy5jb21cIix0bXA6XCJ0bXAvZWxsaXB0aWMtNi4zLjIudGd6XzE0NzM5Mzg4MzcyMDVfMC4zMTA4OTAzNDYyOTk4NTY5XCJ9LGRpcmVjdG9yaWVzOnt9LF9yZXNvbHZlZDpcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VsbGlwdGljLy0vZWxsaXB0aWMtNi4zLjIudGd6XCJ9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17bW9kcDE6e2dlbjpcIjAyXCIscHJpbWU6XCJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjNhMzYyMGZmZmZmZmZmZmZmZmZmZmZcIn0sbW9kcDI6e2dlbjpcIjAyXCIscHJpbWU6XCJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjM3ZWQ2YjBiZmY1Y2I2ZjQwNmI3ZWRlZTM4NmJmYjVhODk5ZmE1YWU5ZjI0MTE3YzRiMWZlNjQ5Mjg2NjUxZWNlNjUzODFmZmZmZmZmZmZmZmZmZmZmXCJ9LG1vZHA1OntnZW46XCIwMlwiLHByaW1lOlwiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2EyMzczMjdmZmZmZmZmZmZmZmZmZmZmXCJ9LG1vZHAxNDp7Z2VuOlwiMDJcIixwcmltZTpcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhY2FhNjhmZmZmZmZmZmZmZmZmZmZmXCJ9LG1vZHAxNTp7Z2VuOlwiMDJcIixwcmltZTpcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5M2FkMmNhZmZmZmZmZmZmZmZmZmZmZlwifSxtb2RwMTY6e2dlbjpcIjAyXCIscHJpbWU6XCJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjM3ZWQ2YjBiZmY1Y2I2ZjQwNmI3ZWRlZTM4NmJmYjVhODk5ZmE1YWU5ZjI0MTE3YzRiMWZlNjQ5Mjg2NjUxZWNlNDViM2RjMjAwN2NiOGExNjNiZjA1OThkYTQ4MzYxYzU1ZDM5YTY5MTYzZmE4ZmQyNGNmNWY4MzY1NWQyM2RjYTNhZDk2MWM2MmYzNTYyMDg1NTJiYjllZDUyOTA3NzA5Njk2NmQ2NzBjMzU0ZTRhYmM5ODA0ZjE3NDZjMDhjYTE4MjE3YzMyOTA1ZTQ2MmUzNmNlM2JlMzllNzcyYzE4MGU4NjAzOWIyNzgzYTJlYzA3YTI4ZmI1YzU1ZGYwNmY0YzUyYzlkZTJiY2JmNjk1NTgxNzE4Mzk5NTQ5N2NlYTk1NmFlNTE1ZDIyNjE4OThmYTA1MTAxNTcyOGU1YThhYWFjNDJkYWQzMzE3MGQwNDUwN2EzM2E4NTUyMWFiZGYxY2JhNjRlY2ZiODUwNDU4ZGJlZjBhOGFlYTcxNTc1ZDA2MGM3ZGIzOTcwZjg1YTZlMWU0YzdhYmY1YWU4Y2RiMDkzM2Q3MWU4Yzk0ZTA0YTI1NjE5ZGNlZTNkMjI2MWFkMmVlNmJmMTJmZmEwNmQ5OGEwODY0ZDg3NjAyNzMzZWM4NmE2NDUyMWYyYjE4MTc3YjIwMGNiYmUxMTc1NzdhNjE1ZDZjNzcwOTg4YzBiYWQ5NDZlMjA4ZTI0ZmEwNzRlNWFiMzE0M2RiNWJmY2UwZmQxMDhlNGI4MmQxMjBhOTIxMDgwMTFhNzIzYzEyYTc4N2U2ZDc4ODcxOWExMGJkYmE1YjI2OTljMzI3MTg2YWY0ZTIzYzFhOTQ2ODM0YjYxNTBiZGEyNTgzZTljYTJhZDQ0Y2U4ZGJiYmMyZGIwNGRlOGVmOTJlOGVmYzE0MWZiZWNhYTYyODdjNTk0NzRlNmJjMDVkOTliMjk2NGZhMDkwYzNhMjIzM2JhMTg2NTE1YmU3ZWQxZjYxMjk3MGNlZTJkN2FmYjgxYmRkNzYyMTcwNDgxY2QwMDY5MTI3ZDViMDVhYTk5M2I0ZWE5ODhkOGZkZGMxODZmZmI3ZGM5MGE2YzA4ZjRkZjQzNWM5MzQwNjMxOTlmZmZmZmZmZmZmZmZmZmZmXCJcbn0sbW9kcDE3OntnZW46XCIwMlwiLHByaW1lOlwiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkyMTA4MDExYTcyM2MxMmE3ODdlNmQ3ODg3MTlhMTBiZGJhNWIyNjk5YzMyNzE4NmFmNGUyM2MxYTk0NjgzNGI2MTUwYmRhMjU4M2U5Y2EyYWQ0NGNlOGRiYmJjMmRiMDRkZThlZjkyZThlZmMxNDFmYmVjYWE2Mjg3YzU5NDc0ZTZiYzA1ZDk5YjI5NjRmYTA5MGMzYTIyMzNiYTE4NjUxNWJlN2VkMWY2MTI5NzBjZWUyZDdhZmI4MWJkZDc2MjE3MDQ4MWNkMDA2OTEyN2Q1YjA1YWE5OTNiNGVhOTg4ZDhmZGRjMTg2ZmZiN2RjOTBhNmMwOGY0ZGY0MzVjOTM0MDI4NDkyMzZjM2ZhYjRkMjdjNzAyNmMxZDRkY2IyNjAyNjQ2ZGVjOTc1MWU3NjNkYmEzN2JkZjhmZjk0MDZhZDllNTMwZWU1ZGIzODJmNDEzMDAxYWViMDZhNTNlZDkwMjdkODMxMTc5NzI3YjA4NjVhODkxOGRhM2VkYmViY2Y5YjE0ZWQ0NGNlNmNiYWNlZDRiYjFiZGI3ZjE0NDdlNmNjMjU0YjMzMjA1MTUxMmJkN2FmNDI2ZmI4ZjQwMTM3OGNkMmJmNTk4M2NhMDFjNjRiOTJlY2YwMzJlYTE1ZDE3MjFkMDNmNDgyZDdjZTZlNzRmZWY2ZDU1ZTcwMmY0Njk4MGM4MmI1YTg0MDMxOTAwYjFjOWU1OWU3Yzk3ZmJlYzdlOGYzMjNhOTdhN2UzNmNjODhiZTBmMWQ0NWI3ZmY1ODVhYzU0YmQ0MDdiMjJiNDE1NGFhY2M4ZjZkN2ViZjQ4ZTFkODE0Y2M1ZWQyMGY4MDM3ZTBhNzk3MTVlZWYyOWJlMzI4MDZhMWQ1OGJiN2M1ZGE3NmY1NTBhYTNkOGExZmJmZjBlYjE5Y2NiMWEzMTNkNTVjZGE1NmM5ZWMyZWYyOTYzMjM4N2ZlOGQ3NmUzYzA0NjgwNDNlOGY2NjNmNDg2MGVlMTJiZjJkNWIwYjc0NzRkNmU2OTRmOTFlNmRjYzQwMjRmZmZmZmZmZmZmZmZmZmZmXCJ9LG1vZHAxODp7Z2VuOlwiMDJcIixwcmltZTpcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkYmUxMTU5NzRhMzkyNmYxMmZlZTVlNDM4Nzc3Y2I2YTkzMmRmOGNkOGJlYzRkMDczYjkzMWJhM2JjODMyYjY4ZDlkZDMwMDc0MWZhN2JmOGFmYzQ3ZWQyNTc2ZjY5MzZiYTQyNDY2M2FhYjYzOWM1YWU0ZjU2ODM0MjNiNDc0MmJmMWM5NzgyMzhmMTZjYmUzOWQ2NTJkZTNmZGI4YmVmYzg0OGFkOTIyMjIyZTA0YTQwMzdjMDcxM2ViNTdhODFhMjNmMGM3MzQ3M2ZjNjQ2Y2VhMzA2YjRiY2JjODg2MmY4Mzg1ZGRmYTlkNGI3ZmEyYzA4N2U4Nzk2ODMzMDNlZDViZGQzYTA2MmIzY2Y1YjNhMjc4YTY2ZDJhMTNmODNmNDRmODJkZGYzMTBlZTA3NGFiNmEzNjQ1OTdlODk5YTAyNTVkYzE2NGYzMWNjNTA4NDY4NTFkZjlhYjQ4MTk1ZGVkN2VhMWIxZDUxMGJkN2VlNzRkNzNmYWYzNmJjMzFlY2ZhMjY4MzU5MDQ2ZjRlYjg3OWY5MjQwMDk0MzhiNDgxYzZjZDc4ODlhMDAyZWQ1ZWUzODJiYzkxOTBkYTZmYzAyNmU0Nzk1NThlNDQ3NTY3N2U5YWE5ZTMwNTBlMjc2NTY5NGRmYzgxZjU2ZTg4MGI5NmU3MTYwYzk4MGRkOThlZGQzZGZmZmZmZmZmZmZmZmZmZmZmXCJ9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e1wiMi4xNi44NDAuMS4xMDEuMy40LjEuMVwiOlwiYWVzLTEyOC1lY2JcIixcIjIuMTYuODQwLjEuMTAxLjMuNC4xLjJcIjpcImFlcy0xMjgtY2JjXCIsXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4zXCI6XCJhZXMtMTI4LW9mYlwiLFwiMi4xNi44NDAuMS4xMDEuMy40LjEuNFwiOlwiYWVzLTEyOC1jZmJcIixcIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIxXCI6XCJhZXMtMTkyLWVjYlwiLFwiMi4xNi44NDAuMS4xMDEuMy40LjEuMjJcIjpcImFlcy0xOTItY2JjXCIsXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yM1wiOlwiYWVzLTE5Mi1vZmJcIixcIjIuMTYuODQwLjEuMTAxLjMuNC4xLjI0XCI6XCJhZXMtMTkyLWNmYlwiLFwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDFcIjpcImFlcy0yNTYtZWNiXCIsXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MlwiOlwiYWVzLTI1Ni1jYmNcIixcIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQzXCI6XCJhZXMtMjU2LW9mYlwiLFwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDRcIjpcImFlcy0yNTYtY2ZiXCJ9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIG8odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX12YXIgYT1yKDE5NSksZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG4odGhpcyxlKSxpKHRoaXMsT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuIG8oZSx0KSxlfShhKTt0LmV4cG9ydHM9Zn0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGkodCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIWV8fFwib2JqZWN0XCIhPXR5cGVvZiBlJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiBvKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9dmFyIGE9cigxOTUpLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBuKHRoaXMsZSksaSh0aGlzLE9iamVjdC5nZXRQcm90b3R5cGVPZihlKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBvKGUsdCksZX0oYSk7dC5leHBvcnRzPWZ9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiByJiZ0KGUucHJvdG90eXBlLHIpLG4mJnQoZSxuKSxlfX0oKSxvPXIoMTk2KSxhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe24odGhpcyx0KSx0aGlzLnNpemU9MH1yZXR1cm4gaSh0LFt7a2V5Olwid3JpdGVVSW50XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLnNpemUrPWV9fSx7a2V5Olwid3JpdGVWYXJVSW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoZS5pc0J1ZmZlcih0KSlyZXR1cm4gdm9pZCB0aGlzLndyaXRlVmFyT2N0ZXRTdHJpbmcodCk7aWYoIW8odCkpdGhyb3cgbmV3IEVycm9yKFwiVUludCBtdXN0IGJlIGFuIGludGVnZXJcIik7aWYodDwwKXRocm93IG5ldyBFcnJvcihcIlVJbnQgbXVzdCBiZSBwb3NpdGl2ZVwiKTt2YXIgcj1NYXRoLmNlaWwodC50b1N0cmluZygyKS5sZW5ndGgvOCk7dGhpcy53cml0ZVZhck9jdGV0U3RyaW5nKHtsZW5ndGg6cn0pfX0se2tleTpcIndyaXRlT2N0ZXRTdHJpbmdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuc2tpcChlKX19LHtrZXk6XCJ3cml0ZVZhck9jdGV0U3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5za2lwKDEpLHQubGVuZ3RoPjEyNyl7dmFyIGU9TWF0aC5jZWlsKHQubGVuZ3RoLnRvU3RyaW5nKDIpLmxlbmd0aC84KTt0aGlzLnNraXAoZSl9dGhpcy5za2lwKHQubGVuZ3RoKX19LHtrZXk6XCJ3cml0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2l6ZSs9dC5sZW5ndGh9fSx7a2V5Olwic2tpcFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2l6ZSs9dH19LHtrZXk6XCJnZXRTaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXplfX1dKSx0fSgpO1sxLDIsNCw4XS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EucHJvdG90eXBlW1wid3JpdGVVSW50XCIrOCp0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy53cml0ZVVJbnQoZSx0KX19KSx0LmV4cG9ydHM9YX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiByJiZ0KGUucHJvdG90eXBlLHIpLG4mJnQoZSxuKSxlfX0oKSxvPXIoNDcxKSxhPXIoNDcwKSxmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtuKHRoaXMsdCksdGhpcy5idWZmZXI9ZSx0aGlzLmN1cnNvcj0wLHRoaXMuYm9va21hcmtzPVtdfXJldHVybiBpKHQsW3trZXk6XCJib29rbWFya1wiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib29rbWFya3MucHVzaCh0aGlzLmN1cnNvcil9fSx7a2V5OlwicmVzdG9yZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jdXJzb3I9dGhpcy5ib29rbWFya3MucG9wKCl9fSx7a2V5OlwiZW5zdXJlQXZhaWxhYmxlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5idWZmZXIubGVuZ3RoPHRoaXMuY3Vyc29yK3QpdGhyb3cgbmV3IG8oXCJUcmllZCB0byByZWFkIFwiK3QrXCIgYnl0ZXMsIGJ1dCBvbmx5IFwiKyh0aGlzLmJ1ZmZlci5sZW5ndGgtdGhpcy5jdXJzb3IpK1wiIGJ5dGVzIGF2YWlsYWJsZVwiKX19LHtrZXk6XCJyZWFkVUludFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGVla1VJbnQodCk7cmV0dXJuIHRoaXMuY3Vyc29yKz10LGV9fSx7a2V5OlwicGVla1VJbnRcIix2YWx1ZTpmdW5jdGlvbihlKXtpZigwPT09ZSlyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IEVycm9yKFwiVHJpZWQgdG8gcmVhZCBpbnRlZ2VyIHdpdGggbmVnYXRpdmUgbGVuZ3RoIChwcm92aWRlZDogXCIrZStcIilcIik7aWYoZT50Lk1BWF9JTlRfQllURVMpdGhyb3cgbmV3IEVycm9yKFwiVHJpZWQgdG8gcmVhZCB0b28gbGFyZ2UgaW50ZWdlciAocmVxdWVzdGVkOiBcIitlK1wiLCBtYXg6IFwiK3QuTUFYX0lOVF9CWVRFUytcIilcIik7dGhpcy5lbnN1cmVBdmFpbGFibGUoZSk7dmFyIHI9dGhpcy5idWZmZXIucmVhZFVJbnRCRSh0aGlzLmN1cnNvcixlKTtyZXR1cm4gcn19LHtrZXk6XCJza2lwVUludFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2tpcCh0KX19LHtrZXk6XCJyZWFkVUludDY0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5yZWFkVUludDMyKCksdGhpcy5yZWFkVUludDMyKCldfX0se2tleTpcInBlZWtVSW50NjRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYm9va21hcmsoKTt2YXIgdD10aGlzLnJlYWRVSW50NjQoKTtyZXR1cm4gdGhpcy5yZXN0b3JlKCksdH19LHtrZXk6XCJza2lwVUludDY0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNraXAoOCl9fSx7a2V5OlwicmVhZFZhclVJbnRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZFZhck9jdGV0U3RyaW5nKCk7aWYoZS5sZW5ndGg+dC5NQVhfSU5UX0JZVEVTKXRocm93IG5ldyBhKFwiVUludCBvZiBsZW5ndGggXCIrZS5sZW5ndGgrXCIgdG9vIGxhcmdlIHRvIHBhcnNlIGFzIGludGVnZXIgKG1heDogXCIrdC5NQVhfSU5UX0JZVEVTK1wiKVwiKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IGEoXCJVSW50IG9mIGxlbmd0aCAwIGlzIGludmFsaWRcIik7cmV0dXJuIGUucmVhZFVJbnRCRSgwLGUubGVuZ3RoKX19LHtrZXk6XCJwZWVrVmFyVUludFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib29rbWFyaygpO3ZhciB0PXRoaXMucmVhZFZhclVJbnQoKTtyZXR1cm4gdGhpcy5yZXN0b3JlKCksdH19LHtrZXk6XCJza2lwVmFyVUludFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5za2lwVmFyT2N0ZXRTdHJpbmcoKX19LHtrZXk6XCJyZWFkT2N0ZXRTdHJpbmdcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZWFkKHQpfX0se2tleTpcInBlZWtPY3RldFN0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBlZWsodCl9fSx7a2V5Olwic2tpcE9jdGV0U3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2tpcCh0KX19LHtrZXk6XCJyZWFkTGVuZ3RoUHJlZml4XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlYWRVSW50OCgpO2lmKGUmdC5ISUdIX0JJVCl7dmFyIHI9ZSZ0LkxPV0VSX1NFVkVOX0JJVFMsbj10aGlzLnJlYWRVSW50KHIpLGk9TWF0aC5tYXgoMTI4LDE8PDgqKHItMSkpO2lmKG48aSl0aHJvdyBuZXcgYShcIkxlbmd0aCBwcmVmaXggZW5jb2RpbmcgaXMgbm90IGNhbm9uaWNhbDogXCIrbitcIiBlbmNvZGVkIGluIFwiK3IrXCIgYnl0ZXNcIik7cmV0dXJuIG59cmV0dXJuIGV9fSx7a2V5OlwicmVhZFZhck9jdGV0U3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRMZW5ndGhQcmVmaXgoKTtyZXR1cm4gdGhpcy5yZWFkKHQpfX0se2tleTpcInBlZWtWYXJPY3RldFN0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib29rbWFyaygpO3ZhciB0PXRoaXMucmVhZFZhck9jdGV0U3RyaW5nKCk7cmV0dXJuIHRoaXMucmVzdG9yZSgpLHR9fSx7a2V5Olwic2tpcFZhck9jdGV0U3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRMZW5ndGhQcmVmaXgoKTtyZXR1cm4gdGhpcy5za2lwKHQpfX0se2tleTpcInJlYWRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmVuc3VyZUF2YWlsYWJsZSh0KTt2YXIgZT10aGlzLmJ1ZmZlci5zbGljZSh0aGlzLmN1cnNvcix0aGlzLmN1cnNvcit0KTtyZXR1cm4gdGhpcy5jdXJzb3IrPXQsZX19LHtrZXk6XCJwZWVrXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQXZhaWxhYmxlKHQpLHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMuY3Vyc29yLHRoaXMuY3Vyc29yK3QpfX0se2tleTpcInNraXBcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmVuc3VyZUF2YWlsYWJsZSh0KSx0aGlzLmN1cnNvcis9dH19XSxbe2tleTpcImZyb21cIix2YWx1ZTpmdW5jdGlvbihyKXtpZihlLmlzQnVmZmVyKHIpKXJldHVybiBuZXcgdChyKTtpZihyIGluc3RhbmNlb2YgdClyZXR1cm4gbmV3IHQoci5idWZmZXIuc2xpY2Uoci5jdXJzb3IpKTt0aHJvdyBuZXcgRXJyb3IoXCJSZWFkZXIgbXVzdCBiZSBnaXZlbiBhIEJ1ZmZlclwiKX19XSksdH0oKTtmLkhJR0hfQklUPTEyOCxmLkxPV0VSX1NFVkVOX0JJVFM9MTI3LGYuTUFYX0lOVF9CWVRFUz02LFtcInJlYWRcIixcInBlZWtcIixcInNraXBcIl0uZm9yRWFjaChmdW5jdGlvbih0KXtbMSwyLDRdLmZvckVhY2goZnVuY3Rpb24oZSl7Zi5wcm90b3R5cGVbdCtcIlVJbnRcIis4KmVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdCtcIlVJbnRcIl0oZSl9fSl9KSx0LmV4cG9ydHM9Zn0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiByJiZ0KGUucHJvdG90eXBlLHIpLG4mJnQoZSxuKSxlfX0oKSxvPXIoMTk2KSxhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe24odGhpcyx0KSx0aGlzLmNvbXBvbmVudHM9W119cmV0dXJuIGkodCxbe2tleTpcIndyaXRlVUludFwiLHZhbHVlOmZ1bmN0aW9uKHQscil7aWYoIW8odCkpdGhyb3cgbmV3IEVycm9yKFwiVUludCBtdXN0IGJlIGFuIGludGVnZXJcIik7aWYodDwwKXRocm93IG5ldyBFcnJvcihcIlVJbnQgbXVzdCBiZSBwb3NpdGl2ZVwiKTtpZihyPD0wKXRocm93IG5ldyBFcnJvcihcIlVJbnQgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm9cIik7aWYodC50b1N0cmluZygyKS5sZW5ndGg+OCpyKXRocm93IG5ldyBFcnJvcihcIlVJbnQgXCIrdCtcIiBkb2VzIG5vdCBmaXQgaW4gXCIrcitcIiBieXRlc1wiKTt2YXIgbj1uZXcgZShyKTtuLndyaXRlVUludEJFKHQsMCxyKSx0aGlzLndyaXRlKG4pfX0se2tleTpcIndyaXRlVmFyVUludFwiLHZhbHVlOmZ1bmN0aW9uKHIpe2lmKGUuaXNCdWZmZXIocikpcmV0dXJuIHZvaWQgdGhpcy53cml0ZVZhck9jdGV0U3RyaW5nKHIpO2lmKCFvKHIpKXRocm93IG5ldyBFcnJvcihcIlVJbnQgbXVzdCBiZSBhbiBpbnRlZ2VyXCIpO2lmKHI8MCl0aHJvdyBuZXcgRXJyb3IoXCJVSW50IG11c3QgYmUgcG9zaXRpdmVcIik7aWYocj50Lk1BWF9TQUZFX0lOVEVHRVIpdGhyb3cgbmV3IEVycm9yKFwiVUludCBpcyB0b28gbGFyZ2VcIik7dmFyIG49TWF0aC5jZWlsKHIudG9TdHJpbmcoMikubGVuZ3RoLzgpLGk9bmV3IGUobik7aS53cml0ZVVJbnRCRShyLDAsbiksdGhpcy53cml0ZVZhck9jdGV0U3RyaW5nKGkpfX0se2tleTpcIndyaXRlVUludDY0XCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYobyhlKSYmZTw9dC5NQVhfU0FGRV9JTlRFR0VSKXJldHVybiB0aGlzLndyaXRlVUludDMyKE1hdGguZmxvb3IoZS80Mjk0OTY3Mjk2KSksdm9pZCB0aGlzLndyaXRlVUludDMyKDQyOTQ5NjcyOTUmZSk7aWYoIUFycmF5LmlzQXJyYXkoZSl8fDIhPT1lLmxlbmd0aHx8IW8oZVswXSl8fCFvKGVbMV0pKXRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCA2NC1iaXQgaW50ZWdlciBhcyBhbiBhcnJheSBvZiB0d28gMzItYml0IHdvcmRzXCIpO3RoaXMud3JpdGVVSW50MzIoZVswXSksdGhpcy53cml0ZVVJbnQzMihlWzFdKX19LHtrZXk6XCJ3cml0ZU9jdGV0U3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih0Lmxlbmd0aCE9PWUpdGhyb3cgbmV3IEVycm9yKFwiSW5jb3JyZWN0IGxlbmd0aCBmb3Igb2N0ZXQgc3RyaW5nIChhY3R1YWw6IFwiK3QubGVuZ3RoK1wiLCBleHBlY3RlZDogXCIrZStcIilcIik7dGhpcy53cml0ZSh0KX19LHtrZXk6XCJ3cml0ZVZhck9jdGV0U3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIWUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdHMgYSBidWZmZXJcIik7dmFyIHI9MTI4O2lmKHQubGVuZ3RoPD0xMjcpdGhpcy53cml0ZVVJbnQ4KHQubGVuZ3RoKTtlbHNle3ZhciBuPU1hdGguY2VpbCh0Lmxlbmd0aC50b1N0cmluZygyKS5sZW5ndGgvOCk7dGhpcy53cml0ZVVJbnQ4KHJ8biksdGhpcy53cml0ZVVJbnQodC5sZW5ndGgsbil9dGhpcy53cml0ZSh0KX19LHtrZXk6XCJ3cml0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY29tcG9uZW50cy5wdXNoKHQpfX0se2tleTpcImdldEJ1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGUuY29uY2F0KHRoaXMuY29tcG9uZW50cyl9fV0pLHR9KCk7YS5NQVhfU0FGRV9JTlRFR0VSPXIoNDc1KSxbMSwyLDRdLmZvckVhY2goZnVuY3Rpb24odCl7YS5wcm90b3R5cGVbXCJ3cml0ZVVJbnRcIis4KnRdPWZ1bmN0aW9uKGUpe3RoaXMud3JpdGVVSW50KGUsdCl9fSksdC5leHBvcnRzPWF9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7cig0ODcpLHQuZXhwb3J0cz05MDA3MTk5MjU0NzQwOTkxfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcih0K1wiIGlzIG5vdCBhIGZ1bmN0aW9uIVwiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDg5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIW4odCkpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGFuIG9iamVjdCFcIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig0NzYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUscil7aWYobih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChyKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGwoZSxyKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiB0LmNhbGwoZSxyLG4pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsbixpKXtyZXR1cm4gdC5jYWxsKGUscixuLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoODkpLGk9cigyMDApLmRvY3VtZW50LG89bihpKSYmbihpLmNyZWF0ZUVsZW1lbnQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbz9pLmNyZWF0ZUVsZW1lbnQodCk6e319fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig0ODMpLGk9cig0ODQpO3QuZXhwb3J0cz1yKDE0NCk/ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuLmYodCxlLGkoMSxyKSl9OmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFtlXT1yLHR9fSxmdW5jdGlvbih0LGUscil7dC5leHBvcnRzPSFyKDE0NCkmJiFyKDE5OSkoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHIoNDc5KShcImRpdlwiKSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig4OSksaT1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4hbih0KSYmaXNGaW5pdGUodCkmJmkodCk9PT10fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoNDc3KSxpPXIoNDgxKSxvPXIoNDg1KSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmY9cigxNDQpP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbih0LGUscil7aWYobih0KSxlPW8oZSwhMCksbihyKSxpKXRyeXtyZXR1cm4gYSh0LGUscil9Y2F0Y2godCl7fWlmKFwiZ2V0XCJpbiByfHxcInNldFwiaW4gcil0aHJvdyBUeXBlRXJyb3IoXCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCFcIik7cmV0dXJuXCJ2YWx1ZVwiaW4gciYmKHRbZV09ci52YWx1ZSksdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoODkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFuKHQpKXJldHVybiB0O3ZhciByLGk7aWYoZSYmXCJmdW5jdGlvblwiPT10eXBlb2Yocj10LnRvU3RyaW5nKSYmIW4oaT1yLmNhbGwodCkpKXJldHVybiBpO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mKHI9dC52YWx1ZU9mKSYmIW4oaT1yLmNhbGwodCkpKXJldHVybiBpO2lmKCFlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZihyPXQudG9TdHJpbmcpJiYhbihpPXIuY2FsbCh0KSkpcmV0dXJuIGk7dGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTk4KTtuKG4uUyxcIk51bWJlclwiLHtpc0ludGVnZXI6cig0ODIpfSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDE5OCk7bihuLlMsXCJOdW1iZXJcIix7TUFYX1NBRkVfSU5URUdFUjo5MDA3MTk5MjU0NzQwOTkxfSl9LGZ1bmN0aW9uKHQsZSxyKXshZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZSh0LGUscixuKXt0W2VdPXI+PjI0JjI1NSx0W2UrMV09cj4+MTYmMjU1LHRbZSsyXT1yPj44JjI1NSx0W2UrM109MjU1JnIsdFtlKzRdPW4+PjI0JjI1NSx0W2UrNV09bj4+MTYmMjU1LHRbZSs2XT1uPj44JjI1NSx0W2UrN109MjU1Jm59ZnVuY3Rpb24gbih0LGUscixuLGkpe3ZhciBvLGE9MDtmb3Iobz0wO288aTtvKyspYXw9dFtlK29dXnJbbitvXTtyZXR1cm4oMSZhLTE+Pj44KS0xfWZ1bmN0aW9uIGkodCxlLHIsaSl7cmV0dXJuIG4odCxlLHIsaSwxNil9ZnVuY3Rpb24gbyh0LGUscixpKXtyZXR1cm4gbih0LGUscixpLDMyKX1mdW5jdGlvbiBhKHQsZSxyLG4pe2Zvcih2YXIgaSxvPTI1NSZuWzBdfCgyNTUmblsxXSk8PDh8KDI1NSZuWzJdKTw8MTZ8KDI1NSZuWzNdKTw8MjQsYT0yNTUmclswXXwoMjU1JnJbMV0pPDw4fCgyNTUmclsyXSk8PDE2fCgyNTUmclszXSk8PDI0LGY9MjU1JnJbNF18KDI1NSZyWzVdKTw8OHwoMjU1JnJbNl0pPDwxNnwoMjU1JnJbN10pPDwyNCxzPTI1NSZyWzhdfCgyNTUmcls5XSk8PDh8KDI1NSZyWzEwXSk8PDE2fCgyNTUmclsxMV0pPDwyNCx1PTI1NSZyWzEyXXwoMjU1JnJbMTNdKTw8OHwoMjU1JnJbMTRdKTw8MTZ8KDI1NSZyWzE1XSk8PDI0LGg9MjU1Jm5bNF18KDI1NSZuWzVdKTw8OHwoMjU1Jm5bNl0pPDwxNnwoMjU1Jm5bN10pPDwyNCxjPTI1NSZlWzBdfCgyNTUmZVsxXSk8PDh8KDI1NSZlWzJdKTw8MTZ8KDI1NSZlWzNdKTw8MjQsZD0yNTUmZVs0XXwoMjU1JmVbNV0pPDw4fCgyNTUmZVs2XSk8PDE2fCgyNTUmZVs3XSk8PDI0LGw9MjU1JmVbOF18KDI1NSZlWzldKTw8OHwoMjU1JmVbMTBdKTw8MTZ8KDI1NSZlWzExXSk8PDI0LHA9MjU1JmVbMTJdfCgyNTUmZVsxM10pPDw4fCgyNTUmZVsxNF0pPDwxNnwoMjU1JmVbMTVdKTw8MjQsYj0yNTUmbls4XXwoMjU1Jm5bOV0pPDw4fCgyNTUmblsxMF0pPDwxNnwoMjU1Jm5bMTFdKTw8MjQsdj0yNTUmclsxNl18KDI1NSZyWzE3XSk8PDh8KDI1NSZyWzE4XSk8PDE2fCgyNTUmclsxOV0pPDwyNCx5PTI1NSZyWzIwXXwoMjU1JnJbMjFdKTw8OHwoMjU1JnJbMjJdKTw8MTZ8KDI1NSZyWzIzXSk8PDI0LG09MjU1JnJbMjRdfCgyNTUmclsyNV0pPDw4fCgyNTUmclsyNl0pPDwxNnwoMjU1JnJbMjddKTw8MjQsZz0yNTUmclsyOF18KDI1NSZyWzI5XSk8PDh8KDI1NSZyWzMwXSk8PDE2fCgyNTUmclszMV0pPDwyNCx3PTI1NSZuWzEyXXwoMjU1Jm5bMTNdKTw8OHwoMjU1Jm5bMTRdKTw8MTZ8KDI1NSZuWzE1XSk8PDI0LF89byxNPWEsUz1mLEU9cyxBPXUsaz1oLHg9YyxJPWQsQj1sLE89cCxSPWIsUD12LFQ9eSxqPW0sQz1nLE49dyxMPTA7TDwyMDtMKz0yKWk9XytUfDAsQV49aTw8N3xpPj4+MjUsaT1BK198MCxCXj1pPDw5fGk+Pj4yMyxpPUIrQXwwLFRePWk8PDEzfGk+Pj4xOSxpPVQrQnwwLF9ePWk8PDE4fGk+Pj4xNCxpPWsrTXwwLE9ePWk8PDd8aT4+PjI1LGk9TytrfDAsal49aTw8OXxpPj4+MjMsaT1qK098MCxNXj1pPDwxM3xpPj4+MTksaT1NK2p8MCxrXj1pPDwxOHxpPj4+MTQsaT1SK3h8MCxDXj1pPDw3fGk+Pj4yNSxpPUMrUnwwLFNePWk8PDl8aT4+PjIzLGk9UytDfDAseF49aTw8MTN8aT4+PjE5LGk9eCtTfDAsUl49aTw8MTh8aT4+PjE0LGk9TitQfDAsRV49aTw8N3xpPj4+MjUsaT1FK058MCxJXj1pPDw5fGk+Pj4yMyxpPUkrRXwwLFBePWk8PDEzfGk+Pj4xOSxpPVArSXwwLE5ePWk8PDE4fGk+Pj4xNCxpPV8rRXwwLE1ePWk8PDd8aT4+PjI1LGk9TStffDAsU149aTw8OXxpPj4+MjMsaT1TK018MCxFXj1pPDwxM3xpPj4+MTksaT1FK1N8MCxfXj1pPDwxOHxpPj4+MTQsaT1rK0F8MCx4Xj1pPDw3fGk+Pj4yNSxpPXgra3wwLElePWk8PDl8aT4+PjIzLGk9SSt4fDAsQV49aTw8MTN8aT4+PjE5LGk9QStJfDAsa149aTw8MTh8aT4+PjE0LGk9UitPfDAsUF49aTw8N3xpPj4+MjUsaT1QK1J8MCxCXj1pPDw5fGk+Pj4yMyxpPUIrUHwwLE9ePWk8PDEzfGk+Pj4xOSxpPU8rQnwwLFJePWk8PDE4fGk+Pj4xNCxpPU4rQ3wwLFRePWk8PDd8aT4+PjI1LGk9VCtOfDAsal49aTw8OXxpPj4+MjMsaT1qK1R8MCxDXj1pPDwxM3xpPj4+MTksaT1DK2p8MCxOXj1pPDwxOHxpPj4+MTQ7Xz1fK298MCxNPU0rYXwwLFM9UytmfDAsRT1FK3N8MCxBPUErdXwwLGs9aytofDAseD14K2N8MCxJPUkrZHwwLEI9QitsfDAsTz1PK3B8MCxSPVIrYnwwLFA9UCt2fDAsVD1UK3l8MCxqPWorbXwwLEM9QytnfDAsTj1OK3d8MCx0WzBdPV8+Pj4wJjI1NSx0WzFdPV8+Pj44JjI1NSx0WzJdPV8+Pj4xNiYyNTUsdFszXT1fPj4+MjQmMjU1LHRbNF09TT4+PjAmMjU1LHRbNV09TT4+PjgmMjU1LHRbNl09TT4+PjE2JjI1NSx0WzddPU0+Pj4yNCYyNTUsdFs4XT1TPj4+MCYyNTUsdFs5XT1TPj4+OCYyNTUsdFsxMF09Uz4+PjE2JjI1NSx0WzExXT1TPj4+MjQmMjU1LHRbMTJdPUU+Pj4wJjI1NSx0WzEzXT1FPj4+OCYyNTUsdFsxNF09RT4+PjE2JjI1NSx0WzE1XT1FPj4+MjQmMjU1LHRbMTZdPUE+Pj4wJjI1NSx0WzE3XT1BPj4+OCYyNTUsdFsxOF09QT4+PjE2JjI1NSx0WzE5XT1BPj4+MjQmMjU1LHRbMjBdPWs+Pj4wJjI1NSx0WzIxXT1rPj4+OCYyNTUsdFsyMl09az4+PjE2JjI1NSx0WzIzXT1rPj4+MjQmMjU1LHRbMjRdPXg+Pj4wJjI1NSx0WzI1XT14Pj4+OCYyNTUsdFsyNl09eD4+PjE2JjI1NSx0WzI3XT14Pj4+MjQmMjU1LHRbMjhdPUk+Pj4wJjI1NSx0WzI5XT1JPj4+OCYyNTUsdFszMF09ST4+PjE2JjI1NSx0WzMxXT1JPj4+MjQmMjU1LHRbMzJdPUI+Pj4wJjI1NSx0WzMzXT1CPj4+OCYyNTUsdFszNF09Qj4+PjE2JjI1NSx0WzM1XT1CPj4+MjQmMjU1LHRbMzZdPU8+Pj4wJjI1NSx0WzM3XT1PPj4+OCYyNTUsdFszOF09Tz4+PjE2JjI1NSx0WzM5XT1PPj4+MjQmMjU1LHRbNDBdPVI+Pj4wJjI1NSx0WzQxXT1SPj4+OCYyNTUsdFs0Ml09Uj4+PjE2JjI1NSx0WzQzXT1SPj4+MjQmMjU1LHRbNDRdPVA+Pj4wJjI1NSx0WzQ1XT1QPj4+OCYyNTUsdFs0Nl09UD4+PjE2JjI1NSx0WzQ3XT1QPj4+MjQmMjU1LHRbNDhdPVQ+Pj4wJjI1NSx0WzQ5XT1UPj4+OCYyNTUsdFs1MF09VD4+PjE2JjI1NSx0WzUxXT1UPj4+MjQmMjU1LHRbNTJdPWo+Pj4wJjI1NSx0WzUzXT1qPj4+OCYyNTUsdFs1NF09aj4+PjE2JjI1NSx0WzU1XT1qPj4+MjQmMjU1LHRbNTZdPUM+Pj4wJjI1NSx0WzU3XT1DPj4+OCYyNTUsdFs1OF09Qz4+PjE2JjI1NSx0WzU5XT1DPj4+MjQmMjU1LHRbNjBdPU4+Pj4wJjI1NSx0WzYxXT1OPj4+OCYyNTUsdFs2Ml09Tj4+PjE2JjI1NSx0WzYzXT1OPj4+MjQmMjU1fWZ1bmN0aW9uIGYodCxlLHIsbil7Zm9yKHZhciBpLG89MjU1Jm5bMF18KDI1NSZuWzFdKTw8OHwoMjU1Jm5bMl0pPDwxNnwoMjU1Jm5bM10pPDwyNCxhPTI1NSZyWzBdfCgyNTUmclsxXSk8PDh8KDI1NSZyWzJdKTw8MTZ8KDI1NSZyWzNdKTw8MjQsZj0yNTUmcls0XXwoMjU1JnJbNV0pPDw4fCgyNTUmcls2XSk8PDE2fCgyNTUmcls3XSk8PDI0LHM9MjU1JnJbOF18KDI1NSZyWzldKTw8OHwoMjU1JnJbMTBdKTw8MTZ8KDI1NSZyWzExXSk8PDI0LHU9MjU1JnJbMTJdfCgyNTUmclsxM10pPDw4fCgyNTUmclsxNF0pPDwxNnwoMjU1JnJbMTVdKTw8MjQsaD0yNTUmbls0XXwoMjU1Jm5bNV0pPDw4fCgyNTUmbls2XSk8PDE2fCgyNTUmbls3XSk8PDI0LGM9MjU1JmVbMF18KDI1NSZlWzFdKTw8OHwoMjU1JmVbMl0pPDwxNnwoMjU1JmVbM10pPDwyNCxkPTI1NSZlWzRdfCgyNTUmZVs1XSk8PDh8KDI1NSZlWzZdKTw8MTZ8KDI1NSZlWzddKTw8MjQsbD0yNTUmZVs4XXwoMjU1JmVbOV0pPDw4fCgyNTUmZVsxMF0pPDwxNnwoMjU1JmVbMTFdKTw8MjQscD0yNTUmZVsxMl18KDI1NSZlWzEzXSk8PDh8KDI1NSZlWzE0XSk8PDE2fCgyNTUmZVsxNV0pPDwyNCxiPTI1NSZuWzhdfCgyNTUmbls5XSk8PDh8KDI1NSZuWzEwXSk8PDE2fCgyNTUmblsxMV0pPDwyNCx2PTI1NSZyWzE2XXwoMjU1JnJbMTddKTw8OHwoMjU1JnJbMThdKTw8MTZ8KDI1NSZyWzE5XSk8PDI0LHk9MjU1JnJbMjBdfCgyNTUmclsyMV0pPDw4fCgyNTUmclsyMl0pPDwxNnwoMjU1JnJbMjNdKTw8MjQsbT0yNTUmclsyNF18KDI1NSZyWzI1XSk8PDh8KDI1NSZyWzI2XSk8PDE2fCgyNTUmclsyN10pPDwyNCxnPTI1NSZyWzI4XXwoMjU1JnJbMjldKTw8OHwoMjU1JnJbMzBdKTw8MTZ8KDI1NSZyWzMxXSk8PDI0LHc9MjU1Jm5bMTJdfCgyNTUmblsxM10pPDw4fCgyNTUmblsxNF0pPDwxNnwoMjU1Jm5bMTVdKTw8MjQsXz1vLE09YSxTPWYsRT1zLEE9dSxrPWgseD1jLEk9ZCxCPWwsTz1wLFI9YixQPXYsVD15LGo9bSxDPWcsTj13LEw9MDtMPDIwO0wrPTIpaT1fK1R8MCxBXj1pPDw3fGk+Pj4yNSxpPUErX3wwLEJePWk8PDl8aT4+PjIzLGk9QitBfDAsVF49aTw8MTN8aT4+PjE5LGk9VCtCfDAsX149aTw8MTh8aT4+PjE0LGk9aytNfDAsT149aTw8N3xpPj4+MjUsaT1PK2t8MCxqXj1pPDw5fGk+Pj4yMyxpPWorT3wwLE1ePWk8PDEzfGk+Pj4xOSxpPU0ranwwLGtePWk8PDE4fGk+Pj4xNCxpPVIreHwwLENePWk8PDd8aT4+PjI1LGk9QytSfDAsU149aTw8OXxpPj4+MjMsaT1TK0N8MCx4Xj1pPDwxM3xpPj4+MTksaT14K1N8MCxSXj1pPDwxOHxpPj4+MTQsaT1OK1B8MCxFXj1pPDw3fGk+Pj4yNSxpPUUrTnwwLElePWk8PDl8aT4+PjIzLGk9SStFfDAsUF49aTw8MTN8aT4+PjE5LGk9UCtJfDAsTl49aTw8MTh8aT4+PjE0LGk9XytFfDAsTV49aTw8N3xpPj4+MjUsaT1NK198MCxTXj1pPDw5fGk+Pj4yMyxpPVMrTXwwLEVePWk8PDEzfGk+Pj4xOSxpPUUrU3wwLF9ePWk8PDE4fGk+Pj4xNCxpPWsrQXwwLHhePWk8PDd8aT4+PjI1LGk9eCtrfDAsSV49aTw8OXxpPj4+MjMsaT1JK3h8MCxBXj1pPDwxM3xpPj4+MTksaT1BK0l8MCxrXj1pPDwxOHxpPj4+MTQsaT1SK098MCxQXj1pPDw3fGk+Pj4yNSxpPVArUnwwLEJePWk8PDl8aT4+PjIzLGk9QitQfDAsT149aTw8MTN8aT4+PjE5LGk9TytCfDAsUl49aTw8MTh8aT4+PjE0LGk9TitDfDAsVF49aTw8N3xpPj4+MjUsaT1UK058MCxqXj1pPDw5fGk+Pj4yMyxpPWorVHwwLENePWk8PDEzfGk+Pj4xOSxpPUMranwwLE5ePWk8PDE4fGk+Pj4xNDt0WzBdPV8+Pj4wJjI1NSx0WzFdPV8+Pj44JjI1NSx0WzJdPV8+Pj4xNiYyNTUsdFszXT1fPj4+MjQmMjU1LHRbNF09az4+PjAmMjU1LHRbNV09az4+PjgmMjU1LHRbNl09az4+PjE2JjI1NSx0WzddPWs+Pj4yNCYyNTUsdFs4XT1SPj4+MCYyNTUsdFs5XT1SPj4+OCYyNTUsdFsxMF09Uj4+PjE2JjI1NSx0WzExXT1SPj4+MjQmMjU1LHRbMTJdPU4+Pj4wJjI1NSx0WzEzXT1OPj4+OCYyNTUsdFsxNF09Tj4+PjE2JjI1NSx0WzE1XT1OPj4+MjQmMjU1LHRbMTZdPXg+Pj4wJjI1NSx0WzE3XT14Pj4+OCYyNTUsdFsxOF09eD4+PjE2JjI1NSx0WzE5XT14Pj4+MjQmMjU1LHRbMjBdPUk+Pj4wJjI1NSx0WzIxXT1JPj4+OCYyNTUsdFsyMl09ST4+PjE2JjI1NSx0WzIzXT1JPj4+MjQmMjU1LHRbMjRdPUI+Pj4wJjI1NSx0WzI1XT1CPj4+OCYyNTUsdFsyNl09Qj4+PjE2JjI1NSx0WzI3XT1CPj4+MjQmMjU1LHRbMjhdPU8+Pj4wJjI1NSx0WzI5XT1PPj4+OCYyNTUsdFszMF09Tz4+PjE2JjI1NSx0WzMxXT1PPj4+MjQmMjU1fWZ1bmN0aW9uIHModCxlLHIsbil7YSh0LGUscixuKX1mdW5jdGlvbiB1KHQsZSxyLG4pe2YodCxlLHIsbil9ZnVuY3Rpb24gaCh0LGUscixuLGksbyxhKXt2YXIgZix1LGg9bmV3IFVpbnQ4QXJyYXkoMTYpLGM9bmV3IFVpbnQ4QXJyYXkoNjQpO2Zvcih1PTA7dTwxNjt1KyspaFt1XT0wO2Zvcih1PTA7dTw4O3UrKyloW3VdPW9bdV07Zm9yKDtpPj02NDspe2ZvcihzKGMsaCxhLGR0KSx1PTA7dTw2NDt1KyspdFtlK3VdPXJbbit1XV5jW3VdO2ZvcihmPTEsdT04O3U8MTY7dSsrKWY9ZisoMjU1JmhbdV0pfDAsaFt1XT0yNTUmZixmPj4+PTg7aS09NjQsZSs9NjQsbis9NjR9aWYoaT4wKWZvcihzKGMsaCxhLGR0KSx1PTA7dTxpO3UrKyl0W2UrdV09cltuK3VdXmNbdV07cmV0dXJuIDB9ZnVuY3Rpb24gYyh0LGUscixuLGkpe3ZhciBvLGEsZj1uZXcgVWludDhBcnJheSgxNiksdT1uZXcgVWludDhBcnJheSg2NCk7Zm9yKGE9MDthPDE2O2ErKylmW2FdPTA7Zm9yKGE9MDthPDg7YSsrKWZbYV09blthXTtmb3IoO3I+PTY0Oyl7Zm9yKHModSxmLGksZHQpLGE9MDthPDY0O2ErKyl0W2UrYV09dVthXTtmb3Iobz0xLGE9ODthPDE2O2ErKylvPW8rKDI1NSZmW2FdKXwwLGZbYV09MjU1Jm8sbz4+Pj04O3ItPTY0LGUrPTY0fWlmKHI+MClmb3Iocyh1LGYsaSxkdCksYT0wO2E8cjthKyspdFtlK2FdPXVbYV07cmV0dXJuIDB9ZnVuY3Rpb24gZCh0LGUscixuLGkpe3ZhciBvPW5ldyBVaW50OEFycmF5KDMyKTt1KG8sbixpLGR0KTtmb3IodmFyIGE9bmV3IFVpbnQ4QXJyYXkoOCksZj0wO2Y8ODtmKyspYVtmXT1uW2YrMTZdO3JldHVybiBjKHQsZSxyLGEsbyl9ZnVuY3Rpb24gbCh0LGUscixuLGksbyxhKXt2YXIgZj1uZXcgVWludDhBcnJheSgzMik7dShmLG8sYSxkdCk7Zm9yKHZhciBzPW5ldyBVaW50OEFycmF5KDgpLGM9MDtjPDg7YysrKXNbY109b1tjKzE2XTtyZXR1cm4gaCh0LGUscixuLGkscyxmKX1mdW5jdGlvbiBwKHQsZSxyLG4saSxvKXt2YXIgYT1uZXcgbHQobyk7cmV0dXJuIGEudXBkYXRlKHIsbixpKSxhLmZpbmlzaCh0LGUpLDB9ZnVuY3Rpb24gYih0LGUscixuLG8sYSl7dmFyIGY9bmV3IFVpbnQ4QXJyYXkoMTYpO3JldHVybiBwKGYsMCxyLG4sbyxhKSxpKHQsZSxmLDApfWZ1bmN0aW9uIHYodCxlLHIsbixpKXt2YXIgbztpZihyPDMyKXJldHVybi0xO2ZvcihsKHQsMCxlLDAscixuLGkpLHAodCwxNix0LDMyLHItMzIsdCksbz0wO288MTY7bysrKXRbb109MDtyZXR1cm4gMH1mdW5jdGlvbiB5KHQsZSxyLG4saSl7dmFyIG8sYT1uZXcgVWludDhBcnJheSgzMik7aWYocjwzMilyZXR1cm4tMTtpZihkKGEsMCwzMixuLGkpLDAhPT1iKGUsMTYsZSwzMixyLTMyLGEpKXJldHVybi0xO2ZvcihsKHQsMCxlLDAscixuLGkpLG89MDtvPDMyO28rKyl0W29dPTA7cmV0dXJuIDB9ZnVuY3Rpb24gbSh0LGUpe3ZhciByO2ZvcihyPTA7cjwxNjtyKyspdFtyXT0wfGVbcl19ZnVuY3Rpb24gZyh0KXt2YXIgZSxyLG49MTtmb3IoZT0wO2U8MTY7ZSsrKXI9dFtlXStuKzY1NTM1LG49TWF0aC5mbG9vcihyLzY1NTM2KSx0W2VdPXItNjU1MzYqbjt0WzBdKz1uLTErMzcqKG4tMSl9ZnVuY3Rpb24gdyh0LGUscil7Zm9yKHZhciBuLGk9fihyLTEpLG89MDtvPDE2O28rKyluPWkmKHRbb11eZVtvXSksdFtvXV49bixlW29dXj1ufWZ1bmN0aW9uIF8odCxlKXt2YXIgcixuLGksbz10dCgpLGE9dHQoKTtmb3Iocj0wO3I8MTY7cisrKWFbcl09ZVtyXTtmb3IoZyhhKSxnKGEpLGcoYSksbj0wO248MjtuKyspe2ZvcihvWzBdPWFbMF0tNjU1MTcscj0xO3I8MTU7cisrKW9bcl09YVtyXS02NTUzNS0ob1tyLTFdPj4xNiYxKSxvW3ItMV0mPTY1NTM1O29bMTVdPWFbMTVdLTMyNzY3LShvWzE0XT4+MTYmMSksaT1vWzE1XT4+MTYmMSxvWzE0XSY9NjU1MzUsdyhhLG8sMS1pKX1mb3Iocj0wO3I8MTY7cisrKXRbMipyXT0yNTUmYVtyXSx0WzIqcisxXT1hW3JdPj44fWZ1bmN0aW9uIE0odCxlKXt2YXIgcj1uZXcgVWludDhBcnJheSgzMiksbj1uZXcgVWludDhBcnJheSgzMik7cmV0dXJuIF8ocix0KSxfKG4sZSksbyhyLDAsbiwwKX1mdW5jdGlvbiBTKHQpe3ZhciBlPW5ldyBVaW50OEFycmF5KDMyKTtyZXR1cm4gXyhlLHQpLDEmZVswXX1mdW5jdGlvbiBFKHQsZSl7dmFyIHI7Zm9yKHI9MDtyPDE2O3IrKyl0W3JdPWVbMipyXSsoZVsyKnIrMV08PDgpO3RbMTVdJj0zMjc2N31mdW5jdGlvbiBBKHQsZSxyKXtmb3IodmFyIG49MDtuPDE2O24rKyl0W25dPWVbbl0rcltuXX1mdW5jdGlvbiBrKHQsZSxyKXtmb3IodmFyIG49MDtuPDE2O24rKyl0W25dPWVbbl0tcltuXX1mdW5jdGlvbiB4KHQsZSxyKXt2YXIgbixpLG89MCxhPTAsZj0wLHM9MCx1PTAsaD0wLGM9MCxkPTAsbD0wLHA9MCxiPTAsdj0wLHk9MCxtPTAsZz0wLHc9MCxfPTAsTT0wLFM9MCxFPTAsQT0wLGs9MCx4PTAsST0wLEI9MCxPPTAsUj0wLFA9MCxUPTAsaj0wLEM9MCxOPXJbMF0sTD1yWzFdLFU9clsyXSx6PXJbM10sRD1yWzRdLHE9cls1XSxGPXJbNl0sSz1yWzddLEc9cls4XSxWPXJbOV0sSD1yWzEwXSxYPXJbMTFdLFk9clsxMl0sVz1yWzEzXSxaPXJbMTRdLEo9clsxNV07bj1lWzBdLG8rPW4qTixhKz1uKkwsZis9bipVLHMrPW4qeix1Kz1uKkQsaCs9bipxLGMrPW4qRixkKz1uKkssbCs9bipHLHArPW4qVixiKz1uKkgsdis9bipYLHkrPW4qWSxtKz1uKlcsZys9bipaLHcrPW4qSixuPWVbMV0sYSs9bipOLGYrPW4qTCxzKz1uKlUsdSs9bip6LGgrPW4qRCxjKz1uKnEsZCs9bipGLGwrPW4qSyxwKz1uKkcsYis9bipWLHYrPW4qSCx5Kz1uKlgsbSs9bipZLGcrPW4qVyx3Kz1uKlosXys9bipKLG49ZVsyXSxmKz1uKk4scys9bipMLHUrPW4qVSxoKz1uKnosYys9bipELGQrPW4qcSxsKz1uKkYscCs9bipLLGIrPW4qRyx2Kz1uKlYseSs9bipILG0rPW4qWCxnKz1uKlksdys9bipXLF8rPW4qWixNKz1uKkosbj1lWzNdLHMrPW4qTix1Kz1uKkwsaCs9bipVLGMrPW4qeixkKz1uKkQsbCs9bipxLHArPW4qRixiKz1uKkssdis9bipHLHkrPW4qVixtKz1uKkgsZys9bipYLHcrPW4qWSxfKz1uKlcsTSs9bipaLFMrPW4qSixuPWVbNF0sdSs9bipOLGgrPW4qTCxjKz1uKlUsZCs9bip6LGwrPW4qRCxwKz1uKnEsYis9bipGLHYrPW4qSyx5Kz1uKkcsbSs9bipWLGcrPW4qSCx3Kz1uKlgsXys9bipZLE0rPW4qVyxTKz1uKlosRSs9bipKLG49ZVs1XSxoKz1uKk4sYys9bipMLGQrPW4qVSxsKz1uKnoscCs9bipELGIrPW4qcSx2Kz1uKkYseSs9bipLLG0rPW4qRyxnKz1uKlYsdys9bipILF8rPW4qWCxNKz1uKlksUys9bipXLEUrPW4qWixBKz1uKkosbj1lWzZdLGMrPW4qTixkKz1uKkwsbCs9bipVLHArPW4qeixiKz1uKkQsdis9bipxLHkrPW4qRixtKz1uKkssZys9bipHLHcrPW4qVixfKz1uKkgsTSs9bipYLFMrPW4qWSxFKz1uKlcsQSs9bipaLGsrPW4qSixuPWVbN10sZCs9bipOLGwrPW4qTCxwKz1uKlUsYis9bip6LHYrPW4qRCx5Kz1uKnEsbSs9bipGLGcrPW4qSyx3Kz1uKkcsXys9bipWLE0rPW4qSCxTKz1uKlgsRSs9bipZLEErPW4qVyxrKz1uKloseCs9bipKLG49ZVs4XSxsKz1uKk4scCs9bipMLGIrPW4qVSx2Kz1uKnoseSs9bipELG0rPW4qcSxnKz1uKkYsdys9bipLLF8rPW4qRyxNKz1uKlYsUys9bipILEUrPW4qWCxBKz1uKlksays9bipXLHgrPW4qWixJKz1uKkosbj1lWzldLHArPW4qTixiKz1uKkwsdis9bipVLHkrPW4qeixtKz1uKkQsZys9bipxLHcrPW4qRixfKz1uKkssTSs9bipHLFMrPW4qVixFKz1uKkgsQSs9bipYLGsrPW4qWSx4Kz1uKlcsSSs9bipaLEIrPW4qSixuPWVbMTBdLGIrPW4qTix2Kz1uKkwseSs9bipVLG0rPW4qeixnKz1uKkQsdys9bipxLF8rPW4qRixNKz1uKkssUys9bipHLEUrPW4qVixBKz1uKkgsays9bipYLHgrPW4qWSxJKz1uKlcsQis9bipaLE8rPW4qSixuPWVbMTFdLHYrPW4qTix5Kz1uKkwsbSs9bipVLGcrPW4qeix3Kz1uKkQsXys9bipxLE0rPW4qRixTKz1uKkssRSs9bipHLEErPW4qVixrKz1uKkgseCs9bipYO0krPW4qWTtCKz1uKlcsTys9bipaLFIrPW4qSixuPWVbMTJdLHkrPW4qTixtKz1uKkwsZys9bipVLHcrPW4qeixfKz1uKkQsTSs9bipxLFMrPW4qRixFKz1uKkssQSs9bipHLGsrPW4qVix4Kz1uKkgsSSs9bipYLEIrPW4qWSxPKz1uKlcsUis9bipaLFArPW4qSixuPWVbMTNdLG0rPW4qTixnKz1uKkwsdys9bipVLF8rPW4qeixNKz1uKkQsUys9bipxLEUrPW4qRixBKz1uKkssays9bipHLHgrPW4qVixJKz1uKkgsQis9bipYLE8rPW4qWSxSKz1uKlcsUCs9bipaLFQrPW4qSixuPWVbMTRdLGcrPW4qTix3Kz1uKkwsXys9bipVLE0rPW4qeixTKz1uKkQsRSs9bipxLEErPW4qRixrKz1uKksseCs9bipHLEkrPW4qVixCKz1uKkgsTys9bipYLFIrPW4qWSxQKz1uKlcsVCs9bipaLGorPW4qSixuPWVbMTVdLHcrPW4qTixfKz1uKkwsTSs9bipVLFMrPW4qeixFKz1uKkQsQSs9bipxLGsrPW4qRix4Kz1uKkssSSs9bipHLEIrPW4qVixPKz1uKkgsUis9bipYLFArPW4qWSxUKz1uKlcsais9bipaLEMrPW4qSixvKz0zOCpfLGErPTM4Kk0sZis9MzgqUyxzKz0zOCpFLHUrPTM4KkEsaCs9MzgqayxjKz0zOCp4LGQrPTM4KkksbCs9MzgqQixwKz0zOCpPLGIrPTM4KlIsdis9MzgqUCx5Kz0zOCpULG0rPTM4KmosZys9MzgqQyxpPTEsbj1vK2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLG89bi02NTUzNippLG49YStpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSxhPW4tNjU1MzYqaSxuPWYraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksZj1uLTY1NTM2Kmksbj1zK2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLHM9bi02NTUzNippLG49dStpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSx1PW4tNjU1MzYqaSxuPWgraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksaD1uLTY1NTM2Kmksbj1jK2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLGM9bi02NTUzNippLG49ZCtpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSxkPW4tNjU1MzYqaSxuPWwraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksbD1uLTY1NTM2Kmksbj1wK2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLHA9bi02NTUzNippLG49YitpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSxiPW4tNjU1MzYqaSxuPXYraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksdj1uLTY1NTM2Kmksbj15K2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLHk9bi02NTUzNippLG49bStpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSxtPW4tNjU1MzYqaSxuPWcraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksZz1uLTY1NTM2Kmksbj13K2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLHc9bi02NTUzNippLG8rPWktMSszNyooaS0xKSxpPTEsbj1vK2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLG89bi02NTUzNippLG49YStpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSxhPW4tNjU1MzYqaSxuPWYraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksZj1uLTY1NTM2Kmksbj1zK2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLHM9bi02NTUzNippLG49dStpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSx1PW4tNjU1MzYqaSxuPWgraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksaD1uLTY1NTM2Kmksbj1jK2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLGM9bi02NTUzNippLG49ZCtpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSxkPW4tNjU1MzYqaSxuPWwraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksbD1uLTY1NTM2Kmksbj1wK2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLHA9bi02NTUzNippLG49YitpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSxiPW4tNjU1MzYqaSxuPXYraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksdj1uLTY1NTM2Kmksbj15K2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLHk9bi02NTUzNippLG49bStpKzY1NTM1LGk9TWF0aC5mbG9vcihuLzY1NTM2KSxtPW4tNjU1MzYqaSxuPWcraSs2NTUzNSxpPU1hdGguZmxvb3Iobi82NTUzNiksZz1uLTY1NTM2Kmksbj13K2krNjU1MzUsaT1NYXRoLmZsb29yKG4vNjU1MzYpLHc9bi02NTUzNippLG8rPWktMSszNyooaS0xKSx0WzBdPW8sdFsxXT1hLHRbMl09Zix0WzNdPXMsdFs0XT11LHRbNV09aCx0WzZdPWMsdFs3XT1kLHRbOF09bCx0WzldPXAsdFsxMF09Yix0WzExXT12LHRbMTJdPXksdFsxM109bTt0WzE0XT1nO3RbMTVdPXd9ZnVuY3Rpb24gSSh0LGUpe3godCxlLGUpfWZ1bmN0aW9uIEIodCxlKXt2YXIgcixuPXR0KCk7Zm9yKHI9MDtyPDE2O3IrKyluW3JdPWVbcl07Zm9yKHI9MjUzO3I+PTA7ci0tKUkobixuKSwyIT09ciYmNCE9PXImJngobixuLGUpO2ZvcihyPTA7cjwxNjtyKyspdFtyXT1uW3JdfWZ1bmN0aW9uIE8odCxlKXt2YXIgcixuPXR0KCk7Zm9yKHI9MDtyPDE2O3IrKyluW3JdPWVbcl07Zm9yKHI9MjUwO3I+PTA7ci0tKUkobixuKSwxIT09ciYmeChuLG4sZSk7Zm9yKHI9MDtyPDE2O3IrKyl0W3JdPW5bcl19ZnVuY3Rpb24gUih0LGUscil7dmFyIG4saSxvPW5ldyBVaW50OEFycmF5KDMyKSxhPW5ldyBGbG9hdDY0QXJyYXkoODApLGY9dHQoKSxzPXR0KCksdT10dCgpLGg9dHQoKSxjPXR0KCksZD10dCgpO2ZvcihpPTA7aTwzMTtpKyspb1tpXT1lW2ldO2ZvcihvWzMxXT0xMjcmZVszMV18NjQsb1swXSY9MjQ4LEUoYSxyKSxpPTA7aTwxNjtpKyspc1tpXT1hW2ldLGhbaV09ZltpXT11W2ldPTA7Zm9yKGZbMF09aFswXT0xLGk9MjU0O2k+PTA7LS1pKW49b1tpPj4+M10+Pj4oNyZpKSYxLHcoZixzLG4pLHcodSxoLG4pLEEoYyxmLHUpLGsoZixmLHUpLEEodSxzLGgpLGsocyxzLGgpLEkoaCxjKSxJKGQsZikseChmLHUsZikseCh1LHMsYyksQShjLGYsdSksayhmLGYsdSksSShzLGYpLGsodSxoLGQpLHgoZix1LGF0KSxBKGYsZixoKSx4KHUsdSxmKSx4KGYsaCxkKSx4KGgscyxhKSxJKHMsYyksdyhmLHMsbiksdyh1LGgsbik7Zm9yKGk9MDtpPDE2O2krKylhW2krMTZdPWZbaV0sYVtpKzMyXT11W2ldLGFbaSs0OF09c1tpXSxhW2krNjRdPWhbaV07dmFyIGw9YS5zdWJhcnJheSgzMikscD1hLnN1YmFycmF5KDE2KTtyZXR1cm4gQihsLGwpLHgocCxwLGwpLF8odCxwKSwwfWZ1bmN0aW9uIFAodCxlKXtyZXR1cm4gUih0LGUsbnQpfWZ1bmN0aW9uIFQodCxlKXtyZXR1cm4gZXQoZSwzMiksUCh0LGUpfWZ1bmN0aW9uIGoodCxlLHIpe3ZhciBuPW5ldyBVaW50OEFycmF5KDMyKTtyZXR1cm4gUihuLHIsZSksdSh0LHJ0LG4sZHQpfWZ1bmN0aW9uIEModCxlLHIsbixpLG8pe3ZhciBhPW5ldyBVaW50OEFycmF5KDMyKTtyZXR1cm4gaihhLGksbykscHQodCxlLHIsbixhKX1mdW5jdGlvbiBOKHQsZSxyLG4saSxvKXt2YXIgYT1uZXcgVWludDhBcnJheSgzMik7cmV0dXJuIGooYSxpLG8pLGJ0KHQsZSxyLG4sYSl9ZnVuY3Rpb24gTCh0LGUscixuKXtmb3IodmFyIGksbyxhLGYscyx1LGgsYyxkLGwscCxiLHYseSxtLGcsdyxfLE0sUyxFLEEsayx4LEksQixPPW5ldyBJbnQzMkFycmF5KDE2KSxSPW5ldyBJbnQzMkFycmF5KDE2KSxQPXRbMF0sVD10WzFdLGo9dFsyXSxDPXRbM10sTj10WzRdLEw9dFs1XSxVPXRbNl0sej10WzddLEQ9ZVswXSxxPWVbMV0sRj1lWzJdLEs9ZVszXSxHPWVbNF0sVj1lWzVdLEg9ZVs2XSxYPWVbN10sWT0wO24+PTEyODspe2ZvcihNPTA7TTwxNjtNKyspUz04Kk0rWSxPW01dPXJbUyswXTw8MjR8cltTKzFdPDwxNnxyW1MrMl08PDh8cltTKzNdLFJbTV09cltTKzRdPDwyNHxyW1MrNV08PDE2fHJbUys2XTw8OHxyW1MrN107Zm9yKE09MDtNPDgwO00rKylpZihpPVAsbz1ULGE9aixmPUMscz1OLHU9TCxoPVUsYz16LGQ9RCxsPXEscD1GLGI9Syx2PUcseT1WLG09SCxnPVgsRT16LEE9WCxrPTY1NTM1JkEseD1BPj4+MTYsST02NTUzNSZFLEI9RT4+PjE2LEU9KE4+Pj4xNHxHPDwxOCleKE4+Pj4xOHxHPDwxNCleKEc+Pj45fE48PDIzKSxBPShHPj4+MTR8Tjw8MTgpXihHPj4+MTh8Tjw8MTQpXihOPj4+OXxHPDwyMyksays9NjU1MzUmQSx4Kz1BPj4+MTYsSSs9NjU1MzUmRSxCKz1FPj4+MTYsRT1OJkxefk4mVSxBPUcmVl5+RyZILGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LEU9dnRbMipNXSxBPXZ0WzIqTSsxXSxrKz02NTUzNSZBLHgrPUE+Pj4xNixJKz02NTUzNSZFLEIrPUU+Pj4xNixFPU9bTSUxNl0sQT1SW00lMTZdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHc9NjU1MzUmSXxCPDwxNixfPTY1NTM1Jmt8eDw8MTYsRT13LEE9XyxrPTY1NTM1JkEseD1BPj4+MTYsST02NTUzNSZFLEI9RT4+PjE2LEU9KFA+Pj4yOHxEPDw0KV4oRD4+PjJ8UDw8MzApXihEPj4+N3xQPDwyNSksQT0oRD4+PjI4fFA8PDQpXihQPj4+MnxEPDwzMCleKFA+Pj43fEQ8PDI1KSxrKz02NTUzNSZBLHgrPUE+Pj4xNixJKz02NTUzNSZFLEIrPUU+Pj4xNixFPVAmVF5QJmpeVCZqLEE9RCZxXkQmRl5xJkYsays9NjU1MzUmQSx4Kz1BPj4+MTYsSSs9NjU1MzUmRSxCKz1FPj4+MTYseCs9az4+PjE2LEkrPXg+Pj4xNixCKz1JPj4+MTYsYz02NTUzNSZJfEI8PDE2LGc9NjU1MzUma3x4PDwxNixFPWYsQT1iLGs9NjU1MzUmQSx4PUE+Pj4xNixJPTY1NTM1JkUsQj1FPj4+MTYsRT13LEE9XyxrKz02NTUzNSZBLHgrPUE+Pj4xNixJKz02NTUzNSZFLEIrPUU+Pj4xNix4Kz1rPj4+MTYsSSs9eD4+PjE2LEIrPUk+Pj4xNixmPTY1NTM1Jkl8Qjw8MTYsYj02NTUzNSZrfHg8PDE2LFQ9aSxqPW8sQz1hLE49ZixMPXMsVT11LHo9aCxQPWMscT1kLEY9bCxLPXAsRz1iLFY9dixIPXksWD1tLEQ9ZyxNJTE2PT09MTUpZm9yKFM9MDtTPDE2O1MrKylFPU9bU10sQT1SW1NdLGs9NjU1MzUmQSx4PUE+Pj4xNixJPTY1NTM1JkUsQj1FPj4+MTYsRT1PWyhTKzkpJTE2XSxBPVJbKFMrOSklMTZdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHc9T1soUysxKSUxNl0sXz1SWyhTKzEpJTE2XSxFPSh3Pj4+MXxfPDwzMSleKHc+Pj44fF88PDI0KV53Pj4+NyxBPShfPj4+MXx3PDwzMSleKF8+Pj44fHc8PDI0KV4oXz4+Pjd8dzw8MjUpLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHc9T1soUysxNCklMTZdLF89UlsoUysxNCklMTZdLEU9KHc+Pj4xOXxfPDwxMyleKF8+Pj4yOXx3PDwzKV53Pj4+NixBPShfPj4+MTl8dzw8MTMpXih3Pj4+Mjl8Xzw8MyleKF8+Pj42fHc8PDI2KSxrKz02NTUzNSZBLHgrPUE+Pj4xNixJKz02NTUzNSZFLEIrPUU+Pj4xNix4Kz1rPj4+MTYsSSs9eD4+PjE2LEIrPUk+Pj4xNixPW1NdPTY1NTM1Jkl8Qjw8MTYsUltTXT02NTUzNSZrfHg8PDE2O0U9UCxBPUQsaz02NTUzNSZBLHg9QT4+PjE2LEk9NjU1MzUmRSxCPUU+Pj4xNixFPXRbMF0sQT1lWzBdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHRbMF09UD02NTUzNSZJfEI8PDE2LGVbMF09RD02NTUzNSZrfHg8PDE2LEU9VCxBPXEsaz02NTUzNSZBLHg9QT4+PjE2LEk9NjU1MzUmRSxCPUU+Pj4xNixFPXRbMV0sQT1lWzFdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHRbMV09VD02NTUzNSZJfEI8PDE2LGVbMV09cT02NTUzNSZrfHg8PDE2LEU9aixBPUYsaz02NTUzNSZBLHg9QT4+PjE2LEk9NjU1MzUmRSxCPUU+Pj4xNixFPXRbMl0sQT1lWzJdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHRbMl09aj02NTUzNSZJfEI8PDE2LGVbMl09Rj02NTUzNSZrfHg8PDE2LEU9QyxBPUssaz02NTUzNSZBLHg9QT4+PjE2LEk9NjU1MzUmRSxCPUU+Pj4xNixFPXRbM10sQT1lWzNdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHRbM109Qz02NTUzNSZJfEI8PDE2LGVbM109Sz02NTUzNSZrfHg8PDE2LEU9TixBPUcsaz02NTUzNSZBLHg9QT4+PjE2LEk9NjU1MzUmRSxCPUU+Pj4xNixFPXRbNF0sQT1lWzRdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHRbNF09Tj02NTUzNSZJfEI8PDE2LGVbNF09Rz02NTUzNSZrfHg8PDE2LEU9TCxBPVYsaz02NTUzNSZBLHg9QT4+PjE2LEk9NjU1MzUmRSxCPUU+Pj4xNixFPXRbNV0sQT1lWzVdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHRbNV09TD02NTUzNSZJfEI8PDE2LGVbNV09Vj02NTUzNSZrfHg8PDE2LEU9VSxBPUgsaz02NTUzNSZBLHg9QT4+PjE2LEk9NjU1MzUmRSxCPUU+Pj4xNixFPXRbNl0sQT1lWzZdLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHRbNl09VT02NTUzNSZJfEI8PDE2LGVbNl09SD02NTUzNSZrfHg8PDE2LEU9eixBPVgsaz02NTUzNSZBLHg9QT4+PjE2LEk9NjU1MzUmRSxCPUU+Pj4xNixFPXRbN10sQT1lWzddLGsrPTY1NTM1JkEseCs9QT4+PjE2LEkrPTY1NTM1JkUsQis9RT4+PjE2LHgrPWs+Pj4xNixJKz14Pj4+MTYsQis9ST4+PjE2LHRbN109ej02NTUzNSZJfEI8PDE2LGVbN109WD02NTUzNSZrfHg8PDE2LFkrPTEyOCxuLT0xMjh9cmV0dXJuIG59ZnVuY3Rpb24gVSh0LHIsbil7dmFyIGksbz1uZXcgSW50MzJBcnJheSg4KSxhPW5ldyBJbnQzMkFycmF5KDgpLGY9bmV3IFVpbnQ4QXJyYXkoMjU2KSxzPW47Zm9yKG9bMF09MTc3OTAzMzcwMyxvWzFdPTMxNDQxMzQyNzcsb1syXT0xMDEzOTA0MjQyLG9bM109Mjc3MzQ4MDc2MixvWzRdPTEzNTk4OTMxMTksb1s1XT0yNjAwODIyOTI0LG9bNl09NTI4NzM0NjM1LG9bN109MTU0MTQ1OTIyNSxhWzBdPTQwODkyMzU3MjAsYVsxXT0yMjI3ODczNTk1LGFbMl09NDI3MTE3NTcyMyxhWzNdPTE1OTU3NTAxMjksYVs0XT0yOTE3NTY1MTM3LGFbNV09NzI1NTExMTk5LGFbNl09NDIxNTM4OTU0NyxhWzddPTMyNzAzMzIwOSxMKG8sYSxyLG4pLG4lPTEyOCxpPTA7aTxuO2krKylmW2ldPXJbcy1uK2ldO2ZvcihmW25dPTEyOCxuPTI1Ni0xMjgqKG48MTEyPzE6MCksZltuLTldPTAsZShmLG4tOCxzLzUzNjg3MDkxMnwwLHM8PDMpLEwobyxhLGYsbiksaT0wO2k8ODtpKyspZSh0LDgqaSxvW2ldLGFbaV0pO3JldHVybiAwfWZ1bmN0aW9uIHoodCxlKXt2YXIgcj10dCgpLG49dHQoKSxpPXR0KCksbz10dCgpLGE9dHQoKSxmPXR0KCkscz10dCgpLHU9dHQoKSxoPXR0KCk7ayhyLHRbMV0sdFswXSksayhoLGVbMV0sZVswXSkseChyLHIsaCksQShuLHRbMF0sdFsxXSksQShoLGVbMF0sZVsxXSkseChuLG4saCkseChpLHRbM10sZVszXSkseChpLGksc3QpLHgobyx0WzJdLGVbMl0pLEEobyxvLG8pLGsoYSxuLHIpLGsoZixvLGkpLEEocyxvLGkpLEEodSxuLHIpLHgodFswXSxhLGYpLHgodFsxXSx1LHMpLHgodFsyXSxzLGYpLHgodFszXSxhLHUpfWZ1bmN0aW9uIEQodCxlLHIpe3ZhciBuO2ZvcihuPTA7bjw0O24rKyl3KHRbbl0sZVtuXSxyKX1mdW5jdGlvbiBxKHQsZSl7dmFyIHI9dHQoKSxuPXR0KCksaT10dCgpO0IoaSxlWzJdKSx4KHIsZVswXSxpKSx4KG4sZVsxXSxpKSxfKHQsbiksdFszMV1ePVMocik8PDd9ZnVuY3Rpb24gRih0LGUscil7dmFyIG4saTtmb3IobSh0WzBdLGl0KSxtKHRbMV0sb3QpLG0odFsyXSxvdCksbSh0WzNdLGl0KSxpPTI1NTtpPj0wOy0taSluPXJbaS84fDBdPj4oNyZpKSYxLEQodCxlLG4pLHooZSx0KSx6KHQsdCksRCh0LGUsbil9ZnVuY3Rpb24gSyh0LGUpe3ZhciByPVt0dCgpLHR0KCksdHQoKSx0dCgpXTtcbm0oclswXSx1dCksbShyWzFdLGh0KSxtKHJbMl0sb3QpLHgoclszXSx1dCxodCksRih0LHIsZSl9ZnVuY3Rpb24gRyh0LGUscil7dmFyIG4saT1uZXcgVWludDhBcnJheSg2NCksbz1bdHQoKSx0dCgpLHR0KCksdHQoKV07Zm9yKHJ8fGV0KGUsMzIpLFUoaSxlLDMyKSxpWzBdJj0yNDgsaVszMV0mPTEyNyxpWzMxXXw9NjQsSyhvLGkpLHEodCxvKSxuPTA7bjwzMjtuKyspZVtuKzMyXT10W25dO3JldHVybiAwfWZ1bmN0aW9uIFYodCxlKXt2YXIgcixuLGksbztmb3Iobj02MztuPj0zMjstLW4pe2ZvcihyPTAsaT1uLTMyLG89bi0xMjtpPG87KytpKWVbaV0rPXItMTYqZVtuXSp5dFtpLShuLTMyKV0scj1lW2ldKzEyOD4+OCxlW2ldLT0yNTYqcjtlW2ldKz1yLGVbbl09MH1mb3Iocj0wLGk9MDtpPDMyO2krKyllW2ldKz1yLShlWzMxXT4+NCkqeXRbaV0scj1lW2ldPj44LGVbaV0mPTI1NTtmb3IoaT0wO2k8MzI7aSsrKWVbaV0tPXIqeXRbaV07Zm9yKG49MDtuPDMyO24rKyllW24rMV0rPWVbbl0+PjgsdFtuXT0yNTUmZVtuXX1mdW5jdGlvbiBIKHQpe3ZhciBlLHI9bmV3IEZsb2F0NjRBcnJheSg2NCk7Zm9yKGU9MDtlPDY0O2UrKylyW2VdPXRbZV07Zm9yKGU9MDtlPDY0O2UrKyl0W2VdPTA7Vih0LHIpfWZ1bmN0aW9uIFgodCxlLHIsbil7dmFyIGksbyxhPW5ldyBVaW50OEFycmF5KDY0KSxmPW5ldyBVaW50OEFycmF5KDY0KSxzPW5ldyBVaW50OEFycmF5KDY0KSx1PW5ldyBGbG9hdDY0QXJyYXkoNjQpLGg9W3R0KCksdHQoKSx0dCgpLHR0KCldO1UoYSxuLDMyKSxhWzBdJj0yNDgsYVszMV0mPTEyNyxhWzMxXXw9NjQ7dmFyIGM9cis2NDtmb3IoaT0wO2k8cjtpKyspdFs2NCtpXT1lW2ldO2ZvcihpPTA7aTwzMjtpKyspdFszMitpXT1hWzMyK2ldO2ZvcihVKHMsdC5zdWJhcnJheSgzMiksciszMiksSChzKSxLKGgscykscSh0LGgpLGk9MzI7aTw2NDtpKyspdFtpXT1uW2ldO2ZvcihVKGYsdCxyKzY0KSxIKGYpLGk9MDtpPDY0O2krKyl1W2ldPTA7Zm9yKGk9MDtpPDMyO2krKyl1W2ldPXNbaV07Zm9yKGk9MDtpPDMyO2krKylmb3Iobz0wO288MzI7bysrKXVbaStvXSs9ZltpXSphW29dO3JldHVybiBWKHQuc3ViYXJyYXkoMzIpLHUpLGN9ZnVuY3Rpb24gWSh0LGUpe3ZhciByPXR0KCksbj10dCgpLGk9dHQoKSxvPXR0KCksYT10dCgpLGY9dHQoKSxzPXR0KCk7cmV0dXJuIG0odFsyXSxvdCksRSh0WzFdLGUpLEkoaSx0WzFdKSx4KG8saSxmdCksayhpLGksdFsyXSksQShvLHRbMl0sbyksSShhLG8pLEkoZixhKSx4KHMsZixhKSx4KHIscyxpKSx4KHIscixvKSxPKHIscikseChyLHIsaSkseChyLHIsbykseChyLHIsbykseCh0WzBdLHIsbyksSShuLHRbMF0pLHgobixuLG8pLE0obixpKSYmeCh0WzBdLHRbMF0sY3QpLEkobix0WzBdKSx4KG4sbixvKSxNKG4saSk/LTE6KFModFswXSk9PT1lWzMxXT4+NyYmayh0WzBdLGl0LHRbMF0pLHgodFszXSx0WzBdLHRbMV0pLDApfWZ1bmN0aW9uIFcodCxlLHIsbil7dmFyIGksYSxmPW5ldyBVaW50OEFycmF5KDMyKSxzPW5ldyBVaW50OEFycmF5KDY0KSx1PVt0dCgpLHR0KCksdHQoKSx0dCgpXSxoPVt0dCgpLHR0KCksdHQoKSx0dCgpXTtpZihhPS0xLHI8NjQpcmV0dXJuLTE7aWYoWShoLG4pKXJldHVybi0xO2ZvcihpPTA7aTxyO2krKyl0W2ldPWVbaV07Zm9yKGk9MDtpPDMyO2krKyl0W2krMzJdPW5baV07aWYoVShzLHQsciksSChzKSxGKHUsaCxzKSxLKGgsZS5zdWJhcnJheSgzMikpLHoodSxoKSxxKGYsdSksci09NjQsbyhlLDAsZiwwKSl7Zm9yKGk9MDtpPHI7aSsrKXRbaV09MDtyZXR1cm4tMX1mb3IoaT0wO2k8cjtpKyspdFtpXT1lW2krNjRdO3JldHVybiBhPXJ9ZnVuY3Rpb24gWih0LGUpe2lmKHQubGVuZ3RoIT09bXQpdGhyb3cgbmV3IEVycm9yKFwiYmFkIGtleSBzaXplXCIpO2lmKGUubGVuZ3RoIT09Z3QpdGhyb3cgbmV3IEVycm9yKFwiYmFkIG5vbmNlIHNpemVcIil9ZnVuY3Rpb24gSih0LGUpe2lmKHQubGVuZ3RoIT09RXQpdGhyb3cgbmV3IEVycm9yKFwiYmFkIHB1YmxpYyBrZXkgc2l6ZVwiKTtpZihlLmxlbmd0aCE9PUF0KXRocm93IG5ldyBFcnJvcihcImJhZCBzZWNyZXQga2V5IHNpemVcIil9ZnVuY3Rpb24gJCgpe3ZhciB0LGU7Zm9yKGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKWlmKFwiW29iamVjdCBVaW50OEFycmF5XVwiIT09KHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50c1tlXSkpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJ1bmV4cGVjdGVkIHR5cGUgXCIrdCtcIiwgdXNlIFVpbnQ4QXJyYXlcIil9ZnVuY3Rpb24gUSh0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPTB9dmFyIHR0PWZ1bmN0aW9uKHQpe3ZhciBlLHI9bmV3IEZsb2F0NjRBcnJheSgxNik7aWYodClmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKXJbZV09dFtlXTtyZXR1cm4gcn0sZXQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJubyBQUk5HXCIpfSxydD1uZXcgVWludDhBcnJheSgxNiksbnQ9bmV3IFVpbnQ4QXJyYXkoMzIpO250WzBdPTk7dmFyIGl0PXR0KCksb3Q9dHQoWzFdKSxhdD10dChbNTYxMjksMV0pLGZ0PXR0KFszMDg4Myw0OTUzLDE5OTE0LDMwMTg3LDU1NDY3LDE2NzA1LDI2MzcsMTEyLDU5NTQ0LDMwNTg1LDE2NTA1LDM2MDM5LDY1MTM5LDExMTE5LDI3ODg2LDIwOTk1XSksc3Q9dHQoWzYxNzg1LDk5MDYsMzk4MjgsNjAzNzQsNDUzOTgsMzM0MTEsNTI3NCwyMjQsNTM1NTIsNjExNzEsMzMwMTAsNjU0Miw2NDc0MywyMjIzOSw1NTc3Miw5MjIyXSksdXQ9dHQoWzU0NTU0LDM2NjQ1LDExNjE2LDUxNTQyLDQyOTMwLDM4MTgxLDUxMDQwLDI2OTI0LDU2NDEyLDY0OTgyLDU3OTA1LDQ5MzE2LDIxNTAyLDUyNTkwLDE0MDM1LDg1NTNdKSxodD10dChbMjYyMDAsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTQsMjYyMTRdKSxjdD10dChbNDExMzYsMTg5NTgsNjk1MSw1MDQxNCw1ODQ4OCw0NDMzNSw2MTUwLDEyMDk5LDU1MjA3LDE1ODY3LDE1MywxMTA4NSw1NzA5OSwyMDQxNyw5MzQ0LDExMTM5XSksZHQ9bmV3IFVpbnQ4QXJyYXkoWzEwMSwxMjAsMTEyLDk3LDExMCwxMDAsMzIsNTEsNTAsNDUsOTgsMTIxLDExNiwxMDEsMzIsMTA3XSksbHQ9ZnVuY3Rpb24odCl7dGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTYpLHRoaXMucj1uZXcgVWludDE2QXJyYXkoMTApLHRoaXMuaD1uZXcgVWludDE2QXJyYXkoMTApLHRoaXMucGFkPW5ldyBVaW50MTZBcnJheSg4KSx0aGlzLmxlZnRvdmVyPTAsdGhpcy5maW49MDt2YXIgZSxyLG4saSxvLGEsZixzO2U9MjU1JnRbMF18KDI1NSZ0WzFdKTw8OCx0aGlzLnJbMF09ODE5MSZlLHI9MjU1JnRbMl18KDI1NSZ0WzNdKTw8OCx0aGlzLnJbMV09ODE5MSYoZT4+PjEzfHI8PDMpLG49MjU1JnRbNF18KDI1NSZ0WzVdKTw8OCx0aGlzLnJbMl09NzkzOSYocj4+PjEwfG48PDYpLGk9MjU1JnRbNl18KDI1NSZ0WzddKTw8OCx0aGlzLnJbM109ODE5MSYobj4+Pjd8aTw8OSksbz0yNTUmdFs4XXwoMjU1JnRbOV0pPDw4LHRoaXMucls0XT0yNTUmKGk+Pj40fG88PDEyKSx0aGlzLnJbNV09bz4+PjEmODE5MCxhPTI1NSZ0WzEwXXwoMjU1JnRbMTFdKTw8OCx0aGlzLnJbNl09ODE5MSYobz4+PjE0fGE8PDIpLGY9MjU1JnRbMTJdfCgyNTUmdFsxM10pPDw4LHRoaXMucls3XT04MDY1JihhPj4+MTF8Zjw8NSkscz0yNTUmdFsxNF18KDI1NSZ0WzE1XSk8PDgsdGhpcy5yWzhdPTgxOTEmKGY+Pj44fHM8PDgpLHRoaXMucls5XT1zPj4+NSYxMjcsdGhpcy5wYWRbMF09MjU1JnRbMTZdfCgyNTUmdFsxN10pPDw4LHRoaXMucGFkWzFdPTI1NSZ0WzE4XXwoMjU1JnRbMTldKTw8OCx0aGlzLnBhZFsyXT0yNTUmdFsyMF18KDI1NSZ0WzIxXSk8PDgsdGhpcy5wYWRbM109MjU1JnRbMjJdfCgyNTUmdFsyM10pPDw4LHRoaXMucGFkWzRdPTI1NSZ0WzI0XXwoMjU1JnRbMjVdKTw8OCx0aGlzLnBhZFs1XT0yNTUmdFsyNl18KDI1NSZ0WzI3XSk8PDgsdGhpcy5wYWRbNl09MjU1JnRbMjhdfCgyNTUmdFsyOV0pPDw4LHRoaXMucGFkWzddPTI1NSZ0WzMwXXwoMjU1JnRbMzFdKTw8OH07bHQucHJvdG90eXBlLmJsb2Nrcz1mdW5jdGlvbih0LGUscil7Zm9yKHZhciBuLGksbyxhLGYscyx1LGgsYyxkLGwscCxiLHYseSxtLGcsdyxfLE09dGhpcy5maW4/MDoyMDQ4LFM9dGhpcy5oWzBdLEU9dGhpcy5oWzFdLEE9dGhpcy5oWzJdLGs9dGhpcy5oWzNdLHg9dGhpcy5oWzRdLEk9dGhpcy5oWzVdLEI9dGhpcy5oWzZdLE89dGhpcy5oWzddLFI9dGhpcy5oWzhdLFA9dGhpcy5oWzldLFQ9dGhpcy5yWzBdLGo9dGhpcy5yWzFdLEM9dGhpcy5yWzJdLE49dGhpcy5yWzNdLEw9dGhpcy5yWzRdLFU9dGhpcy5yWzVdLHo9dGhpcy5yWzZdLEQ9dGhpcy5yWzddLHE9dGhpcy5yWzhdLEY9dGhpcy5yWzldO3I+PTE2OyluPTI1NSZ0W2UrMF18KDI1NSZ0W2UrMV0pPDw4LFMrPTgxOTEmbixpPTI1NSZ0W2UrMl18KDI1NSZ0W2UrM10pPDw4LEUrPTgxOTEmKG4+Pj4xM3xpPDwzKSxvPTI1NSZ0W2UrNF18KDI1NSZ0W2UrNV0pPDw4LEErPTgxOTEmKGk+Pj4xMHxvPDw2KSxhPTI1NSZ0W2UrNl18KDI1NSZ0W2UrN10pPDw4LGsrPTgxOTEmKG8+Pj43fGE8PDkpLGY9MjU1JnRbZSs4XXwoMjU1JnRbZSs5XSk8PDgseCs9ODE5MSYoYT4+PjR8Zjw8MTIpLEkrPWY+Pj4xJjgxOTEscz0yNTUmdFtlKzEwXXwoMjU1JnRbZSsxMV0pPDw4LEIrPTgxOTEmKGY+Pj4xNHxzPDwyKSx1PTI1NSZ0W2UrMTJdfCgyNTUmdFtlKzEzXSk8PDgsTys9ODE5MSYocz4+PjExfHU8PDUpLGg9MjU1JnRbZSsxNF18KDI1NSZ0W2UrMTVdKTw8OCxSKz04MTkxJih1Pj4+OHxoPDw4KSxQKz1oPj4+NXxNLGM9MCxkPWMsZCs9UypULGQrPUUqKDUqRiksZCs9QSooNSpxKSxkKz1rKig1KkQpLGQrPXgqKDUqeiksYz1kPj4+MTMsZCY9ODE5MSxkKz1JKig1KlUpLGQrPUIqKDUqTCksZCs9TyooNSpOKSxkKz1SKig1KkMpLGQrPVAqKDUqaiksYys9ZD4+PjEzLGQmPTgxOTEsbD1jLGwrPVMqaixsKz1FKlQsbCs9QSooNSpGKSxsKz1rKig1KnEpLGwrPXgqKDUqRCksYz1sPj4+MTMsbCY9ODE5MSxsKz1JKig1KnopLGwrPUIqKDUqVSksbCs9TyooNSpMKSxsKz1SKig1Kk4pLGwrPVAqKDUqQyksYys9bD4+PjEzLGwmPTgxOTEscD1jLHArPVMqQyxwKz1FKmoscCs9QSpULHArPWsqKDUqRikscCs9eCooNSpxKSxjPXA+Pj4xMyxwJj04MTkxLHArPUkqKDUqRCkscCs9QiooNSp6KSxwKz1PKig1KlUpLHArPVIqKDUqTCkscCs9UCooNSpOKSxjKz1wPj4+MTMscCY9ODE5MSxiPWMsYis9UypOLGIrPUUqQyxiKz1BKmosYis9aypULGIrPXgqKDUqRiksYz1iPj4+MTMsYiY9ODE5MSxiKz1JKig1KnEpLGIrPUIqKDUqRCksYis9TyooNSp6KSxiKz1SKig1KlUpLGIrPVAqKDUqTCksYys9Yj4+PjEzLGImPTgxOTEsdj1jLHYrPVMqTCx2Kz1FKk4sdis9QSpDLHYrPWsqaix2Kz14KlQsYz12Pj4+MTMsdiY9ODE5MSx2Kz1JKig1KkYpLHYrPUIqKDUqcSksdis9TyooNSpEKSx2Kz1SKig1KnopLHYrPVAqKDUqVSksYys9dj4+PjEzLHYmPTgxOTEseT1jLHkrPVMqVSx5Kz1FKkwseSs9QSpOLHkrPWsqQyx5Kz14KmosYz15Pj4+MTMseSY9ODE5MSx5Kz1JKlQseSs9QiooNSpGKSx5Kz1PKig1KnEpLHkrPVIqKDUqRCkseSs9UCooNSp6KSxjKz15Pj4+MTMseSY9ODE5MSxtPWMsbSs9Uyp6LG0rPUUqVSxtKz1BKkwsbSs9aypOLG0rPXgqQyxjPW0+Pj4xMyxtJj04MTkxLG0rPUkqaixtKz1CKlQsbSs9TyooNSpGKSxtKz1SKig1KnEpLG0rPVAqKDUqRCksYys9bT4+PjEzLG0mPTgxOTEsZz1jLGcrPVMqRCxnKz1FKnosZys9QSpVLGcrPWsqTCxnKz14Kk4sYz1nPj4+MTMsZyY9ODE5MSxnKz1JKkMsZys9QipqLGcrPU8qVCxnKz1SKig1KkYpLGcrPVAqKDUqcSksYys9Zz4+PjEzLGcmPTgxOTEsdz1jLHcrPVMqcSx3Kz1FKkQsdys9QSp6LHcrPWsqVSx3Kz14KkwsYz13Pj4+MTMsdyY9ODE5MSx3Kz1JKk4sdys9QipDLHcrPU8qaix3Kz1SKlQsdys9UCooNSpGKSxjKz13Pj4+MTMsdyY9ODE5MSxfPWMsXys9UypGLF8rPUUqcSxfKz1BKkQsXys9ayp6LF8rPXgqVSxjPV8+Pj4xMyxfJj04MTkxLF8rPUkqTCxfKz1CKk4sXys9TypDLF8rPVIqaixfKz1QKlQsYys9Xz4+PjEzLF8mPTgxOTEsYz0oYzw8MikrY3wwLGM9YytkfDAsZD04MTkxJmMsYz4+Pj0xMyxsKz1jLFM9ZCxFPWwsQT1wLGs9Yix4PXYsST15LEI9bSxPPWcsUj13LFA9XyxlKz0xNixyLT0xNjt0aGlzLmhbMF09Uyx0aGlzLmhbMV09RSx0aGlzLmhbMl09QSx0aGlzLmhbM109ayx0aGlzLmhbNF09eCx0aGlzLmhbNV09SSx0aGlzLmhbNl09Qix0aGlzLmhbN109Tyx0aGlzLmhbOF09Uix0aGlzLmhbOV09UH0sbHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxvLGE9bmV3IFVpbnQxNkFycmF5KDEwKTtpZih0aGlzLmxlZnRvdmVyKXtmb3Iobz10aGlzLmxlZnRvdmVyLHRoaXMuYnVmZmVyW28rK109MTtvPDE2O28rKyl0aGlzLmJ1ZmZlcltvXT0wO3RoaXMuZmluPTEsdGhpcy5ibG9ja3ModGhpcy5idWZmZXIsMCwxNil9Zm9yKHI9dGhpcy5oWzFdPj4+MTMsdGhpcy5oWzFdJj04MTkxLG89MjtvPDEwO28rKyl0aGlzLmhbb10rPXIscj10aGlzLmhbb10+Pj4xMyx0aGlzLmhbb10mPTgxOTE7Zm9yKHRoaXMuaFswXSs9NSpyLHI9dGhpcy5oWzBdPj4+MTMsdGhpcy5oWzBdJj04MTkxLHRoaXMuaFsxXSs9cixyPXRoaXMuaFsxXT4+PjEzLHRoaXMuaFsxXSY9ODE5MSx0aGlzLmhbMl0rPXIsYVswXT10aGlzLmhbMF0rNSxyPWFbMF0+Pj4xMyxhWzBdJj04MTkxLG89MTtvPDEwO28rKylhW29dPXRoaXMuaFtvXStyLHI9YVtvXT4+PjEzLGFbb10mPTgxOTE7Zm9yKGFbOV0tPTgxOTIsbj0oMV5yKS0xLG89MDtvPDEwO28rKylhW29dJj1uO2ZvcihuPX5uLG89MDtvPDEwO28rKyl0aGlzLmhbb109dGhpcy5oW29dJm58YVtvXTtmb3IodGhpcy5oWzBdPTY1NTM1Jih0aGlzLmhbMF18dGhpcy5oWzFdPDwxMyksdGhpcy5oWzFdPTY1NTM1Jih0aGlzLmhbMV0+Pj4zfHRoaXMuaFsyXTw8MTApLHRoaXMuaFsyXT02NTUzNSYodGhpcy5oWzJdPj4+Nnx0aGlzLmhbM108PDcpLHRoaXMuaFszXT02NTUzNSYodGhpcy5oWzNdPj4+OXx0aGlzLmhbNF08PDQpLHRoaXMuaFs0XT02NTUzNSYodGhpcy5oWzRdPj4+MTJ8dGhpcy5oWzVdPDwxfHRoaXMuaFs2XTw8MTQpLHRoaXMuaFs1XT02NTUzNSYodGhpcy5oWzZdPj4+Mnx0aGlzLmhbN108PDExKSx0aGlzLmhbNl09NjU1MzUmKHRoaXMuaFs3XT4+PjV8dGhpcy5oWzhdPDw4KSx0aGlzLmhbN109NjU1MzUmKHRoaXMuaFs4XT4+Pjh8dGhpcy5oWzldPDw1KSxpPXRoaXMuaFswXSt0aGlzLnBhZFswXSx0aGlzLmhbMF09NjU1MzUmaSxvPTE7bzw4O28rKylpPSh0aGlzLmhbb10rdGhpcy5wYWRbb118MCkrKGk+Pj4xNil8MCx0aGlzLmhbb109NjU1MzUmaTt0W2UrMF09dGhpcy5oWzBdPj4+MCYyNTUsdFtlKzFdPXRoaXMuaFswXT4+PjgmMjU1LHRbZSsyXT10aGlzLmhbMV0+Pj4wJjI1NSx0W2UrM109dGhpcy5oWzFdPj4+OCYyNTUsdFtlKzRdPXRoaXMuaFsyXT4+PjAmMjU1LHRbZSs1XT10aGlzLmhbMl0+Pj44JjI1NSx0W2UrNl09dGhpcy5oWzNdPj4+MCYyNTUsdFtlKzddPXRoaXMuaFszXT4+PjgmMjU1LHRbZSs4XT10aGlzLmhbNF0+Pj4wJjI1NSx0W2UrOV09dGhpcy5oWzRdPj4+OCYyNTUsdFtlKzEwXT10aGlzLmhbNV0+Pj4wJjI1NSx0W2UrMTFdPXRoaXMuaFs1XT4+PjgmMjU1LHRbZSsxMl09dGhpcy5oWzZdPj4+MCYyNTUsdFtlKzEzXT10aGlzLmhbNl0+Pj44JjI1NSx0W2UrMTRdPXRoaXMuaFs3XT4+PjAmMjU1LHRbZSsxNV09dGhpcy5oWzddPj4+OCYyNTV9LGx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGk7aWYodGhpcy5sZWZ0b3Zlcil7Zm9yKGk9MTYtdGhpcy5sZWZ0b3ZlcixpPnImJihpPXIpLG49MDtuPGk7bisrKXRoaXMuYnVmZmVyW3RoaXMubGVmdG92ZXIrbl09dFtlK25dO2lmKHItPWksZSs9aSx0aGlzLmxlZnRvdmVyKz1pLHRoaXMubGVmdG92ZXI8MTYpcmV0dXJuO3RoaXMuYmxvY2tzKHRoaXMuYnVmZmVyLDAsMTYpLHRoaXMubGVmdG92ZXI9MH1pZihyPj0xNiYmKGk9ci1yJTE2LHRoaXMuYmxvY2tzKHQsZSxpKSxlKz1pLHItPWkpLHIpe2ZvcihuPTA7bjxyO24rKyl0aGlzLmJ1ZmZlclt0aGlzLmxlZnRvdmVyK25dPXRbZStuXTt0aGlzLmxlZnRvdmVyKz1yfX07dmFyIHB0PXYsYnQ9eSx2dD1bMTExNjM1MjQwOCwzNjA5NzY3NDU4LDE4OTk0NDc0NDEsNjAyODkxNzI1LDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSwzOTIxMDA5NTczLDIxNzMyOTU1NDgsOTYxOTg3MTYzLDQwODE2Mjg0NzIsMTUwODk3MDk5MywzMDUzODM0MjY1LDI0NTM2MzU3NDgsMjkzNzY3MTU3OSwyODcwNzYzMjIxLDM2NjQ2MDk1NjAsMzYyNDM4MTA4MCwyNzM0ODgzMzk0LDMxMDU5ODQwMSwxMTY0OTk2NTQyLDYwNzIyNTI3OCwxMzIzNjEwNzY0LDE0MjY4ODE5ODcsMzU5MDMwNDk5NCwxOTI1MDc4Mzg4LDQwNjgxODIzODMsMjE2MjA3ODIwNiw5OTEzMzYxMTMsMjYxNDg4ODEwMyw2MzM4MDMzMTcsMzI0ODIyMjU4MCwzNDc5Nzc0ODY4LDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCw0MDIyMjI0Nzc0LDk0NDcxMTEzOSwyNjQzNDcwNzgsMjM0MTI2Mjc3Myw2MDQ4MDc2MjgsMjAwNzgwMDkzMyw3NzAyNTU5ODMsMTQ5NTk5MDkwMSwxMjQ5MTUwMTIyLDE4NTY0MzEyMzUsMTU1NTA4MTY5MiwzMTc1MjE4MTMyLDE5OTYwNjQ5ODYsMjE5ODk1MDgzNywyNTU0MjIwODgyLDM5OTk3MTkzMzksMjgyMTgzNDM0OSw3NjY3ODQwMTYsMjk1Mjk5NjgwOCwyNTY2NTk0ODc5LDMyMTAzMTM2NzEsMzIwMzMzNzk1NiwzMzM2NTcxODkxLDEwMzQ0NTcwMjYsMzU4NDUyODcxMSwyNDY2OTQ4OTAxLDExMzkyNjk5MywzNzU4MzI2MzgzLDMzODI0MTg5NSwxNjg3MTc5MzYsNjY2MzA3MjA1LDExODgxNzk5NjQsNzczNTI5OTEyLDE1NDYwNDU3MzQsMTI5NDc1NzM3MiwxNTIyODA1NDg1LDEzOTYxODIyOTEsMjY0MzgzMzgyMywxNjk1MTgzNzAwLDIzNDM1MjczOTAsMTk4NjY2MTA1MSwxMDE0NDc3NDgwLDIxNzcwMjYzNTAsMTIwNjc1OTE0MiwyNDU2OTU2MDM3LDM0NDA3NzYyNywyNzMwNDg1OTIxLDEyOTA4NjM0NjAsMjgyMDMwMjQxMSwzMTU4NDU0MjczLDMyNTk3MzA4MDAsMzUwNTk1MjY1NywzMzQ1NzY0NzcxLDEwNjIxNzAwOCwzNTE2MDY1ODE3LDM2MDYwMDgzNDQsMzYwMDM1MjgwNCwxNDMyNzI1Nzc2LDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCwyNzU0MjMzNDQsODUxMTY5NzIwLDQzMDIyNzczNCwzMTAwODIzNzUyLDUwNjk0ODYxNiwxMzYzMjU4MTk1LDY1OTA2MDU1NiwzNzUwNjg1NTkzLDg4Mzk5Nzg3NywzNzg1MDUwMjgwLDk1ODEzOTU3MSwzMzE4MzA3NDI3LDEzMjI4MjIyMTgsMzgxMjcyMzQwMywxNTM3MDAyMDYzLDIwMDMwMzQ5OTUsMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5LDE5NTU1NjIyMjIsMTU3NTk5MDAxMiwyMDI0MTA0ODE1LDExMjU1OTI5MjgsMjIyNzczMDQ1MiwyNzE2OTA0MzA2LDIzNjE4NTI0MjQsNDQyNzc2MDQ0LDI0Mjg0MzY0NzQsNTkzNjk4MzQ0LDI3NTY3MzQxODcsMzczMzExMDI0OSwzMjA0MDMxNDc5LDI5OTkzNTE1NzMsMzMyOTMyNTI5OCwzODE1OTIwNDI3LDMzOTE1Njk2MTQsMzkyODM4MzkwMCwzNTE1MjY3MjcxLDU2NjI4MDcxMSwzOTQwMTg3NjA2LDM0NTQwNjk1MzQsNDExODYzMDI3MSw0MDAwMjM5OTkyLDExNjQxODQ3NCwxOTE0MTM4NTU0LDE3NDI5MjQyMSwyNzMxMDU1MjcwLDI4OTM4MDM1NiwzMjAzOTkzMDA2LDQ2MDM5MzI2OSwzMjA2MjAzMTUsNjg1NDcxNzMzLDU4NzQ5NjgzNiw4NTIxNDI5NzEsMTA4Njc5Mjg1MSwxMDE3MDM2Mjk4LDM2NTU0MzEwMCwxMTI2MDAwNTgwLDI2MTgyOTc2NzYsMTI4ODAzMzQ3MCwzNDA5ODU1MTU4LDE1MDE1MDU5NDgsNDIzNDUwOTg2NiwxNjA3MTY3OTE1LDk4NzE2NzQ2OCwxODE2NDAyMzE2LDEyNDYxODk1OTFdLHl0PW5ldyBGbG9hdDY0QXJyYXkoWzIzNywyMTEsMjQ1LDkyLDI2LDk5LDE4LDg4LDIxNCwxNTYsMjQ3LDE2MiwyMjIsMjQ5LDIyMiwyMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNl0pLG10PTMyLGd0PTI0LHd0PTMyLF90PTE2LE10PTMyLFN0PTMyLEV0PTMyLEF0PTMyLGt0PTMyLHh0PWd0LEl0PXd0LEJ0PV90LE90PTY0LFJ0PTMyLFB0PTY0LFR0PTMyLGp0PTY0O3QubG93bGV2ZWw9e2NyeXB0b19jb3JlX2hzYWxzYTIwOnUsY3J5cHRvX3N0cmVhbV94b3I6bCxjcnlwdG9fc3RyZWFtOmQsY3J5cHRvX3N0cmVhbV9zYWxzYTIwX3hvcjpoLGNyeXB0b19zdHJlYW1fc2Fsc2EyMDpjLGNyeXB0b19vbmV0aW1lYXV0aDpwLGNyeXB0b19vbmV0aW1lYXV0aF92ZXJpZnk6YixjcnlwdG9fdmVyaWZ5XzE2OmksY3J5cHRvX3ZlcmlmeV8zMjpvLGNyeXB0b19zZWNyZXRib3g6dixjcnlwdG9fc2VjcmV0Ym94X29wZW46eSxjcnlwdG9fc2NhbGFybXVsdDpSLGNyeXB0b19zY2FsYXJtdWx0X2Jhc2U6UCxjcnlwdG9fYm94X2JlZm9yZW5tOmosY3J5cHRvX2JveF9hZnRlcm5tOnB0LGNyeXB0b19ib3g6QyxjcnlwdG9fYm94X29wZW46TixjcnlwdG9fYm94X2tleXBhaXI6VCxjcnlwdG9faGFzaDpVLGNyeXB0b19zaWduOlgsY3J5cHRvX3NpZ25fa2V5cGFpcjpHLGNyeXB0b19zaWduX29wZW46VyxjcnlwdG9fc2VjcmV0Ym94X0tFWUJZVEVTOm10LGNyeXB0b19zZWNyZXRib3hfTk9OQ0VCWVRFUzpndCxjcnlwdG9fc2VjcmV0Ym94X1pFUk9CWVRFUzp3dCxjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUzpfdCxjcnlwdG9fc2NhbGFybXVsdF9CWVRFUzpNdCxjcnlwdG9fc2NhbGFybXVsdF9TQ0FMQVJCWVRFUzpTdCxjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTOkV0LGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVM6QXQsY3J5cHRvX2JveF9CRUZPUkVOTUJZVEVTOmt0LGNyeXB0b19ib3hfTk9OQ0VCWVRFUzp4dCxjcnlwdG9fYm94X1pFUk9CWVRFUzpJdCxjcnlwdG9fYm94X0JPWFpFUk9CWVRFUzpCdCxjcnlwdG9fc2lnbl9CWVRFUzpPdCxjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFUzpSdCxjcnlwdG9fc2lnbl9TRUNSRVRLRVlCWVRFUzpQdCxjcnlwdG9fc2lnbl9TRUVEQllURVM6VHQsY3J5cHRvX2hhc2hfQllURVM6anR9LHQudXRpbHx8KHQudXRpbD17fSx0LnV0aWwuZGVjb2RlVVRGOD10LnV0aWwuZW5jb2RlVVRGOD10LnV0aWwuZW5jb2RlQmFzZTY0PXQudXRpbC5kZWNvZGVCYXNlNjQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJuYWNsLnV0aWwgbW92ZWQgaW50byBzZXBhcmF0ZSBwYWNrYWdlOiBodHRwczovL2dpdGh1Yi5jb20vZGNoZXN0L3R3ZWV0bmFjbC11dGlsLWpzXCIpfSksdC5yYW5kb21CeXRlcz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gZXQoZSx0KSxlfSx0LnNlY3JldGJveD1mdW5jdGlvbih0LGUscil7JCh0LGUsciksWihyLGUpO2Zvcih2YXIgbj1uZXcgVWludDhBcnJheSh3dCt0Lmxlbmd0aCksaT1uZXcgVWludDhBcnJheShuLmxlbmd0aCksbz0wO288dC5sZW5ndGg7bysrKW5bbyt3dF09dFtvXTtyZXR1cm4gdihpLG4sbi5sZW5ndGgsZSxyKSxpLnN1YmFycmF5KF90KX0sdC5zZWNyZXRib3gub3Blbj1mdW5jdGlvbih0LGUscil7JCh0LGUsciksWihyLGUpO2Zvcih2YXIgbj1uZXcgVWludDhBcnJheShfdCt0Lmxlbmd0aCksaT1uZXcgVWludDhBcnJheShuLmxlbmd0aCksbz0wO288dC5sZW5ndGg7bysrKW5bbytfdF09dFtvXTtyZXR1cm4hKG4ubGVuZ3RoPDMyKSYmKDA9PT15KGksbixuLmxlbmd0aCxlLHIpJiZpLnN1YmFycmF5KHd0KSl9LHQuc2VjcmV0Ym94LmtleUxlbmd0aD1tdCx0LnNlY3JldGJveC5ub25jZUxlbmd0aD1ndCx0LnNlY3JldGJveC5vdmVyaGVhZExlbmd0aD1fdCx0LnNjYWxhck11bHQ9ZnVuY3Rpb24odCxlKXtpZigkKHQsZSksdC5sZW5ndGghPT1TdCl0aHJvdyBuZXcgRXJyb3IoXCJiYWQgbiBzaXplXCIpO2lmKGUubGVuZ3RoIT09TXQpdGhyb3cgbmV3IEVycm9yKFwiYmFkIHAgc2l6ZVwiKTt2YXIgcj1uZXcgVWludDhBcnJheShNdCk7cmV0dXJuIFIocix0LGUpLHJ9LHQuc2NhbGFyTXVsdC5iYXNlPWZ1bmN0aW9uKHQpe2lmKCQodCksdC5sZW5ndGghPT1TdCl0aHJvdyBuZXcgRXJyb3IoXCJiYWQgbiBzaXplXCIpO3ZhciBlPW5ldyBVaW50OEFycmF5KE10KTtyZXR1cm4gUChlLHQpLGV9LHQuc2NhbGFyTXVsdC5zY2FsYXJMZW5ndGg9U3QsdC5zY2FsYXJNdWx0Lmdyb3VwRWxlbWVudExlbmd0aD1NdCx0LmJveD1mdW5jdGlvbihlLHIsbixpKXt2YXIgbz10LmJveC5iZWZvcmUobixpKTtyZXR1cm4gdC5zZWNyZXRib3goZSxyLG8pfSx0LmJveC5iZWZvcmU9ZnVuY3Rpb24odCxlKXskKHQsZSksSih0LGUpO3ZhciByPW5ldyBVaW50OEFycmF5KGt0KTtyZXR1cm4gaihyLHQsZSkscn0sdC5ib3guYWZ0ZXI9dC5zZWNyZXRib3gsdC5ib3gub3Blbj1mdW5jdGlvbihlLHIsbixpKXt2YXIgbz10LmJveC5iZWZvcmUobixpKTtyZXR1cm4gdC5zZWNyZXRib3gub3BlbihlLHIsbyl9LHQuYm94Lm9wZW4uYWZ0ZXI9dC5zZWNyZXRib3gub3Blbix0LmJveC5rZXlQYWlyPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoRXQpLGU9bmV3IFVpbnQ4QXJyYXkoQXQpO3JldHVybiBUKHQsZSkse3B1YmxpY0tleTp0LHNlY3JldEtleTplfX0sdC5ib3gua2V5UGFpci5mcm9tU2VjcmV0S2V5PWZ1bmN0aW9uKHQpe2lmKCQodCksdC5sZW5ndGghPT1BdCl0aHJvdyBuZXcgRXJyb3IoXCJiYWQgc2VjcmV0IGtleSBzaXplXCIpO3ZhciBlPW5ldyBVaW50OEFycmF5KEV0KTtyZXR1cm4gUChlLHQpLHtwdWJsaWNLZXk6ZSxzZWNyZXRLZXk6bmV3IFVpbnQ4QXJyYXkodCl9fSx0LmJveC5wdWJsaWNLZXlMZW5ndGg9RXQsdC5ib3guc2VjcmV0S2V5TGVuZ3RoPUF0LHQuYm94LnNoYXJlZEtleUxlbmd0aD1rdCx0LmJveC5ub25jZUxlbmd0aD14dCx0LmJveC5vdmVyaGVhZExlbmd0aD10LnNlY3JldGJveC5vdmVyaGVhZExlbmd0aCx0LnNpZ249ZnVuY3Rpb24odCxlKXtpZigkKHQsZSksZS5sZW5ndGghPT1QdCl0aHJvdyBuZXcgRXJyb3IoXCJiYWQgc2VjcmV0IGtleSBzaXplXCIpO3ZhciByPW5ldyBVaW50OEFycmF5KE90K3QubGVuZ3RoKTtyZXR1cm4gWChyLHQsdC5sZW5ndGgsZSkscn0sdC5zaWduLm9wZW49ZnVuY3Rpb24odCxlKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJuYWNsLnNpZ24ub3BlbiBhY2NlcHRzIDIgYXJndW1lbnRzOyBkaWQgeW91IG1lYW4gdG8gdXNlIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnk/XCIpO2lmKCQodCxlKSxlLmxlbmd0aCE9PVJ0KXRocm93IG5ldyBFcnJvcihcImJhZCBwdWJsaWMga2V5IHNpemVcIik7dmFyIHI9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpLG49VyhyLHQsdC5sZW5ndGgsZSk7aWYobjwwKXJldHVybiBudWxsO2Zvcih2YXIgaT1uZXcgVWludDhBcnJheShuKSxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXT1yW29dO3JldHVybiBpfSx0LnNpZ24uZGV0YWNoZWQ9ZnVuY3Rpb24oZSxyKXtmb3IodmFyIG49dC5zaWduKGUsciksaT1uZXcgVWludDhBcnJheShPdCksbz0wO288aS5sZW5ndGg7bysrKWlbb109bltvXTtyZXR1cm4gaX0sdC5zaWduLmRldGFjaGVkLnZlcmlmeT1mdW5jdGlvbih0LGUscil7aWYoJCh0LGUsciksZS5sZW5ndGghPT1PdCl0aHJvdyBuZXcgRXJyb3IoXCJiYWQgc2lnbmF0dXJlIHNpemVcIik7aWYoci5sZW5ndGghPT1SdCl0aHJvdyBuZXcgRXJyb3IoXCJiYWQgcHVibGljIGtleSBzaXplXCIpO3ZhciBuLGk9bmV3IFVpbnQ4QXJyYXkoT3QrdC5sZW5ndGgpLG89bmV3IFVpbnQ4QXJyYXkoT3QrdC5sZW5ndGgpO2ZvcihuPTA7bjxPdDtuKyspaVtuXT1lW25dO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspaVtuK090XT10W25dO3JldHVybiBXKG8saSxpLmxlbmd0aCxyKT49MH0sdC5zaWduLmtleVBhaXI9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgVWludDhBcnJheShSdCksZT1uZXcgVWludDhBcnJheShQdCk7cmV0dXJuIEcodCxlKSx7cHVibGljS2V5OnQsc2VjcmV0S2V5OmV9fSx0LnNpZ24ua2V5UGFpci5mcm9tU2VjcmV0S2V5PWZ1bmN0aW9uKHQpe2lmKCQodCksdC5sZW5ndGghPT1QdCl0aHJvdyBuZXcgRXJyb3IoXCJiYWQgc2VjcmV0IGtleSBzaXplXCIpO2Zvcih2YXIgZT1uZXcgVWludDhBcnJheShSdCkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09dFszMityXTtyZXR1cm57cHVibGljS2V5OmUsc2VjcmV0S2V5Om5ldyBVaW50OEFycmF5KHQpfX0sdC5zaWduLmtleVBhaXIuZnJvbVNlZWQ9ZnVuY3Rpb24odCl7aWYoJCh0KSx0Lmxlbmd0aCE9PVR0KXRocm93IG5ldyBFcnJvcihcImJhZCBzZWVkIHNpemVcIik7Zm9yKHZhciBlPW5ldyBVaW50OEFycmF5KFJ0KSxyPW5ldyBVaW50OEFycmF5KFB0KSxuPTA7bjwzMjtuKyspcltuXT10W25dO3JldHVybiBHKGUsciwhMCkse3B1YmxpY0tleTplLHNlY3JldEtleTpyfX0sdC5zaWduLnB1YmxpY0tleUxlbmd0aD1SdCx0LnNpZ24uc2VjcmV0S2V5TGVuZ3RoPVB0LHQuc2lnbi5zZWVkTGVuZ3RoPVR0LHQuc2lnbi5zaWduYXR1cmVMZW5ndGg9T3QsdC5oYXNoPWZ1bmN0aW9uKHQpeyQodCk7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoanQpO3JldHVybiBVKGUsdCx0Lmxlbmd0aCksZX0sdC5oYXNoLmhhc2hMZW5ndGg9anQsdC52ZXJpZnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0LGUpLDAhPT10Lmxlbmd0aCYmMCE9PWUubGVuZ3RoJiYodC5sZW5ndGg9PT1lLmxlbmd0aCYmMD09PW4odCwwLGUsMCx0Lmxlbmd0aCkpfSx0LnNldFBSTkc9ZnVuY3Rpb24odCl7ZXQ9dH0sZnVuY3Rpb24oKXt2YXIgZT1cInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmLmNyeXB0b3x8c2VsZi5tc0NyeXB0bzpudWxsO2lmKGUmJmUuZ2V0UmFuZG9tVmFsdWVzKXt2YXIgbj02NTUzNjt0LnNldFBSTkcoZnVuY3Rpb24odCxyKXt2YXIgaSxvPW5ldyBVaW50OEFycmF5KHIpO2ZvcihpPTA7aTxyO2krPW4pZS5nZXRSYW5kb21WYWx1ZXMoby5zdWJhcnJheShpLGkrTWF0aC5taW4oci1pLG4pKSk7Zm9yKGk9MDtpPHI7aSsrKXRbaV09b1tpXTtRKG8pfSl9ZWxzZSBlPXIoNjA4KSxlJiZlLnJhbmRvbUJ5dGVzJiZ0LnNldFBSTkcoZnVuY3Rpb24odCxyKXt2YXIgbixpPWUucmFuZG9tQnl0ZXMocik7Zm9yKG49MDtuPHI7bisrKXRbbl09aVtuXTtRKGkpfSl9KCl9KFwidW5kZWZpbmVkXCIhPXR5cGVvZiB0JiZ0LmV4cG9ydHM/dC5leHBvcnRzOnNlbGYubmFjbD1zZWxmLm5hY2x8fHt9KX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcih0KXt2YXIgZT10Lmxlbmd0aDtpZihlJTQ+MCl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0XCIpO3JldHVyblwiPVwiPT09dFtlLTJdPzI6XCI9XCI9PT10W2UtMV0/MTowfWZ1bmN0aW9uIG4odCl7cmV0dXJuIDMqdC5sZW5ndGgvNC1yKHQpfWZ1bmN0aW9uIGkodCl7dmFyIGUsbixpLG8sYSxmLHM9dC5sZW5ndGg7YT1yKHQpLGY9bmV3IGgoMypzLzQtYSksaT1hPjA/cy00OnM7dmFyIGM9MDtmb3IoZT0wLG49MDtlPGk7ZSs9NCxuKz0zKW89dVt0LmNoYXJDb2RlQXQoZSldPDwxOHx1W3QuY2hhckNvZGVBdChlKzEpXTw8MTJ8dVt0LmNoYXJDb2RlQXQoZSsyKV08PDZ8dVt0LmNoYXJDb2RlQXQoZSszKV0sZltjKytdPW8+PjE2JjI1NSxmW2MrK109bz4+OCYyNTUsZltjKytdPTI1NSZvO3JldHVybiAyPT09YT8obz11W3QuY2hhckNvZGVBdChlKV08PDJ8dVt0LmNoYXJDb2RlQXQoZSsxKV0+PjQsZltjKytdPTI1NSZvKToxPT09YSYmKG89dVt0LmNoYXJDb2RlQXQoZSldPDwxMHx1W3QuY2hhckNvZGVBdChlKzEpXTw8NHx1W3QuY2hhckNvZGVBdChlKzIpXT4+MixmW2MrK109bz4+OCYyNTUsZltjKytdPTI1NSZvKSxmfWZ1bmN0aW9uIG8odCl7cmV0dXJuIHNbdD4+MTgmNjNdK3NbdD4+MTImNjNdK3NbdD4+NiY2M10rc1s2MyZ0XX1mdW5jdGlvbiBhKHQsZSxyKXtmb3IodmFyIG4saT1bXSxhPWU7YTxyO2ErPTMpbj0odFthXTw8MTYpKyh0W2ErMV08PDgpK3RbYSsyXSxpLnB1c2gobyhuKSk7cmV0dXJuIGkuam9pbihcIlwiKX1mdW5jdGlvbiBmKHQpe2Zvcih2YXIgZSxyPXQubGVuZ3RoLG49ciUzLGk9XCJcIixvPVtdLGY9MTYzODMsdT0wLGg9ci1uO3U8aDt1Kz1mKW8ucHVzaChhKHQsdSx1K2Y+aD9oOnUrZikpO3JldHVybiAxPT09bj8oZT10W3ItMV0saSs9c1tlPj4yXSxpKz1zW2U8PDQmNjNdLGkrPVwiPT1cIik6Mj09PW4mJihlPSh0W3ItMl08PDgpK3Rbci0xXSxpKz1zW2U+PjEwXSxpKz1zW2U+PjQmNjNdLGkrPXNbZTw8MiY2M10saSs9XCI9XCIpLG8ucHVzaChpKSxvLmpvaW4oXCJcIil9ZS5ieXRlTGVuZ3RoPW4sZS50b0J5dGVBcnJheT1pLGUuZnJvbUJ5dGVBcnJheT1mO2Zvcih2YXIgcz1bXSx1PVtdLGg9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxjPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiLGQ9MCxsPWMubGVuZ3RoO2Q8bDsrK2Qpc1tkXT1jW2RdLHVbYy5jaGFyQ29kZUF0KGQpXT1kO3VbXCItXCIuY2hhckNvZGVBdCgwKV09NjIsdVtcIl9cIi5jaGFyQ29kZUF0KDApXT02M30sZnVuY3Rpb24odCxlKXtlLnJlYWQ9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgbyxhLGY9OCppLW4tMSxzPSgxPDxmKS0xLHU9cz4+MSxoPS03LGM9cj9pLTE6MCxkPXI/LTE6MSxsPXRbZStjXTtmb3IoYys9ZCxvPWwmKDE8PC1oKS0xLGw+Pj0taCxoKz1mO2g+MDtvPTI1NipvK3RbZStjXSxjKz1kLGgtPTgpO2ZvcihhPW8mKDE8PC1oKS0xLG8+Pj0taCxoKz1uO2g+MDthPTI1NiphK3RbZStjXSxjKz1kLGgtPTgpO2lmKDA9PT1vKW89MS11O2Vsc2V7aWYobz09PXMpcmV0dXJuIGE/TmFOOihsPy0xOjEpKigxLzApO2ErPU1hdGgucG93KDIsbiksby09dX1yZXR1cm4obD8tMToxKSphKk1hdGgucG93KDIsby1uKX0sZS53cml0ZT1mdW5jdGlvbih0LGUscixuLGksbyl7dmFyIGEsZixzLHU9OCpvLWktMSxoPSgxPDx1KS0xLGM9aD4+MSxkPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsbD1uPzA6by0xLHA9bj8xOi0xLGI9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhmPWlzTmFOKGUpPzE6MCxhPWgpOihhPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHM9TWF0aC5wb3coMiwtYSkpPDEmJihhLS0scyo9MiksZSs9YStjPj0xP2QvczpkKk1hdGgucG93KDIsMS1jKSxlKnM+PTImJihhKysscy89MiksYStjPj1oPyhmPTAsYT1oKTphK2M+PTE/KGY9KGUqcy0xKSpNYXRoLnBvdygyLGkpLGErPWMpOihmPWUqTWF0aC5wb3coMixjLTEpKk1hdGgucG93KDIsaSksYT0wKSk7aT49ODt0W3IrbF09MjU1JmYsbCs9cCxmLz0yNTYsaS09OCk7Zm9yKGE9YTw8aXxmLHUrPWk7dT4wO3RbcitsXT0yNTUmYSxsKz1wLGEvPTI1Nix1LT04KTt0W3IrbC1wXXw9MTI4KmJ9fSxmdW5jdGlvbih0LGUpe3ZhciByPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm5cIltvYmplY3QgQXJyYXldXCI9PXIuY2FsbCh0KX19LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHIsbjtpZih0PXQudG9Mb3dlckNhc2UoKSxkW3RdKXI9ZFt0XS5rZXksbj1kW3RdLml2O2Vsc2V7aWYoIWNbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgc3VpdGUgdHlwZVwiKTtyPTgqY1t0XS5rZXksbj1jW3RdLml2fXZhciBpPXMoZSwhMSxyLG4pO3JldHVybiBvKHQsaS5rZXksaS5pdil9ZnVuY3Rpb24gaSh0LGUpe3ZhciByLG47aWYodD10LnRvTG93ZXJDYXNlKCksZFt0XSlyPWRbdF0ua2V5LG49ZFt0XS5pdjtlbHNle2lmKCFjW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIHN1aXRlIHR5cGVcIik7cj04KmNbdF0ua2V5LG49Y1t0XS5pdn12YXIgaT1zKGUsITEscixuKTtyZXR1cm4gYSh0LGkua2V5LGkuaXYpfWZ1bmN0aW9uIG8odCxlLHIpe2lmKHQ9dC50b0xvd2VyQ2FzZSgpLGRbdF0pcmV0dXJuIHUuY3JlYXRlQ2lwaGVyaXYodCxlLHIpO2lmKGNbdF0pcmV0dXJuIG5ldyBoKHtrZXk6ZSxpdjpyLG1vZGU6dH0pO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIHN1aXRlIHR5cGVcIil9ZnVuY3Rpb24gYSh0LGUscil7aWYodD10LnRvTG93ZXJDYXNlKCksZFt0XSlyZXR1cm4gdS5jcmVhdGVEZWNpcGhlcml2KHQsZSxyKTtpZihjW3RdKXJldHVybiBuZXcgaCh7a2V5OmUsaXY6cixtb2RlOnQsZGVjcnlwdDohMH0pO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIHN1aXRlIHR5cGVcIil9ZnVuY3Rpb24gZigpe3JldHVybiBPYmplY3Qua2V5cyhjKS5jb25jYXQodS5nZXRDaXBoZXJzKCkpfXZhciBzPXIoMTQ2KSx1PXIoNDk0KSxoPXIoNDk4KSxjPXIoNDk5KSxkPXIoOTUpO2UuY3JlYXRlQ2lwaGVyPWUuQ2lwaGVyPW4sZS5jcmVhdGVDaXBoZXJpdj1lLkNpcGhlcml2PW8sZS5jcmVhdGVEZWNpcGhlcj1lLkRlY2lwaGVyPWksZS5jcmVhdGVEZWNpcGhlcml2PWUuRGVjaXBoZXJpdj1hLGUubGlzdENpcGhlcnM9ZS5nZXRDaXBoZXJzPWZ9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKCl7cmV0dXJuIE9iamVjdC5rZXlzKGEpfXZhciBpPXIoNDk2KTtlLmNyZWF0ZUNpcGhlcj1lLkNpcGhlcj1pLmNyZWF0ZUNpcGhlcixlLmNyZWF0ZUNpcGhlcml2PWUuQ2lwaGVyaXY9aS5jcmVhdGVDaXBoZXJpdjt2YXIgbz1yKDQ5NSk7ZS5jcmVhdGVEZWNpcGhlcj1lLkRlY2lwaGVyPW8uY3JlYXRlRGVjaXBoZXIsZS5jcmVhdGVEZWNpcGhlcml2PWUuRGVjaXBoZXJpdj1vLmNyZWF0ZURlY2lwaGVyaXY7dmFyIGE9cig5NSk7ZS5saXN0Q2lwaGVycz1lLmdldENpcGhlcnM9bn0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUscixvKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG4/KHUuY2FsbCh0aGlzKSx0aGlzLl9jYWNoZT1uZXcgaSx0aGlzLl9sYXN0PXZvaWQgMCx0aGlzLl9jaXBoZXI9bmV3IHMuQUVTKHIpLHRoaXMuX3ByZXY9bmV3IHQoby5sZW5ndGgpLG8uY29weSh0aGlzLl9wcmV2KSx0aGlzLl9tb2RlPWUsdm9pZCh0aGlzLl9hdXRvcGFkZGluZz0hMCkpOm5ldyBuKGUscixvKX1mdW5jdGlvbiBpKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBpP3ZvaWQodGhpcy5jYWNoZT1uZXcgdChcIlwiKSk6bmV3IGl9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGU9dFsxNV0scj0tMTsrK3I8ZTspaWYodFtyKygxNi1lKV0hPT1lKXRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBkZWNyeXB0IGRhdGFcIik7aWYoMTYhPT1lKXJldHVybiB0LnNsaWNlKDAsMTYtZSl9ZnVuY3Rpb24gYShlLHIsaSl7dmFyIG89Y1tlLnRvTG93ZXJDYXNlKCldO2lmKCFvKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIHN1aXRlIHR5cGVcIik7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPW5ldyB0KGkpKSxcInN0cmluZ1wiPT10eXBlb2YgciYmKHI9bmV3IHQocikpLHIubGVuZ3RoIT09by5rZXkvOCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBrZXkgbGVuZ3RoIFwiK3IubGVuZ3RoKTtpZihpLmxlbmd0aCE9PW8uaXYpdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgaXYgbGVuZ3RoIFwiK2kubGVuZ3RoKTtyZXR1cm5cInN0cmVhbVwiPT09by50eXBlP25ldyBkKGJbby5tb2RlXSxyLGksITApOlwiYXV0aFwiPT09by50eXBlP25ldyBsKGJbby5tb2RlXSxyLGksITApOm5ldyBuKGJbby5tb2RlXSxyLGkpfWZ1bmN0aW9uIGYodCxlKXt2YXIgcj1jW3QudG9Mb3dlckNhc2UoKV07aWYoIXIpdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgc3VpdGUgdHlwZVwiKTt2YXIgbj1wKGUsITEsci5rZXksci5pdik7cmV0dXJuIGEodCxuLmtleSxuLml2KX12YXIgcz1yKDk0KSx1PXIoOTcpLGg9cigyKSxjPXIoOTUpLGQ9cigyMTApLGw9cigyMDMpLHA9cigxNDYpO2gobix1KSxuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuX2NhY2hlLmFkZChlKTtmb3IodmFyIHIsbixpPVtdO3I9dGhpcy5fY2FjaGUuZ2V0KHRoaXMuX2F1dG9wYWRkaW5nKTspbj10aGlzLl9tb2RlLmRlY3J5cHQodGhpcyxyKSxpLnB1c2gobik7cmV0dXJuIHQuY29uY2F0KGkpfSxuLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jYWNoZS5mbHVzaCgpO2lmKHRoaXMuX2F1dG9wYWRkaW5nKXJldHVybiBvKHRoaXMuX21vZGUuZGVjcnlwdCh0aGlzLHQpKTtpZih0KXRocm93IG5ldyBFcnJvcihcImRhdGEgbm90IG11bHRpcGxlIG9mIGJsb2NrIGxlbmd0aFwiKX0sbi5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2F1dG9wYWRkaW5nPSEhdCx0aGlzfSxpLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5jYWNoZT10LmNvbmNhdChbdGhpcy5jYWNoZSxlXSl9LGkucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZTtpZih0KXtpZih0aGlzLmNhY2hlLmxlbmd0aD4xNilyZXR1cm4gZT10aGlzLmNhY2hlLnNsaWNlKDAsMTYpLHRoaXMuY2FjaGU9dGhpcy5jYWNoZS5zbGljZSgxNiksZX1lbHNlIGlmKHRoaXMuY2FjaGUubGVuZ3RoPj0xNilyZXR1cm4gZT10aGlzLmNhY2hlLnNsaWNlKDAsMTYpLHRoaXMuY2FjaGU9dGhpcy5jYWNoZS5zbGljZSgxNiksZTtyZXR1cm4gbnVsbH0saS5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtpZih0aGlzLmNhY2hlLmxlbmd0aClyZXR1cm4gdGhpcy5jYWNoZX07dmFyIGI9e0VDQjpyKDIwOCksQ0JDOnIoMjA0KSxDRkI6cigyMDUpLENGQjg6cigyMDcpLENGQjE6cigyMDYpLE9GQjpyKDIwOSksQ1RSOnIoOTYpLEdDTTpyKDk2KX07ZS5jcmVhdGVEZWNpcGhlcj1mLGUuY3JlYXRlRGVjaXBoZXJpdj1hfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUscixvKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG4/KHMuY2FsbCh0aGlzKSx0aGlzLl9jYWNoZT1uZXcgaSx0aGlzLl9jaXBoZXI9bmV3IGYuQUVTKHIpLHRoaXMuX3ByZXY9bmV3IHQoby5sZW5ndGgpLG8uY29weSh0aGlzLl9wcmV2KSx0aGlzLl9tb2RlPWUsdm9pZCh0aGlzLl9hdXRvcGFkZGluZz0hMCkpOm5ldyBuKGUscixvKX1mdW5jdGlvbiBpKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBpP3ZvaWQodGhpcy5jYWNoZT1uZXcgdChcIlwiKSk6bmV3IGl9ZnVuY3Rpb24gbyhlLHIsaSl7dmFyIG89aFtlLnRvTG93ZXJDYXNlKCldO2lmKCFvKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIHN1aXRlIHR5cGVcIik7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPW5ldyB0KGkpKSxcInN0cmluZ1wiPT10eXBlb2YgciYmKHI9bmV3IHQocikpLHIubGVuZ3RoIT09by5rZXkvOCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBrZXkgbGVuZ3RoIFwiK3IubGVuZ3RoKTtpZihpLmxlbmd0aCE9PW8uaXYpdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgaXYgbGVuZ3RoIFwiK2kubGVuZ3RoKTtyZXR1cm5cInN0cmVhbVwiPT09by50eXBlP25ldyBkKHBbby5tb2RlXSxyLGkpOlwiYXV0aFwiPT09by50eXBlP25ldyBsKHBbby5tb2RlXSxyLGkpOm5ldyBuKHBbby5tb2RlXSxyLGkpfWZ1bmN0aW9uIGEodCxlKXt2YXIgcj1oW3QudG9Mb3dlckNhc2UoKV07aWYoIXIpdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgc3VpdGUgdHlwZVwiKTt2YXIgbj1jKGUsITEsci5rZXksci5pdik7cmV0dXJuIG8odCxuLmtleSxuLml2KX12YXIgZj1yKDk0KSxzPXIoOTcpLHU9cigyKSxoPXIoOTUpLGM9cigxNDYpLGQ9cigyMTApLGw9cigyMDMpO3UobixzKSxuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuX2NhY2hlLmFkZChlKTtmb3IodmFyIHIsbixpPVtdO3I9dGhpcy5fY2FjaGUuZ2V0KCk7KW49dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsciksaS5wdXNoKG4pO3JldHVybiB0LmNvbmNhdChpKX0sbi5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY2FjaGUuZmx1c2goKTtpZih0aGlzLl9hdXRvcGFkZGluZylyZXR1cm4gdD10aGlzLl9tb2RlLmVuY3J5cHQodGhpcyx0KSx0aGlzLl9jaXBoZXIuc2NydWIoKSx0O2lmKFwiMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTBcIiE9PXQudG9TdHJpbmcoXCJoZXhcIikpdGhyb3cgdGhpcy5fY2lwaGVyLnNjcnViKCksbmV3IEVycm9yKFwiZGF0YSBub3QgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoXCIpfSxuLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXV0b3BhZGRpbmc9ISF0LHRoaXN9LGkucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLmNhY2hlPXQuY29uY2F0KFt0aGlzLmNhY2hlLGVdKX0saS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZS5sZW5ndGg+MTUpe3ZhciB0PXRoaXMuY2FjaGUuc2xpY2UoMCwxNik7cmV0dXJuIHRoaXMuY2FjaGU9dGhpcy5jYWNoZS5zbGljZSgxNiksdH1yZXR1cm4gbnVsbH0saS5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MTYtdGhpcy5jYWNoZS5sZW5ndGgscj1uZXcgdChlKSxuPS0xOysrbjxlOylyLndyaXRlVUludDgoZSxuKTt2YXIgaT10LmNvbmNhdChbdGhpcy5jYWNoZSxyXSk7cmV0dXJuIGl9O3ZhciBwPXtFQ0I6cigyMDgpLENCQzpyKDIwNCksQ0ZCOnIoMjA1KSxDRkI4OnIoMjA3KSxDRkIxOnIoMjA2KSxPRkI6cigyMDkpLENUUjpyKDk2KSxHQ006cig5Nil9O2UuY3JlYXRlQ2lwaGVyaXY9byxlLmNyZWF0ZUNpcGhlcj1hfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe3RoaXMuaD10LHRoaXMuc3RhdGU9bmV3IGUoMTYpLHRoaXMuc3RhdGUuZmlsbCgwKSx0aGlzLmNhY2hlPW5ldyBlKFwiXCIpfWZ1bmN0aW9uIG4odCl7cmV0dXJuW3QucmVhZFVJbnQzMkJFKDApLHQucmVhZFVJbnQzMkJFKDQpLHQucmVhZFVJbnQzMkJFKDgpLHQucmVhZFVJbnQzMkJFKDEyKV19ZnVuY3Rpb24gaSh0KXt0PXQubWFwKG8pO3ZhciByPW5ldyBlKDE2KTtyZXR1cm4gci53cml0ZVVJbnQzMkJFKHRbMF0sMCksci53cml0ZVVJbnQzMkJFKHRbMV0sNCksci53cml0ZVVJbnQzMkJFKHRbMl0sOCksci53cml0ZVVJbnQzMkJFKHRbM10sMTIpLHJ9ZnVuY3Rpb24gbyh0KXt2YXIgZSxyO3JldHVybiBlPXQ+c3x8dDwwPyhyPU1hdGguYWJzKHQpJXMsdDwwP3MtcjpyKTp0fWZ1bmN0aW9uIGEodCxlKXtyZXR1cm5bdFswXV5lWzBdLHRbMV1eZVsxXSx0WzJdXmVbMl0sdFszXV5lWzNdXX12YXIgZj1uZXcgZSgxNik7Zi5maWxsKDApLHQuZXhwb3J0cz1yLHIucHJvdG90eXBlLmdoYXNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMTsrK2U8dC5sZW5ndGg7KXRoaXMuc3RhdGVbZV1ePXRbZV07dGhpcy5fbXVsdGlwbHkoKX0sci5wcm90b3R5cGUuX211bHRpcGx5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUscixvPW4odGhpcy5oKSxmPVswLDAsMCwwXSxzPS0xOysrczwxMjg7KXtmb3IoZT0wIT09KHRoaXMuc3RhdGVbfn4ocy84KV0mMTw8Ny1zJTgpLGUmJihmPWEoZixvKSkscj0wIT09KDEmb1szXSksdD0zO3Q+MDt0LS0pb1t0XT1vW3RdPj4+MXwoMSZvW3QtMV0pPDwzMTtvWzBdPW9bMF0+Pj4xLHImJihvWzBdPW9bMF1eMjI1PDwyNCl9dGhpcy5zdGF0ZT1pKGYpfSxyLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5jYWNoZT1lLmNvbmNhdChbdGhpcy5jYWNoZSx0XSk7Zm9yKHZhciByO3RoaXMuY2FjaGUubGVuZ3RoPj0xNjspcj10aGlzLmNhY2hlLnNsaWNlKDAsMTYpLHRoaXMuY2FjaGU9dGhpcy5jYWNoZS5zbGljZSgxNiksdGhpcy5naGFzaChyKX0sci5wcm90b3R5cGUuZmluYWw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy5jYWNoZS5sZW5ndGgmJnRoaXMuZ2hhc2goZS5jb25jYXQoW3RoaXMuY2FjaGUsZl0sMTYpKSx0aGlzLmdoYXNoKGkoWzAsdCwwLHJdKSksdGhpcy5zdGF0ZX07dmFyIHM9TWF0aC5wb3coMiwzMil9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7aS5jYWxsKHRoaXMpO3ZhciByLG49dC5tb2RlLnRvTG93ZXJDYXNlKCksbz1mW25dO3I9dC5kZWNyeXB0P1wiZGVjcnlwdFwiOlwiZW5jcnlwdFwiO3ZhciBhPXQua2V5O1wiZGVzLWVkZVwiIT09biYmXCJkZXMtZWRlLWNiY1wiIT09bnx8KGE9ZS5jb25jYXQoW2EsYS5zbGljZSgwLDgpXSkpO3ZhciBzPXQuaXY7dGhpcy5fZGVzPW8uY3JlYXRlKHtrZXk6YSxpdjpzLHR5cGU6cn0pfXZhciBpPXIoNTAwKSxvPXIoMTQ1KSxhPXIoMiksZj17XCJkZXMtZWRlMy1jYmNcIjpvLkNCQy5pbnN0YW50aWF0ZShvLkVERSksXCJkZXMtZWRlM1wiOm8uRURFLFwiZGVzLWVkZS1jYmNcIjpvLkNCQy5pbnN0YW50aWF0ZShvLkVERSksXCJkZXMtZWRlXCI6by5FREUsXCJkZXMtY2JjXCI6by5DQkMuaW5zdGFudGlhdGUoby5ERVMpLFwiZGVzLWVjYlwiOm8uREVTfTtmLmRlcz1mW1wiZGVzLWNiY1wiXSxmLmRlczM9ZltcImRlcy1lZGUzLWNiY1wiXSx0LmV4cG9ydHM9bixhKG4saSksbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy5fZGVzLnVwZGF0ZSh0KSl9LG4ucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9kZXMuZmluYWwoKSl9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXtlW1wiZGVzLWVjYlwiXT17a2V5OjgsaXY6MH0sZVtcImRlcy1jYmNcIl09ZS5kZXM9e2tleTo4LGl2Ojh9LGVbXCJkZXMtZWRlMy1jYmNcIl09ZS5kZXMzPXtrZXk6MjQsaXY6OH0sZVtcImRlcy1lZGUzXCJdPXtrZXk6MjQsaXY6MH0sZVtcImRlcy1lZGUtY2JjXCJdPXtrZXk6MTYsaXY6OH0sZVtcImRlcy1lZGVcIl09e2tleToxNixpdjowfX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe2kuY2FsbCh0aGlzKSx0aGlzLmhhc2hNb2RlPVwic3RyaW5nXCI9PXR5cGVvZiB0LHRoaXMuaGFzaE1vZGU/dGhpc1t0XT10aGlzLl9maW5hbE9yRGlnZXN0OnRoaXMuZmluYWw9dGhpcy5fZmluYWxPckRpZ2VzdCx0aGlzLl9kZWNvZGVyPW51bGwsdGhpcy5fZW5jb2Rpbmc9bnVsbH12YXIgaT1yKDMxKS5UcmFuc2Zvcm0sbz1yKDIpLGE9cig1MikuU3RyaW5nRGVjb2Rlcjt0LmV4cG9ydHM9bixvKG4saSksbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQscixuKXtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9bmV3IGUodCxyKSk7dmFyIGk9dGhpcy5fdXBkYXRlKHQpO3JldHVybiB0aGlzLmhhc2hNb2RlP3RoaXM6KG4mJihpPXRoaXMuX3RvU3RyaW5nKGksbikpLGkpfSxuLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZz1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUuZ2V0QXV0aFRhZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcInRyeWluZyB0byBnZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGVcIil9LG4ucHJvdG90eXBlLnNldEF1dGhUYWc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpfSxuLnByb3RvdHlwZS5zZXRBQUQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gc2V0IGFhZCBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKX0sbi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dmFyIG47dHJ5e3RoaXMuaGFzaE1vZGU/dGhpcy5fdXBkYXRlKHQpOnRoaXMucHVzaCh0aGlzLl91cGRhdGUodCkpfWNhdGNoKHQpe249dH1maW5hbGx5e3Iobil9fSxuLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24odCl7dmFyIGU7dHJ5e3RoaXMucHVzaCh0aGlzLl9maW5hbCgpKX1jYXRjaCh0KXtlPXR9ZmluYWxseXt0KGUpfX0sbi5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3Q9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fZmluYWwoKXx8bmV3IGUoXCJcIik7cmV0dXJuIHQmJihyPXRoaXMuX3RvU3RyaW5nKHIsdCwhMCkpLHJ9LG4ucHJvdG90eXBlLl90b1N0cmluZz1mdW5jdGlvbih0LGUscil7aWYodGhpcy5fZGVjb2Rlcnx8KHRoaXMuX2RlY29kZXI9bmV3IGEoZSksdGhpcy5fZW5jb2Rpbmc9ZSksdGhpcy5fZW5jb2RpbmchPT1lKXRocm93IG5ldyBFcnJvcihcImNhbid0IHN3aXRjaCBlbmNvZGluZ3NcIik7dmFyIG49dGhpcy5fZGVjb2Rlci53cml0ZSh0KTtyZXR1cm4gciYmKG4rPXRoaXMuX2RlY29kZXIuZW5kKCkpLG59fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCl7by5lcXVhbCh0Lmxlbmd0aCw4LFwiSW52YWxpZCBJViBsZW5ndGhcIiksdGhpcy5pdj1uZXcgQXJyYXkoOCk7Zm9yKHZhciBlPTA7ZTx0aGlzLml2Lmxlbmd0aDtlKyspdGhpcy5pdltlXT10W2VdfWZ1bmN0aW9uIGkodCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKSx0aGlzLl9jYmNJbml0KCl9YShlLHQpO2Zvcih2YXIgcj1PYmplY3Qua2V5cyhmKSxuPTA7bjxyLmxlbmd0aDtuKyspe3ZhciBpPXJbbl07ZS5wcm90b3R5cGVbaV09ZltpXX1yZXR1cm4gZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlfXZhciBvPXIoOTgpLGE9cigyKSxmPXt9O2UuaW5zdGFudGlhdGU9aSxmLl9jYmNJbml0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4odGhpcy5vcHRpb25zLml2KTt0aGlzLl9jYmNTdGF0ZT10fSxmLl91cGRhdGU9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9dGhpcy5fY2JjU3RhdGUsbz10aGlzLmNvbnN0cnVjdG9yLnN1cGVyXy5wcm90b3R5cGUsYT1pLml2O2lmKFwiZW5jcnlwdFwiPT09dGhpcy50eXBlKXtmb3IodmFyIGY9MDtmPHRoaXMuYmxvY2tTaXplO2YrKylhW2ZdXj10W2UrZl07by5fdXBkYXRlLmNhbGwodGhpcyxhLDAscixuKTtmb3IodmFyIGY9MDtmPHRoaXMuYmxvY2tTaXplO2YrKylhW2ZdPXJbbitmXX1lbHNle28uX3VwZGF0ZS5jYWxsKHRoaXMsdCxlLHIsbik7Zm9yKHZhciBmPTA7Zjx0aGlzLmJsb2NrU2l6ZTtmKyspcltuK2ZdXj1hW2ZdO2Zvcih2YXIgZj0wO2Y8dGhpcy5ibG9ja1NpemU7ZisrKWFbZl09dFtlK2ZdfX19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQpe3RoaXMub3B0aW9ucz10LHRoaXMudHlwZT10aGlzLm9wdGlvbnMudHlwZSx0aGlzLmJsb2NrU2l6ZT04LHRoaXMuX2luaXQoKSx0aGlzLmJ1ZmZlcj1uZXcgQXJyYXkodGhpcy5ibG9ja1NpemUpLHRoaXMuYnVmZmVyT2ZmPTB9dmFyIGk9cig5OCk7dC5leHBvcnRzPW4sbi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt9LG4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQubGVuZ3RoP1tdOlwiZGVjcnlwdFwiPT09dGhpcy50eXBlP3RoaXMuX3VwZGF0ZURlY3J5cHQodCk6dGhpcy5fdXBkYXRlRW5jcnlwdCh0KX0sbi5wcm90b3R5cGUuX2J1ZmZlcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1NYXRoLm1pbih0aGlzLmJ1ZmZlci5sZW5ndGgtdGhpcy5idWZmZXJPZmYsdC5sZW5ndGgtZSksbj0wO248cjtuKyspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmYrbl09dFtlK25dO3JldHVybiB0aGlzLmJ1ZmZlck9mZis9cixyfSxuLnByb3RvdHlwZS5fZmx1c2hCdWZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdXBkYXRlKHRoaXMuYnVmZmVyLDAsdCxlKSx0aGlzLmJ1ZmZlck9mZj0wLHRoaXMuYmxvY2tTaXplfSxuLnByb3RvdHlwZS5fdXBkYXRlRW5jcnlwdD1mdW5jdGlvbih0KXt2YXIgZT0wLHI9MCxuPSh0aGlzLmJ1ZmZlck9mZit0Lmxlbmd0aCkvdGhpcy5ibG9ja1NpemV8MCxpPW5ldyBBcnJheShuKnRoaXMuYmxvY2tTaXplKTswIT09dGhpcy5idWZmZXJPZmYmJihlKz10aGlzLl9idWZmZXIodCxlKSx0aGlzLmJ1ZmZlck9mZj09PXRoaXMuYnVmZmVyLmxlbmd0aCYmKHIrPXRoaXMuX2ZsdXNoQnVmZmVyKGkscikpKTtmb3IodmFyIG89dC5sZW5ndGgtKHQubGVuZ3RoLWUpJXRoaXMuYmxvY2tTaXplO2U8bztlKz10aGlzLmJsb2NrU2l6ZSl0aGlzLl91cGRhdGUodCxlLGkscikscis9dGhpcy5ibG9ja1NpemU7Zm9yKDtlPHQubGVuZ3RoO2UrKyx0aGlzLmJ1ZmZlck9mZisrKXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2ZmXT10W2VdO3JldHVybiBpfSxuLnByb3RvdHlwZS5fdXBkYXRlRGVjcnlwdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPTAsbj1NYXRoLmNlaWwoKHRoaXMuYnVmZmVyT2ZmK3QubGVuZ3RoKS90aGlzLmJsb2NrU2l6ZSktMSxpPW5ldyBBcnJheShuKnRoaXMuYmxvY2tTaXplKTtuPjA7bi0tKWUrPXRoaXMuX2J1ZmZlcih0LGUpLHIrPXRoaXMuX2ZsdXNoQnVmZmVyKGkscik7cmV0dXJuIGUrPXRoaXMuX2J1ZmZlcih0LGUpLGl9LG4ucHJvdG90eXBlLmZpbmFsPWZ1bmN0aW9uKHQpe3ZhciBlO3QmJihlPXRoaXMudXBkYXRlKHQpKTt2YXIgcjtyZXR1cm4gcj1cImVuY3J5cHRcIj09PXRoaXMudHlwZT90aGlzLl9maW5hbEVuY3J5cHQoKTp0aGlzLl9maW5hbERlY3J5cHQoKSxlP2UuY29uY2F0KHIpOnJ9LG4ucHJvdG90eXBlLl9wYWQ9ZnVuY3Rpb24odCxlKXtpZigwPT09ZSlyZXR1cm4hMTtmb3IoO2U8dC5sZW5ndGg7KXRbZSsrXT0wO3JldHVybiEwfSxuLnByb3RvdHlwZS5fZmluYWxFbmNyeXB0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuX3BhZCh0aGlzLmJ1ZmZlcix0aGlzLmJ1ZmZlck9mZikpcmV0dXJuW107dmFyIHQ9bmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTtyZXR1cm4gdGhpcy5fdXBkYXRlKHRoaXMuYnVmZmVyLDAsdCwwKSx0fSxuLnByb3RvdHlwZS5fdW5wYWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LG4ucHJvdG90eXBlLl9maW5hbERlY3J5cHQ9ZnVuY3Rpb24oKXtpLmVxdWFsKHRoaXMuYnVmZmVyT2ZmLHRoaXMuYmxvY2tTaXplLFwiTm90IGVub3VnaCBkYXRhIHRvIGRlY3J5cHRcIik7dmFyIHQ9bmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTtyZXR1cm4gdGhpcy5fZmx1c2hCdWZmZXIodCwwKSx0aGlzLl91bnBhZCh0KX19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKCl7dGhpcy50bXA9bmV3IEFycmF5KDIpLHRoaXMua2V5cz1udWxsfWZ1bmN0aW9uIGkodCl7dS5jYWxsKHRoaXMsdCk7dmFyIGU9bmV3IG47dGhpcy5fZGVzU3RhdGU9ZSx0aGlzLmRlcml2ZUtleXMoZSx0LmtleSl9dmFyIG89cig5OCksYT1yKDIpLGY9cigxNDUpLHM9Zi51dGlscyx1PWYuQ2lwaGVyO2EoaSx1KSx0LmV4cG9ydHM9aSxpLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGkodCl9O3ZhciBoPVsxLDEsMiwyLDIsMiwyLDIsMSwyLDIsMiwyLDIsMiwxXTtpLnByb3RvdHlwZS5kZXJpdmVLZXlzPWZ1bmN0aW9uKHQsZSl7dC5rZXlzPW5ldyBBcnJheSgzMiksby5lcXVhbChlLmxlbmd0aCx0aGlzLmJsb2NrU2l6ZSxcIkludmFsaWQga2V5IGxlbmd0aFwiKTt2YXIgcj1zLnJlYWRVSW50MzJCRShlLDApLG49cy5yZWFkVUludDMyQkUoZSw0KTtzLnBjMShyLG4sdC50bXAsMCkscj10LnRtcFswXSxuPXQudG1wWzFdO2Zvcih2YXIgaT0wO2k8dC5rZXlzLmxlbmd0aDtpKz0yKXt2YXIgYT1oW2k+Pj4xXTtyPXMucjI4c2hsKHIsYSksbj1zLnIyOHNobChuLGEpLHMucGMyKHIsbix0LmtleXMsaSl9fSxpLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXRoaXMuX2Rlc1N0YXRlLG89cy5yZWFkVUludDMyQkUodCxlKSxhPXMucmVhZFVJbnQzMkJFKHQsZSs0KTtzLmlwKG8sYSxpLnRtcCwwKSxvPWkudG1wWzBdLGE9aS50bXBbMV0sXCJlbmNyeXB0XCI9PT10aGlzLnR5cGU/dGhpcy5fZW5jcnlwdChpLG8sYSxpLnRtcCwwKTp0aGlzLl9kZWNyeXB0KGksbyxhLGkudG1wLDApLG89aS50bXBbMF0sYT1pLnRtcFsxXSxzLndyaXRlVUludDMyQkUocixvLG4pLHMud3JpdGVVSW50MzJCRShyLGEsbis0KX0saS5wcm90b3R5cGUuX3BhZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aC1lLG49ZTtuPHQubGVuZ3RoO24rKyl0W25dPXI7cmV0dXJuITB9LGkucHJvdG90eXBlLl91bnBhZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFt0Lmxlbmd0aC0xXSxyPXQubGVuZ3RoLWU7cjx0Lmxlbmd0aDtyKyspby5lcXVhbCh0W3JdLGUpO3JldHVybiB0LnNsaWNlKDAsdC5sZW5ndGgtZSl9LGkucHJvdG90eXBlLl9lbmNyeXB0PWZ1bmN0aW9uKHQsZSxyLG4saSl7Zm9yKHZhciBvPWUsYT1yLGY9MDtmPHQua2V5cy5sZW5ndGg7Zis9Mil7dmFyIHU9dC5rZXlzW2ZdLGg9dC5rZXlzW2YrMV07cy5leHBhbmQoYSx0LnRtcCwwKSx1Xj10LnRtcFswXSxoXj10LnRtcFsxXTt2YXIgYz1zLnN1YnN0aXR1dGUodSxoKSxkPXMucGVybXV0ZShjKSxsPWE7YT0ob15kKT4+PjAsbz1sfXMucmlwKGEsbyxuLGkpfSxpLnByb3RvdHlwZS5fZGVjcnlwdD1mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1yLGE9ZSxmPXQua2V5cy5sZW5ndGgtMjtmPj0wO2YtPTIpe3ZhciB1PXQua2V5c1tmXSxoPXQua2V5c1tmKzFdO3MuZXhwYW5kKG8sdC50bXAsMCksdV49dC50bXBbMF0saF49dC50bXBbMV07dmFyIGM9cy5zdWJzdGl0dXRlKHUsaCksZD1zLnBlcm11dGUoYyksbD1vO289KGFeZCk+Pj4wLGE9bH1zLnJpcChvLGEsbixpKX19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7by5lcXVhbChlLmxlbmd0aCwyNCxcIkludmFsaWQga2V5IGxlbmd0aFwiKTt2YXIgcj1lLnNsaWNlKDAsOCksbj1lLnNsaWNlKDgsMTYpLGk9ZS5zbGljZSgxNiwyNCk7XCJlbmNyeXB0XCI9PT10P3RoaXMuY2lwaGVycz1bdS5jcmVhdGUoe3R5cGU6XCJlbmNyeXB0XCIsa2V5OnJ9KSx1LmNyZWF0ZSh7dHlwZTpcImRlY3J5cHRcIixrZXk6bn0pLHUuY3JlYXRlKHt0eXBlOlwiZW5jcnlwdFwiLGtleTppfSldOnRoaXMuY2lwaGVycz1bdS5jcmVhdGUoe3R5cGU6XCJkZWNyeXB0XCIsa2V5Oml9KSx1LmNyZWF0ZSh7dHlwZTpcImVuY3J5cHRcIixrZXk6bn0pLHUuY3JlYXRlKHt0eXBlOlwiZGVjcnlwdFwiLGtleTpyfSldfWZ1bmN0aW9uIGkodCl7cy5jYWxsKHRoaXMsdCk7dmFyIGU9bmV3IG4odGhpcy50eXBlLHRoaXMub3B0aW9ucy5rZXkpO3RoaXMuX2VkZVN0YXRlPWV9dmFyIG89cig5OCksYT1yKDIpLGY9cigxNDUpLHM9Zi5DaXBoZXIsdT1mLkRFUzthKGkscyksdC5leHBvcnRzPWksaS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBpKHQpfSxpLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXRoaXMuX2VkZVN0YXRlO2kuY2lwaGVyc1swXS5fdXBkYXRlKHQsZSxyLG4pLGkuY2lwaGVyc1sxXS5fdXBkYXRlKHIsbixyLG4pLGkuY2lwaGVyc1syXS5fdXBkYXRlKHIsbixyLG4pfSxpLnByb3RvdHlwZS5fcGFkPXUucHJvdG90eXBlLl9wYWQsaS5wcm90b3R5cGUuX3VucGFkPXUucHJvdG90eXBlLl91bnBhZH0sZnVuY3Rpb24odCxlKXtcInVzZSBzdHJpY3RcIjtlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3ZhciByPXRbMCtlXTw8MjR8dFsxK2VdPDwxNnx0WzIrZV08PDh8dFszK2VdO3JldHVybiByPj4+MH0sZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXt0WzArcl09ZT4+PjI0LHRbMStyXT1lPj4+MTYmMjU1LHRbMityXT1lPj4+OCYyNTUsdFszK3JdPTI1NSZlfSxlLmlwPWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgaT0wLG89MCxhPTY7YT49MDthLT0yKXtmb3IodmFyIGY9MDtmPD0yNDtmKz04KWk8PD0xLGl8PWU+Pj5mK2EmMTtmb3IodmFyIGY9MDtmPD0yNDtmKz04KWk8PD0xLGl8PXQ+Pj5mK2EmMX1mb3IodmFyIGE9NjthPj0wO2EtPTIpe2Zvcih2YXIgZj0xO2Y8PTI1O2YrPTgpbzw8PTEsb3w9ZT4+PmYrYSYxO2Zvcih2YXIgZj0xO2Y8PTI1O2YrPTgpbzw8PTEsb3w9dD4+PmYrYSYxfXJbbiswXT1pPj4+MCxyW24rMV09bz4+PjB9LGUucmlwPWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgaT0wLG89MCxhPTA7YTw0O2ErKylmb3IodmFyIGY9MjQ7Zj49MDtmLT04KWk8PD0xLGl8PWU+Pj5mK2EmMSxpPDw9MSxpfD10Pj4+ZithJjE7Zm9yKHZhciBhPTQ7YTw4O2ErKylmb3IodmFyIGY9MjQ7Zj49MDtmLT04KW88PD0xLG98PWU+Pj5mK2EmMSxvPDw9MSxvfD10Pj4+ZithJjE7cltuKzBdPWk+Pj4wLHJbbisxXT1vPj4+MH0sZS5wYzE9ZnVuY3Rpb24odCxlLHIsbil7Zm9yKHZhciBpPTAsbz0wLGE9NzthPj01O2EtLSl7XG5mb3IodmFyIGY9MDtmPD0yNDtmKz04KWk8PD0xLGl8PWU+PmYrYSYxO2Zvcih2YXIgZj0wO2Y8PTI0O2YrPTgpaTw8PTEsaXw9dD4+ZithJjF9Zm9yKHZhciBmPTA7Zjw9MjQ7Zis9OClpPDw9MSxpfD1lPj5mK2EmMTtmb3IodmFyIGE9MTthPD0zO2ErKyl7Zm9yKHZhciBmPTA7Zjw9MjQ7Zis9OClvPDw9MSxvfD1lPj5mK2EmMTtmb3IodmFyIGY9MDtmPD0yNDtmKz04KW88PD0xLG98PXQ+PmYrYSYxfWZvcih2YXIgZj0wO2Y8PTI0O2YrPTgpbzw8PTEsb3w9dD4+ZithJjE7cltuKzBdPWk+Pj4wLHJbbisxXT1vPj4+MH0sZS5yMjhzaGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDw8ZSYyNjg0MzU0NTV8dD4+PjI4LWV9O3ZhciByPVsxNCwxMSwxNyw0LDI3LDIzLDI1LDAsMTMsMjIsNywxOCw1LDksMTYsMjQsMiwyMCwxMiwyMSwxLDgsMTUsMjYsMTUsNCwyNSwxOSw5LDEsMjYsMTYsNSwxMSwyMyw4LDEyLDcsMTcsMCwyMiwzLDEwLDE0LDYsMjAsMjcsMjRdO2UucGMyPWZ1bmN0aW9uKHQsZSxuLGkpe2Zvcih2YXIgbz0wLGE9MCxmPXIubGVuZ3RoPj4+MSxzPTA7czxmO3MrKylvPDw9MSxvfD10Pj4+cltzXSYxO2Zvcih2YXIgcz1mO3M8ci5sZW5ndGg7cysrKWE8PD0xLGF8PWU+Pj5yW3NdJjE7bltpKzBdPW8+Pj4wLG5baSsxXT1hPj4+MH0sZS5leHBhbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPTAsaT0wO249KDEmdCk8PDV8dD4+PjI3O2Zvcih2YXIgbz0yMztvPj0xNTtvLT00KW48PD02LG58PXQ+Pj5vJjYzO2Zvcih2YXIgbz0xMTtvPj0zO28tPTQpaXw9dD4+Pm8mNjMsaTw8PTY7aXw9KDMxJnQpPDwxfHQ+Pj4zMSxlW3IrMF09bj4+PjAsZVtyKzFdPWk+Pj4wfTt2YXIgbj1bMTQsMCw0LDE1LDEzLDcsMSw0LDIsMTQsMTUsMiwxMSwxMyw4LDEsMywxMCwxMCw2LDYsMTIsMTIsMTEsNSw5LDksNSwwLDMsNyw4LDQsMTUsMSwxMiwxNCw4LDgsMiwxMyw0LDYsOSwyLDEsMTEsNywxNSw1LDEyLDExLDksMyw3LDE0LDMsMTAsMTAsMCw1LDYsMCwxMywxNSwzLDEsMTMsOCw0LDE0LDcsNiwxNSwxMSwyLDMsOCw0LDE0LDksMTIsNywwLDIsMSwxMywxMCwxMiw2LDAsOSw1LDExLDEwLDUsMCwxMywxNCw4LDcsMTAsMTEsMSwxMCwzLDQsMTUsMTMsNCwxLDIsNSwxMSw4LDYsMTIsNyw2LDEyLDksMCwzLDUsMiwxNCwxNSw5LDEwLDEzLDAsNyw5LDAsMTQsOSw2LDMsMyw0LDE1LDYsNSwxMCwxLDIsMTMsOCwxMiw1LDcsMTQsMTEsMTIsNCwxMSwyLDE1LDgsMSwxMywxLDYsMTAsNCwxMyw5LDAsOCw2LDE1LDksMyw4LDAsNywxMSw0LDEsMTUsMiwxNCwxMiwzLDUsMTEsMTAsNSwxNCwyLDcsMTIsNywxMywxMyw4LDE0LDExLDMsNSwwLDYsNiwxNSw5LDAsMTAsMywxLDQsMiw3LDgsMiw1LDEyLDExLDEsMTIsMTAsNCwxNCwxNSw5LDEwLDMsNiwxNSw5LDAsMCw2LDEyLDEwLDExLDEsNywxMywxMyw4LDE1LDksMSw0LDMsNSwxNCwxMSw1LDEyLDIsNyw4LDIsNCwxNCwyLDE0LDEyLDExLDQsMiwxLDEyLDcsNCwxMCw3LDExLDEzLDYsMSw4LDUsNSwwLDMsMTUsMTUsMTAsMTMsMywwLDksMTQsOCw5LDYsNCwxMSwyLDgsMSwxMiwxMSw3LDEwLDEsMTMsMTQsNywyLDgsMTMsMTUsNiw5LDE1LDEyLDAsNSw5LDYsMTAsMyw0LDAsNSwxNCwzLDEyLDEwLDEsMTUsMTAsNCwxNSwyLDksNywyLDEyLDYsOSw4LDUsMCw2LDEzLDEsMywxMyw0LDE0LDE0LDAsNywxMSw1LDMsMTEsOCw5LDQsMTQsMywxNSwyLDUsMTIsMiw5LDgsNSwxMiwxNSwzLDEwLDcsMTEsMCwxNCw0LDEsMTAsNywxLDYsMTMsMCwxMSw4LDYsMTMsNCwxMywxMSwwLDIsMTEsMTQsNywxNSw0LDAsOSw4LDEsMTMsMTAsMywxNCwxMiwzLDksNSw3LDEyLDUsMiwxMCwxNSw2LDgsMSw2LDEsNiw0LDExLDExLDEzLDEzLDgsMTIsMSwzLDQsNywxMCwxNCw3LDEwLDksMTUsNSw2LDAsOCwxNSwwLDE0LDUsMiw5LDMsMiwxMiwxMywxLDIsMTUsOCwxMyw0LDgsNiwxMCwxNSwzLDExLDcsMSw0LDEwLDEyLDksNSwzLDYsMTQsMTEsNSwwLDAsMTQsMTIsOSw3LDIsNywyLDExLDEsNCwxNCwxLDcsOSw0LDEyLDEwLDE0LDgsMiwxMywwLDE1LDYsMTIsMTAsOSwxMywwLDE1LDMsMyw1LDUsNiw4LDExXTtlLnN1YnN0aXR1dGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxpPTA7aTw0O2krKyl7dmFyIG89dD4+PjE4LTYqaSY2MyxhPW5bNjQqaStvXTtyPDw9NCxyfD1hfWZvcih2YXIgaT0wO2k8NDtpKyspe3ZhciBvPWU+Pj4xOC02KmkmNjMsYT1uWzI1Nis2NCppK29dO3I8PD00LHJ8PWF9cmV0dXJuIHI+Pj4wfTt2YXIgaT1bMTYsMjUsMTIsMTEsMywyMCw0LDE1LDMxLDE3LDksNiwyNywxNCwxLDIyLDMwLDI0LDgsMTgsMCw1LDI5LDIzLDEzLDE5LDIsMjYsMTAsMjEsMjgsN107ZS5wZXJtdXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9MDtyPGkubGVuZ3RoO3IrKyllPDw9MSxlfD10Pj4+aVtyXSYxO3JldHVybiBlPj4+MH0sZS5wYWRTcGxpdD1mdW5jdGlvbih0LGUscil7Zm9yKHZhciBuPXQudG9TdHJpbmcoMik7bi5sZW5ndGg8ZTspbj1cIjBcIituO2Zvcih2YXIgaT1bXSxvPTA7bzxlO28rPXIpaS5wdXNoKG4uc2xpY2UobyxvK3IpKTtyZXR1cm4gaS5qb2luKFwiIFwiKX19LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0KXtjLldyaXRhYmxlLmNhbGwodGhpcyk7dmFyIGU9bFt0XTtpZighZSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG1lc3NhZ2UgZGlnZXN0XCIpO3RoaXMuX2hhc2hUeXBlPWUuaGFzaCx0aGlzLl9oYXNoPXMoZS5oYXNoKSx0aGlzLl90YWc9ZS5pZCx0aGlzLl9zaWduVHlwZT1lLnNpZ259ZnVuY3Rpb24gaSh0KXtjLldyaXRhYmxlLmNhbGwodGhpcyk7dmFyIGU9bFt0XTtpZighZSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG1lc3NhZ2UgZGlnZXN0XCIpO3RoaXMuX2hhc2g9cyhlLmhhc2gpLHRoaXMuX3RhZz1lLmlkLHRoaXMuX3NpZ25UeXBlPWUuc2lnbn1mdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgbih0KX1mdW5jdGlvbiBhKHQpe3JldHVybiBuZXcgaSh0KX12YXIgZj1yKDIxMSkscz1yKDU5KSx1PXIoMiksaD1yKDU0MiksYz1yKDMxKSxkPXIoNTQzKSxsPXt9O09iamVjdC5rZXlzKGYpLmZvckVhY2goZnVuY3Rpb24odCl7bFt0XT1sW3QudG9Mb3dlckNhc2UoKV09Zlt0XX0pLHUobixjLldyaXRhYmxlKSxuLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3RoaXMuX2hhc2gudXBkYXRlKHQpLHIoKX0sbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQscil7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQmJih0PW5ldyBlKHQscikpLHRoaXMuX2hhc2gudXBkYXRlKHQpLHRoaXN9LG4ucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24odCxyKXt0aGlzLmVuZCgpO3ZhciBuPXRoaXMuX2hhc2guZGlnZXN0KCksaT1oKGUuY29uY2F0KFt0aGlzLl90YWcsbl0pLHQsdGhpcy5faGFzaFR5cGUsdGhpcy5fc2lnblR5cGUpO3JldHVybiByP2kudG9TdHJpbmcocik6aX0sdShpLGMuV3JpdGFibGUpLGkucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7dGhpcy5faGFzaC51cGRhdGUodCkscigpfSxpLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxyKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9bmV3IGUodCxyKSksdGhpcy5faGFzaC51cGRhdGUodCksdGhpc30saS5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uKHQscixuKXtcInN0cmluZ1wiPT10eXBlb2YgciYmKHI9bmV3IGUocixuKSksdGhpcy5lbmQoKTt2YXIgaT10aGlzLl9oYXNoLmRpZ2VzdCgpO3JldHVybiBkKHIsZS5jb25jYXQoW3RoaXMuX3RhZyxpXSksdCx0aGlzLl9zaWduVHlwZSl9LHQuZXhwb3J0cz17U2lnbjpvLFZlcmlmeTphLGNyZWF0ZVNpZ246byxjcmVhdGVWZXJpZnk6YX19KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7dmFyIGU9byh0KSxyPWUudG9SZWQoYS5tb250KHQubW9kdWx1cykpLnJlZFBvdyhuZXcgYSh0LnB1YmxpY0V4cG9uZW50KSkuZnJvbVJlZCgpO3JldHVybntibGluZGVyOnIsdW5ibGluZGVyOmUuaW52bSh0Lm1vZHVsdXMpfX1mdW5jdGlvbiBpKHQscil7dmFyIGk9bihyKSxvPXIubW9kdWx1cy5ieXRlTGVuZ3RoKCksZj0oYS5tb250KHIubW9kdWx1cyksbmV3IGEodCkubXVsKGkuYmxpbmRlcikudW1vZChyLm1vZHVsdXMpKSxzPWYudG9SZWQoYS5tb250KHIucHJpbWUxKSksdT1mLnRvUmVkKGEubW9udChyLnByaW1lMikpLGg9ci5jb2VmZmljaWVudCxjPXIucHJpbWUxLGQ9ci5wcmltZTIsbD1zLnJlZFBvdyhyLmV4cG9uZW50MSkscD11LnJlZFBvdyhyLmV4cG9uZW50Mik7bD1sLmZyb21SZWQoKSxwPXAuZnJvbVJlZCgpO3ZhciBiPWwuaXN1YihwKS5pbXVsKGgpLnVtb2QoYyk7cmV0dXJuIGIuaW11bChkKSxwLmlhZGQoYiksbmV3IGUocC5pbXVsKGkudW5ibGluZGVyKS51bW9kKHIubW9kdWx1cykudG9BcnJheSghMSxvKSl9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGU9dC5tb2R1bHVzLmJ5dGVMZW5ndGgoKSxyPW5ldyBhKGYoZSkpO3IuY21wKHQubW9kdWx1cyk+PTB8fCFyLnVtb2QodC5wcmltZTEpfHwhci51bW9kKHQucHJpbWUyKTspcj1uZXcgYShmKGUpKTtyZXR1cm4gcn12YXIgYT1yKDE4KSxmPXIoNjEpO3QuZXhwb3J0cz1pLGkuZ2V0cj1vfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXt0aGlzLnR5cGU9dCx0aGlzLnA9bmV3IG8oZS5wLDE2KSx0aGlzLnJlZD1lLnByaW1lP28ucmVkKGUucHJpbWUpOm8ubW9udCh0aGlzLnApLHRoaXMuemVybz1uZXcgbygwKS50b1JlZCh0aGlzLnJlZCksdGhpcy5vbmU9bmV3IG8oMSkudG9SZWQodGhpcy5yZWQpLHRoaXMudHdvPW5ldyBvKDIpLnRvUmVkKHRoaXMucmVkKSx0aGlzLm49ZS5uJiZuZXcgbyhlLm4sMTYpLHRoaXMuZz1lLmcmJnRoaXMucG9pbnRGcm9tSlNPTihlLmcsZS5nUmVkKSx0aGlzLl93bmFmVDE9bmV3IEFycmF5KDQpLHRoaXMuX3duYWZUMj1uZXcgQXJyYXkoNCksdGhpcy5fd25hZlQzPW5ldyBBcnJheSg0KSx0aGlzLl93bmFmVDQ9bmV3IEFycmF5KDQpO3ZhciByPXRoaXMubiYmdGhpcy5wLmRpdih0aGlzLm4pOyFyfHxyLmNtcG4oMTAwKT4wP3RoaXMucmVkTj1udWxsOih0aGlzLl9tYXh3ZWxsVHJpY2s9ITAsdGhpcy5yZWROPXRoaXMubi50b1JlZCh0aGlzLnJlZCkpfWZ1bmN0aW9uIGkodCxlKXt0aGlzLmN1cnZlPXQsdGhpcy50eXBlPWUsdGhpcy5wcmVjb21wdXRlZD1udWxsfXZhciBvPXIoMTgpLGE9cigxOSksZj1hLnV0aWxzLHM9Zi5nZXROQUYsdT1mLmdldEpTRixoPWYuYXNzZXJ0O3QuZXhwb3J0cz1uLG4ucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpfSxuLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKX0sbi5wcm90b3R5cGUuX2ZpeGVkTmFmTXVsPWZ1bmN0aW9uKHQsZSl7aCh0LnByZWNvbXB1dGVkKTt2YXIgcj10Ll9nZXREb3VibGVzKCksbj1zKGUsMSksaT0oMTw8ci5zdGVwKzEpLShyLnN0ZXAlMj09PTA/MjoxKTtpLz0zO2Zvcih2YXIgbz1bXSxhPTA7YTxuLmxlbmd0aDthKz1yLnN0ZXApe2Zvcih2YXIgZj0wLGU9YStyLnN0ZXAtMTtlPj1hO2UtLSlmPShmPDwxKStuW2VdO28ucHVzaChmKX1mb3IodmFyIHU9dGhpcy5qcG9pbnQobnVsbCxudWxsLG51bGwpLGM9dGhpcy5qcG9pbnQobnVsbCxudWxsLG51bGwpLGQ9aTtkPjA7ZC0tKXtmb3IodmFyIGE9MDthPG8ubGVuZ3RoO2ErKyl7dmFyIGY9b1thXTtmPT09ZD9jPWMubWl4ZWRBZGQoci5wb2ludHNbYV0pOmY9PT0tZCYmKGM9Yy5taXhlZEFkZChyLnBvaW50c1thXS5uZWcoKSkpfXU9dS5hZGQoYyl9cmV0dXJuIHUudG9QKCl9LG4ucHJvdG90eXBlLl93bmFmTXVsPWZ1bmN0aW9uKHQsZSl7dmFyIHI9NCxuPXQuX2dldE5BRlBvaW50cyhyKTtyPW4ud25kO2Zvcih2YXIgaT1uLnBvaW50cyxvPXMoZSxyKSxhPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxmPW8ubGVuZ3RoLTE7Zj49MDtmLS0pe2Zvcih2YXIgZT0wO2Y+PTAmJjA9PT1vW2ZdO2YtLSllKys7aWYoZj49MCYmZSsrLGE9YS5kYmxwKGUpLGY8MClicmVhazt2YXIgdT1vW2ZdO2goMCE9PXUpLGE9XCJhZmZpbmVcIj09PXQudHlwZT91PjA/YS5taXhlZEFkZChpW3UtMT4+MV0pOmEubWl4ZWRBZGQoaVstdS0xPj4xXS5uZWcoKSk6dT4wP2EuYWRkKGlbdS0xPj4xXSk6YS5hZGQoaVstdS0xPj4xXS5uZWcoKSl9cmV0dXJuXCJhZmZpbmVcIj09PXQudHlwZT9hLnRvUCgpOmF9LG4ucHJvdG90eXBlLl93bmFmTXVsQWRkPWZ1bmN0aW9uKHQsZSxyLG4saSl7Zm9yKHZhciBvPXRoaXMuX3duYWZUMSxhPXRoaXMuX3duYWZUMixmPXRoaXMuX3duYWZUMyxoPTAsYz0wO2M8bjtjKyspe3ZhciBkPWVbY10sbD1kLl9nZXROQUZQb2ludHModCk7b1tjXT1sLnduZCxhW2NdPWwucG9pbnRzfWZvcih2YXIgYz1uLTE7Yz49MTtjLT0yKXt2YXIgcD1jLTEsYj1jO2lmKDE9PT1vW3BdJiYxPT09b1tiXSl7dmFyIHY9W2VbcF0sbnVsbCxudWxsLGVbYl1dOzA9PT1lW3BdLnkuY21wKGVbYl0ueSk/KHZbMV09ZVtwXS5hZGQoZVtiXSksdlsyXT1lW3BdLnRvSigpLm1peGVkQWRkKGVbYl0ubmVnKCkpKTowPT09ZVtwXS55LmNtcChlW2JdLnkucmVkTmVnKCkpPyh2WzFdPWVbcF0udG9KKCkubWl4ZWRBZGQoZVtiXSksdlsyXT1lW3BdLmFkZChlW2JdLm5lZygpKSk6KHZbMV09ZVtwXS50b0ooKS5taXhlZEFkZChlW2JdKSx2WzJdPWVbcF0udG9KKCkubWl4ZWRBZGQoZVtiXS5uZWcoKSkpO3ZhciB5PVstMywtMSwtNSwtNywwLDcsNSwxLDNdLG09dShyW3BdLHJbYl0pO2g9TWF0aC5tYXgobVswXS5sZW5ndGgsaCksZltwXT1uZXcgQXJyYXkoaCksZltiXT1uZXcgQXJyYXkoaCk7Zm9yKHZhciBnPTA7ZzxoO2crKyl7dmFyIHc9MHxtWzBdW2ddLF89MHxtWzFdW2ddO2ZbcF1bZ109eVszKih3KzEpKyhfKzEpXSxmW2JdW2ddPTAsYVtwXT12fX1lbHNlIGZbcF09cyhyW3BdLG9bcF0pLGZbYl09cyhyW2JdLG9bYl0pLGg9TWF0aC5tYXgoZltwXS5sZW5ndGgsaCksaD1NYXRoLm1heChmW2JdLmxlbmd0aCxoKX1mb3IodmFyIE09dGhpcy5qcG9pbnQobnVsbCxudWxsLG51bGwpLFM9dGhpcy5fd25hZlQ0LGM9aDtjPj0wO2MtLSl7Zm9yKHZhciBFPTA7Yz49MDspe2Zvcih2YXIgQT0hMCxnPTA7ZzxuO2crKylTW2ddPTB8ZltnXVtjXSwwIT09U1tnXSYmKEE9ITEpO2lmKCFBKWJyZWFrO0UrKyxjLS19aWYoYz49MCYmRSsrLE09TS5kYmxwKEUpLGM8MClicmVhaztmb3IodmFyIGc9MDtnPG47ZysrKXt2YXIgZCxrPVNbZ107MCE9PWsmJihrPjA/ZD1hW2ddW2stMT4+MV06azwwJiYoZD1hW2ddWy1rLTE+PjFdLm5lZygpKSxNPVwiYWZmaW5lXCI9PT1kLnR5cGU/TS5taXhlZEFkZChkKTpNLmFkZChkKSl9fWZvcih2YXIgYz0wO2M8bjtjKyspYVtjXT1udWxsO3JldHVybiBpP006TS50b1AoKX0sbi5CYXNlUG9pbnQ9aSxpLnByb3RvdHlwZS5lcT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKX0saS5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJ2ZS52YWxpZGF0ZSh0aGlzKX0sbi5wcm90b3R5cGUuZGVjb2RlUG9pbnQ9ZnVuY3Rpb24odCxlKXt0PWYudG9BcnJheSh0LGUpO3ZhciByPXRoaXMucC5ieXRlTGVuZ3RoKCk7aWYoKDQ9PT10WzBdfHw2PT09dFswXXx8Nz09PXRbMF0pJiZ0Lmxlbmd0aC0xPT09MipyKXs2PT09dFswXT9oKHRbdC5sZW5ndGgtMV0lMj09PTApOjc9PT10WzBdJiZoKHRbdC5sZW5ndGgtMV0lMj09PTEpO3ZhciBuPXRoaXMucG9pbnQodC5zbGljZSgxLDErciksdC5zbGljZSgxK3IsMSsyKnIpKTtyZXR1cm4gbn1pZigoMj09PXRbMF18fDM9PT10WzBdKSYmdC5sZW5ndGgtMT09PXIpcmV0dXJuIHRoaXMucG9pbnRGcm9tWCh0LnNsaWNlKDEsMStyKSwzPT09dFswXSk7dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBwb2ludCBmb3JtYXRcIil9LGkucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5jb2RlKHQsITApfSxpLnByb3RvdHlwZS5fZW5jb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCkscj10aGlzLmdldFgoKS50b0FycmF5KFwiYmVcIixlKTtyZXR1cm4gdD9bdGhpcy5nZXRZKCkuaXNFdmVuKCk/MjozXS5jb25jYXQocik6WzRdLmNvbmNhdChyLHRoaXMuZ2V0WSgpLnRvQXJyYXkoXCJiZVwiLGUpKX0saS5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGYuZW5jb2RlKHRoaXMuX2VuY29kZShlKSx0KX0saS5wcm90b3R5cGUucHJlY29tcHV0ZT1mdW5jdGlvbih0KXtpZih0aGlzLnByZWNvbXB1dGVkKXJldHVybiB0aGlzO3ZhciBlPXtkb3VibGVzOm51bGwsbmFmOm51bGwsYmV0YTpudWxsfTtyZXR1cm4gZS5uYWY9dGhpcy5fZ2V0TkFGUG9pbnRzKDgpLGUuZG91Ymxlcz10aGlzLl9nZXREb3VibGVzKDQsdCksZS5iZXRhPXRoaXMuX2dldEJldGEoKSx0aGlzLnByZWNvbXB1dGVkPWUsdGhpc30saS5wcm90b3R5cGUuX2hhc0RvdWJsZXM9ZnVuY3Rpb24odCl7aWYoIXRoaXMucHJlY29tcHV0ZWQpcmV0dXJuITE7dmFyIGU9dGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO3JldHVybiEhZSYmZS5wb2ludHMubGVuZ3RoPj1NYXRoLmNlaWwoKHQuYml0TGVuZ3RoKCkrMSkvZS5zdGVwKX0saS5wcm90b3R5cGUuX2dldERvdWJsZXM9ZnVuY3Rpb24odCxlKXtpZih0aGlzLnByZWNvbXB1dGVkJiZ0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMpcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcztmb3IodmFyIHI9W3RoaXNdLG49dGhpcyxpPTA7aTxlO2krPXQpe2Zvcih2YXIgbz0wO288dDtvKyspbj1uLmRibCgpO3IucHVzaChuKX1yZXR1cm57c3RlcDp0LHBvaW50czpyfX0saS5wcm90b3R5cGUuX2dldE5BRlBvaW50cz1mdW5jdGlvbih0KXtpZih0aGlzLnByZWNvbXB1dGVkJiZ0aGlzLnByZWNvbXB1dGVkLm5hZilyZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5uYWY7Zm9yKHZhciBlPVt0aGlzXSxyPSgxPDx0KS0xLG49MT09PXI/bnVsbDp0aGlzLmRibCgpLGk9MTtpPHI7aSsrKWVbaV09ZVtpLTFdLmFkZChuKTtyZXR1cm57d25kOnQscG9pbnRzOmV9fSxpLnByb3RvdHlwZS5fZ2V0QmV0YT1mdW5jdGlvbigpe3JldHVybiBudWxsfSxpLnByb3RvdHlwZS5kYmxwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLHI9MDtyPHQ7cisrKWU9ZS5kYmwoKTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQpe3RoaXMudHdpc3RlZD0xIT09KDB8dC5hKSx0aGlzLm1PbmVBPXRoaXMudHdpc3RlZCYmKDB8dC5hKT09PS0xLHRoaXMuZXh0ZW5kZWQ9dGhpcy5tT25lQSx1LmNhbGwodGhpcyxcImVkd2FyZHNcIix0KSx0aGlzLmE9bmV3IGYodC5hLDE2KS51bW9kKHRoaXMucmVkLm0pLHRoaXMuYT10aGlzLmEudG9SZWQodGhpcy5yZWQpLHRoaXMuYz1uZXcgZih0LmMsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmMyPXRoaXMuYy5yZWRTcXIoKSx0aGlzLmQ9bmV3IGYodC5kLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5kZD10aGlzLmQucmVkQWRkKHRoaXMuZCksaCghdGhpcy50d2lzdGVkfHwwPT09dGhpcy5jLmZyb21SZWQoKS5jbXBuKDEpKSx0aGlzLm9uZUM9MT09PSgwfHQuYyl9ZnVuY3Rpb24gaSh0LGUscixuLGkpe3UuQmFzZVBvaW50LmNhbGwodGhpcyx0LFwicHJvamVjdGl2ZVwiKSxudWxsPT09ZSYmbnVsbD09PXImJm51bGw9PT1uPyh0aGlzLng9dGhpcy5jdXJ2ZS56ZXJvLHRoaXMueT10aGlzLmN1cnZlLm9uZSx0aGlzLno9dGhpcy5jdXJ2ZS5vbmUsdGhpcy50PXRoaXMuY3VydmUuemVybyx0aGlzLnpPbmU9ITApOih0aGlzLng9bmV3IGYoZSwxNiksdGhpcy55PW5ldyBmKHIsMTYpLHRoaXMuej1uP25ldyBmKG4sMTYpOnRoaXMuY3VydmUub25lLHRoaXMudD1pJiZuZXcgZihpLDE2KSx0aGlzLngucmVkfHwodGhpcy54PXRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMueS5yZWR8fCh0aGlzLnk9dGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy56LnJlZHx8KHRoaXMuej10aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnQmJiF0aGlzLnQucmVkJiYodGhpcy50PXRoaXMudC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuek9uZT10aGlzLno9PT10aGlzLmN1cnZlLm9uZSx0aGlzLmN1cnZlLmV4dGVuZGVkJiYhdGhpcy50JiYodGhpcy50PXRoaXMueC5yZWRNdWwodGhpcy55KSx0aGlzLnpPbmV8fCh0aGlzLnQ9dGhpcy50LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKSkpKX12YXIgbz1yKDk5KSxhPXIoMTkpLGY9cigxOCkscz1yKDIpLHU9by5iYXNlLGg9YS51dGlscy5hc3NlcnQ7cyhuLHUpLHQuZXhwb3J0cz1uLG4ucHJvdG90eXBlLl9tdWxBPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1PbmVBP3QucmVkTmVnKCk6dGhpcy5hLnJlZE11bCh0KX0sbi5wcm90b3R5cGUuX211bEM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub25lQz90OnRoaXMuYy5yZWRNdWwodCl9LG4ucHJvdG90eXBlLmpwb2ludD1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdGhpcy5wb2ludCh0LGUscixuKX0sbi5wcm90b3R5cGUucG9pbnRGcm9tWD1mdW5jdGlvbih0LGUpe3Q9bmV3IGYodCwxNiksdC5yZWR8fCh0PXQudG9SZWQodGhpcy5yZWQpKTt2YXIgcj10LnJlZFNxcigpLG49dGhpcy5jMi5yZWRTdWIodGhpcy5hLnJlZE11bChyKSksaT10aGlzLm9uZS5yZWRTdWIodGhpcy5jMi5yZWRNdWwodGhpcy5kKS5yZWRNdWwocikpLG89bi5yZWRNdWwoaS5yZWRJbnZtKCkpLGE9by5yZWRTcXJ0KCk7aWYoMCE9PWEucmVkU3FyKCkucmVkU3ViKG8pLmNtcCh0aGlzLnplcm8pKXRocm93IG5ldyBFcnJvcihcImludmFsaWQgcG9pbnRcIik7dmFyIHM9YS5mcm9tUmVkKCkuaXNPZGQoKTtyZXR1cm4oZSYmIXN8fCFlJiZzKSYmKGE9YS5yZWROZWcoKSksdGhpcy5wb2ludCh0LGEpfSxuLnByb3RvdHlwZS5wb2ludEZyb21ZPWZ1bmN0aW9uKHQsZSl7dD1uZXcgZih0LDE2KSx0LnJlZHx8KHQ9dC50b1JlZCh0aGlzLnJlZCkpO3ZhciByPXQucmVkU3FyKCksbj1yLnJlZFN1Yih0aGlzLm9uZSksaT1yLnJlZE11bCh0aGlzLmQpLnJlZEFkZCh0aGlzLm9uZSksbz1uLnJlZE11bChpLnJlZEludm0oKSk7aWYoMD09PW8uY21wKHRoaXMuemVybykpe2lmKGUpdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBwb2ludFwiKTtyZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8sdCl9dmFyIGE9by5yZWRTcXJ0KCk7aWYoMCE9PWEucmVkU3FyKCkucmVkU3ViKG8pLmNtcCh0aGlzLnplcm8pKXRocm93IG5ldyBFcnJvcihcImludmFsaWQgcG9pbnRcIik7cmV0dXJuIGEuaXNPZGQoKSE9PWUmJihhPWEucmVkTmVnKCkpLHRoaXMucG9pbnQoYSx0KX0sbi5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24odCl7aWYodC5pc0luZmluaXR5KCkpcmV0dXJuITA7dC5ub3JtYWxpemUoKTt2YXIgZT10LngucmVkU3FyKCkscj10LnkucmVkU3FyKCksbj1lLnJlZE11bCh0aGlzLmEpLnJlZEFkZChyKSxpPXRoaXMuYzIucmVkTXVsKHRoaXMub25lLnJlZEFkZCh0aGlzLmQucmVkTXVsKGUpLnJlZE11bChyKSkpO3JldHVybiAwPT09bi5jbXAoaSl9LHMoaSx1LkJhc2VQb2ludCksbi5wcm90b3R5cGUucG9pbnRGcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gaS5mcm9tSlNPTih0aGlzLHQpfSxuLnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gbmV3IGkodGhpcyx0LGUscixuKX0saS5mcm9tSlNPTj1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgaSh0LGVbMF0sZVsxXSxlWzJdKX0saS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT9cIjxFQyBQb2ludCBJbmZpbml0eT5cIjpcIjxFQyBQb2ludCB4OiBcIit0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LDIpK1wiIHk6IFwiK3RoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrXCIgejogXCIrdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwyKStcIj5cIn0saS5wcm90b3R5cGUuaXNJbmZpbml0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy54LmNtcG4oMCkmJjA9PT10aGlzLnkuY21wKHRoaXMueil9LGkucHJvdG90eXBlLl9leHREYmw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLngucmVkU3FyKCksZT10aGlzLnkucmVkU3FyKCkscj10aGlzLnoucmVkU3FyKCk7cj1yLnJlZElBZGQocik7dmFyIG49dGhpcy5jdXJ2ZS5fbXVsQSh0KSxpPXRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKS5yZWRJU3ViKHQpLnJlZElTdWIoZSksbz1uLnJlZEFkZChlKSxhPW8ucmVkU3ViKHIpLGY9bi5yZWRTdWIoZSkscz1pLnJlZE11bChhKSx1PW8ucmVkTXVsKGYpLGg9aS5yZWRNdWwoZiksYz1hLnJlZE11bChvKTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChzLHUsYyxoKX0saS5wcm90b3R5cGUuX3Byb2pEYmw9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbj10aGlzLngucmVkQWRkKHRoaXMueSkucmVkU3FyKCksaT10aGlzLngucmVkU3FyKCksbz10aGlzLnkucmVkU3FyKCk7aWYodGhpcy5jdXJ2ZS50d2lzdGVkKXt2YXIgYT10aGlzLmN1cnZlLl9tdWxBKGkpLGY9YS5yZWRBZGQobyk7aWYodGhpcy56T25lKXQ9bi5yZWRTdWIoaSkucmVkU3ViKG8pLnJlZE11bChmLnJlZFN1Yih0aGlzLmN1cnZlLnR3bykpLGU9Zi5yZWRNdWwoYS5yZWRTdWIobykpLHI9Zi5yZWRTcXIoKS5yZWRTdWIoZikucmVkU3ViKGYpO2Vsc2V7dmFyIHM9dGhpcy56LnJlZFNxcigpLHU9Zi5yZWRTdWIocykucmVkSVN1YihzKTt0PW4ucmVkU3ViKGkpLnJlZElTdWIobykucmVkTXVsKHUpLGU9Zi5yZWRNdWwoYS5yZWRTdWIobykpLHI9Zi5yZWRNdWwodSl9fWVsc2V7dmFyIGE9aS5yZWRBZGQobykscz10aGlzLmN1cnZlLl9tdWxDKHRoaXMuYy5yZWRNdWwodGhpcy56KSkucmVkU3FyKCksdT1hLnJlZFN1YihzKS5yZWRTdWIocyk7dD10aGlzLmN1cnZlLl9tdWxDKG4ucmVkSVN1YihhKSkucmVkTXVsKHUpLGU9dGhpcy5jdXJ2ZS5fbXVsQyhhKS5yZWRNdWwoaS5yZWRJU3ViKG8pKSxyPWEucmVkTXVsKHUpfXJldHVybiB0aGlzLmN1cnZlLnBvaW50KHQsZSxyKX0saS5wcm90b3R5cGUuZGJsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpP3RoaXM6dGhpcy5jdXJ2ZS5leHRlbmRlZD90aGlzLl9leHREYmwoKTp0aGlzLl9wcm9qRGJsKCl9LGkucHJvdG90eXBlLl9leHRBZGQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy55LnJlZFN1Yih0aGlzLngpLnJlZE11bCh0LnkucmVkU3ViKHQueCkpLHI9dGhpcy55LnJlZEFkZCh0aGlzLngpLnJlZE11bCh0LnkucmVkQWRkKHQueCkpLG49dGhpcy50LnJlZE11bCh0aGlzLmN1cnZlLmRkKS5yZWRNdWwodC50KSxpPXRoaXMuei5yZWRNdWwodC56LnJlZEFkZCh0LnopKSxvPXIucmVkU3ViKGUpLGE9aS5yZWRTdWIobiksZj1pLnJlZEFkZChuKSxzPXIucmVkQWRkKGUpLHU9by5yZWRNdWwoYSksaD1mLnJlZE11bChzKSxjPW8ucmVkTXVsKHMpLGQ9YS5yZWRNdWwoZik7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQodSxoLGQsYyl9LGkucHJvdG90eXBlLl9wcm9qQWRkPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbj10aGlzLnoucmVkTXVsKHQueiksaT1uLnJlZFNxcigpLG89dGhpcy54LnJlZE11bCh0LngpLGE9dGhpcy55LnJlZE11bCh0LnkpLGY9dGhpcy5jdXJ2ZS5kLnJlZE11bChvKS5yZWRNdWwoYSkscz1pLnJlZFN1YihmKSx1PWkucmVkQWRkKGYpLGg9dGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZE11bCh0LngucmVkQWRkKHQueSkpLnJlZElTdWIobykucmVkSVN1YihhKSxjPW4ucmVkTXVsKHMpLnJlZE11bChoKTtyZXR1cm4gdGhpcy5jdXJ2ZS50d2lzdGVkPyhlPW4ucmVkTXVsKHUpLnJlZE11bChhLnJlZFN1Yih0aGlzLmN1cnZlLl9tdWxBKG8pKSkscj1zLnJlZE11bCh1KSk6KGU9bi5yZWRNdWwodSkucmVkTXVsKGEucmVkU3ViKG8pKSxyPXRoaXMuY3VydmUuX211bEMocykucmVkTXVsKHUpKSx0aGlzLmN1cnZlLnBvaW50KGMsZSxyKX0saS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT90OnQuaXNJbmZpbml0eSgpP3RoaXM6dGhpcy5jdXJ2ZS5leHRlbmRlZD90aGlzLl9leHRBZGQodCk6dGhpcy5fcHJvakFkZCh0KX0saS5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9oYXNEb3VibGVzKHQpP3RoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsdCk6dGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLHQpfSxpLnByb3RvdHlwZS5tdWxBZGQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsW3RoaXMsZV0sW3Qscl0sMiwhMSl9LGkucHJvdG90eXBlLmptdWxBZGQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsW3RoaXMsZV0sW3Qscl0sMiwhMCl9LGkucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2lmKHRoaXMuek9uZSlyZXR1cm4gdGhpczt2YXIgdD10aGlzLnoucmVkSW52bSgpO3JldHVybiB0aGlzLng9dGhpcy54LnJlZE11bCh0KSx0aGlzLnk9dGhpcy55LnJlZE11bCh0KSx0aGlzLnQmJih0aGlzLnQ9dGhpcy50LnJlZE11bCh0KSksdGhpcy56PXRoaXMuY3VydmUub25lLHRoaXMuek9uZT0hMCx0aGlzfSxpLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTmVnKCksdGhpcy55LHRoaXMueix0aGlzLnQmJnRoaXMudC5yZWROZWcoKSl9LGkucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKSx0aGlzLnguZnJvbVJlZCgpfSxpLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCksdGhpcy55LmZyb21SZWQoKX0saS5wcm90b3R5cGUuZXE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHwwPT09dGhpcy5nZXRYKCkuY21wKHQuZ2V0WCgpKSYmMD09PXRoaXMuZ2V0WSgpLmNtcCh0LmdldFkoKSl9LGkucHJvdG90eXBlLmVxWFRvUD1mdW5jdGlvbih0KXt2YXIgZT10LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwodGhpcy56KTtpZigwPT09dGhpcy54LmNtcChlKSlyZXR1cm4hMDtmb3IodmFyIHI9dC5jbG9uZSgpLG49dGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh0aGlzLnopOzspe2lmKHIuaWFkZCh0aGlzLmN1cnZlLm4pLHIuY21wKHRoaXMuY3VydmUucCk+PTApcmV0dXJuITE7aWYoZS5yZWRJQWRkKG4pLDA9PT10aGlzLnguY21wKGUpKXJldHVybiEwfXJldHVybiExfSxpLnByb3RvdHlwZS50b1A9aS5wcm90b3R5cGUubm9ybWFsaXplLGkucHJvdG90eXBlLm1peGVkQWRkPWkucHJvdG90eXBlLmFkZH0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCl7cy5jYWxsKHRoaXMsXCJtb250XCIsdCksdGhpcy5hPW5ldyBhKHQuYSwxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuYj1uZXcgYSh0LmIsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmk0PW5ldyBhKDQpLnRvUmVkKHRoaXMucmVkKS5yZWRJbnZtKCksdGhpcy50d289bmV3IGEoMikudG9SZWQodGhpcy5yZWQpLHRoaXMuYTI0PXRoaXMuaTQucmVkTXVsKHRoaXMuYS5yZWRBZGQodGhpcy50d28pKX1mdW5jdGlvbiBpKHQsZSxyKXtzLkJhc2VQb2ludC5jYWxsKHRoaXMsdCxcInByb2plY3RpdmVcIiksbnVsbD09PWUmJm51bGw9PT1yPyh0aGlzLng9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56PXRoaXMuY3VydmUuemVybyk6KHRoaXMueD1uZXcgYShlLDE2KSx0aGlzLno9bmV3IGEociwxNiksdGhpcy54LnJlZHx8KHRoaXMueD10aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnoucmVkfHwodGhpcy56PXRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCkpKX12YXIgbz1yKDk5KSxhPXIoMTgpLGY9cigyKSxzPW8uYmFzZSx1PXIoMTkpLGg9dS51dGlscztmKG4scyksdC5leHBvcnRzPW4sbi5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5ub3JtYWxpemUoKS54LHI9ZS5yZWRTcXIoKSxuPXIucmVkTXVsKGUpLnJlZEFkZChyLnJlZE11bCh0aGlzLmEpKS5yZWRBZGQoZSksaT1uLnJlZFNxcnQoKTtyZXR1cm4gMD09PWkucmVkU3FyKCkuY21wKG4pfSxmKGkscy5CYXNlUG9pbnQpLG4ucHJvdG90eXBlLmRlY29kZVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucG9pbnQoaC50b0FycmF5KHQsZSksMSl9LG4ucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHRoaXMsdCxlKX0sbi5wcm90b3R5cGUucG9pbnRGcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gaS5mcm9tSlNPTih0aGlzLHQpfSxpLnByb3RvdHlwZS5wcmVjb21wdXRlPWZ1bmN0aW9uKCl7fSxpLnByb3RvdHlwZS5fZW5jb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0WCgpLnRvQXJyYXkoXCJiZVwiLHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCkpfSxpLmZyb21KU09OPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZVswXSxlWzFdfHx0Lm9uZSl9LGkucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/XCI8RUMgUG9pbnQgSW5maW5pdHk+XCI6XCI8RUMgUG9pbnQgeDogXCIrdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwyKStcIiB6OiBcIit0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LDIpK1wiPlwifSxpLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnouY21wbigwKX0saS5wcm90b3R5cGUuZGJsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54LnJlZEFkZCh0aGlzLnopLGU9dC5yZWRTcXIoKSxyPXRoaXMueC5yZWRTdWIodGhpcy56KSxuPXIucmVkU3FyKCksaT1lLnJlZFN1YihuKSxvPWUucmVkTXVsKG4pLGE9aS5yZWRNdWwobi5yZWRBZGQodGhpcy5jdXJ2ZS5hMjQucmVkTXVsKGkpKSk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQobyxhKX0saS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlXCIpfSxpLnByb3RvdHlwZS5kaWZmQWRkPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy54LnJlZEFkZCh0aGlzLnopLG49dGhpcy54LnJlZFN1Yih0aGlzLnopLGk9dC54LnJlZEFkZCh0LnopLG89dC54LnJlZFN1Yih0LnopLGE9by5yZWRNdWwociksZj1pLnJlZE11bChuKSxzPWUuei5yZWRNdWwoYS5yZWRBZGQoZikucmVkU3FyKCkpLHU9ZS54LnJlZE11bChhLnJlZElTdWIoZikucmVkU3FyKCkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHMsdSl9LGkucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5jbG9uZSgpLHI9dGhpcyxuPXRoaXMuY3VydmUucG9pbnQobnVsbCxudWxsKSxpPXRoaXMsbz1bXTswIT09ZS5jbXBuKDApO2UuaXVzaHJuKDEpKW8ucHVzaChlLmFuZGxuKDEpKTtmb3IodmFyIGE9by5sZW5ndGgtMTthPj0wO2EtLSkwPT09b1thXT8ocj1yLmRpZmZBZGQobixpKSxuPW4uZGJsKCkpOihuPXIuZGlmZkFkZChuLGkpLHI9ci5kYmwoKSk7cmV0dXJuIG59LGkucHJvdG90eXBlLm11bEFkZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZVwiKX0saS5wcm90b3R5cGUuanVtbEFkZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZVwiKX0saS5wcm90b3R5cGUuZXE9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmdldFgoKS5jbXAodC5nZXRYKCkpfSxpLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PXRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSksdGhpcy56PXRoaXMuY3VydmUub25lLHRoaXN9LGkucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKSx0aGlzLnguZnJvbVJlZCgpfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCl7aC5jYWxsKHRoaXMsXCJzaG9ydFwiLHQpLHRoaXMuYT1uZXcgcyh0LmEsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmI9bmV3IHModC5iLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy50aW52PXRoaXMudHdvLnJlZEludm0oKSx0aGlzLnplcm9BPTA9PT10aGlzLmEuZnJvbVJlZCgpLmNtcG4oMCksdGhpcy50aHJlZUE9MD09PXRoaXMuYS5mcm9tUmVkKCkuc3ViKHRoaXMucCkuY21wbigtMyksdGhpcy5lbmRvPXRoaXMuX2dldEVuZG9tb3JwaGlzbSh0KSx0aGlzLl9lbmRvV25hZlQxPW5ldyBBcnJheSg0KSx0aGlzLl9lbmRvV25hZlQyPW5ldyBBcnJheSg0KX1mdW5jdGlvbiBpKHQsZSxyLG4pe2guQmFzZVBvaW50LmNhbGwodGhpcyx0LFwiYWZmaW5lXCIpLG51bGw9PT1lJiZudWxsPT09cj8odGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy5pbmY9ITApOih0aGlzLng9bmV3IHMoZSwxNiksdGhpcy55PW5ldyBzKHIsMTYpLG4mJih0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpLHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMueC5yZWR8fCh0aGlzLng9dGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy55LnJlZHx8KHRoaXMueT10aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLmluZj0hMSl9ZnVuY3Rpb24gbyh0LGUscixuKXtoLkJhc2VQb2ludC5jYWxsKHRoaXMsdCxcImphY29iaWFuXCIpLG51bGw9PT1lJiZudWxsPT09ciYmbnVsbD09PW4/KHRoaXMueD10aGlzLmN1cnZlLm9uZSx0aGlzLnk9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56PW5ldyBzKDApKToodGhpcy54PW5ldyBzKGUsMTYpLHRoaXMueT1uZXcgcyhyLDE2KSx0aGlzLno9bmV3IHMobiwxNikpLHRoaXMueC5yZWR8fCh0aGlzLng9dGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy55LnJlZHx8KHRoaXMueT10aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnoucmVkfHwodGhpcy56PXRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuek9uZT10aGlzLno9PT10aGlzLmN1cnZlLm9uZX12YXIgYT1yKDk5KSxmPXIoMTkpLHM9cigxOCksdT1yKDIpLGg9YS5iYXNlLGM9Zi51dGlscy5hc3NlcnQ7dShuLGgpLHQuZXhwb3J0cz1uLG4ucHJvdG90eXBlLl9nZXRFbmRvbW9ycGhpc209ZnVuY3Rpb24odCl7aWYodGhpcy56ZXJvQSYmdGhpcy5nJiZ0aGlzLm4mJjE9PT10aGlzLnAubW9kbigzKSl7dmFyIGUscjtpZih0LmJldGEpZT1uZXcgcyh0LmJldGEsMTYpLnRvUmVkKHRoaXMucmVkKTtlbHNle3ZhciBuPXRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApO2U9blswXS5jbXAoblsxXSk8MD9uWzBdOm5bMV0sZT1lLnRvUmVkKHRoaXMucmVkKX1pZih0LmxhbWJkYSlyPW5ldyBzKHQubGFtYmRhLDE2KTtlbHNle3ZhciBpPXRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pOzA9PT10aGlzLmcubXVsKGlbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChlKSk/cj1pWzBdOihyPWlbMV0sYygwPT09dGhpcy5nLm11bChyKS54LmNtcCh0aGlzLmcueC5yZWRNdWwoZSkpKSl9dmFyIG87cmV0dXJuIG89dC5iYXNpcz90LmJhc2lzLm1hcChmdW5jdGlvbih0KXtyZXR1cm57YTpuZXcgcyh0LmEsMTYpLGI6bmV3IHModC5iLDE2KX19KTp0aGlzLl9nZXRFbmRvQmFzaXMocikse2JldGE6ZSxsYW1iZGE6cixiYXNpczpvfX19LG4ucHJvdG90eXBlLl9nZXRFbmRvUm9vdHM9ZnVuY3Rpb24odCl7dmFyIGU9dD09PXRoaXMucD90aGlzLnJlZDpzLm1vbnQodCkscj1uZXcgcygyKS50b1JlZChlKS5yZWRJbnZtKCksbj1yLnJlZE5lZygpLGk9bmV3IHMoMykudG9SZWQoZSkucmVkTmVnKCkucmVkU3FydCgpLnJlZE11bChyKSxvPW4ucmVkQWRkKGkpLmZyb21SZWQoKSxhPW4ucmVkU3ViKGkpLmZyb21SZWQoKTtyZXR1cm5bbyxhXX0sbi5wcm90b3R5cGUuX2dldEVuZG9CYXNpcz1mdW5jdGlvbih0KXtmb3IodmFyIGUscixuLGksbyxhLGYsdSxoLGM9dGhpcy5uLnVzaHJuKE1hdGguZmxvb3IodGhpcy5uLmJpdExlbmd0aCgpLzIpKSxkPXQsbD10aGlzLm4uY2xvbmUoKSxwPW5ldyBzKDEpLGI9bmV3IHMoMCksdj1uZXcgcygwKSx5PW5ldyBzKDEpLG09MDswIT09ZC5jbXBuKDApOyl7dmFyIGc9bC5kaXYoZCk7dT1sLnN1YihnLm11bChkKSksaD12LnN1YihnLm11bChwKSk7dmFyIHc9eS5zdWIoZy5tdWwoYikpO2lmKCFuJiZ1LmNtcChjKTwwKWU9Zi5uZWcoKSxyPXAsbj11Lm5lZygpLGk9aDtlbHNlIGlmKG4mJjI9PT0rK20pYnJlYWs7Zj11LGw9ZCxkPXUsdj1wLHA9aCx5PWIsYj13fW89dS5uZWcoKSxhPWg7dmFyIF89bi5zcXIoKS5hZGQoaS5zcXIoKSksTT1vLnNxcigpLmFkZChhLnNxcigpKTtyZXR1cm4gTS5jbXAoXyk+PTAmJihvPWUsYT1yKSxuLm5lZ2F0aXZlJiYobj1uLm5lZygpLGk9aS5uZWcoKSksby5uZWdhdGl2ZSYmKG89by5uZWcoKSxhPWEubmVnKCkpLFt7YTpuLGI6aX0se2E6byxiOmF9XX0sbi5wcm90b3R5cGUuX2VuZG9TcGxpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmVuZG8uYmFzaXMscj1lWzBdLG49ZVsxXSxpPW4uYi5tdWwodCkuZGl2Um91bmQodGhpcy5uKSxvPXIuYi5uZWcoKS5tdWwodCkuZGl2Um91bmQodGhpcy5uKSxhPWkubXVsKHIuYSksZj1vLm11bChuLmEpLHM9aS5tdWwoci5iKSx1PW8ubXVsKG4uYiksaD10LnN1YihhKS5zdWIoZiksYz1zLmFkZCh1KS5uZWcoKTtyZXR1cm57azE6aCxrMjpjfX0sbi5wcm90b3R5cGUucG9pbnRGcm9tWD1mdW5jdGlvbih0LGUpe3Q9bmV3IHModCwxNiksdC5yZWR8fCh0PXQudG9SZWQodGhpcy5yZWQpKTt2YXIgcj10LnJlZFNxcigpLnJlZE11bCh0KS5yZWRJQWRkKHQucmVkTXVsKHRoaXMuYSkpLnJlZElBZGQodGhpcy5iKSxuPXIucmVkU3FydCgpO2lmKDAhPT1uLnJlZFNxcigpLnJlZFN1YihyKS5jbXAodGhpcy56ZXJvKSl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHBvaW50XCIpO3ZhciBpPW4uZnJvbVJlZCgpLmlzT2RkKCk7cmV0dXJuKGUmJiFpfHwhZSYmaSkmJihuPW4ucmVkTmVnKCkpLHRoaXMucG9pbnQodCxuKX0sbi5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24odCl7aWYodC5pbmYpcmV0dXJuITA7dmFyIGU9dC54LHI9dC55LG49dGhpcy5hLnJlZE11bChlKSxpPWUucmVkU3FyKCkucmVkTXVsKGUpLnJlZElBZGQobikucmVkSUFkZCh0aGlzLmIpO3JldHVybiAwPT09ci5yZWRTcXIoKS5yZWRJU3ViKGkpLmNtcG4oMCl9LG4ucHJvdG90eXBlLl9lbmRvV25hZk11bEFkZD1mdW5jdGlvbih0LGUscil7Zm9yKHZhciBuPXRoaXMuX2VuZG9XbmFmVDEsaT10aGlzLl9lbmRvV25hZlQyLG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIGE9dGhpcy5fZW5kb1NwbGl0KGVbb10pLGY9dFtvXSxzPWYuX2dldEJldGEoKTthLmsxLm5lZ2F0aXZlJiYoYS5rMS5pbmVnKCksZj1mLm5lZyghMCkpLGEuazIubmVnYXRpdmUmJihhLmsyLmluZWcoKSxzPXMubmVnKCEwKSksblsyKm9dPWYsblsyKm8rMV09cyxpWzIqb109YS5rMSxpWzIqbysxXT1hLmsyfWZvcih2YXIgdT10aGlzLl93bmFmTXVsQWRkKDEsbixpLDIqbyxyKSxoPTA7aDwyKm87aCsrKW5baF09bnVsbCxpW2hdPW51bGw7cmV0dXJuIHV9LHUoaSxoLkJhc2VQb2ludCksbi5wcm90b3R5cGUucG9pbnQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuZXcgaSh0aGlzLHQsZSxyKX0sbi5wcm90b3R5cGUucG9pbnRGcm9tSlNPTj1mdW5jdGlvbih0LGUpe3JldHVybiBpLmZyb21KU09OKHRoaXMsdCxlKX0saS5wcm90b3R5cGUuX2dldEJldGE9ZnVuY3Rpb24oKXtpZih0aGlzLmN1cnZlLmVuZG8pe3ZhciB0PXRoaXMucHJlY29tcHV0ZWQ7aWYodCYmdC5iZXRhKXJldHVybiB0LmJldGE7dmFyIGU9dGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTXVsKHRoaXMuY3VydmUuZW5kby5iZXRhKSx0aGlzLnkpO2lmKHQpe3ZhciByPXRoaXMuY3VydmUsbj1mdW5jdGlvbih0KXtyZXR1cm4gci5wb2ludCh0LngucmVkTXVsKHIuZW5kby5iZXRhKSx0LnkpfTt0LmJldGE9ZSxlLnByZWNvbXB1dGVkPXtiZXRhOm51bGwsbmFmOnQubmFmJiZ7d25kOnQubmFmLnduZCxwb2ludHM6dC5uYWYucG9pbnRzLm1hcChuKX0sZG91Ymxlczp0LmRvdWJsZXMmJntzdGVwOnQuZG91Ymxlcy5zdGVwLHBvaW50czp0LmRvdWJsZXMucG9pbnRzLm1hcChuKX19fXJldHVybiBlfX0saS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJlY29tcHV0ZWQ/W3RoaXMueCx0aGlzLnksdGhpcy5wcmVjb21wdXRlZCYme2RvdWJsZXM6dGhpcy5wcmVjb21wdXRlZC5kb3VibGVzJiZ7c3RlcDp0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMuc3RlcCxwb2ludHM6dGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnBvaW50cy5zbGljZSgxKX0sbmFmOnRoaXMucHJlY29tcHV0ZWQubmFmJiZ7d25kOnRoaXMucHJlY29tcHV0ZWQubmFmLnduZCxwb2ludHM6dGhpcy5wcmVjb21wdXRlZC5uYWYucG9pbnRzLnNsaWNlKDEpfX1dOlt0aGlzLngsdGhpcy55XX0saS5mcm9tSlNPTj1mdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbihlKXtyZXR1cm4gdC5wb2ludChlWzBdLGVbMV0scil9XCJzdHJpbmdcIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpO3ZhciBpPXQucG9pbnQoZVswXSxlWzFdLHIpO2lmKCFlWzJdKXJldHVybiBpO3ZhciBvPWVbMl07cmV0dXJuIGkucHJlY29tcHV0ZWQ9e2JldGE6bnVsbCxkb3VibGVzOm8uZG91YmxlcyYme3N0ZXA6by5kb3VibGVzLnN0ZXAscG9pbnRzOltpXS5jb25jYXQoby5kb3VibGVzLnBvaW50cy5tYXAobikpfSxuYWY6by5uYWYmJnt3bmQ6by5uYWYud25kLHBvaW50czpbaV0uY29uY2F0KG8ubmFmLnBvaW50cy5tYXAobikpfX0saX0saS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT9cIjxFQyBQb2ludCBJbmZpbml0eT5cIjpcIjxFQyBQb2ludCB4OiBcIit0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LDIpK1wiIHk6IFwiK3RoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrXCI+XCJ9LGkucHJvdG90eXBlLmlzSW5maW5pdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmZ9LGkucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0aGlzLmluZilyZXR1cm4gdDtpZih0LmluZilyZXR1cm4gdGhpcztpZih0aGlzLmVxKHQpKXJldHVybiB0aGlzLmRibCgpO2lmKHRoaXMubmVnKCkuZXEodCkpcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCxudWxsKTtpZigwPT09dGhpcy54LmNtcCh0LngpKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7dmFyIGU9dGhpcy55LnJlZFN1Yih0LnkpOzAhPT1lLmNtcG4oMCkmJihlPWUucmVkTXVsKHRoaXMueC5yZWRTdWIodC54KS5yZWRJbnZtKCkpKTt2YXIgcj1lLnJlZFNxcigpLnJlZElTdWIodGhpcy54KS5yZWRJU3ViKHQueCksbj1lLnJlZE11bCh0aGlzLngucmVkU3ViKHIpKS5yZWRJU3ViKHRoaXMueSk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQocixuKX0saS5wcm90b3R5cGUuZGJsPWZ1bmN0aW9uKCl7aWYodGhpcy5pbmYpcmV0dXJuIHRoaXM7dmFyIHQ9dGhpcy55LnJlZEFkZCh0aGlzLnkpO2lmKDA9PT10LmNtcG4oMCkpcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCxudWxsKTt2YXIgZT10aGlzLmN1cnZlLmEscj10aGlzLngucmVkU3FyKCksbj10LnJlZEludm0oKSxpPXIucmVkQWRkKHIpLnJlZElBZGQocikucmVkSUFkZChlKS5yZWRNdWwobiksbz1pLnJlZFNxcigpLnJlZElTdWIodGhpcy54LnJlZEFkZCh0aGlzLngpKSxhPWkucmVkTXVsKHRoaXMueC5yZWRTdWIobykpLnJlZElTdWIodGhpcy55KTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChvLGEpfSxpLnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueC5mcm9tUmVkKCl9LGkucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55LmZyb21SZWQoKX0saS5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVybiB0PW5ldyBzKHQsMTYpLHRoaXMuX2hhc0RvdWJsZXModCk/dGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcyx0KTp0aGlzLmN1cnZlLmVuZG8/dGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoW3RoaXNdLFt0XSk6dGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLHQpfSxpLnByb3RvdHlwZS5tdWxBZGQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVt0aGlzLGVdLGk9W3Qscl07cmV0dXJuIHRoaXMuY3VydmUuZW5kbz90aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChuLGkpOnRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxuLGksMil9LGkucHJvdG90eXBlLmptdWxBZGQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVt0aGlzLGVdLGk9W3Qscl07cmV0dXJuIHRoaXMuY3VydmUuZW5kbz90aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChuLGksITApOnRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxuLGksMiwhMCl9LGkucHJvdG90eXBlLmVxPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzPT09dHx8dGhpcy5pbmY9PT10LmluZiYmKHRoaXMuaW5mfHwwPT09dGhpcy54LmNtcCh0LngpJiYwPT09dGhpcy55LmNtcCh0LnkpKX0saS5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaW5mKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuY3VydmUucG9pbnQodGhpcy54LHRoaXMueS5yZWROZWcoKSk7aWYodCYmdGhpcy5wcmVjb21wdXRlZCl7dmFyIHI9dGhpcy5wcmVjb21wdXRlZCxuPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm5lZygpfTtlLnByZWNvbXB1dGVkPXtuYWY6ci5uYWYmJnt3bmQ6ci5uYWYud25kLHBvaW50czpyLm5hZi5wb2ludHMubWFwKG4pfSxkb3VibGVzOnIuZG91YmxlcyYme3N0ZXA6ci5kb3VibGVzLnN0ZXAscG9pbnRzOnIuZG91Ymxlcy5wb2ludHMubWFwKG4pfX19cmV0dXJuIGV9LGkucHJvdG90eXBlLnRvSj1mdW5jdGlvbigpe2lmKHRoaXMuaW5mKXJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLG51bGwsbnVsbCk7dmFyIHQ9dGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LHRoaXMueSx0aGlzLmN1cnZlLm9uZSk7cmV0dXJuIHR9LHUobyxoLkJhc2VQb2ludCksbi5wcm90b3R5cGUuanBvaW50PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IG8odGhpcyx0LGUscil9LG8ucHJvdG90eXBlLnRvUD1mdW5jdGlvbigpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7dmFyIHQ9dGhpcy56LnJlZEludm0oKSxlPXQucmVkU3FyKCkscj10aGlzLngucmVkTXVsKGUpLG49dGhpcy55LnJlZE11bChlKS5yZWRNdWwodCk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQocixuKX0sby5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHRoaXMueCx0aGlzLnkucmVkTmVnKCksdGhpcy56KX0sby5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiB0O2lmKHQuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzO3ZhciBlPXQuei5yZWRTcXIoKSxyPXRoaXMuei5yZWRTcXIoKSxuPXRoaXMueC5yZWRNdWwoZSksaT10LngucmVkTXVsKHIpLG89dGhpcy55LnJlZE11bChlLnJlZE11bCh0LnopKSxhPXQueS5yZWRNdWwoci5yZWRNdWwodGhpcy56KSksZj1uLnJlZFN1YihpKSxzPW8ucmVkU3ViKGEpO2lmKDA9PT1mLmNtcG4oMCkpcmV0dXJuIDAhPT1zLmNtcG4oMCk/dGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCxudWxsLG51bGwpOnRoaXMuZGJsKCk7dmFyIHU9Zi5yZWRTcXIoKSxoPXUucmVkTXVsKGYpLGM9bi5yZWRNdWwodSksZD1zLnJlZFNxcigpLnJlZElBZGQoaCkucmVkSVN1YihjKS5yZWRJU3ViKGMpLGw9cy5yZWRNdWwoYy5yZWRJU3ViKGQpKS5yZWRJU3ViKG8ucmVkTXVsKGgpKSxwPXRoaXMuei5yZWRNdWwodC56KS5yZWRNdWwoZik7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGQsbCxwKX0sby5wcm90b3R5cGUubWl4ZWRBZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5pc0luZmluaXR5KCkpcmV0dXJuIHQudG9KKCk7aWYodC5pc0luZmluaXR5KCkpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy56LnJlZFNxcigpLHI9dGhpcy54LG49dC54LnJlZE11bChlKSxpPXRoaXMueSxvPXQueS5yZWRNdWwoZSkucmVkTXVsKHRoaXMueiksYT1yLnJlZFN1YihuKSxmPWkucmVkU3ViKG8pO2lmKDA9PT1hLmNtcG4oMCkpcmV0dXJuIDAhPT1mLmNtcG4oMCk/dGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCxudWxsLG51bGwpOnRoaXMuZGJsKCk7dmFyIHM9YS5yZWRTcXIoKSx1PXMucmVkTXVsKGEpLGg9ci5yZWRNdWwocyksYz1mLnJlZFNxcigpLnJlZElBZGQodSkucmVkSVN1YihoKS5yZWRJU3ViKGgpLGQ9Zi5yZWRNdWwoaC5yZWRJU3ViKGMpKS5yZWRJU3ViKGkucmVkTXVsKHUpKSxsPXRoaXMuei5yZWRNdWwoYSk7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGMsZCxsKX0sby5wcm90b3R5cGUuZGJscD1mdW5jdGlvbih0KXtpZigwPT09dClyZXR1cm4gdGhpcztpZih0aGlzLmlzSW5maW5pdHkoKSlyZXR1cm4gdGhpcztpZighdClyZXR1cm4gdGhpcy5kYmwoKTtpZih0aGlzLmN1cnZlLnplcm9BfHx0aGlzLmN1cnZlLnRocmVlQSl7Zm9yKHZhciBlPXRoaXMscj0wO3I8dDtyKyspZT1lLmRibCgpO3JldHVybiBlfWZvcih2YXIgbj10aGlzLmN1cnZlLmEsaT10aGlzLmN1cnZlLnRpbnYsbz10aGlzLngsYT10aGlzLnksZj10aGlzLnoscz1mLnJlZFNxcigpLnJlZFNxcigpLHU9YS5yZWRBZGQoYSkscj0wO3I8dDtyKyspe3ZhciBoPW8ucmVkU3FyKCksYz11LnJlZFNxcigpLGQ9Yy5yZWRTcXIoKSxsPWgucmVkQWRkKGgpLnJlZElBZGQoaCkucmVkSUFkZChuLnJlZE11bChzKSkscD1vLnJlZE11bChjKSxiPWwucmVkU3FyKCkucmVkSVN1YihwLnJlZEFkZChwKSksdj1wLnJlZElTdWIoYikseT1sLnJlZE11bCh2KTt5PXkucmVkSUFkZCh5KS5yZWRJU3ViKGQpO3ZhciBtPXUucmVkTXVsKGYpO3IrMTx0JiYocz1zLnJlZE11bChkKSksbz1iLGY9bSx1PXl9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG8sdS5yZWRNdWwoaSksZil9LG8ucHJvdG90eXBlLmRibD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT90aGlzOnRoaXMuY3VydmUuemVyb0E/dGhpcy5femVyb0RibCgpOnRoaXMuY3VydmUudGhyZWVBP3RoaXMuX3RocmVlRGJsKCk6dGhpcy5fZGJsKCl9LG8ucHJvdG90eXBlLl96ZXJvRGJsPWZ1bmN0aW9uKCl7dmFyIHQsZSxyO2lmKHRoaXMuek9uZSl7dmFyIG49dGhpcy54LnJlZFNxcigpLGk9dGhpcy55LnJlZFNxcigpLG89aS5yZWRTcXIoKSxhPXRoaXMueC5yZWRBZGQoaSkucmVkU3FyKCkucmVkSVN1YihuKS5yZWRJU3ViKG8pO2E9YS5yZWRJQWRkKGEpO3ZhciBmPW4ucmVkQWRkKG4pLnJlZElBZGQobikscz1mLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihhKSx1PW8ucmVkSUFkZChvKTt1PXUucmVkSUFkZCh1KSx1PXUucmVkSUFkZCh1KSx0PXMsZT1mLnJlZE11bChhLnJlZElTdWIocykpLnJlZElTdWIodSkscj10aGlzLnkucmVkQWRkKHRoaXMueSl9ZWxzZXt2YXIgaD10aGlzLngucmVkU3FyKCksYz10aGlzLnkucmVkU3FyKCksZD1jLnJlZFNxcigpLGw9dGhpcy54LnJlZEFkZChjKS5yZWRTcXIoKS5yZWRJU3ViKGgpLnJlZElTdWIoZCk7bD1sLnJlZElBZGQobCk7dmFyIHA9aC5yZWRBZGQoaCkucmVkSUFkZChoKSxiPXAucmVkU3FyKCksdj1kLnJlZElBZGQoZCk7dj12LnJlZElBZGQodiksdj12LnJlZElBZGQodiksdD1iLnJlZElTdWIobCkucmVkSVN1YihsKSxlPXAucmVkTXVsKGwucmVkSVN1Yih0KSkucmVkSVN1Yih2KSxyPXRoaXMueS5yZWRNdWwodGhpcy56KSxyPXIucmVkSUFkZChyKX1yZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQodCxlLHIpfSxvLnByb3RvdHlwZS5fdGhyZWVEYmw9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7aWYodGhpcy56T25lKXt2YXIgbj10aGlzLngucmVkU3FyKCksaT10aGlzLnkucmVkU3FyKCksbz1pLnJlZFNxcigpLGE9dGhpcy54LnJlZEFkZChpKS5yZWRTcXIoKS5yZWRJU3ViKG4pLnJlZElTdWIobyk7YT1hLnJlZElBZGQoYSk7dmFyIGY9bi5yZWRBZGQobikucmVkSUFkZChuKS5yZWRJQWRkKHRoaXMuY3VydmUuYSkscz1mLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihhKTt0PXM7dmFyIHU9by5yZWRJQWRkKG8pO3U9dS5yZWRJQWRkKHUpLHU9dS5yZWRJQWRkKHUpLGU9Zi5yZWRNdWwoYS5yZWRJU3ViKHMpKS5yZWRJU3ViKHUpLHI9dGhpcy55LnJlZEFkZCh0aGlzLnkpfWVsc2V7dmFyIGg9dGhpcy56LnJlZFNxcigpLGM9dGhpcy55LnJlZFNxcigpLGQ9dGhpcy54LnJlZE11bChjKSxsPXRoaXMueC5yZWRTdWIoaCkucmVkTXVsKHRoaXMueC5yZWRBZGQoaCkpO2w9bC5yZWRBZGQobCkucmVkSUFkZChsKTt2YXIgcD1kLnJlZElBZGQoZCk7cD1wLnJlZElBZGQocCk7dmFyIGI9cC5yZWRBZGQocCk7dD1sLnJlZFNxcigpLnJlZElTdWIoYikscj10aGlzLnkucmVkQWRkKHRoaXMueikucmVkU3FyKCkucmVkSVN1YihjKS5yZWRJU3ViKGgpO3ZhciB2PWMucmVkU3FyKCk7dj12LnJlZElBZGQodiksdj12LnJlZElBZGQodiksdj12LnJlZElBZGQodiksZT1sLnJlZE11bChwLnJlZElTdWIodCkpLnJlZElTdWIodil9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHQsZSxyKX0sby5wcm90b3R5cGUuX2RibD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY3VydmUuYSxlPXRoaXMueCxyPXRoaXMueSxuPXRoaXMueixpPW4ucmVkU3FyKCkucmVkU3FyKCksbz1lLnJlZFNxcigpLGE9ci5yZWRTcXIoKSxmPW8ucmVkQWRkKG8pLnJlZElBZGQobykucmVkSUFkZCh0LnJlZE11bChpKSkscz1lLnJlZEFkZChlKTtzPXMucmVkSUFkZChzKTt2YXIgdT1zLnJlZE11bChhKSxoPWYucmVkU3FyKCkucmVkSVN1Yih1LnJlZEFkZCh1KSksYz11LnJlZElTdWIoaCksZD1hLnJlZFNxcigpO2Q9ZC5yZWRJQWRkKGQpLGQ9ZC5yZWRJQWRkKGQpLGQ9ZC5yZWRJQWRkKGQpO3ZhciBsPWYucmVkTXVsKGMpLnJlZElTdWIoZCkscD1yLnJlZEFkZChyKS5yZWRNdWwobik7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGgsbCxwKX0sby5wcm90b3R5cGUudHJwbD1mdW5jdGlvbigpe2lmKCF0aGlzLmN1cnZlLnplcm9BKXJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTt2YXIgdD10aGlzLngucmVkU3FyKCksZT10aGlzLnkucmVkU3FyKCkscj10aGlzLnoucmVkU3FyKCksbj1lLnJlZFNxcigpLGk9dC5yZWRBZGQodCkucmVkSUFkZCh0KSxvPWkucmVkU3FyKCksYT10aGlzLngucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIodCkucmVkSVN1YihuKTthPWEucmVkSUFkZChhKSxhPWEucmVkQWRkKGEpLnJlZElBZGQoYSksYT1hLnJlZElTdWIobyk7dmFyIGY9YS5yZWRTcXIoKSxzPW4ucmVkSUFkZChuKTtzPXMucmVkSUFkZChzKSxzPXMucmVkSUFkZChzKSxzPXMucmVkSUFkZChzKTt2YXIgdT1pLnJlZElBZGQoYSkucmVkU3FyKCkucmVkSVN1YihvKS5yZWRJU3ViKGYpLnJlZElTdWIocyksaD1lLnJlZE11bCh1KTtoPWgucmVkSUFkZChoKSxoPWgucmVkSUFkZChoKTt2YXIgYz10aGlzLngucmVkTXVsKGYpLnJlZElTdWIoaCk7Yz1jLnJlZElBZGQoYyksYz1jLnJlZElBZGQoYyk7dmFyIGQ9dGhpcy55LnJlZE11bCh1LnJlZE11bChzLnJlZElTdWIodSkpLnJlZElTdWIoYS5yZWRNdWwoZikpKTtkPWQucmVkSUFkZChkKSxkPWQucmVkSUFkZChkKSxkPWQucmVkSUFkZChkKTt2YXIgbD10aGlzLnoucmVkQWRkKGEpLnJlZFNxcigpLnJlZElTdWIocikucmVkSVN1YihmKTtyZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoYyxkLGwpfSxvLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1uZXcgcyh0LGUpLHRoaXMuY3VydmUuX3duYWZNdWwodGhpcyx0KX0sby5wcm90b3R5cGUuZXE9ZnVuY3Rpb24odCl7aWYoXCJhZmZpbmVcIj09PXQudHlwZSlyZXR1cm4gdGhpcy5lcSh0LnRvSigpKTtpZih0aGlzPT09dClyZXR1cm4hMDt2YXIgZT10aGlzLnoucmVkU3FyKCkscj10LnoucmVkU3FyKCk7aWYoMCE9PXRoaXMueC5yZWRNdWwocikucmVkSVN1Yih0LngucmVkTXVsKGUpKS5jbXBuKDApKXJldHVybiExO3ZhciBuPWUucmVkTXVsKHRoaXMueiksaT1yLnJlZE11bCh0LnopO3JldHVybiAwPT09dGhpcy55LnJlZE11bChpKS5yZWRJU3ViKHQueS5yZWRNdWwobikpLmNtcG4oMCl9LG8ucHJvdG90eXBlLmVxWFRvUD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnoucmVkU3FyKCkscj10LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwoZSk7aWYoMD09PXRoaXMueC5jbXAocikpcmV0dXJuITA7Zm9yKHZhciBuPXQuY2xvbmUoKSxpPXRoaXMuY3VydmUucmVkTi5yZWRNdWwoZSk7Oyl7aWYobi5pYWRkKHRoaXMuY3VydmUubiksbi5jbXAodGhpcy5jdXJ2ZS5wKT49MClyZXR1cm4hMTtpZihyLnJlZElBZGQoaSksMD09PXRoaXMueC5jbXAocikpcmV0dXJuITB9cmV0dXJuITF9LG8ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/XCI8RUMgSlBvaW50IEluZmluaXR5PlwiOlwiPEVDIEpQb2ludCB4OiBcIit0aGlzLngudG9TdHJpbmcoMTYsMikrXCIgeTogXCIrdGhpcy55LnRvU3RyaW5nKDE2LDIpK1wiIHo6IFwiK3RoaXMuei50b1N0cmluZygxNiwyKStcIj5cIn0sby5wcm90b3R5cGUuaXNJbmZpbml0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy56LmNtcG4oMCl9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtcInNob3J0XCI9PT10LnR5cGU/dGhpcy5jdXJ2ZT1uZXcgZi5jdXJ2ZS5zaG9ydCh0KTpcImVkd2FyZHNcIj09PXQudHlwZT90aGlzLmN1cnZlPW5ldyBmLmN1cnZlLmVkd2FyZHModCk6dGhpcy5jdXJ2ZT1uZXcgZi5jdXJ2ZS5tb250KHQpLHRoaXMuZz10aGlzLmN1cnZlLmcsdGhpcy5uPXRoaXMuY3VydmUubix0aGlzLmhhc2g9dC5oYXNoLHModGhpcy5nLnZhbGlkYXRlKCksXCJJbnZhbGlkIGN1cnZlXCIpLHModGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSxcIkludmFsaWQgY3VydmUsIEcqTiAhPSBPXCIpfWZ1bmN0aW9uIGkodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkobyx0LHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgcj1uZXcgbihlKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sdCx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6cn0pLHJ9fSl9dmFyIG89ZSxhPXIoNDkpLGY9cigxOSkscz1mLnV0aWxzLmFzc2VydDtvLlByZXNldEN1cnZlPW4saShcInAxOTJcIix7dHlwZTpcInNob3J0XCIscHJpbWU6XCJwMTkyXCIscDpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmXCIsYTpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZjXCIsYjpcIjY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxXCIsbjpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDk5ZGVmODM2IDE0NmJjOWIxIGI0ZDIyODMxXCIsaGFzaDphLnNoYTI1NixnUmVkOiExLGc6W1wiMTg4ZGE4MGUgYjAzMDkwZjYgN2NiZjIwZWIgNDNhMTg4MDAgZjRmZjBhZmQgODJmZjEwMTJcIixcIjA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExXCJdfSksaShcInAyMjRcIix7dHlwZTpcInNob3J0XCIscHJpbWU6XCJwMjI0XCIscDpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxXCIsYTpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlXCIsYjpcImI0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0XCIsbjpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmYxNmEyIGUwYjhmMDNlIDEzZGQyOTQ1IDVjNWMyYTNkXCIsaGFzaDphLnNoYTI1NixnUmVkOiExLGc6W1wiYjcwZTBjYmQgNmJiNGJmN2YgMzIxMzkwYjkgNGEwM2MxZDMgNTZjMjExMjIgMzQzMjgwZDYgMTE1YzFkMjFcIixcImJkMzc2Mzg4IGI1ZjcyM2ZiIDRjMjJkZmU2IGNkNDM3NWEwIDVhMDc0NzY0IDQ0ZDU4MTk5IDg1MDA3ZTM0XCJdfSksaShcInAyNTZcIix7XG50eXBlOlwic2hvcnRcIixwcmltZTpudWxsLHA6XCJmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZlwiLGE6XCJmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmY1wiLGI6XCI1YWM2MzVkOCBhYTNhOTNlNyBiM2ViYmQ1NSA3Njk4ODZiYyA2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YlwiLG46XCJmZmZmZmZmZiAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MVwiLGhhc2g6YS5zaGEyNTYsZ1JlZDohMSxnOltcIjZiMTdkMWYyIGUxMmM0MjQ3IGY4YmNlNmU1IDYzYTQ0MGYyIDc3MDM3ZDgxIDJkZWIzM2EwIGY0YTEzOTQ1IGQ4OThjMjk2XCIsXCI0ZmUzNDJlMiBmZTFhN2Y5YiA4ZWU3ZWI0YSA3YzBmOWUxNiAyYmNlMzM1NyA2YjMxNWVjZSBjYmI2NDA2OCAzN2JmNTFmNVwiXX0pLGkoXCJwMzg0XCIse3R5cGU6XCJzaG9ydFwiLHByaW1lOm51bGwscDpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmXCIsYTpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZjXCIsYjpcImIzMzEyZmE3IGUyM2VlN2U0IDk4OGUwNTZiIGUzZjgyZDE5IDE4MWQ5YzZlIGZlODE0MTEyIDAzMTQwODhmIDUwMTM4NzVhIGM2NTYzOThkIDhhMmVkMTlkIDJhODVjOGVkIGQzZWMyYWVmXCIsbjpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxIGY0MzcyZGRmIDU4MWEwZGIyIDQ4YjBhNzdhIGVjZWMxOTZhIGNjYzUyOTczXCIsaGFzaDphLnNoYTM4NCxnUmVkOiExLGc6W1wiYWE4N2NhMjIgYmU4YjA1MzcgOGViMWM3MWUgZjMyMGFkNzQgNmUxZDNiNjIgOGJhNzliOTggNTlmNzQxZTAgODI1NDJhMzggNTUwMmYyNWQgYmY1NTI5NmMgM2E1NDVlMzggNzI3NjBhYjdcIixcIjM2MTdkZTRhIDk2MjYyYzZmIDVkOWU5OGJmIDkyOTJkYzI5IGY4ZjQxZGJkIDI4OWExNDdjIGU5ZGEzMTEzIGI1ZjBiOGMwIDBhNjBiMWNlIDFkN2U4MTlkIDdhNDMxZDdjIDkwZWEwZTVmXCJdfSksaShcInA1MjFcIix7dHlwZTpcInNob3J0XCIscHJpbWU6bnVsbCxwOlwiMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmZcIixhOlwiMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmNcIixiOlwiMDAwMDAwNTEgOTUzZWI5NjEgOGUxYzlhMWYgOTI5YTIxYTAgYjY4NTQwZWUgYTJkYTcyNWIgOTliMzE1ZjMgYjhiNDg5OTEgOGVmMTA5ZTEgNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgM2JiMWJmMDcgMzU3M2RmODggM2QyYzM0ZjEgZWY0NTFmZDQgNmI1MDNmMDBcIixuOlwiMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmEgNTE4Njg3ODMgYmYyZjk2NmIgN2ZjYzAxNDggZjcwOWE1ZDAgM2JiNWM5YjggODk5YzQ3YWUgYmI2ZmI3MWUgOTEzODY0MDlcIixoYXNoOmEuc2hhNTEyLGdSZWQ6ITEsZzpbXCIwMDAwMDBjNiA4NThlMDZiNyAwNDA0ZTljZCA5ZTNlY2I2NiAyMzk1YjQ0MiA5YzY0ODEzOSAwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYSBhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyBhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NlwiLFwiMDAwMDAxMTggMzkyOTZhNzggOWEzYmMwMDQgNWM4YTVmYjQgMmM3ZDFiZDkgOThmNTQ0NDkgNTc5YjQ0NjggMTdhZmJkMTcgMjczZTY2MmMgOTdlZTcyOTkgNWVmNDI2NDAgYzU1MGI5MDEgM2ZhZDA3NjEgMzUzYzcwODYgYTI3MmMyNDAgODhiZTk0NzYgOWZkMTY2NTBcIl19KSxpKFwiY3VydmUyNTUxOVwiLHt0eXBlOlwibW9udFwiLHByaW1lOlwicDI1NTE5XCIscDpcIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWRcIixhOlwiNzZkMDZcIixiOlwiMFwiLG46XCIxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkXCIsaGFzaDphLnNoYTI1NixnUmVkOiExLGc6W1wiOVwiXX0pLGkoXCJlZDI1NTE5XCIse3R5cGU6XCJlZHdhcmRzXCIscHJpbWU6XCJwMjU1MTlcIixwOlwiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZFwiLGE6XCItMVwiLGM6XCIxXCIsZDpcIjUyMDM2Y2VlMmI2ZmZlNzMgOGNjNzQwNzk3Nzc5ZTg5OCAwMDcwMGE0ZDQxNDFkOGFiIDc1ZWI0ZGNhMTM1OTc4YTNcIixuOlwiMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZFwiLGhhc2g6YS5zaGEyNTYsZ1JlZDohMSxnOltcIjIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWFcIixcIjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NThcIl19KTt2YXIgdTt0cnl7dT1yKDUyMCl9Y2F0Y2godCl7dT12b2lkIDB9aShcInNlY3AyNTZrMVwiLHt0eXBlOlwic2hvcnRcIixwcmltZTpcImsyNTZcIixwOlwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmZcIixhOlwiMFwiLGI6XCI3XCIsbjpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGJhYWVkY2U2IGFmNDhhMDNiIGJmZDI1ZThjIGQwMzY0MTQxXCIsaDpcIjFcIixoYXNoOmEuc2hhMjU2LGJldGE6XCI3YWU5NmEyYjY1N2MwNzEwNmU2NDQ3OWVhYzM0MzRlOTljZjA0OTc1MTJmNTg5OTVjMTM5NmMyODcxOTUwMWVlXCIsbGFtYmRhOlwiNTM2M2FkNGNjMDVjMzBlMGE1MjYxYzAyODgxMjY0NWExMjJlMjJlYTIwODE2Njc4ZGYwMjk2N2MxYjIzYmQ3MlwiLGJhc2lzOlt7YTpcIjMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1XCIsYjpcIi1lNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjM1wifSx7YTpcIjExNGNhNTBmN2E4ZTJmM2Y2NTdjMTEwOGQ5ZDQ0Y2ZkOFwiLGI6XCIzMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNVwifV0sZ1JlZDohMSxnOltcIjc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwYjA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmODE3OThcIixcIjQ4M2FkYTc3MjZhM2M0NjU1ZGE0ZmJmYzBlMTEwOGE4ZmQxN2I0NDhhNjg1NTQxOTljNDdkMDhmZmIxMGQ0YjhcIix1XX0pfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG4/KFwic3RyaW5nXCI9PXR5cGVvZiB0JiYoZihvLmN1cnZlcy5oYXNPd25Qcm9wZXJ0eSh0KSxcIlVua25vd24gY3VydmUgXCIrdCksdD1vLmN1cnZlc1t0XSksdCBpbnN0YW5jZW9mIG8uY3VydmVzLlByZXNldEN1cnZlJiYodD17Y3VydmU6dH0pLHRoaXMuY3VydmU9dC5jdXJ2ZS5jdXJ2ZSx0aGlzLm49dGhpcy5jdXJ2ZS5uLHRoaXMubmg9dGhpcy5uLnVzaHJuKDEpLHRoaXMuZz10aGlzLmN1cnZlLmcsdGhpcy5nPXQuY3VydmUuZyx0aGlzLmcucHJlY29tcHV0ZSh0LmN1cnZlLm4uYml0TGVuZ3RoKCkrMSksdm9pZCh0aGlzLmhhc2g9dC5oYXNofHx0LmN1cnZlLmhhc2gpKTpuZXcgbih0KX12YXIgaT1yKDE4KSxvPXIoMTkpLGE9by51dGlscyxmPWEuYXNzZXJ0LHM9cig1MTQpLHU9cig1MTUpO3QuZXhwb3J0cz1uLG4ucHJvdG90eXBlLmtleVBhaXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBzKHRoaXMsdCl9LG4ucHJvdG90eXBlLmtleUZyb21Qcml2YXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHMuZnJvbVByaXZhdGUodGhpcyx0LGUpfSxuLnByb3RvdHlwZS5rZXlGcm9tUHVibGljPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHMuZnJvbVB1YmxpYyh0aGlzLHQsZSl9LG4ucHJvdG90eXBlLmdlbktleVBhaXI9ZnVuY3Rpb24odCl7dHx8KHQ9e30pO2Zvcih2YXIgZT1uZXcgby5obWFjRFJCRyh7aGFzaDp0aGlzLmhhc2gscGVyczp0LnBlcnMsZW50cm9weTp0LmVudHJvcHl8fG8ucmFuZCh0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSxub25jZTp0aGlzLm4udG9BcnJheSgpfSkscj10aGlzLm4uYnl0ZUxlbmd0aCgpLG49dGhpcy5uLnN1YihuZXcgaSgyKSk7Oyl7dmFyIGE9bmV3IGkoZS5nZW5lcmF0ZShyKSk7aWYoIShhLmNtcChuKT4wKSlyZXR1cm4gYS5pYWRkbigxKSx0aGlzLmtleUZyb21Qcml2YXRlKGEpfX0sbi5wcm90b3R5cGUuX3RydW5jYXRlVG9OPWZ1bmN0aW9uKHQsZSl7dmFyIHI9OCp0LmJ5dGVMZW5ndGgoKS10aGlzLm4uYml0TGVuZ3RoKCk7cmV0dXJuIHI+MCYmKHQ9dC51c2hybihyKSksIWUmJnQuY21wKHRoaXMubik+PTA/dC5zdWIodGhpcy5uKTp0fSxuLnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKHQsZSxyLG4pe1wib2JqZWN0XCI9PXR5cGVvZiByJiYobj1yLHI9bnVsbCksbnx8KG49e30pLGU9dGhpcy5rZXlGcm9tUHJpdmF0ZShlLHIpLHQ9dGhpcy5fdHJ1bmNhdGVUb04obmV3IGkodCwxNikpO2Zvcih2YXIgYT10aGlzLm4uYnl0ZUxlbmd0aCgpLGY9ZS5nZXRQcml2YXRlKCkudG9BcnJheShcImJlXCIsYSkscz10LnRvQXJyYXkoXCJiZVwiLGEpLGg9bmV3IG8uaG1hY0RSQkcoe2hhc2g6dGhpcy5oYXNoLGVudHJvcHk6Zixub25jZTpzLHBlcnM6bi5wZXJzLHBlcnNFbmM6bi5wZXJzRW5jfSksYz10aGlzLm4uc3ViKG5ldyBpKDEpKSxkPTA7ITA7ZCsrKXt2YXIgbD1uLms/bi5rKGQpOm5ldyBpKGguZ2VuZXJhdGUodGhpcy5uLmJ5dGVMZW5ndGgoKSkpO2lmKGw9dGhpcy5fdHJ1bmNhdGVUb04obCwhMCksIShsLmNtcG4oMSk8PTB8fGwuY21wKGMpPj0wKSl7dmFyIHA9dGhpcy5nLm11bChsKTtpZighcC5pc0luZmluaXR5KCkpe3ZhciBiPXAuZ2V0WCgpLHY9Yi51bW9kKHRoaXMubik7aWYoMCE9PXYuY21wbigwKSl7dmFyIHk9bC5pbnZtKHRoaXMubikubXVsKHYubXVsKGUuZ2V0UHJpdmF0ZSgpKS5pYWRkKHQpKTtpZih5PXkudW1vZCh0aGlzLm4pLDAhPT15LmNtcG4oMCkpe3ZhciBtPShwLmdldFkoKS5pc09kZCgpPzE6MCl8KDAhPT1iLmNtcCh2KT8yOjApO3JldHVybiBuLmNhbm9uaWNhbCYmeS5jbXAodGhpcy5uaCk+MCYmKHk9dGhpcy5uLnN1Yih5KSxtXj0xKSxuZXcgdSh7cjp2LHM6eSxyZWNvdmVyeVBhcmFtOm19KX19fX19fSxuLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24odCxlLHIsbil7dD10aGlzLl90cnVuY2F0ZVRvTihuZXcgaSh0LDE2KSkscj10aGlzLmtleUZyb21QdWJsaWMocixuKSxlPW5ldyB1KGUsXCJoZXhcIik7dmFyIG89ZS5yLGE9ZS5zO2lmKG8uY21wbigxKTwwfHxvLmNtcCh0aGlzLm4pPj0wKXJldHVybiExO2lmKGEuY21wbigxKTwwfHxhLmNtcCh0aGlzLm4pPj0wKXJldHVybiExO3ZhciBmPWEuaW52bSh0aGlzLm4pLHM9Zi5tdWwodCkudW1vZCh0aGlzLm4pLGg9Zi5tdWwobykudW1vZCh0aGlzLm4pO2lmKCF0aGlzLmN1cnZlLl9tYXh3ZWxsVHJpY2spe3ZhciBjPXRoaXMuZy5tdWxBZGQocyxyLmdldFB1YmxpYygpLGgpO3JldHVybiFjLmlzSW5maW5pdHkoKSYmMD09PWMuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAobyl9dmFyIGM9dGhpcy5nLmptdWxBZGQocyxyLmdldFB1YmxpYygpLGgpO3JldHVybiFjLmlzSW5maW5pdHkoKSYmYy5lcVhUb1Aobyl9LG4ucHJvdG90eXBlLnJlY292ZXJQdWJLZXk9ZnVuY3Rpb24odCxlLHIsbil7ZigoMyZyKT09PXIsXCJUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzXCIpLGU9bmV3IHUoZSxuKTt2YXIgbz10aGlzLm4sYT1uZXcgaSh0KSxzPWUucixoPWUucyxjPTEmcixkPXI+PjE7aWYocy5jbXAodGhpcy5jdXJ2ZS5wLnVtb2QodGhpcy5jdXJ2ZS5uKSk+PTAmJmQpdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgc2VuY29uZCBrZXkgY2FuZGluYXRlXCIpO3M9ZD90aGlzLmN1cnZlLnBvaW50RnJvbVgocy5hZGQodGhpcy5jdXJ2ZS5uKSxjKTp0aGlzLmN1cnZlLnBvaW50RnJvbVgocyxjKTt2YXIgbD1lLnIuaW52bShvKSxwPW8uc3ViKGEpLm11bChsKS51bW9kKG8pLGI9aC5tdWwobCkudW1vZChvKTtyZXR1cm4gdGhpcy5nLm11bEFkZChwLHMsYil9LG4ucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW09ZnVuY3Rpb24odCxlLHIsbil7aWYoZT1uZXcgdShlLG4pLG51bGwhPT1lLnJlY292ZXJ5UGFyYW0pcmV0dXJuIGUucmVjb3ZlcnlQYXJhbTtmb3IodmFyIGk9MDtpPDQ7aSsrKXt2YXIgbzt0cnl7bz10aGlzLnJlY292ZXJQdWJLZXkodCxlLGkpfWNhdGNoKHQpe2NvbnRpbnVlfWlmKG8uZXEocikpcmV0dXJuIGl9dGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgdmFsaWQgcmVjb3ZlcnkgZmFjdG9yXCIpfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXt0aGlzLmVjPXQsdGhpcy5wcml2PW51bGwsdGhpcy5wdWI9bnVsbCxlLnByaXYmJnRoaXMuX2ltcG9ydFByaXZhdGUoZS5wcml2LGUucHJpdkVuYyksZS5wdWImJnRoaXMuX2ltcG9ydFB1YmxpYyhlLnB1YixlLnB1YkVuYyl9dmFyIGk9cigxOCk7dC5leHBvcnRzPW4sbi5mcm9tUHVibGljPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG4/ZTpuZXcgbih0LHtwdWI6ZSxwdWJFbmM6cn0pfSxuLmZyb21Qcml2YXRlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG4/ZTpuZXcgbih0LHtwcml2OmUscHJpdkVuYzpyfSl9LG4ucHJvdG90eXBlLnZhbGlkYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRQdWJsaWMoKTtyZXR1cm4gdC5pc0luZmluaXR5KCk/e3Jlc3VsdDohMSxyZWFzb246XCJJbnZhbGlkIHB1YmxpYyBrZXlcIn06dC52YWxpZGF0ZSgpP3QubXVsKHRoaXMuZWMuY3VydmUubikuaXNJbmZpbml0eSgpP3tyZXN1bHQ6ITAscmVhc29uOm51bGx9OntyZXN1bHQ6ITEscmVhc29uOlwiUHVibGljIGtleSAqIE4gIT0gT1wifTp7cmVzdWx0OiExLHJlYXNvbjpcIlB1YmxpYyBrZXkgaXMgbm90IGEgcG9pbnRcIn19LG4ucHJvdG90eXBlLmdldFB1YmxpYz1mdW5jdGlvbih0LGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0JiYoZT10LHQ9bnVsbCksdGhpcy5wdWJ8fCh0aGlzLnB1Yj10aGlzLmVjLmcubXVsKHRoaXMucHJpdikpLGU/dGhpcy5wdWIuZW5jb2RlKGUsdCk6dGhpcy5wdWJ9LG4ucHJvdG90eXBlLmdldFByaXZhdGU9ZnVuY3Rpb24odCl7cmV0dXJuXCJoZXhcIj09PXQ/dGhpcy5wcml2LnRvU3RyaW5nKDE2LDIpOnRoaXMucHJpdn0sbi5wcm90b3R5cGUuX2ltcG9ydFByaXZhdGU9ZnVuY3Rpb24odCxlKXt0aGlzLnByaXY9bmV3IGkodCxlfHwxNiksdGhpcy5wcml2PXRoaXMucHJpdi51bW9kKHRoaXMuZWMuY3VydmUubil9LG4ucHJvdG90eXBlLl9pbXBvcnRQdWJsaWM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54fHx0Lnk/dm9pZCh0aGlzLnB1Yj10aGlzLmVjLmN1cnZlLnBvaW50KHQueCx0LnkpKTp2b2lkKHRoaXMucHViPXRoaXMuZWMuY3VydmUuZGVjb2RlUG9pbnQodCxlKSl9LG4ucHJvdG90eXBlLmRlcml2ZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5tdWwodGhpcy5wcml2KS5nZXRYKCl9LG4ucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLmVjLnNpZ24odCx0aGlzLGUscil9LG4ucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVjLnZlcmlmeSh0LGUsdGhpcyl9LG4ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm5cIjxLZXkgcHJpdjogXCIrKHRoaXMucHJpdiYmdGhpcy5wcml2LnRvU3RyaW5nKDE2LDIpKStcIiBwdWI6IFwiKyh0aGlzLnB1YiYmdGhpcy5wdWIuaW5zcGVjdCgpKStcIiA+XCJ9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0IGluc3RhbmNlb2Ygbj90OnZvaWQodGhpcy5faW1wb3J0REVSKHQsZSl8fChjKHQuciYmdC5zLFwiU2lnbmF0dXJlIHdpdGhvdXQgciBvciBzXCIpLHRoaXMucj1uZXcgcyh0LnIsMTYpLHRoaXMucz1uZXcgcyh0LnMsMTYpLHZvaWQgMD09PXQucmVjb3ZlcnlQYXJhbT90aGlzLnJlY292ZXJ5UGFyYW09bnVsbDp0aGlzLnJlY292ZXJ5UGFyYW09dC5yZWNvdmVyeVBhcmFtKSl9ZnVuY3Rpb24gaSgpe3RoaXMucGxhY2U9MH1mdW5jdGlvbiBvKHQsZSl7dmFyIHI9dFtlLnBsYWNlKytdO2lmKCEoMTI4JnIpKXJldHVybiByO2Zvcih2YXIgbj0xNSZyLGk9MCxvPTAsYT1lLnBsYWNlO288bjtvKyssYSsrKWk8PD04LGl8PXRbYV07cmV0dXJuIGUucGxhY2U9YSxpfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPTAscj10Lmxlbmd0aC0xOyF0W2VdJiYhKDEyOCZ0W2UrMV0pJiZlPHI7KWUrKztyZXR1cm4gMD09PWU/dDp0LnNsaWNlKGUpfWZ1bmN0aW9uIGYodCxlKXtpZihlPDEyOClyZXR1cm4gdm9pZCB0LnB1c2goZSk7dmFyIHI9MSsoTWF0aC5sb2coZSkvTWF0aC5MTjI+Pj4zKTtmb3IodC5wdXNoKDEyOHxyKTstLXI7KXQucHVzaChlPj4+KHI8PDMpJjI1NSk7dC5wdXNoKGUpfXZhciBzPXIoMTgpLHU9cigxOSksaD11LnV0aWxzLGM9aC5hc3NlcnQ7dC5leHBvcnRzPW4sbi5wcm90b3R5cGUuX2ltcG9ydERFUj1mdW5jdGlvbih0LGUpe3Q9aC50b0FycmF5KHQsZSk7dmFyIHI9bmV3IGk7aWYoNDghPT10W3IucGxhY2UrK10pcmV0dXJuITE7dmFyIG49byh0LHIpO2lmKG4rci5wbGFjZSE9PXQubGVuZ3RoKXJldHVybiExO2lmKDIhPT10W3IucGxhY2UrK10pcmV0dXJuITE7dmFyIGE9byh0LHIpLGY9dC5zbGljZShyLnBsYWNlLGErci5wbGFjZSk7aWYoci5wbGFjZSs9YSwyIT09dFtyLnBsYWNlKytdKXJldHVybiExO3ZhciB1PW8odCxyKTtpZih0Lmxlbmd0aCE9PXUrci5wbGFjZSlyZXR1cm4hMTt2YXIgYz10LnNsaWNlKHIucGxhY2UsdStyLnBsYWNlKTtyZXR1cm4gMD09PWZbMF0mJjEyOCZmWzFdJiYoZj1mLnNsaWNlKDEpKSwwPT09Y1swXSYmMTI4JmNbMV0mJihjPWMuc2xpY2UoMSkpLHRoaXMucj1uZXcgcyhmKSx0aGlzLnM9bmV3IHMoYyksdGhpcy5yZWNvdmVyeVBhcmFtPW51bGwsITB9LG4ucHJvdG90eXBlLnRvREVSPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuci50b0FycmF5KCkscj10aGlzLnMudG9BcnJheSgpO2ZvcigxMjgmZVswXSYmKGU9WzBdLmNvbmNhdChlKSksMTI4JnJbMF0mJihyPVswXS5jb25jYXQocikpLGU9YShlKSxyPWEocik7IShyWzBdfHwxMjgmclsxXSk7KXI9ci5zbGljZSgxKTt2YXIgbj1bMl07ZihuLGUubGVuZ3RoKSxuPW4uY29uY2F0KGUpLG4ucHVzaCgyKSxmKG4sci5sZW5ndGgpO3ZhciBpPW4uY29uY2F0KHIpLG89WzQ4XTtyZXR1cm4gZihvLGkubGVuZ3RoKSxvPW8uY29uY2F0KGkpLGguZW5jb2RlKG8sdCl9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtpZihmKFwiZWQyNTUxOVwiPT09dCxcIm9ubHkgdGVzdGVkIHdpdGggZWQyNTUxOSBzbyBmYXJcIiksISh0aGlzIGluc3RhbmNlb2YgbikpcmV0dXJuIG5ldyBuKHQpO3ZhciB0PW8uY3VydmVzW3RdLmN1cnZlO3RoaXMuY3VydmU9dCx0aGlzLmc9dC5nLHRoaXMuZy5wcmVjb21wdXRlKHQubi5iaXRMZW5ndGgoKSsxKSx0aGlzLnBvaW50Q2xhc3M9dC5wb2ludCgpLmNvbnN0cnVjdG9yLHRoaXMuZW5jb2RpbmdMZW5ndGg9TWF0aC5jZWlsKHQubi5iaXRMZW5ndGgoKS84KSx0aGlzLmhhc2g9aS5zaGE1MTJ9dmFyIGk9cig0OSksbz1yKDE5KSxhPW8udXRpbHMsZj1hLmFzc2VydCxzPWEucGFyc2VCeXRlcyx1PXIoNTE3KSxoPXIoNTE4KTt0LmV4cG9ydHM9bixuLnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKHQsZSl7dD1zKHQpO3ZhciByPXRoaXMua2V5RnJvbVNlY3JldChlKSxuPXRoaXMuaGFzaEludChyLm1lc3NhZ2VQcmVmaXgoKSx0KSxpPXRoaXMuZy5tdWwobiksbz10aGlzLmVuY29kZVBvaW50KGkpLGE9dGhpcy5oYXNoSW50KG8sci5wdWJCeXRlcygpLHQpLm11bChyLnByaXYoKSksZj1uLmFkZChhKS51bW9kKHRoaXMuY3VydmUubik7cmV0dXJuIHRoaXMubWFrZVNpZ25hdHVyZSh7UjppLFM6ZixSZW5jb2RlZDpvfSl9LG4ucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbih0LGUscil7dD1zKHQpLGU9dGhpcy5tYWtlU2lnbmF0dXJlKGUpO3ZhciBuPXRoaXMua2V5RnJvbVB1YmxpYyhyKSxpPXRoaXMuaGFzaEludChlLlJlbmNvZGVkKCksbi5wdWJCeXRlcygpLHQpLG89dGhpcy5nLm11bChlLlMoKSksYT1lLlIoKS5hZGQobi5wdWIoKS5tdWwoaSkpO3JldHVybiBhLmVxKG8pfSxuLnByb3RvdHlwZS5oYXNoSW50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuaGFzaCgpLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXQudXBkYXRlKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGEuaW50RnJvbUxFKHQuZGlnZXN0KCkpLnVtb2QodGhpcy5jdXJ2ZS5uKX0sbi5wcm90b3R5cGUua2V5RnJvbVB1YmxpYz1mdW5jdGlvbih0KXtyZXR1cm4gdS5mcm9tUHVibGljKHRoaXMsdCl9LG4ucHJvdG90eXBlLmtleUZyb21TZWNyZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUuZnJvbVNlY3JldCh0aGlzLHQpfSxuLnByb3RvdHlwZS5tYWtlU2lnbmF0dXJlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgaD90Om5ldyBoKHRoaXMsdCl9LG4ucHJvdG90eXBlLmVuY29kZVBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0WSgpLnRvQXJyYXkoXCJsZVwiLHRoaXMuZW5jb2RpbmdMZW5ndGgpO3JldHVybiBlW3RoaXMuZW5jb2RpbmdMZW5ndGgtMV18PXQuZ2V0WCgpLmlzT2RkKCk/MTI4OjAsZX0sbi5wcm90b3R5cGUuZGVjb2RlUG9pbnQ9ZnVuY3Rpb24odCl7dD1hLnBhcnNlQnl0ZXModCk7dmFyIGU9dC5sZW5ndGgtMSxyPXQuc2xpY2UoMCxlKS5jb25jYXQodFtlXSYtMTI5KSxuPTAhPT0oMTI4JnRbZV0pLGk9YS5pbnRGcm9tTEUocik7cmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWShpLG4pfSxuLnByb3RvdHlwZS5lbmNvZGVJbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9BcnJheShcImxlXCIsdGhpcy5lbmNvZGluZ0xlbmd0aCl9LG4ucHJvdG90eXBlLmRlY29kZUludD1mdW5jdGlvbih0KXtyZXR1cm4gYS5pbnRGcm9tTEUodCl9LG4ucHJvdG90eXBlLmlzUG9pbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB0aGlzLnBvaW50Q2xhc3N9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe3RoaXMuZWRkc2E9dCx0aGlzLl9zZWNyZXQ9ZihlLnNlY3JldCksdC5pc1BvaW50KGUucHViKT90aGlzLl9wdWI9ZS5wdWI6dGhpcy5fcHViQnl0ZXM9ZihlLnB1Yil9dmFyIGk9cigxOSksbz1pLnV0aWxzLGE9by5hc3NlcnQsZj1vLnBhcnNlQnl0ZXMscz1vLmNhY2hlZFByb3BlcnR5O24uZnJvbVB1YmxpYz1mdW5jdGlvbih0LGUpe3JldHVybiBlIGluc3RhbmNlb2Ygbj9lOm5ldyBuKHQse3B1YjplfSl9LG4uZnJvbVNlY3JldD1mdW5jdGlvbih0LGUpe3JldHVybiBlIGluc3RhbmNlb2Ygbj9lOm5ldyBuKHQse3NlY3JldDplfSl9LG4ucHJvdG90eXBlLnNlY3JldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWNyZXR9LHMobixcInB1YkJ5dGVzXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLnB1YigpKX0pLHMobixcInB1YlwiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B1YkJ5dGVzP3RoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5fcHViQnl0ZXMpOnRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpfSkscyhuLFwicHJpdkJ5dGVzXCIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZHNhLGU9dGhpcy5oYXNoKCkscj10LmVuY29kaW5nTGVuZ3RoLTEsbj1lLnNsaWNlKDAsdC5lbmNvZGluZ0xlbmd0aCk7cmV0dXJuIG5bMF0mPTI0OCxuW3JdJj0xMjcsbltyXXw9NjQsbn0pLHMobixcInByaXZcIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLnByaXZCeXRlcygpKX0pLHMobixcImhhc2hcIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCl9KSxzKG4sXCJtZXNzYWdlUHJlZml4XCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNoKCkuc2xpY2UodGhpcy5lZGRzYS5lbmNvZGluZ0xlbmd0aCl9KSxuLnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKHQpe3JldHVybiBhKHRoaXMuX3NlY3JldCxcIktleVBhaXIgY2FuIG9ubHkgdmVyaWZ5XCIpLHRoaXMuZWRkc2Euc2lnbih0LHRoaXMpfSxuLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lZGRzYS52ZXJpZnkodCxlLHRoaXMpfSxuLnByb3RvdHlwZS5nZXRTZWNyZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGEodGhpcy5fc2VjcmV0LFwiS2V5UGFpciBpcyBwdWJsaWMgb25seVwiKSxvLmVuY29kZSh0aGlzLnNlY3JldCgpLHQpfSxuLnByb3RvdHlwZS5nZXRQdWJsaWM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uZW5jb2RlKHRoaXMucHViQnl0ZXMoKSx0KX0sdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7dGhpcy5lZGRzYT10LFwib2JqZWN0XCIhPXR5cGVvZiBlJiYoZT11KGUpKSxBcnJheS5pc0FycmF5KGUpJiYoZT17UjplLnNsaWNlKDAsdC5lbmNvZGluZ0xlbmd0aCksUzplLnNsaWNlKHQuZW5jb2RpbmdMZW5ndGgpfSksZihlLlImJmUuUyxcIlNpZ25hdHVyZSB3aXRob3V0IFIgb3IgU1wiKSx0LmlzUG9pbnQoZS5SKSYmKHRoaXMuX1I9ZS5SKSxlLlMgaW5zdGFuY2VvZiBpJiYodGhpcy5fUz1lLlMpLHRoaXMuX1JlbmNvZGVkPUFycmF5LmlzQXJyYXkoZS5SKT9lLlI6ZS5SZW5jb2RlZCx0aGlzLl9TZW5jb2RlZD1BcnJheS5pc0FycmF5KGUuUyk/ZS5TOmUuU2VuY29kZWR9dmFyIGk9cigxOCksbz1yKDE5KSxhPW8udXRpbHMsZj1hLmFzc2VydCxzPWEuY2FjaGVkUHJvcGVydHksdT1hLnBhcnNlQnl0ZXM7cyhuLFwiU1wiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMuU2VuY29kZWQoKSl9KSxzKG4sXCJSXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpfSkscyhuLFwiUmVuY29kZWRcIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMuUigpKX0pLHMobixcIlNlbmNvZGVkXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVJbnQodGhpcy5TKCkpfSksbi5wcm90b3R5cGUudG9CeXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJlbmNvZGVkKCkuY29uY2F0KHRoaXMuU2VuY29kZWQoKSl9LG4ucHJvdG90eXBlLnRvSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIGEuZW5jb2RlKHRoaXMudG9CeXRlcygpLFwiaGV4XCIpLnRvVXBwZXJDYXNlKCl9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSlyZXR1cm4gbmV3IG4odCk7dGhpcy5oYXNoPXQuaGFzaCx0aGlzLnByZWRSZXNpc3Q9ISF0LnByZWRSZXNpc3QsdGhpcy5vdXRMZW49dGhpcy5oYXNoLm91dFNpemUsdGhpcy5taW5FbnRyb3B5PXQubWluRW50cm9weXx8dGhpcy5oYXNoLmhtYWNTdHJlbmd0aCx0aGlzLnJlc2VlZD1udWxsLHRoaXMucmVzZWVkSW50ZXJ2YWw9bnVsbCx0aGlzLks9bnVsbCx0aGlzLlY9bnVsbDt2YXIgZT1hLnRvQXJyYXkodC5lbnRyb3B5LHQuZW50cm9weUVuYykscj1hLnRvQXJyYXkodC5ub25jZSx0Lm5vbmNlRW5jKSxpPWEudG9BcnJheSh0LnBlcnMsdC5wZXJzRW5jKTtmKGUubGVuZ3RoPj10aGlzLm1pbkVudHJvcHkvOCxcIk5vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogXCIrdGhpcy5taW5FbnRyb3B5K1wiIGJpdHNcIiksdGhpcy5faW5pdChlLHIsaSl9dmFyIGk9cig0OSksbz1yKDE5KSxhPW8udXRpbHMsZj1hLmFzc2VydDt0LmV4cG9ydHM9bixuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUscil7dmFyIG49dC5jb25jYXQoZSkuY29uY2F0KHIpO3RoaXMuSz1uZXcgQXJyYXkodGhpcy5vdXRMZW4vOCksdGhpcy5WPW5ldyBBcnJheSh0aGlzLm91dExlbi84KTtmb3IodmFyIGk9MDtpPHRoaXMuVi5sZW5ndGg7aSsrKXRoaXMuS1tpXT0wLHRoaXMuVltpXT0xO3RoaXMuX3VwZGF0ZShuKSx0aGlzLnJlc2VlZD0xLHRoaXMucmVzZWVkSW50ZXJ2YWw9MjgxNDc0OTc2NzEwNjU2fSxuLnByb3RvdHlwZS5faG1hYz1mdW5jdGlvbigpe3JldHVybiBuZXcgaS5obWFjKHRoaXMuaGFzaCx0aGlzLkspfSxuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS51cGRhdGUoWzBdKTt0JiYoZT1lLnVwZGF0ZSh0KSksdGhpcy5LPWUuZGlnZXN0KCksdGhpcy5WPXRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKSx0JiYodGhpcy5LPXRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS51cGRhdGUoWzFdKS51cGRhdGUodCkuZGlnZXN0KCksdGhpcy5WPXRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKSl9LG4ucHJvdG90eXBlLnJlc2VlZD1mdW5jdGlvbih0LGUscixuKXtcInN0cmluZ1wiIT10eXBlb2YgZSYmKG49cixyPWUsZT1udWxsKSx0PWEudG9CdWZmZXIodCxlKSxyPWEudG9CdWZmZXIocixuKSxmKHQubGVuZ3RoPj10aGlzLm1pbkVudHJvcHkvOCxcIk5vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogXCIrdGhpcy5taW5FbnRyb3B5K1wiIGJpdHNcIiksdGhpcy5fdXBkYXRlKHQuY29uY2F0KHJ8fFtdKSksdGhpcy5yZXNlZWQ9MX0sbi5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24odCxlLHIsbil7aWYodGhpcy5yZXNlZWQ+dGhpcy5yZXNlZWRJbnRlcnZhbCl0aHJvdyBuZXcgRXJyb3IoXCJSZXNlZWQgaXMgcmVxdWlyZWRcIik7XCJzdHJpbmdcIiE9dHlwZW9mIGUmJihuPXIscj1lLGU9bnVsbCksciYmKHI9YS50b0FycmF5KHIsbiksdGhpcy5fdXBkYXRlKHIpKTtmb3IodmFyIGk9W107aS5sZW5ndGg8dDspdGhpcy5WPXRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKSxpPWkuY29uY2F0KHRoaXMuVik7dmFyIG89aS5zbGljZSgwLHQpO3JldHVybiB0aGlzLl91cGRhdGUociksdGhpcy5yZXNlZWQrKyxhLmVuY29kZShvLGUpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e2RvdWJsZXM6e3N0ZXA6NCxwb2ludHM6W1tcImU2MGZjZTkzYjU5ZTllYzUzMDExYWFiYzIxYzIzZTk3YjJhMzEzNjliODdhNWFlOWM0NGVlODllMmE2ZGVjMGFcIixcImY3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjFcIl0sW1wiODI4MjI2MzIxMmM2MDlkOWVhMmE2ZTNlMTcyZGUyMzhkOGMzOWNhYmQ1YWMxY2ExMDY0NmUyM2ZkNWY1MTUwOFwiLFwiMTFmOGE4MDk4NTU3ZGZlNDVlODI1NmU4MzBiNjBhY2U2MmQ2MTNhYzJmN2IxN2JlZDMxYjZlYWZmNmUyNmNhZlwiXSxbXCIxNzVlMTU5ZjcyOGI4NjVhNzJmOTljYzZjNmZjODQ2ZGUwYjkzODMzZmQyMjIyZWQ3M2ZjZTViNTUxZTViNzM5XCIsXCJkMzUwNmUwZDllM2M3OWViYTRlZjk3YTUxZmY3MWY1ZWFjYjU5NTVhZGQyNDM0NWM2ZWZhNmZmZWU5ZmVkNjk1XCJdLFtcIjM2M2Q5MGQ0NDdiMDBjOWM5OWNlYWMwNWI2MjYyZWUwNTM0NDFjN2U1NTU1MmZmZTUyNmJhZDhmODNmZjQ2NDBcIixcIjRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOVwiXSxbXCI4YjRiNWYxNjVkZjNjMmJlOGM2MjQ0YjViNzQ1NjM4ODQzZTRhNzgxYTE1YmNkMWI2OWY3OWE1NWRmZmRmODBjXCIsXCI0YWFkMGE2ZjY4ZDMwOGI0YjNmYmQ3ODEzYWIwZGEwNGY5ZTMzNjU0NjE2MmVlNTZiM2VmZjBjNjVmZDRmZDM2XCJdLFtcIjcyM2NiYWE2ZTVkYjk5NmQ2YmY3NzFjMDBiZDU0OGM3YjcwMGRiZmZhNmMwZTc3YmNiNjExNTkyNTIzMmZjZGFcIixcIjk2ZTg2N2I1NTk1Y2M0OThhOTIxMTM3NDg4ODI0ZDZlMjY2MGEwNjUzNzc5NDk0ODAxZGMwNjlkOWViMzlmNWZcIl0sW1wiZWViZmE0ZDQ5M2JlYmY5OGJhNWZlZWM4MTJjMmQzYjUwOTQ3OTYxMjM3YTkxOTgzOWE1MzNlY2EwZTdkZDdmYVwiLFwiNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OVwiXSxbXCIxMDBmNDRkYTY5NmU3MTY3Mjc5MWQwYTA5YjdiZGU0NTlmMTIxNWEyOWIzYzAzYmZlZmQ3ODM1YjM5YTQ4ZGIwXCIsXCJjZGQ5ZTEzMTkyYTAwYjc3MmVjOGYzMzAwYzA5MDY2NmI3ZmY0YTE4ZmY1MTk1YWMwZmJkNWNkNjJiYzY1YTA5XCJdLFtcImUxMDMxYmUyNjJjN2VkMWIxZGM5MjI3YTRhMDRjMDE3YTc3ZjhkNDQ2NGYzYjM4NTJjOGFjZGU2ZTUzNGZkMmRcIixcIjlkNzA2MTkyODk0MDQwNWU2YmI2YTQxNzY1OTc1MzVhZjI5MmRkNDE5ZTFjZWQ3OWE0NGYxOGYyOTQ1NmEwMGRcIl0sW1wiZmVlYTZjYWU0NmQ1NWI1MzBhYzI4MzlmMTQzYmQ3ZWM1Y2Y4YjI2NmE0MWQ2YWY1MmQ1ZTY4OGQ5MDk0Njk2ZFwiLFwiZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OFwiXSxbXCJkYTY3YTkxZDkxMDQ5Y2RjYjM2N2JlNGJlNmZmY2EzY2ZlZWQ2NTdkODA4NTgzZGUzM2ZhOTc4YmMxZWM2Y2IxXCIsXCI5YmFjYWEzNTQ4MTY0MmJjNDFmNDYzZjdlYzk3ODBlNWRlYzdhZGM1MDhmNzQwYTE3ZTllYThlMjdhNjhiZTFkXCJdLFtcIjUzOTA0ZmFhMGIzMzRjZGRhNmUwMDA5MzVlZjIyMTUxZWMwOGQwZjdiYjExMDY5ZjU3NTQ1Y2NjMWEzN2I3YzBcIixcIjViYzA4N2QwYmM4MDEwNmQ4OGM5ZWNjYWMyMGQzYzFjMTM5OTk5ODFlMTQ0MzQ2OTlkY2IwOTZiMDIyNzcxYzhcIl0sW1wiOGU3YmNkMGJkMzU5ODNhNzcxOWNjYTc3NjRjYTkwNjc3OWI1M2EwNDNhOWI4YmNhZWZmOTU5ZjQzYWQ4NjA0N1wiLFwiMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYVwiXSxbXCIzODVlZWQzNGMxY2RmZjIxZTZkMDgxODY4OWI4MWJkZTcxYTdmNGYxODM5N2U2NjkwYTg0MWUxNTk5YzQzODYyXCIsXCIyODNiZWJjM2U4ZWEyM2Y1NjcwMWRlMTllOWViZjQ1NzZiMzA0ZWVjMjA4NmRjOGNjMDQ1OGZlNTU0MmU1NDUzXCJdLFtcIjZmOWQ5YjgwM2VjZjE5MTYzN2M3M2E0NDEzZGZhMTgwZmRkZjg0YTU5NDdmYmM5YzYwNmVkODZjM2ZhYzNhN1wiLFwiN2M4MGM2OGU2MDMwNTliYTY5YjhlMmEzMGU0NWM0ZDQ3ZWE0ZGQyZjVjMjgxMDAyZDg2ODkwNjAzYTg0MjE2MFwiXSxbXCIzMzIyZDQwMTI0M2M0ZTI1ODJhMjE0N2MxMDRkNmVjYmY3NzRkMTYzZGIwZjVlNTMxM2I3ZTBlNzQyZDBlNmJkXCIsXCI1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwXCJdLFtcIjg1NjcyYzdkMmRlMGI3ZGEyYmQxNzcwZDg5NjY1ODY4NzQxYjNmOWFmNzY0MzM5NzcyMWQ3NGQyODEzNGFiODNcIixcIjdjNDgxYjliNWI0M2IyZWI2Mzc0MDQ5YmZhNjJjMmU1ZTc3ZjE3ZmNjNTI5OGY0NGM4ZTMwOTRmNzkwMzEzYTZcIl0sW1wiOTQ4YmY4MDliMTk4OGE0NmIwNmM5ZjE5MTk0MTNiMTBmOTIyNmM2MGY2Njg4MzJmZmQ5NTlhZjYwYzgyYTBhXCIsXCI1M2E1NjI4NTZkY2I2NjQ2ZGM2Yjc0YzVkMWMzNDE4YzZkNGRmZjA4Yzk3Y2QyYmVkNGNiN2Y4OGQ4YzhlNTg5XCJdLFtcIjYyNjBjZTdmNDYxODAxYzM0ZjA2N2NlMGYwMjg3M2E4ZjFiMGU0NGRmYzY5NzUyYWNjZWNkODE5ZjM4ZmQ4ZThcIixcImJjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTdcIl0sW1wiZTUwMzdkZTBhZmMxZDhkNDNkODM0ODQxNGJiZjQxMDMwNDNlYzhmNTc1YmZkYzQzMjk1M2NjOGQyMDM3ZmEyZFwiLFwiNDU3MTUzNGJhYTk0ZDNiNWY5Zjk4ZDA5ZmI5OTBiZGRiZDVmNWIwM2VjNDgxZjEwZTBlNWRjODQxZDc1NWJkYVwiXSxbXCJlMDYzNzJiMGY0YTIwN2FkZjVlYTkwNWU4ZjE3NzFiNGU3ZThkYmQxYzZhNmM1YjcyNTg2NmEwYWU0ZmNlNzI1XCIsXCI3YTkwODk3NGJjZTE4Y2ZlMTJhMjdiYjJhZDVhNDg4Y2Q3NDg0YTc3ODcxMDQ4NzBiMjcwMzRmOTRlZWUzMWRkXCJdLFtcIjIxM2M3YTcxNWNkNWQ0NTM1OGQwYmJmOWRjMGNlMDIyMDRiMTBiZGRlMmEzZjU4NTQwYWQ2OTA4ZDA1NTk3NTRcIixcIjRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjJcIl0sW1wiNGU3YzI3MmE3YWY0YjM0ZThkYmI5MzUyYTU0MTlhODdlMjgzOGM3MGFkYzYyY2RkZjBjYzNhM2IwOGZiZDUzY1wiLFwiMTc3NDljNzY2YzlkMGIxOGUxNmZkMDlmNmRlZjY4MWI1MzBiOTYxNGJmZjdkZDMzZTBiMzk0MTgxN2RjYWFlNlwiXSxbXCJmZWE3NGUzZGJlNzc4YjFiMTBmMjM4YWQ2MTY4NmFhNWM3NmUzZGIyYmU0MzA1NzYzMjQyN2UyODQwZmIyN2I2XCIsXCI2ZTA1NjhkYjliMGIxMzI5N2NmNjc0ZGVjY2I2YWY5MzEyNmI1OTZiOTczZjdiNzc3MDFkM2RiN2YyM2NiOTZmXCJdLFtcIjc2ZTY0MTEzZjY3N2NmMGUxMGEyNTcwZDU5OTk2OGQzMTU0NGUxNzliNzYwNDMyOTUyYzAyYTQ0MTdiZGRlMzlcIixcImM5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDFcIl0sW1wiYzczOGM1NmIwM2IyYWJlMWU4MjgxYmFhNzQzZjhmOWE4ZjdjYzY0M2RmMjZjYmVlM2FiMTUwMjQyYmNiYjg5MVwiLFwiODkzZmI1Nzg5NTFhZDI1MzdmNzE4ZjJlYWNiZmJiYmI4MjMxNGVlZjc4ODBjZmU5MTdlNzM1ZDk2OTlhODRjM1wiXSxbXCJkODk1NjI2NTQ4YjY1YjgxZTI2NGM3NjM3Yzk3Mjg3N2QxZDcyZTVmM2E5MjUwMTQzNzJlOWY2NTg4ZjZjMTRiXCIsXCJmZWJmYWEzOGYyYmM3ZWFlNzI4ZWM2MDgxOGMzNDBlYjAzNDI4ZDYzMmJiMDY3ZTE3OTM2M2VkNzVkN2Q5OTFmXCJdLFtcImI4ZGE5NDAzMmE5NTc1MThlYjBmNjQzMzU3MWU4NzYxY2VmZmM3MzY5M2U4NGVkZDQ5MTUwYTU2NGY2NzZlMDNcIixcIjI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTdcIl0sW1wiZTgwZmVhMTQ0NDFmYjMzYTdkOGFkYWI5NDc1ZDdmYWIyMDE5ZWZmYjUxNTZhNzkyZjFhMTE3NzhlM2MwZGY1ZFwiLFwiZWVkMWRlN2Y2MzhlMDA3NzFlODk3NjhjYTNjYTk0NDcyZDE1NWU4MGFmMzIyZWE5ZmNiNDI5MWI2YWM5ZWM3OFwiXSxbXCJhMzAxNjk3YmRmY2Q3MDQzMTNiYTQ4ZTUxZDU2NzU0M2YyYTE4MjAzMWVmZDY5MTVkZGMwN2JiY2M0ZTE2MDcwXCIsXCI3MzcwZjkxY2ZiNjdlNGY1MDgxODA5ZmEyNWQ0MGY5YjE3MzVkYmY3YzBhMTFhMTMwYzBkMWEwNDFlMTc3ZWExXCJdLFtcIjkwYWQ4NWIzODlkNmI5MzY0NjNmOWQwNTEyNjc4ZGUyMDhjYzMzMGIxMTMwN2ZmZmFiN2FjNjNlM2ZiMDRlZDRcIixcImU1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MFwiXSxbXCI4ZjY4YjlkMmY2M2I1ZjMzOTIzOWMxYWQ5ODFmMTYyZWU4OGM1Njc4NzIzZWEzMzUxYjdiNDQ0YzllYzRjMGRhXCIsXCI2NjJhOWYyZGJhMDYzOTg2ZGUxZDkwYzJiNmJlMjE1ZGJiZWEyY2ZlOTU1MTBiZmRmMjNjYmY3OTUwMWZmZjgyXCJdLFtcImU0ZjNmYjAxNzZhZjg1ZDY1ZmY5OWZmOTE5OGMzNjA5MWY0OGU4NjUwMzY4MWUzZTY2ODZmZDUwNTMyMzFlMTFcIixcIjFlNjM2MzNhZDBlZjRmMWMxNjYxYTZkMGVhMDJiNzI4NmNjN2U3NGVjOTUxZDFjOTgyMmMzODU3NmZlYjczYmNcIl0sW1wiOGMwMGZhOWIxOGViZjMzMWViOTYxNTM3YTQ1YTQyNjZjNzAzNGYyZjBkNGUxZDA3MTZmYjZlYWUyMGVhZTI5ZVwiLFwiZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YlwiXSxbXCJlN2EyNmNlNjlkZDQ4MjlmM2UxMGNlYzBhOWU5OGVkMzE0M2QwODRmMzA4YjkyYzA5OTdmZGRmYzYwY2IzZTQxXCIsXCIyYTc1OGUzMDBmYTc5ODRiNDcxYjAwNmExYWFmYmIxOGQwYTZiMmMwNDIwZTgzZTIwZThhOTQyMWNmMmNmZDUxXCJdLFtcImI2NDU5ZTBlZTM2NjJlYzhkMjM1NDBjMjIzYmNiZGM1NzFjYmNiOTY3ZDc5NDI0ZjNjZjI5ZWIzZGU2YjgwZWZcIixcIjY3Yzg3NmQwNmYzZTA2ZGUxZGFkZjE2ZTU2NjFkYjNjNGIzYWU2ZDQ4ZTM1YjJmZjMwYmYwYjYxYTcxYmE0NVwiXSxbXCJkNjhhODBjODI4MGJiODQwNzkzMjM0YWExMThmMDYyMzFkNmYxZmM2N2U3M2M1YTVkZWRhMGY1YjQ5Njk0M2U4XCIsXCJkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwXCJdLFtcIjMyNGFlZDdkZjY1YzgwNDI1MmRjMDI3MDkwN2EzMGIwOTYxMmFlYjk3MzQ0OWNlYTQwOTU5ODBmYzI4ZDNkNWRcIixcIjY0OGEzNjU3NzRiNjFmMmZmMTMwYzBjMzVhZWMxZjRmMTkyMTNiMGM3ZTMzMjg0Mzk2NzIyNGFmOTZhYjdjODRcIl0sW1wiNGRmOWMxNDkxOWNkZTYxZjZkNTFkZmRiZTVmZWU1ZGNlZWM0MTQzYmE4ZDFjYTg4OGU4YmQzNzNmZDA1NGM5NlwiLFwiMzVlYzUxMDkyZDg3MjgwNTA5NzRjMjNhMWQ4NWQ0YjVkNTA2Y2RjMjg4NDkwMTkyZWJhYzA2Y2FkMTBkNWRcIl0sW1wiOWMzOTE5YTg0YTQ3NDg3MGZhZWQ4YTljMWNjNjYwMjE1MjM0ODkwNTRkN2YwMzA4Y2JmYzk5YzhhYzFmOThjZFwiLFwiZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZFwiXSxbXCI2MDU3MTcwYjFkZDEyZmRmOGRlMDVmMjgxZDhlMDZiYjkxZTE0OTNhOGI5MWQ0Y2M1YTIxMzgyMTIwYTk1OWU1XCIsXCI5YTFhZjBiMjZhNmE0ODA3YWRkOWEyZGFmNzFkZjI2MjQ2NTE1MmJjM2VlMjRjNjVlODk5YmU5MzIzODVhMmE4XCJdLFtcImE1NzZkZjhlMjNhMDg0MTE0MjE0MzlhNDUxOGRhMzE4ODBjZWYwZmJhN2Q0ZGYxMmIxYTY5NzNlZWNiOTQyNjZcIixcIjQwYTZiZjIwZTc2NjQwYjJjOTJiOTdhZmU1OGNkODJjNDMyZTEwYTdmNTE0ZDlmM2VlOGJlMTFhZTFiMjhlYzhcIl0sW1wiNzc3OGE3OGMyOGRlYzNlMzBhMDVmZTk2MjlkZThjMzhiYjMwZDFmNWNmOWEzYTIwOGY3NjM4ODliZTU4YWQ3MVwiLFwiMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhY1wiXSxbXCI5Mjg5NTVlZTYzN2E4NDQ2MzcyOWZkMzBlN2FmZDJlZDVmOTYyNzRlNWFkN2U1Y2IwOWVkYTljMDZkOTAzYWNcIixcImMyNTYyMTAwM2QzZjQyYTgyN2I3OGExMzA5M2E5NWVlYWMzZDI2ZWZhOGE4ZDgzZmM1MTgwZTkzNWJjZDA5MWZcIl0sW1wiODVkMGZlZjNlYzZkYjEwOTM5OTA2NGYzYTBlM2IyODU1NjQ1YjRhOTA3YWQzNTQ1MjdhYWU3NTE2M2Q4Mjc1MVwiLFwiMWYwMzY0ODQxM2EzOGMwYmUyOWQ0OTZlNTgyY2Y1NjYzZTg3NTFlOTY4NzczMzE1ODJjMjM3YTI0ZWIxZjk2MlwiXSxbXCJmZjJiMGRjZTk3ZWVjZTk3YzFjOWI2MDQxNzk4Yjg1ZGZkZmI2ZDg4ODJkYTIwMzA4ZjU0MDQ4MjQ1MjYwODdlXCIsXCI0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3XCJdLFtcIjgyN2ZiYmU0YjFlODgwZWE5ZWQyYjJlNjMwMWIyMTJiNTdmMWVlMTQ4Y2Q2ZGQyODc4MGU1ZTJjZjg1NmUyNDFcIixcImM2MGY5YzkyM2M3MjdiMGI3MWJlZjJjNjdkMWQxMjY4N2ZmN2E2MzE4NjkwMzE2NmQ2MDViNjhiYWVjMjkzZWNcIl0sW1wiZWFhNjQ5ZjIxZjUxYmRiYWU3YmU0YWUzNGNlNmU1MjE3YTU4ZmRjZTdmNDdmOWFhN2YzYjU4ZmEyMTIwZTJiM1wiLFwiYmUzMjc5ZWQ1YmJiYjAzYWM2OWE4MGY4OTg3OWFhNWEwMWE2Yjk2NWYxM2Y3ZTU5ZDQ3YTUzMDViYTVhZDkzZFwiXSxbXCJlNGE0MmQ0M2M1Y2YxNjlkOTM5MWRmNmRlY2Y0MmVlNTQxYjZkOGYwYzlhMTM3NDAxZTIzNjMyZGRhMzRkMjRmXCIsXCI0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0XCJdLFtcIjFlYzgwZmVmMzYwY2JkZDk1NDE2MGZhZGFiMzUyYjZiOTJiNTM1NzZhODhmZWE0OTQ3MTczYjlkNDMwMGJmMTlcIixcImFlZWZlOTM3NTZiNTM0MGQyZjNhNDk1OGE3YWJiZjVlMDE0NmU3N2Y2Mjk1YTA3YjY3MWNkYzFjYzEwN2NlZmRcIl0sW1wiMTQ2YTc3OGMwNDY3MGMyZjkxYjAwYWY0NjgwZGZhOGJjZTM0OTA3MTdkNThiYTg4OWRkYjU5MjgzNjY2NDJiZVwiLFwiYjMxOGUwZWMzMzU0MDI4YWRkNjY5ODI3ZjlkNGIyODcwYWFhOTcxZDJmN2U1ZWQxZDBiMjk3NDgzZDgzZWZkMFwiXSxbXCJmYTUwYzBmNjFkMjJlNWYwN2UzYWNlYmIxYWEwN2IxMjhkMDAxMjIwOWEyOGI5Nzc2ZDc2YTg3OTMxODBlZWY5XCIsXCI2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExXCJdLFtcImRhMWQ2MWQwY2E3MjFhMTFiMWE1YmY2YjdkODhlODQyMWEyODhhYjVkNWJiYTUyMjBlNTNkMzJiNWYwNjdlYzJcIixcIjgxNTdmNTVhN2M5OTMwNmM3OWMwNzY2MTYxYzkxZTI5NjZhNzM4OTlkMjc5YjQ4YTY1NWZiYTBmMWFkODM2ZjFcIl0sW1wiYThlMjgyZmYwYzk3MDY5MDcyMTVmZjk4ZThmZDQxNjYxNTMxMWRlMDQ0NmYxZTA2MmE3M2IwNjEwZDA2NGUxM1wiLFwiN2Y5NzM1NWI4ZGI4MWMwOWFiZmI3ZjNjNWIyNTE1ODg4YjY3OWEzZTUwZGQ2YmQ2Y2VmN2M3MzExMWY0Y2MwY1wiXSxbXCIxNzRhNTNiOWM5YTI4NTg3MmQzOWU1NmU2OTEzY2FiMTVkNTliMWZhNTEyNTA4YzAyMmYzODJkZTgzMTk0OTdjXCIsXCJjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczXCJdLFtcIjk1OTM5Njk4MTk0Mzc4NWMzZDNlNTdlZGY1MDE4Y2RiZTAzOWU3MzBlNDkxOGIzZDg4NGZkZmYwOTQ3NWI3YmFcIixcIjJlN2U1NTI4ODhjMzMxZGQ4YmEwMzg2YTRiOWNkNjg0OWM2NTNmNjRjODcwOTM4NWU5YjhhYmY4NzUyNGYyZmRcIl0sW1wiZDJhNjNhNTBhZTQwMWU1NmQ2NDVhMTE1M2IxMDlhOGZjY2EwYTQzZDU2MWZiYTJkYmI1MTM0MGM5ZDgyYjE1MVwiLFwiZTgyZDg2ZmI2NDQzZmNiNzU2NWFlZTU4YjI5NDgyMjBhNzBmNzUwYWY0ODRjYTUyZDQxNDIxNzRkY2Y4OTQwNVwiXSxbXCI2NDU4N2UyMzM1NDcxZWI4OTBlZTc4OTZkN2NmZGM4NjZiYWNiZGJkMzgzOTMxN2IzNDM2ZjliNDU2MTdlMDczXCIsXCJkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5XCJdLFtcIjg0ODFiZGUwZTRlNGQ4ODViM2E1NDZkM2U1NDlkZTA0MmYwYWE2Y2VhMjUwZTdmZDM1OGQ2Yzg2ZGQ0NWU0NThcIixcIjM4ZWU3YjhjYmE1NDA0ZGQ4NGEyNWJmMzljZWNiMmNhOTAwYTc5YzQyYjI2MmU1NTZkNjRiMWI1OTc3OTA1N2VcIl0sW1wiMTM0NjRhNTdhNzgxMDJhYTYyYjY5NzlhZTgxN2Y0NjM3ZmZjZmVkM2M0YjFjZTMwYmNkNjMwM2Y2Y2FmNjY2YlwiLFwiNjliZTE1OTAwNDYxNDU4MGVmN2U0MzM0NTNjY2IwY2E0OGYzMDBhODFkMDk0MmUxM2Y0OTVhOTA3ZjZlY2MyN1wiXSxbXCJiYzRhOWRmNWI3MTNmZTJlOWFlZjQzMGJjYzFkYzk3YTBjZDljY2VkZTJmMjg1ODhjYWRhM2EwZDJkODNmMzY2XCIsXCJkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzFcIl0sW1wiOGMyOGE5N2JmODI5OGJjMGQyM2Q4Yzc0OTQ1MmEzMmU2OTRiNjVlMzBhOTQ3MmEzOTU0YWIzMGZlNTMyNGNhYVwiLFwiNDBhMzA0NjNhMzMwNTE5MzM3OGZlZGYzMWY3Y2MwZWI3YWU3ODRmMDQ1MWNiOTQ1OWU3MWRjNzNjYmVmOTQ4MlwiXSxbXCI4ZWE5NjY2MTM5NTI3YThjMWRkOTRjZTRmMDcxZmQyM2M4YjM1MGM1YTRiYjMzNzQ4YzRiYTExMWZhY2NhZTBcIixcIjYyMGVmYWJiYzhlZTI3ODJlMjRlN2MwY2ZiOTVjNWQ3MzViNzgzYmU5Y2YwZjhlOTU1YWYzNGEzMGU2MmI5NDVcIl0sW1wiZGQzNjI1ZmFlZjViYTA2MDc0NjY5NzE2YmJkMzc4OGQ4OWJkZGU4MTU5NTk5NjgwOTJmNzZjYzRlYjlhOTc4N1wiLFwiN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3M1wiXSxbXCJmNzEwZDc5ZDllYjk2MjI5N2U0ZjYyMzJiNDBlOGY3ZmViMmJjNjM4MTQ2MTRkNjkyYzEyZGU3NTI0MDgyMjFlXCIsXCJlYTk4ZTY3MjMyZDNiMzI5NWQzYjUzNTUzMjExNWNjYWM4NjEyYzcyMTg1MTYxNzUyNmFlNDdhOWM3N2JmYzgyXCJdXX0sbmFmOnt3bmQ6Nyxwb2ludHM6W1tcImY5MzA4YTAxOTI1OGMzMTA0OTM0NGY4NWY4OWQ1MjI5YjUzMWM4NDU4MzZmOTliMDg2MDFmMTEzYmNlMDM2ZjlcIixcIjM4OGY3YjBmNjMyZGU4MTQwZmUzMzdlNjJhMzdmMzU2NjUwMGE5OTkzNGMyMjMxYjZjYjlmZDc1ODRiOGU2NzJcIl0sW1wiMmY4YmRlNGQxYTA3MjA5MzU1YjRhNzI1MGE1YzUxMjhlODhiODRiZGRjNjE5YWI3Y2JhOGQ1NjliMjQwZWZlNFwiLFwiZDhhYzIyMjYzNmU1ZTNkNmQ0ZGJhOWRkYTZjOWM0MjZmNzg4MjcxYmFiMGQ2ODQwZGNhODdkM2FhNmFjNjJkNlwiXSxbXCI1Y2JkZjA2NDZlNWRiNGVhYTM5OGYzNjVmMmVhN2EwZTNkNDE5YjdlMDMzMGUzOWNlOTJiZGRlZGNhYzRmOWJjXCIsXCI2YWViY2E0MGJhMjU1OTYwYTMxNzhkNmQ4NjFhNTRkYmE4MTNkMGI4MTNmZGU3YjVhNTA4MjYyODA4NzI2NGRhXCJdLFtcImFjZDQ4NGUyZjBjN2Y2NTMwOWFkMTc4YTlmNTU5YWJkZTA5Nzk2OTc0YzU3ZTcxNGMzNWYxMTBkZmMyN2NjYmVcIixcImNjMzM4OTIxYjBhN2Q5ZmQ2NDM4MDk3MTc2M2I2MWU5YWRkODg4YTQzNzVmOGUwZjA1Y2MyNjJhYzY0ZjljMzdcIl0sW1wiNzc0YWU3Zjg1OGE5NDExZTVlZjQyNDZiNzBjNjVhYWM1NjQ5OTgwYmU1YzE3ODkxYmJlYzE3ODk1ZGEwMDhjYlwiLFwiZDk4NGEwMzJlYjZiNWUxOTAyNDNkZDU2ZDdiN2IzNjUzNzJkYjFlMmRmZjlkNmE4MzAxZDc0YzljOTUzYzYxYlwiXSxbXCJmMjg3NzNjMmQ5NzUyODhiYzdkMWQyMDVjMzc0ODY1MWIwNzVmYmM2NjEwZTU4Y2RkZWVkZGY4ZjE5NDA1YWE4XCIsXCJhYjA5MDJlOGQ4ODBhODk3NTgyMTJlYjY1Y2RhZjQ3M2ExYTA2ZGE1MjFmYTkxZjI5YjVjYjUyZGIwM2VkODFcIl0sW1wiZDc5MjRkNGY3ZDQzZWE5NjVhNDY1YWUzMDk1ZmY0MTEzMWU1OTQ2ZjNjODVmNzllNDRhZGJjZjhlMjdlMDgwZVwiLFwiNTgxZTI4NzJhODZjNzJhNjgzODQyZWMyMjhjYzZkZWZlYTQwYWYyYmQ4OTZkM2E1YzUwNGRjOWZmNmEyNmI1OFwiXSxbXCJkZWZkZWE0Y2RiNjc3NzUwYTQyMGZlZTgwN2VhY2YyMWViOTg5OGFlNzliOTc2ODc2NmU0ZmFhMDRhMmQ0YTM0XCIsXCI0MjExYWIwNjk0NjM1MTY4ZTk5N2IwZWFkMmE5M2RhZWNlZDFmNGEwNGE5NWMwZjZjZmIxOTlmNjllNTZlYjc3XCJdLFtcIjJiNGVhMGE3OTdhNDQzZDI5M2VmNWNmZjQ0NGY0OTc5ZjA2YWNmZWJkN2U4NmQyNzc0NzU2NTYxMzgzODViNmNcIixcIjg1ZTg5YmMwMzc5NDVkOTNiMzQzMDgzYjVhMWM4NjEzMWEwMWY2MGM1MDI2OTc2M2I1NzBjODU0ZTVjMDliN2FcIl0sW1wiMzUyYmJmNGE0Y2RkMTI1NjRmOTNmYTMzMmNlMzMzMzAxZDlhZDQwMjcxZjgxMDcxODEzNDBhZWYyNWJlNTlkNVwiLFwiMzIxZWI0MDc1MzQ4ZjUzNGQ1OWMxODI1OWRkYTNlMWY0YTFiM2IyZTcxYjEwMzljNjdiZDNkOGJjZjgxOTk4Y1wiXSxbXCIyZmEyMTA0ZDZiMzhkMTFiMDIzMDAxMDU1OTg3OTEyNGU0MmFiOGRmZWZmNWZmMjlkYzljZGFkZDRlY2FjYzNmXCIsXCIyZGUxMDY4Mjk1ZGQ4NjViNjQ1NjkzMzViZDVkZDgwMTgxZDcwZWNmYzg4MjY0ODQyM2JhNzZiNTMyYjdkNjdcIl0sW1wiOTI0ODI3OWIwOWI0ZDY4ZGFiMjFhOWIwNjZlZGRhODMyNjNjM2Q4NGUwOTU3MmUyNjljYTBjZDdmNTQ1MzcxNFwiLFwiNzMwMTZmN2JmMjM0YWFkZTVkMWFhNzFiZGVhMmIxZmYzZmMwZGUyYTg4NzkxMmZmZTU0YTMyY2U5N2NiMzQwMlwiXSxbXCJkYWVkNGYyYmUzYThiZjI3OGU3MDEzMmZiMGJlYjc1MjJmNTcwZTE0NGJmNjE1YzA3ZTk5NmQ0NDNkZWU4NzI5XCIsXCJhNjlkY2U0YTdkNmM5OGU4ZDRhMWFjYTg3ZWY4ZDcwMDNmODNjMjMwZjNhZmE3MjZhYjQwZTUyMjkwYmUxYzU1XCJdLFtcImM0NGQxMmM3MDY1ZDgxMmU4YWNmMjhkN2NiYjE5ZjkwMTFlY2Q5ZTlmZGYyODFiMGU2YTNiNWU4N2QyMmU3ZGJcIixcIjIxMTlhNDYwY2UzMjZjZGM3NmM0NTkyNmM5ODJmZGFjMGUxMDZlODYxZWRmNjFjNWEwMzkwNjNmMGUwZTY0ODJcIl0sW1wiNmEyNDViZjZkYzY5ODUwNGM4OWEyMGNmZGVkNjA4NTMxNTJiNjk1MzM2YzI4MDYzYjYxYzY1Y2JkMjY5ZTZiNFwiLFwiZTAyMmNmNDJjMmJkNGE3MDhiM2Y1MTI2ZjE2YTI0YWQ4YjMzYmE0OGQwNDIzYjZlZmQ1ZTYzNDgxMDBkOGE4MlwiXSxbXCIxNjk3ZmZhNmZkOWRlNjI3YzA3N2UzZDJmZTU0MTA4NGNlMTMzMDBiMGJlYzExNDZmOTVhZTU3ZjBkMGJkNmE1XCIsXCJiOWMzOThmMTg2ODA2ZjVkMjc1NjE1MDZlNDU1NzQzM2EyY2YxNTAwOWU0OThhZTdhZGVlOWQ2M2QwMWIyMzk2XCJdLFtcIjYwNWJkYjAxOTk4MTcxOGI5ODZkMGYwN2U4MzRjYjBkOWRlYjgzNjBmZmI3ZjYxZGY5ODIzNDVlZjI3YTc0NzlcIixcIjI5NzJkMmRlNGY4ZDIwNjgxYTc4ZDkzZWM5NmZlMjNjMjZiZmFlODRmYjE0ZGI0M2IwMWUxZTkwNTZiOGM0OVwiXSxbXCI2MmQxNGRhYjQxNTBiZjQ5NzQwMmZkYzQ1YTIxNWUxMGRjYjAxYzM1NDk1OWIxMGNmZTMxYzdlOWQ4N2ZmMzNkXCIsXCI4MGZjMDZiZDhjYzViMDEwOTgwODhhMTk1MGVlZDBkYjAxYWExMzI5NjdhYjQ3MjIzNWY1NjQyNDgzYjI1ZWFmXCJdLFtcIjgwYzYwYWQwMDQwZjI3ZGFkZTViNGIwNmM0MDhlNTZiMmM1MGU5ZjU2YjliOGI0MjVlNTU1YzJmODYzMDhiNmZcIixcIjFjMzgzMDNmMWNjNWMzMGYyNmU2NmJhZDdmZTcyZjcwYTY1ZWVkNGNiZTcwMjRlYjFhYTAxZjU2NDMwYmQ1N2FcIl0sW1wiN2E5Mzc1YWQ2MTY3YWQ1NGFhNzRjNjM0OGNjNTRkMzQ0Y2M1ZGM5NDg3ZDg0NzA0OWQ1ZWFiYjBmYTAzYzhmYlwiLFwiZDBlM2ZhOWVjYTg3MjY5MDk1NTllMGQ3OTI2OTA0NmJkYzU5ZWExMGM3MGNlMmIwMmQ0OTllYzIyNGRjN2Y3XCJdLFtcImQ1MjhlY2Q5YjY5NmI1NGM5MDdhOWVkMDQ1NDQ3YTc5YmI0MDhlYzM5YjY4ZGY1MDRiYjUxZjQ1OWJjM2ZmYzlcIixcImVlY2Y0MTI1MzEzNmU1Zjk5OTY2ZjIxODgxZmQ2NTZlYmM0MzQ1NDA1YzUyMGRiYzA2MzQ2NWI1MjE0MDk5MzNcIl0sW1wiNDkzNzBhNGI1ZjQzNDEyZWEyNWY1MTRlOGVjZGFkMDUyNjYxMTVlNGE3ZWNiMTM4NzIzMTgwOGY4YjQ1OTYzXCIsXCI3NThmM2Y0MWFmZDZlZDQyOGIzMDgxYjA1MTJmZDYyYTU0YzNmM2FmYmI1YjY3NjRiNjUzMDUyYTEyOTQ5YzlhXCJdLFtcIjc3ZjIzMDkzNmVlODhjYmJkNzNkZjkzMGQ2NDcwMmVmODgxZDgxMWUwZTE0OThlMmYxYzEzZWIxZmMzNDVkNzRcIixcIjk1OGVmNDJhNzg4NmI2NDAwYTA4MjY2ZTliYTFiMzc4OTZjOTUzMzBkOTcwNzdjYmJlOGViM2M3NjcxYzYwZDZcIl0sW1wiZjJkYWM5OTFjYzRjZTRiOWVhNDQ4ODdlNWM3YzBiY2U1OGM4MDA3NGFiOWQ0ZGJhZWIyODUzMWI3NzM5ZjUzMFwiLFwiZTBkZWRjOWIzYjJmOGRhZDRkYTFmMzJkZWMyNTMxZGY5ZWI1ZmJlYjA1OThlNGZkMWExMTdkYmE3MDNhM2MzN1wiXSxbXCI0NjNiM2Q5ZjY2MjYyMWZiMWI0YmU4ZmJiZTI1MjAxMjVhMjE2Y2RmYzlkYWUzZGViY2JhNDg1MGM2OTBkNDViXCIsXCI1ZWQ0MzBkNzhjMjk2YzM1NDMxMTQzMDZkZDg2MjJkN2M2MjJlMjdjOTcwYTFkZTMxY2IzNzdiMDFhZjczMDdlXCJdLFtcImYxNmY4MDQyNDRlNDZlMmEwOTIzMmQ0YWZmM2I1OTk3NmI5OGZhYzE0MzI4YTJkMWEzMjQ5NmI0OTk5OGYyNDdcIixcImNlZGFiZDliODIyMDNmN2UxM2QyMDZmY2RmNGUzM2Q5MmE2YzUzYzI2ZTVjY2UyNmQ2NTc5OTYyYzRlMzFkZjZcIl0sW1wiY2FmNzU0MjcyZGM4NDU2M2IwMzUyYjdhMTQzMTFhZjU1ZDI0NTMxNWFjZTI3YzY1MzY5ZTE1ZjcxNTFkNDFkMVwiLFwiY2I0NzQ2NjBlZjM1ZjVmMmE0MWI2NDNmYTVlNDYwNTc1ZjRmYTliNzk2MjIzMmE1YzMyZjkwODMxOGEwNDQ3NlwiXSxbXCIyNjAwY2E0YjI4MmNiOTg2Zjg1ZDBmMTcwOTk3OWQ4YjQ0YTA5YzA3Y2I4NmQ3YzEyNDQ5N2JjODZmMDgyMTIwXCIsXCI0MTE5Yjg4NzUzYzE1YmQ2YTY5M2IwM2ZjZGRiYjQ1ZDVhYzZiZTc0YWI1ZjBlZjQ0YjBiZTk0NzVhN2U0YjQwXCJdLFtcIjc2MzVjYTcyZDdlODQzMmMzMzhlYzUzY2QxMjIyMGJjMDFjNDg2ODVlMjRmN2RjOGM2MDJhNzc0Njk5OGU0MzVcIixcIjkxYjY0OTYwOTQ4OWQ2MTNkMWQ1ZTU5MGY3OGU2ZDc0ZWNmYzA2MWQ1NzA0OGJhZDllNzZmMzAyYzViOWM2MVwiXSxbXCI3NTRlMzIzOWYzMjU1NzBjZGJiZjRhODdkZWVlOGE2NmI3ZjJiMzM0NzlkNDY4ZmJjMWE1MDc0M2JmNTZjYzE4XCIsXCI2NzNmYjg2ZTViZGEzMGZiM2NkMGVkMzA0ZWE0OWEwMjNlZTMzZDAxOTdhNjk1ZDBjNWQ5ODA5M2M1MzY2ODNcIl0sW1wiZTNlNmJkMTA3MWExZTk2YWZmNTc4NTljODJkNTcwZjAzMzA4MDA2NjFkMWM5NTJmOWZlMjY5NDY5MWQ5YjllOFwiLFwiNTljOWUwYmJhMzk0ZTc2ZjQwYzBhYTU4Mzc5YTNjYjZhNWEyMjgzOTkzZTkwYzQxNjcwMDJhZjQ5MjBlMzdmNVwiXSxbXCIxODZiNDgzZDA1NmEwMzM4MjZhZTczZDg4ZjczMjk4NWM0Y2NiMWYzMmJhMzVmNGI0Y2M0N2ZkY2YwNGFhNmViXCIsXCIzYjk1MmQzMmM2N2NmNzdlMmUxNzQ0NmUyMDQxODBhYjIxZmI4MDkwODk1MTM4YjRhNGE3OTdmODZlODA4ODhiXCJdLFtcImRmOWQ3MGE2Yjk4NzZjZTU0NGM5ODU2MWY0YmU0ZjcyNTQ0MmU2ZDJiNzM3ZDljOTFhODMyMTcyNGNlMDk2M2ZcIixcIjU1ZWIyZGFmZDg0ZDZjY2Q1Zjg2MmI3ODVkYzM5ZDRhYjE1NzIyMjcyMGVmOWRhMjE3YjhjNDVjZjJiYTI0MTdcIl0sW1wiNWVkZDVjYzIzYzUxZTg3YTQ5N2NhODE1ZDVkY2UwZjhhYjUyNTU0Zjg0OWVkODk5NWRlNjRjNWYzNGNlNzE0M1wiLFwiZWZhZTljOGRiYzE0MTMwNjYxZThjZWMwMzBjODlhZDBjMTNjNjZjMGQxN2EyOTA1Y2RjNzA2YWI3Mzk5YTg2OFwiXSxbXCIyOTA3OThjMmI2NDc2ODMwZGExMmZlMDIyODdlOWU3NzdhYTNmYmExYzM1NWIxN2E3MjJkMzYyZjg0NjE0ZmJhXCIsXCJlMzhkYTc2ZGNkNDQwNjIxOTg4ZDAwYmNmNzlhZjI1ZDViMjljMDk0ZGIyYTIzMTQ2ZDAwM2FmZDQxOTQzZTdhXCJdLFtcImFmM2M0MjNhOTVkOWY1YjMwNTQ3NTRlZmExNTBhYzM5Y2QyOTU1MmZlMzYwMjU3MzYyZGZkZWNlZjQwNTNiNDVcIixcImY5OGEzZmQ4MzFlYjJiNzQ5YTkzYjBlNmYzNWNmYjQwYzhjZDVhYTY2N2ExNTU4MWJjMmZlZGVkNDk4ZmQ5YzZcIl0sW1wiNzY2ZGJiMjRkMTM0ZTc0NWNjY2FhMjhjOTliZjI3NDkwNmJiNjZiMjZkY2Y5OGRmOGQyZmVkNTBkODg0MjQ5YVwiLFwiNzQ0YjExNTJlYWNiZTVlMzhkY2M4ODc5ODBkYTM4Yjg5NzU4NGE2NWZhMDZjZWRkMmM5MjRmOTdjYmFjNTk5NlwiXSxbXCI1OWRiZjQ2ZjhjOTQ3NTliYTIxMjc3YzMzNzg0ZjQxNjQ1ZjdiNDRmNmM1OTZhNThjZTkyZTY2NjE5MWFiZTNlXCIsXCJjNTM0YWQ0NDE3NWZiYzMwMGY0ZWE2Y2U2NDgzMDlhMDQyY2U3MzlhNzkxOTc5OGNkODVlMjE2YzRhMzA3ZjZlXCJdLFtcImYxM2FkYTk1MTAzYzQ1MzczMDVlNjkxZTc0ZTlhNGE4ZGQ2NDdlNzExYTk1ZTczY2I2MmRjNjAxOGNmZDg3YjhcIixcImUxMzgxN2I0NGVlMTRkZTY2M2JmNGJjODA4MzQxZjMyNjk0OWUyMWE2YTc1YzI1NzA3Nzg0MTliZGFmNTczM2RcIl0sW1wiNzc1NGI0ZmEwZThhY2VkMDZkNDE2N2EyYzU5Y2NhNGNkYTE4NjljMDZlYmFkZmI2NDg4NTUwMDE1YTg4NTIyY1wiLFwiMzBlOTNlODY0ZTY2OWQ4MjIyNGI5NjdjMzAyMGI4ZmE4ZDFlNGUzNTBiNmNiY2M1MzdhNDhiNTc4NDExNjNhMlwiXSxbXCI5NDhkY2FkZjU5OTBlMDQ4YWEzODc0ZDQ2YWJlZjlkNzAxODU4Zjk1ZGU4MDQxZDJhNjgyOGM5OWUyMjYyNTE5XCIsXCJlNDkxYTQyNTM3ZjZlNTk3ZDVkMjhhMzIyNGIxYmMyNWRmOTE1NGVmYmQyZWYxZDJjYmJhMmNhZTUzNDdkNTdlXCJdLFtcIjc5NjI0MTQ0NTBjNzZjMTY4OWM3YjQ4ZjgyMDJlYzM3ZmIyMjRjZjVhYzBiZmExNTcwMzI4YThhM2Q3Yzc3YWJcIixcIjEwMGI2MTBlYzRmZmI0NzYwZDVjMWZjMTMzZWY2ZjZiMTI1MDdhMDUxZjA0YWM1NzYwYWZhNWIyOWRiODM0MzdcIl0sW1wiMzUxNDA4NzgzNDk2NGI1NGIxNWIxNjA2NDRkOTE1NDg1YTE2OTc3MjI1Yjg4NDdiYjBkZDA4NTEzN2VjNDdjYVwiLFwiZWYwYWZiYjIwNTYyMDU0NDhlMTY1MmM0OGU4MTI3ZmM2MDM5ZTc3YzE1YzIzNzhiN2U3ZDE1YTBkZTI5MzMxMVwiXSxbXCJkM2NjMzBhZDZiNDgzZTRiYzc5Y2UyYzlkZDhiYzU0OTkzZTk0N2ViOGRmNzg3YjQ0Mjk0M2QzZjdiNTI3ZWFmXCIsXCI4YjM3OGEyMmQ4MjcyNzhkODljNWU5YmU4Zjk1MDhhZTNjMmFkNDYyOTAzNTg2MzBhZmIzNGRiMDRlZWRlMGE0XCJdLFtcIjE2MjRkODQ3ODA3MzI4NjBjZTFjNzhmY2JmZWZlMDhiMmIyOTgyM2RiOTEzZjY0OTM5NzViYTBmZjQ4NDc2MTBcIixcIjY4NjUxY2Y5YjZkYTkwM2UwOTE0NDQ4YzZjZDlkNGNhODk2ODc4ZjUyODJiZTRjOGNjMDZlMmE0MDQwNzg1NzVcIl0sW1wiNzMzY2U4MGRhOTU1YThhMjY5MDJjOTU2MzNlNjJhOTg1MTkyNDc0YjVhZjIwN2RhNmRmN2I0ZmQ1ZmM2MWNkNFwiLFwiZjU0MzVhMmJkMmJhZGY3ZDQ4NWE0ZDhiOGRiOWZjY2UzZTFlZjhlMDIwMWU0NTc4YzU0NjczYmMxZGM1ZWExZFwiXSxbXCIxNWQ5NDQxMjU0OTQ1MDY0Y2YxYTFjMzNiYmQzYjQ5Zjg5NjZjNTA5MjE3MWU2OTllZjI1OGRmYWI4MWMwNDVjXCIsXCJkNTZlYjMwYjY5NDYzZTcyMzRmNTEzN2I3M2I4NDE3NzQzNDgwMGJhY2ViZmM2ODVmYzM3YmJlOWVmZTQwNzBkXCJdLFtcImExZDBmY2YyZWM5ZGU2NzViNjEyMTM2ZTVjZTcwZDI3MWMyMTQxN2M5ZDJiOGFhYWFjMTM4NTk5ZDA3MTc5NDBcIixcImVkZDc3ZjUwYmNiNWEzY2FiMmU5MDczNzMwOTY2N2YyNjQxNDYyYTU0MDcwZjNkNTE5MjEyZDM5YzE5N2E2MjlcIl0sW1wiZTIyZmJlMTVjMGFmOGNjYzU3ODBjMDczNWY4NGRiZTlhNzkwYmFkZWU4MjQ1YzA2YzdjYTM3MzMxY2IzNjk4MFwiLFwiYTg1NWJhYmFkNWNkNjBjODhiNDMwYTY5ZjUzYTFhN2EzODI4OTE1NDk2NDc5OWJlNDNkMDZkNzdkMzFkYTA2XCJdLFtcIjMxMTA5MWRkOTg2MGU4ZTIwZWUxMzQ3M2MxMTU1ZjVmNjk2MzVlMzk0NzA0ZWFhNzQwMDk0NTIyNDZjZmE5YjNcIixcIjY2ZGI2NTZmODdkMWYwNGZmZmQxZjA0Nzg4YzA2ODMwODcxZWM1YTY0ZmVlZTY4NWJkODBmMGIxMjg2ZDgzNzRcIl0sW1wiMzRjMWZkMDRkMzAxYmU4OWIzMWMwNDQyZDNlNmFjMjQ4ODM5MjhiNDVhOTM0MDc4MTg2N2Q0MjMyZWMyZGJkZlwiLFwiOTQxNDY4NWU5N2IxYjU5NTRiZDQ2ZjczMDE3NDEzNmQ1N2YxY2VlYjQ4NzQ0M2RjNTMyMTg1N2JhNzNhYmVlXCJdLFtcImYyMTllYTVkNmI1NDcwMWMxYzE0ZGU1YjU1N2ViNDJhOGQxM2YzYWJiY2QwOGFmZmNjMmE1ZTZiMDQ5YjhkNjNcIixcIjRjYjk1OTU3ZTgzZDQwYjBmNzNhZjQ1NDRjY2NmNmIxZjRiMDhkM2MwN2IyN2ZiOGQ4YzI5NjJhNDAwNzY2ZDFcIl0sW1wiZDdiODc0MGY3NGE4ZmJhYWIxZjY4M2RiOGY0NWRlMjY1NDNhNTQ5MGJjYTYyNzA4NzIzNjkxMjQ2OWEwYjQ0OFwiLFwiZmE3Nzk2ODEyOGQ5YzkyZWUxMDEwZjMzN2FkNDcxN2VmZjE1ZGI1ZWQzYzA0OWIzNDExZTAzMTVlYWE0NTkzYlwiXSxbXCIzMmQzMWMyMjJmOGY2ZjBlZjg2ZjdjOThkM2EzMzM1ZWFkNWJjZDMyYWJkZDk0Mjg5ZmU0ZDMwOTFhYTgyNGJmXCIsXCI1ZjMwMzJmNTg5MjE1NmUzOWNjZDNkNzkxNWI5ZTFkYTJlNmRhYzllNmYyNmU5NjExMThkMTRiODQ2MmUxNjYxXCJdLFtcIjc0NjFmMzcxOTE0YWIzMjY3MTA0NWExNTVkOTgzMWVhODc5M2Q3N2NkNTk1OTJjNDM0MGY4NmNiYzE4MzQ3YjVcIixcIjhlYzBiYTIzOGI5NmJlYzBjYmRkZGNhZTBhYTQ0MjU0MmVlZTFmZjUwYzk4NmVhNmIzOTg0N2IzY2MwOTJmZjZcIl0sW1wiZWUwNzlhZGIxZGYxODYwMDc0MzU2YTI1YWEzODIwNmE2ZDcxNmIyYzNlNjc0NTNkMjg3Njk4YmFkN2IyYjJkNlwiLFwiOGRjMjQxMmFhZmUzYmU1YzRjNWYzN2UwZWNjNWY5ZjZhNDQ2OTg5YWYwNGM0ZTI1ZWJhYWM0NzllYzFjOGMxZVwiXSxbXCIxNmVjOTNlNDQ3ZWM4M2YwNDY3YjE4MzAyZWU2MjBmN2U2NWRlMzMxODc0YzlkYzcyYmZkODYxNmJhOWRhNmI1XCIsXCI1ZTQ2MzExNTBlNjJmYjQwZDBlOGMyYTdjYTU4MDRhMzlkNTgxODZhNTBlNDk3MTM5NjI2Nzc4ZTI1YjA2NzRkXCJdLFtcImVhYTVmOTgwYzI0NWY2ZjAzODk3ODI5MGFmYTcwYjZiZDg4NTU4OTdmOThiNmFhNDg1Yjk2MDY1ZDUzN2JkOTlcIixcImY2NWY1ZDNlMjkyYzJlMDgxOWE1MjgzOTFjOTk0NjI0ZDc4NDg2OWQ3ZTZlYTY3ZmIxODA0MTAyNGVkYzA3ZGNcIl0sW1wiNzhjOTQwNzU0NGFjMTMyNjkyZWUxOTEwYTAyNDM5OTU4YWUwNDg3NzE1MTM0MmVhOTZjNGI2YjM1YTQ5ZjUxXCIsXCJmM2UwMzE5MTY5ZWI5Yjg1ZDU0MDQ3OTU1MzlhNWU2OGZhMWZiZDU4M2MwNjRkMjQ2MmI2NzVmMTk0YTNkZGI0XCJdLFtcIjQ5NGY0YmUyMTlhMWE3NzAxNmRjZDgzODQzMWFlYTAwMDFjZGM4YWU3YTZmYzY4ODcyNjU3OGQ5NzAyODU3YTVcIixcIjQyMjQyYTk2OTI4M2E1ZjMzOWJhN2YwNzVlMzZiYTJhZjkyNWNlMzBkNzY3ZWQ2ZTU1ZjRiMDMxODgwZDU2MmNcIl0sW1wiYTU5OGE4MDMwZGE2ZDg2YzZiYzdmMmY1MTQ0ZWE1NDlkMjgyMTFlYTU4ZmFhNzBlYmY0YzFlNjY1YzFmZTliNVwiLFwiMjA0YjVkNmY4NDgyMmMzMDdlNGI0YTcxNDA3MzdhZWMyM2ZjNjNiNjViMzVmODZhMTAwMjZkYmQyZDg2NGU2YlwiXSxbXCJjNDE5MTYzNjVhYmIyYjVkMDkxOTJmNWYyZGJlYWZlYzIwOGYwMjBmMTI1NzBhMTg0ZGJhZGMzZTU4NTk1OTk3XCIsXCI0ZjE0MzUxZDAwODdlZmE0OWQyNDViMzI4OTg0OTg5ZDVjYWY5NDUwZjM0YmZjMGVkMTZlOTZiNThmYTk5MTNcIl0sW1wiODQxZDYwNjNhNTg2ZmE0NzVhNzI0NjA0ZGEwM2JjNWI5MmEyZTBkMmUwYTM2YWNmZTRjNzNhNTUxNDc0Mjg4MVwiLFwiNzM4NjdmNTljMDY1OWU4MTkwNGY5YTFjNzU0MzY5OGU2MjU2MmQ2NzQ0YzE2OWNlN2EzNmRlMDFhOGQ2MTU0XCJdLFtcIjVlOTViYjM5OWE2OTcxZDM3NjAyNjk0N2Y4OWJkZTJmMjgyYjMzODEwOTI4YmU0ZGVkMTEyYWM0ZDcwZTIwZDVcIixcIjM5ZjIzZjM2NjgwOTA4NWJlZWJmYzcxMTgxMzEzNzc1YTk5YzlhZWQ3ZDhiYTM4YjE2MTM4NGM3NDYwMTI4NjVcIl0sW1wiMzZlNDY0MWE1Mzk0OGZkNDc2YzM5ZjhhOTlmZDk3NGU1ZWMwNzU2NGI1MzE1ZDhiZjk5NDcxYmNhMGVmMmY2NlwiLFwiZDI0MjRiMWIxYWJlNGViODE2NDIyN2IwODVjOWFhOTQ1NmVhMTM0OTNmZDU2M2UwNmZkNTFjZjU2OTRjNzhmY1wiXSxbXCIzMzY1ODFlYTdiZmJiYjI5MGMxOTFhMmY1MDdhNDFjZjU2NDM4NDIxNzBlOTE0ZmFlYWIyN2MyYzU3OWY3MjZcIixcImVhZDEyMTY4NTk1ZmUxYmU5OTI1MjEyOWI2ZTU2YjMzOTFmN2FiMTQxMGNkMWUwZWYzZGNkY2FiZDJmZGEyMjRcIl0sW1wiOGFiODk4MTZkYWRmZDZiNmExZjI2MzRmY2YwMGVjODQwMzc4MTAyNWVkNjg5MGM0ODQ5NzQyNzA2YmQ0M2VkZVwiLFwiNmZkY2VmMDlmMmY2ZDBhMDQ0ZTY1NGFlZjYyNDEzNmY1MDNkNDU5YzNlODk4NDU4NThhNDdhOTEyOWNkZDI0ZVwiXSxbXCIxZTMzZjFhNzQ2YzljNTc3ODEzMzM0NGQ5Mjk5ZmNhYTIwYjA5MzhlOGFjZmYyNTQ0YmI0MDI4NGI4YzVmYjk0XCIsXCI2MDY2MDI1N2RkMTFiM2FhOWM4ZWQ2MThkMjRlZGZmMjMwNmQzMjBmMWQwMzAxMGUzM2E3ZDIwNTdmM2IzYjZcIl0sW1wiODViN2MxZGNiM2NlYzFiN2VlN2YzMGRlZDc5ZGQyMGEwZWQxZjRjYzE4Y2JjZmNmYTQxMDM2MWZkOGYwOGYzMVwiLFwiM2Q5OGE5Y2RkMDI2ZGQ0M2YzOTA0OGYyNWE4ODQ3ZjRmY2FmYWQxODk1ZDdhNjMzYzZmZWQzYzM1ZTk5OTUxMVwiXSxbXCIyOWRmOWZiZDhkOWU0NjUwOTI3NWY0YjEyNWQ2ZDQ1ZDdmYmU5YTNiODc4YTdhZjg3MmEyODAwNjYxYWM1ZjUxXCIsXCJiNGM0ZmU5OWM3NzVhNjA2ZTJkODg2MjE3OTEzOWZmZGE2MWRjODYxYzAxOWU1NWNkMjg3NmViMmEyN2Q4NGJcIl0sW1wiYTBiMWNhZTA2YjBhODQ3YTNmZWE2ZTY3MWFhZjhhZGZkZmU1OGNhMmY3NjgxMDVjODA4MmIyZTQ0OWZjZTI1MlwiLFwiYWU0MzQxMDJlZGRlMDk1OGVjNGIxOWQ5MTdhNmEyOGU2YjcyZGExODM0YWZmMGU2NTBmMDQ5NTAzYTI5NmNmMlwiXSxbXCI0ZThjZWFmYjliM2U5YTEzNmRjN2ZmNjdlODQwMjk1YjQ5OWRmYjNiMjEzM2U0YmExMTNmMmU0YzBlMTIxZTVcIixcImNmMjE3NDExOGM4YjZkN2E0YjQ4ZjZkNTM0Y2U1Yzc5NDIyYzA4NmE2MzQ2MDUwMmI4MjdjZTYyYTMyNjY4M2NcIl0sW1wiZDI0YTQ0ZTA0N2UxOWI2ZjVhZmI4MWM3Y2EyZjY5MDgwYTUwNzY2ODlhMDEwOTE5ZjQyNzI1YzJiNzg5YTMzYlwiLFwiNmZiOGQ1NTkxYjQ2NmY4ZmM2M2RiNTBmMWMwZjFjNjkwMTNmOTk2ODg3YjgyNDRkMmNkZWM0MTdhZmVhOGZhM1wiXSxbXCJlYTAxNjA2YTdhNmM5Y2RkMjQ5ZmRmY2ZhY2I5OTU4NDAwMWVkZDI4YWJiYWI3N2I1MTA0ZTk4ZThlM2IzNWQ0XCIsXCIzMjJhZjQ5MDhjNzMxMmIwY2ZiZmUzNjlmN2E3YjNjZGI3ZDQ0OTRiYzI4MjM3MDBjZmQ2NTIxODhhM2VhOThkXCJdLFtcImFmOGFkZGJmMmI2NjFjOGE2YzYzMjg2NTVlYjk2NjUxMjUyMDA3ZDhjNWVhMzFiZTRhZDE5NmRlOGNlMjEzMWZcIixcIjY3NDllNjdjMDI5Yjg1ZjUyYTAzNGVhZmQwOTY4MzZiMjUyMDgxODY4MGUyNmFjOGYzZGZiY2RiNzE3NDk3MDBcIl0sW1wiZTNhZTE5NzQ1NjZjYTA2Y2M1MTZkNDdlMGZiMTY1YTY3NGEzZGFiY2ZjYTE1ZTcyMmYwZTM0NTBmNDU4ODlcIixcIjJhZWFiZTdlNDUzMTUxMDExNjIxN2YwN2JmNGQwNzMwMGRlOTdlNDg3NGY4MWY1MzM0MjBhNzJlZWIwYmQ2YTRcIl0sW1wiNTkxZWUzNTUzMTNkOTk3MjFjZjY5OTNmZmVkMWUzZTMwMTk5M2ZmM2VkMjU4ODAyMDc1ZWE4Y2VkMzk3ZTI0NlwiLFwiYjBlYTU1OGExMTNjMzBiZWE2MGZjNDc3NTQ2MGM3OTAxZmYwYjA1M2QyNWNhMmJkZWVlOThmMWE0YmU1ZDE5NlwiXSxbXCIxMTM5NmQ1NWZkYTU0YzQ5ZjE5YWE5NzMxOGQ4ZGE2MWZhODU4NGU0N2IwODQ5NDUwNzdjZjAzMjU1YjUyOTg0XCIsXCI5OThjNzRhOGNkNDVhYzAxMjg5ZDU4MzNhN2JlYjQ3NDRmZjUzNmIwMWIyNTdiZTRjNTc2N2JlYTkzZWE1N2E0XCJdLFtcIjNjNWQyYTFiYTM5YzVhMTc5MDAwMDczOGM5ZTBjNDBiOGRjZGZkNTQ2ODc1NGI2NDA1NTQwMTU3ZTAxN2FhN2FcIixcImIyMjg0Mjc5OTk1YTM0ZTJmOWQ0ZGU3Mzk2ZmMxOGI4MGY5YjhiOWZkZDI3MGY2NjYxZjc5Y2E0YzgxYmQyNTdcIl0sW1wiY2M4NzA0YjhhNjBhMGRlZmEzYTk5YTcyOTlmMmU5YzNmYmMzOTVhZmIwNGFjMDc4NDI1ZWY4YTE3OTNjYzAzMFwiLFwiYmRkNDYwMzlmZWVkMTc4ODFkMWUwODYyZGIzNDdmOGNmMzk1Yjc0ZmM0YmNkYzRlOTQwYjc0ZTNhYzFmMWIxM1wiXSxbXCJjNTMzZTRmN2VhODU1NWFhY2Q5Nzc3YWM1Y2FkMjliOTdkZDRkZWZjY2M1M2VlN2VhMjA0MTE5YjI4ODliMTk3XCIsXCI2ZjBhMjU2YmM1ZWZkZjQyOWEyZmI2MjQyZjFhNDNhMmQ5YjkyNWJiNGE0YjNhMjZiYjhlMGY0NWViNTk2MDk2XCJdLFtcImMxNGY4ZjJjY2IyN2Q2ZjEwOWY2ZDA4ZDAzY2M5NmE2OWJhOGMzNGVlYzA3YmJjZjU2NmQ0OGUzM2RhNjU5M1wiLFwiYzM1OWQ2OTIzYmIzOThmN2ZkNDQ3M2UxNmZlMWMyODQ3NWI3NDBkZDA5ODA3NWU2YzBlODY0OTExM2RjM2EzOFwiXSxbXCJhNmNiYzMwNDZiYzZhNDUwYmFjMjQ3ODlmYTE3MTE1YTRjOTczOWVkNzVmOGYyMWNlNDQxZjcyZTBiOTBlNmVmXCIsXCIyMWFlN2Y0NjgwZTg4OWJiMTMwNjE5ZTJjMGY5NWEzNjBjZWI1NzNjNzA2MDMxMzk4NjJhZmQ2MTdmYTliOWZcIl0sW1wiMzQ3ZDZkOWEwMmM0ODkyN2ViZmI4NmMxMzU5YjFjYWYxMzBhM2MwMjY3ZDExY2U2MzQ0YjM5Zjk5ZDQzY2MzOFwiLFwiNjBlYTdmNjFhMzUzNTI0ZDFjOTg3ZjZlY2VjOTJmMDg2ZDU2NWFiNjg3ODcwY2IxMjY4OWZmMWUzMWM3NDQ0OFwiXSxbXCJkYTY1NDVkMjE4MWRiOGQ5ODNmN2RjYjM3NWVmNTg2NmQ0N2M2N2IxYmYzMWM4Y2Y4NTVlZjc0MzdiNzI2NTZhXCIsXCI0OWI5NjcxNWFiNjg3OGE3OWU3OGYwN2NlNTY4MGM1ZDY2NzMwNTFiNDkzNWJkODk3ZmVhODI0Yjc3ZGMyMDhhXCJdLFtcImM0MDc0N2NjOWQwMTJjYjFhMTNiODE0ODMwOWM2ZGU3ZWMyNWQ2OTQ1ZDY1NzE0NmI5ZDU5OTRiOGZlYjExMTFcIixcIjVjYTU2MDc1M2JlMmExMmZjNmRlNmNhZjJjYjQ4OTU2NWRiOTM2MTU2Yjk1MTRlMWJiNWU4MzAzN2UwZmEyZDRcIl0sW1wiNGU0MmM4ZWM4MmM5OTc5OGNjZjNhNjEwYmU4NzBlNzgzMzhjN2Y3MTMzNDhiZDM0YzgyMDNlZjQwMzdmMzUwMlwiLFwiNzU3MWQ3NGVlNWUwZmI5MmE3YThiMzNhMDc3ODMzNDFhNTQ5MjE0NGNjNTRiY2M0MGE5NDQ3MzY5MzYwNjQzN1wiXSxbXCIzNzc1YWI3MDg5YmM2YWY4MjNhYmEyZTFhZjcwYjIzNmQyNTFjYWRiMGM4Njc0MzI4NzUyMmExYjNiMGRlZGVhXCIsXCJiZTUyZDEwN2JjZmEwOWQ4YmNiOTczNmE4MjhjZmE3ZmFjOGRiMTdiZjdhNzZhMmM0MmFkOTYxNDA5MDE4Y2Y3XCJdLFtcImNlZTMxY2JmN2UzNGVjMzc5ZDk0ZmI4MTRkM2Q3NzVhZDk1NDU5NWQxMzE0YmE4ODQ2OTU5ZTNlODJmNzRlMjZcIixcIjhmZDY0YTE0YzA2YjU4OWMyNmI5NDdhZTJiY2Y2YmZhMDE0OWVmMGJlMTRlZDRkODBmNDQ4YTAxYzQzYjFjNmRcIl0sW1wiYjRmOWVhZWEwOWI2OTE3NjE5ZjZlYTZhNGViNTQ2NGVmZGRiNThmZDQ1YjFlYmVmY2RjMWEwMWQwOGI0Nzk4NlwiLFwiMzllNWM5OTI1YjVhNTRiMDc0MzNhNGYxOGM2MTcyNmY4YmIxMzFjMDEyY2E1NDJlYjI0YThhYzA3MjAwNjgyYVwiXSxbXCJkNDI2M2RmYzNkMmRmOTIzYTAxNzlhNDg5NjZkMzBjZTg0ZTI1MTVhZmMzZGNjYzFiNzc5MDc3OTJlYmNjNjBlXCIsXCI2MmRmYWYwN2EwZjc4ZmViMzBlMzBkNjI5NTg1M2NlMTg5ZTEyNzc2MGFkNmNmN2ZhZTE2NGUxMjJhMjA4ZDU0XCJdLFtcIjQ4NDU3NTI0ODIwZmE2NWE0ZjhkMzVlYjY5MzA4NTdjMDAzMmFjYzBhNGEyZGU0MjIyMzNlZWRhODk3NjEyYzRcIixcIjI1YTc0OGFiMzY3OTc5ZDk4NzMzYzM4YTFmYTFjMmU3ZGM2Y2MwN2RiMmQ2MGE5YWU3YTc2YWFhNDliZDBmNzdcIl0sW1wiZGZlZWVmMTg4MTEwMWYyY2IxMTY0NGYzYTJhZmRmYzIwNDVlMTk5MTkxNTI5MjNmMzY3YTE3NjdjMTFjY2VkYVwiLFwiZWNmYjcwNTZjZjFkZTA0MmY5NDIwYmFiMzk2NzkzYzBjMzkwYmRlNzRiNGJiZGZmMTZhODNhZTA5YTlhNzUxN1wiXSxbXCI2ZDdlZjZiMTc1NDNmODM3M2M1NzNmNDRlMWYzODk4MzVkODliY2JjNjA2MmNlZDM2YzgyZGY4M2I4ZmFlODU5XCIsXCJjZDQ1MGVjMzM1NDM4OTg2ZGZlZmExMGM1N2ZlYTliY2M1MjFhMDk1OWIyZDgwYmJmNzRiMTkwZGNhNzEyZDEwXCJdLFtcImU3NTYwNWQ1OTEwMmE1YTI2ODQ1MDBkM2I5OTFmMmUzZjNjODhiOTMyMjU1NDcwMzVhZjI1YWY2NmUwNDU0MWZcIixcImY1YzU0NzU0YThmNzFlZTU0MGI5YjQ4NzI4NDczZTMxNGY3MjlhYzUzMDhiMDY5MzgzNjA5OTBlMmJmYWQxMjVcIl0sW1wiZWI5ODY2MGY0YzRkZmFhMDZhMmJlNDUzZDUwMjBiYzk5YTBjMmU2MGFiZTM4ODQ1N2RkNDNmZWZiMWVkNjIwY1wiLFwiNmNiOWE4ODc2ZDljYjg1MjA2MDlhZjNhZGQyNmNkMjBhMGE3Y2Q4YTk0MTExMzFjZTg1ZjQ0MTAwMDk5MjIzZVwiXSxbXCIxM2U4N2IwMjdkODUxNGQzNTkzOWYyZTY4OTJiMTk5MjIxNTQ1OTY5NDE4ODgzMzZkYzM1NjNlM2I4ZGJhOTQyXCIsXCJmZWY1YTNjNjgwNTlhNmRlYzVkNjI0MTE0YmYxZTkxYWFjMmI5ZGE1NjhkNmFiZWIyNTcwZDU1NjQ2YjhhZGYxXCJdLFtcImVlMTYzMDI2ZTlmZDZmZTAxN2MzOGYwNmE1YmU2ZmMxMjU0MjRiMzcxY2UyNzA4ZTdiZjQ0OTE2OTFlNTc2NGFcIixcIjFhY2IyNTBmMjU1ZGQ2MWM0M2Q5NGNjYzY3MGQwZjU4ZjQ5YWUzZmExNWI5NjYyM2U1NDMwZGEwYWQ2YzYyYjJcIl0sW1wiYjI2OGY1ZWY5YWQ1MWU0ZDc4ZGUzYTc1MGMyZGM4OWIxZTYyNmQ0MzUwNTg2Nzk5OTkzMmU1ZGIzM2FmM2Q4MFwiLFwiNWYzMTBkNGIzYzk5YjllYmIxOWY3N2Q0MWMxZGVlMDE4Y2YwZDM0ZmQ0MTkxNjE0MDAzZTk0NWExMjE2ZTQyM1wiXSxbXCJmZjA3ZjMxMThhOWRmMDM1ZTlmYWQ4NWViNmM3YmZlNDJiMDJmMDFjYTk5Y2VlYTNiZjdmZmRiYTkzYzQ3NTBkXCIsXCI0MzgxMzZkNjAzZTg1OGEzYTVjNDQwYzM4ZWNjYmFkZGMxZDI5NDIxMTRlMmVkZGQ0NzQwZDA5OGNlZDFmMGQ4XCJdLFtcIjhkOGI5ODU1YzdjMDUyYTM0MTQ2ZmQyMGZmYjY1OGJlYTRiOWY2OWUwZDgyNWViZWMxNmU4YzNjZTJiNTI2YTFcIixcImNkYjU1OWVlZGMyZDc5ZjkyNmJhZjQ0ZmI4NGVhNGQ0NGJjZjUwZmVlNTFkN2NlYjMwZTJlN2Y0NjMwMzY3NThcIl0sW1wiNTJkYjBiNTM4NGRmYmYwNWJmYTlkNDcyZDdhZTI2ZGZlNGI4NTFjZWNhOTFiMWViYTU0MjYzMTgwZGEzMmI2M1wiLFwiYzNiOTk3ZDA1MGVlNWQ0MjNlYmFmNjZhNmRiOWY1N2IzMTgwYzkwMjg3NTY3OWRlOTI0YjY5ZDg0YTdiMzc1XCJdLFtcImU2MmY5NDkwZDNkNTFkYTYzOTVlZmQyNGU4MDkxOWNjN2QwZjI5YzNmM2ZhNDhjNmZmZjU0M2JlY2JkNDMzNTJcIixcIjZkODlhZDdiYTQ4NzZiMGIyMmMyY2EyODBjNjgyODYyZjM0MmM4NTkxZjFkYWY1MTcwZTA3YmZkOWNjYWZhN2RcIl0sW1wiN2YzMGVhMjQ3NmIzOTliNDk1NzUwOWM4OGY3N2QwMTkxYWZhMmZmNWNiN2IxNGZkNmQ4ZTdkNjVhYWFiMTE5M1wiLFwiY2E1ZWY3ZDRiMjMxYzk0YzNiMTUzODlhNWY2MzExZTlkYWZmN2JiNjdiMTAzZTk4ODBlZjRiZmY2MzdhY2FlY1wiXSxbXCI1MDk4ZmYxZTFkOWYxNGZiNDZhMjEwZmFkYTZjOTAzZmVmMGZiN2I0YTFkZDFkOWFjNjBhMDM2MTgwMGI3YTAwXCIsXCI5NzMxMTQxZDgxZmM4ZjgwODRkMzdjNmU3NTQyMDA2YjNlZTFiNDBkNjBkZmU1MzYyYTViMTMyZmQxN2RkYzBcIl0sW1wiMzJiNzhjN2RlOWVlNTEyYTcyODk1YmU2YjljYmVmYTZlMmYzYzRjY2NlNDQ1Yzk2YjlmMmM4MWUyNzc4YWQ1OFwiLFwiZWUxODQ5ZjUxM2RmNzFlMzJlZmMzODk2ZWUyODI2MGM3M2JiODA1NDdhZTIyNzViYTQ5NzIzNzc5NGM4NzUzY1wiXSxbXCJlMmNiNzRmZGRjOGU5ZmJjZDA3NmVlZjJhN2M3MmIwY2UzN2Q1MGYwODI2OWRmYzA3NGI1ODE1NTA1NDdhNGY3XCIsXCJkM2FhMmVkNzFjOWRkMjI0N2E2MmRmMDYyNzM2ZWIwYmFkZGVhOWUzNjEyMmQyYmU4NjQxYWJjYjAwNWNjNGE0XCJdLFtcIjg0Mzg0NDc1NjZkNGQ3YmVkYWRjMjk5NDk2YWIzNTc0MjYwMDlhMzVmMjM1Y2IxNDFiZTBkOTljZDEwYWUzYThcIixcImM0ZTEwMjA5MTY5ODBhNGRhNWQwMWFjNWU2YWQzMzA3MzRlZjBkNzkwNjYzMWM0ZjIzOTA0MjZiMmVkZDc5MWZcIl0sW1wiNDE2MmQ0ODhiODk0MDIwMzliNTg0YzZmYzZjMzA4ODcwNTg3ZDljNDZmNjYwYjg3OGFiNjVjODJjNzExZDY3ZVwiLFwiNjcxNjNlOTAzMjM2Mjg5Zjc3NmYyMmMyNWZiOGEzYWZjMTczMmYyYjg0YjRlOTVkYmRhNDdhZTVhMDg1MjY0OVwiXSxbXCIzZmFkM2ZhODRjYWYwZjM0ZjBmODliZmQyZGNmNTRmYzE3NWQ3NjdhZWMzZTUwNjg0ZjNiYTRhNGJmNWY2ODNkXCIsXCJjZDFiYzdjYjZjYzQwN2JiMmYwY2E2NDdjNzE4YTczMGNmNzE4NzJlN2QwZDJhNTNmYTIwZWZjZGZlNjE4MjZcIl0sW1wiNjc0ZjI2MDBhMzAwN2EwMDU2OGMxYTdjZTA1ZDA4MTZjMWZiODRiZjEzNzA3OThmMWM2OTUzMmZhZWIxYTg2YlwiLFwiMjk5ZDIxZjk0MTNmMzNiM2VkZjQzYjI1NzAwNDU4MGI3MGRiNTdkYTBiMTgyMjU5ZTA5ZWVjYzY5ZTBkMzhhNVwiXSxbXCJkMzJmNGRhNTRhZGU3NGFiYjgxYjgxNWFkMWZiM2IyNjNkODJkNmM2OTI3MTRiY2ZmODdkMjliZDVlZTlmMDhmXCIsXCJmOTQyOWU3MzhiOGU1M2I5NjhlOTkwMTZjMDU5NzA3NzgyZTE0ZjQ1MzUzNTlkNTgyZmM0MTY5MTBiM2VlYTg3XCJdLFtcIjMwZTRlNjcwNDM1Mzg1NTU2ZTU5MzY1NzEzNTg0NWQzNmZiYjY5MzFmNzJiMDhjYjFlZDk1NGYxZTNjZTNmZjZcIixcIjQ2MmY5YmNlNjE5ODk4NjM4NDk5MzUwMTEzYmJjOWIxMGE4NzhkMzVkYTcwNzQwZGM2OTVhNTU5ZWI4OGRiN2JcIl0sW1wiYmUyMDYyMDAzYzUxY2MzMDA0NjgyOTA0MzMwZTRkZWU3ZjNkY2QxMGIwMWU1ODBiZjE5NzFiMDRkNGNhZDI5N1wiLFwiNjIxODhiYzQ5ZDYxZTU0Mjg1NzNkNDhhNzRlMWM2NTViMWM2MTA5MDkwNTY4MmEwZDU1NThlZDcyZGNjYjliY1wiXSxbXCI5MzE0NDQyM2FjZTM0NTFlZDI5ZTBmYjlhYzJhZjIxMWNiNmU4NGE2MDFkZjU5OTNjNDE5ODU5ZmZmNWRmMDRhXCIsXCI3YzEwZGZiMTY0YzM0MjVmNWM3MWEzZjlkNzk5MjAzOGYxMDY1MjI0ZjcyYmI5ZDFkOTAyYTZkMTMwMzdiNDdjXCJdLFtcImIwMTVmODA0NGY1ZmNiZGNmMjFjYTI2ZDZjMzRmYjgxOTc4MjkyMDVjN2I3ZDJhN2NiNjY0MThjMTU3YjExMmNcIixcImFiOGMxZTA4NmQwNGU4MTM3NDRhNjU1YjJkZjhkNWY4M2IzY2RjNmZhYTMwODhjMWQzYWVhMTQ1NGUzYTFkNWZcIl0sW1wiZDVlOWUxZGE2NDlkOTdkODllNDg2ODExN2E0NjVhM2E0ZjhhMThkZTU3YTE0MGQzNmIzZjJhZjM0MWEyMWI1MlwiLFwiNGNiMDQ0MzdmMzkxZWQ3MzExMWExM2NjMWQ0ZGQwZGIxNjkzNDY1YzIyNDA0ODBkODk1NWU4NTkyZjI3NDQ3YVwiXSxbXCJkM2FlNDEwNDdkZDdjYTA2NWRiZjhlZDc3Yjk5MjQzOTk4MzAwNWNkNzJlMTZkNmY5OTZhNTMxNmQzNjk2NmJiXCIsXCJiZDFhZWIyMWFkMjJlYmIyMmExMGYwMzAzNDE3YzZkOTY0ZjhjZGQ3ZGYwYWNhNjE0YjEwZGMxNGQxMjVhYzQ2XCJdLFtcIjQ2M2UyNzYzZDg4NWY5NThmYzY2Y2RkMjI4MDBmMGE0ODcxOTdkMGE4MmUzNzdiNDlmODBhZjg3Yzg5N2IwNjVcIixcImJmZWZhY2RiMGU1ZDBmZDdkZjNhMzExYTk0ZGUwNjJiMjZiODBjNjFmYmM5NzUwOGI3OTk5MjY3MWVmN2NhN2ZcIl0sW1wiNzk4NWZkZmQxMjdjMDU2N2M2ZjUzZWMxYmI2M2VjMzE1OGU1OTdjNDBiZmU3NDdjODNjZGRmYzkxMDY0MTkxN1wiLFwiNjAzYzEyZGFmM2Q5ODYyZWYyYjI1ZmUxZGUyODlhZWQyNGVkMjkxZTBlYzY3MDg3MDNhNWJkNTY3ZjMyZWQwM1wiXSxbXCI3NGExYWQ2YjVmNzZlMzlkYjJkZDI0OTQxMGVhYzdmOTllNzRjNTljYjgzZDJkMGVkNWZmMTU0M2RhNzcwM2U5XCIsXCJjYzYxNTdlZjE4YzljNjNjZDYxOTNkODM2MzFiYmVhMDA5M2UwOTY4OTQyZThjMzNkNTczN2ZkNzkwZTBkYjA4XCJdLFtcIjMwNjgyYTUwNzAzMzc1ZjYwMmQ0MTY2NjRiYTE5YjdmYzliYWI0MmM3Mjc0NzQ2M2E3MWQwODk2YjIyZjZkYTNcIixcIjU1M2UwNGY2YjAxOGI0ZmE2YzhmMzllN2YzMTFkMzE3NjI5MGQwZTBmMTljYTczZjE3NzE0ZDk5NzdhMjJmZjhcIl0sW1wiOWUyMTU4ZjBkN2MwZDVmMjZjMzc5MWVmZWZhNzk1OTc2NTRlN2EyYjI0NjRmNTJiMWVlNmMxMzQ3NzY5ZWY1N1wiLFwiNzEyZmNkZDFiOTA1M2YwOTAwM2EzNDgxZmE3NzYyZTlmZmQ3YzhlZjM1YTM4NTA5ZTJmYmYyNjI5MDA4MzczXCJdLFtcIjE3NmUyNjk4OWE0M2M5Y2ZlYmE0MDI5YzIwMjUzOGMyODE3MmU1NjZlM2M0ZmNlNzMyMjg1N2YzYmUzMjdkNjZcIixcImVkOGNjOWQwNGIyOWViODc3ZDI3MGI0ODc4ZGM0M2MxOWFlZmQzMWY0ZWVlMDllZTdiNDc4MzRjMWZhNGIxYzNcIl0sW1wiNzVkNDZlZmVhMzc3MWU2ZTY4YWJiODlhMTNhZDc0N2VjZjE4OTIzOTNkZmM0ZjFiNzAwNDc4OGM1MDM3NGRhOFwiLFwiOTg1MjM5MGE5OTUwNzY3OWZkMGI4NmZkMmIzOWE4NjhkN2VmYzIyMTUxMzQ2ZTFhM2NhNDcyNjU4NmE2YmVkOFwiXSxbXCI4MDlhMjBjNjdkNjQ5MDBmZmI2OThjNGM4MjVmNmQ1ZjIzMTBmYjA0NTFjODY5MzQ1YjczMTlmNjQ1NjA1NzIxXCIsXCI5ZTk5NDk4MGQ5OTE3ZTIyYjc2YjA2MTkyN2ZhMDQxNDNkMDk2Y2NjNTQ5NjNlNmE1ZWJmYTVmM2Y4ZTI4NmMxXCJdLFtcIjFiMzg5MDNhNDNmN2YxMTRlZDQ1MDBiNGVhYzcwODNmZGVmZWNlMWNmMjljNjM1MjhkNTYzNDQ2Zjk3MmMxODBcIixcIjQwMzZlZGM5MzFhNjBhZTg4OTM1M2Y3N2ZkNTNkZTRhMjcwOGIyNmI2ZjVkYTcyYWQzMzk0MTE5ZGFmNDA4ZjlcIl1dXG59fX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LnNsaWNlKCk7aWYoIXQpcmV0dXJuW107dmFyIHI9W107aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXJbbl09MHx0W25dO3JldHVybiByfWlmKGUpe2lmKFwiaGV4XCI9PT1lKXt0PXQucmVwbGFjZSgvW15hLXowLTldKy9naSxcIlwiKSx0Lmxlbmd0aCUyIT09MCYmKHQ9XCIwXCIrdCk7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXIucHVzaChwYXJzZUludCh0W25dK3RbbisxXSwxNikpfX1lbHNlIGZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10LmNoYXJDb2RlQXQobiksbz1pPj44LGE9MjU1Jmk7bz9yLnB1c2gobyxhKTpyLnB1c2goYSl9cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gMT09PXQubGVuZ3RoP1wiMFwiK3Q6dH1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1cIlwiLHI9MDtyPHQubGVuZ3RoO3IrKyllKz1pKHRbcl0udG9TdHJpbmcoMTYpKTtyZXR1cm4gZX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPVtdLG49MTw8ZSsxLGk9dC5jbG9uZSgpO2kuY21wbigxKT49MDspe3ZhciBvO2lmKGkuaXNPZGQoKSl7dmFyIGE9aS5hbmRsbihuLTEpO289YT4obj4+MSktMT8obj4+MSktYTphLGkuaXN1Ym4obyl9ZWxzZSBvPTA7ci5wdXNoKG8pO2Zvcih2YXIgZj0wIT09aS5jbXBuKDApJiYwPT09aS5hbmRsbihuLTEpP2UrMToxLHM9MTtzPGY7cysrKXIucHVzaCgwKTtpLml1c2hybihmKX1yZXR1cm4gcn1mdW5jdGlvbiBmKHQsZSl7dmFyIHI9W1tdLFtdXTt0PXQuY2xvbmUoKSxlPWUuY2xvbmUoKTtmb3IodmFyIG49MCxpPTA7dC5jbXBuKC1uKT4wfHxlLmNtcG4oLWkpPjA7KXt2YXIgbz10LmFuZGxuKDMpK24mMyxhPWUuYW5kbG4oMykraSYzOzM9PT1vJiYobz0tMSksMz09PWEmJihhPS0xKTt2YXIgZjtpZigwPT09KDEmbykpZj0wO2Vsc2V7dmFyIHM9dC5hbmRsbig3KStuJjc7Zj0zIT09cyYmNSE9PXN8fDIhPT1hP286LW99clswXS5wdXNoKGYpO3ZhciB1O2lmKDA9PT0oMSZhKSl1PTA7ZWxzZXt2YXIgcz1lLmFuZGxuKDcpK2kmNzt1PTMhPT1zJiY1IT09c3x8MiE9PW8/YTotYX1yWzFdLnB1c2godSksMipuPT09ZisxJiYobj0xLW4pLDIqaT09PXUrMSYmKGk9MS1pKSx0Lml1c2hybigxKSxlLml1c2hybigxKX1yZXR1cm4gcn1mdW5jdGlvbiBzKHQsZSxyKXt2YXIgbj1cIl9cIitlO3QucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXNbbl0/dGhpc1tuXTp0aGlzW25dPXIuY2FsbCh0aGlzKX19ZnVuY3Rpb24gdSh0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD9jLnRvQXJyYXkodCxcImhleFwiKTp0fWZ1bmN0aW9uIGgodCl7cmV0dXJuIG5ldyBkKHQsXCJoZXhcIixcImxlXCIpfXZhciBjPWUsZD1yKDE4KTtjLmFzc2VydD1mdW5jdGlvbih0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcihlfHxcIkFzc2VydGlvbiBmYWlsZWRcIil9LGMudG9BcnJheT1uLGMuemVybzI9aSxjLnRvSGV4PW8sYy5lbmNvZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm5cImhleFwiPT09ZT9vKHQpOnR9LGMuZ2V0TkFGPWEsYy5nZXRKU0Y9ZixjLmNhY2hlZFByb3BlcnR5PXMsYy5wYXJzZUJ5dGVzPXUsYy5pbnRGcm9tTEU9aH0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7dGhpcy5yYW5kPXR9dmFyIGk7aWYodC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpfHwoaT1uZXcgbihudWxsKSksaS5nZW5lcmF0ZSh0KX0sdC5leHBvcnRzLlJhbmQ9bixuLnByb3RvdHlwZS5nZW5lcmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFuZCh0KX0sXCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyl3aW5kb3cuY3J5cHRvJiZ3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcz9uLnByb3RvdHlwZS5fcmFuZD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoZSksZX06d2luZG93Lm1zQ3J5cHRvJiZ3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzP24ucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBVaW50OEFycmF5KHQpO3JldHVybiB3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpLGV9Om4ucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkIHlldFwiKX07ZWxzZSB0cnl7dmFyIG89cig2MDkpO24ucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvLnJhbmRvbUJ5dGVzKHQpfX1jYXRjaCh0KXtuLnByb3RvdHlwZS5fcmFuZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IFVpbnQ4QXJyYXkodCkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09dGhpcy5yYW5kLmdldEJ5dGUoKTtyZXR1cm4gZX19fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbigpe3RoaXMucGVuZGluZz1udWxsLHRoaXMucGVuZGluZ1RvdGFsPTAsdGhpcy5ibG9ja1NpemU9dGhpcy5jb25zdHJ1Y3Rvci5ibG9ja1NpemUsdGhpcy5vdXRTaXplPXRoaXMuY29uc3RydWN0b3Iub3V0U2l6ZSx0aGlzLmhtYWNTdHJlbmd0aD10aGlzLmNvbnN0cnVjdG9yLmhtYWNTdHJlbmd0aCx0aGlzLnBhZExlbmd0aD10aGlzLmNvbnN0cnVjdG9yLnBhZExlbmd0aC84LHRoaXMuZW5kaWFuPVwiYmlnXCIsdGhpcy5fZGVsdGE4PXRoaXMuYmxvY2tTaXplLzgsdGhpcy5fZGVsdGEzMj10aGlzLmJsb2NrU2l6ZS8zMn12YXIgaT1yKDQ5KSxvPWkudXRpbHMsYT1vLmFzc2VydDtlLkJsb2NrSGFzaD1uLG4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe2lmKHQ9by50b0FycmF5KHQsZSksdGhpcy5wZW5kaW5nP3RoaXMucGVuZGluZz10aGlzLnBlbmRpbmcuY29uY2F0KHQpOnRoaXMucGVuZGluZz10LHRoaXMucGVuZGluZ1RvdGFsKz10Lmxlbmd0aCx0aGlzLnBlbmRpbmcubGVuZ3RoPj10aGlzLl9kZWx0YTgpe3Q9dGhpcy5wZW5kaW5nO3ZhciByPXQubGVuZ3RoJXRoaXMuX2RlbHRhODt0aGlzLnBlbmRpbmc9dC5zbGljZSh0Lmxlbmd0aC1yLHQubGVuZ3RoKSwwPT09dGhpcy5wZW5kaW5nLmxlbmd0aCYmKHRoaXMucGVuZGluZz1udWxsKSx0PW8uam9pbjMyKHQsMCx0Lmxlbmd0aC1yLHRoaXMuZW5kaWFuKTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPXRoaXMuX2RlbHRhMzIpdGhpcy5fdXBkYXRlKHQsbixuK3RoaXMuX2RlbHRhMzIpfXJldHVybiB0aGlzfSxuLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlKHRoaXMuX3BhZCgpKSxhKG51bGw9PT10aGlzLnBlbmRpbmcpLHRoaXMuX2RpZ2VzdCh0KX0sbi5wcm90b3R5cGUuX3BhZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucGVuZGluZ1RvdGFsLGU9dGhpcy5fZGVsdGE4LHI9ZS0odCt0aGlzLnBhZExlbmd0aCklZSxuPW5ldyBBcnJheShyK3RoaXMucGFkTGVuZ3RoKTtuWzBdPTEyODtmb3IodmFyIGk9MTtpPHI7aSsrKW5baV09MDtpZih0PDw9MyxcImJpZ1wiPT09dGhpcy5lbmRpYW4pe2Zvcih2YXIgbz04O288dGhpcy5wYWRMZW5ndGg7bysrKW5baSsrXT0wO25baSsrXT0wLG5baSsrXT0wLG5baSsrXT0wLG5baSsrXT0wLG5baSsrXT10Pj4+MjQmMjU1LG5baSsrXT10Pj4+MTYmMjU1LG5baSsrXT10Pj4+OCYyNTUsbltpKytdPTI1NSZ0fWVsc2V7bltpKytdPTI1NSZ0LG5baSsrXT10Pj4+OCYyNTUsbltpKytdPXQ+Pj4xNiYyNTUsbltpKytdPXQ+Pj4yNCYyNTUsbltpKytdPTAsbltpKytdPTAsbltpKytdPTAsbltpKytdPTA7Zm9yKHZhciBvPTg7bzx0aGlzLnBhZExlbmd0aDtvKyspbltpKytdPTB9cmV0dXJuIG59fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuPyh0aGlzLkhhc2g9dCx0aGlzLmJsb2NrU2l6ZT10LmJsb2NrU2l6ZS84LHRoaXMub3V0U2l6ZT10Lm91dFNpemUvOCx0aGlzLmlubmVyPW51bGwsdGhpcy5vdXRlcj1udWxsLHZvaWQgdGhpcy5faW5pdChvLnRvQXJyYXkoZSxyKSkpOm5ldyBuKHQsZSxyKX12YXIgaT1yKDQ5KSxvPWkudXRpbHMsYT1vLmFzc2VydDt0LmV4cG9ydHM9bixuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt0Lmxlbmd0aD50aGlzLmJsb2NrU2l6ZSYmKHQ9KG5ldyB0aGlzLkhhc2gpLnVwZGF0ZSh0KS5kaWdlc3QoKSksYSh0Lmxlbmd0aDw9dGhpcy5ibG9ja1NpemUpO2Zvcih2YXIgZT10Lmxlbmd0aDtlPHRoaXMuYmxvY2tTaXplO2UrKyl0LnB1c2goMCk7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXV49NTQ7dGhpcy5pbm5lcj0obmV3IHRoaXMuSGFzaCkudXBkYXRlKHQpO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV1ePTEwNjt0aGlzLm91dGVyPShuZXcgdGhpcy5IYXNoKS51cGRhdGUodCl9LG4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmlubmVyLnVwZGF0ZSh0LGUpLHRoaXN9LG4ucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vdXRlci51cGRhdGUodGhpcy5pbm5lci5kaWdlc3QoKSksdGhpcy5vdXRlci5kaWdlc3QodCl9fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbigpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj8obC5jYWxsKHRoaXMpLHRoaXMuaD1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdLHZvaWQodGhpcy5lbmRpYW49XCJsaXR0bGVcIikpOm5ldyBufWZ1bmN0aW9uIGkodCxlLHIsbil7cmV0dXJuIHQ8PTE1P2Vecl5uOnQ8PTMxP2Umcnx+ZSZuOnQ8PTQ3PyhlfH5yKV5uOnQ8PTYzP2UmbnxyJn5uOmVeKHJ8fm4pfWZ1bmN0aW9uIG8odCl7cmV0dXJuIHQ8PTE1PzA6dDw9MzE/MTUxODUwMDI0OTp0PD00Nz8xODU5Nzc1MzkzOnQ8PTYzPzI0MDA5NTk3MDg6Mjg0MDg1MzgzOH1mdW5jdGlvbiBhKHQpe3JldHVybiB0PD0xNT8xMzUyODI5OTI2OnQ8PTMxPzE1NDg2MDM2ODQ6dDw9NDc/MTgzNjA3MjY5MTp0PD02Mz8yMDUzOTk0MjE3OjB9dmFyIGY9cig0OSkscz1mLnV0aWxzLHU9cy5yb3RsMzIsaD1zLnN1bTMyLGM9cy5zdW0zMl8zLGQ9cy5zdW0zMl80LGw9Zi5jb21tb24uQmxvY2tIYXNoO3MuaW5oZXJpdHMobixsKSxlLnJpcGVtZDE2MD1uLG4uYmxvY2tTaXplPTUxMixuLm91dFNpemU9MTYwLG4uaG1hY1N0cmVuZ3RoPTE5MixuLnBhZExlbmd0aD02NCxuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuaFswXSxuPXRoaXMuaFsxXSxmPXRoaXMuaFsyXSxzPXRoaXMuaFszXSxsPXRoaXMuaFs0XSxtPXIsZz1uLHc9ZixfPXMsTT1sLFM9MDtTPDgwO1MrKyl7dmFyIEU9aCh1KGQocixpKFMsbixmLHMpLHRbcFtTXStlXSxvKFMpKSx2W1NdKSxsKTtyPWwsbD1zLHM9dShmLDEwKSxmPW4sbj1FLEU9aCh1KGQobSxpKDc5LVMsZyx3LF8pLHRbYltTXStlXSxhKFMpKSx5W1NdKSxNKSxtPU0sTT1fLF89dSh3LDEwKSx3PWcsZz1FfUU9Yyh0aGlzLmhbMV0sZixfKSx0aGlzLmhbMV09Yyh0aGlzLmhbMl0scyxNKSx0aGlzLmhbMl09Yyh0aGlzLmhbM10sbCxtKSx0aGlzLmhbM109Yyh0aGlzLmhbNF0scixnKSx0aGlzLmhbNF09Yyh0aGlzLmhbMF0sbix3KSx0aGlzLmhbMF09RX0sbi5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm5cImhleFwiPT09dD9zLnRvSGV4MzIodGhpcy5oLFwibGl0dGxlXCIpOnMuc3BsaXQzMih0aGlzLmgsXCJsaXR0bGVcIil9O3ZhciBwPVswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDcsNCwxMywxLDEwLDYsMTUsMywxMiwwLDksNSwyLDE0LDExLDgsMywxMCwxNCw0LDksMTUsOCwxLDIsNywwLDYsMTMsMTEsNSwxMiwxLDksMTEsMTAsMCw4LDEyLDQsMTMsMyw3LDE1LDE0LDUsNiwyLDQsMCw1LDksNywxMiwyLDEwLDE0LDEsMyw4LDExLDYsMTUsMTNdLGI9WzUsMTQsNywwLDksMiwxMSw0LDEzLDYsMTUsOCwxLDEwLDMsMTIsNiwxMSwzLDcsMCwxMyw1LDEwLDE0LDE1LDgsMTIsNCw5LDEsMiwxNSw1LDEsMyw3LDE0LDYsOSwxMSw4LDEyLDIsMTAsMCw0LDEzLDgsNiw0LDEsMywxMSwxNSwwLDUsMTIsMiwxMyw5LDcsMTAsMTQsMTIsMTUsMTAsNCwxLDUsOCw3LDYsMiwxMywxNCwwLDMsOSwxMV0sdj1bMTEsMTQsMTUsMTIsNSw4LDcsOSwxMSwxMywxNCwxNSw2LDcsOSw4LDcsNiw4LDEzLDExLDksNywxNSw3LDEyLDE1LDksMTEsNywxMywxMiwxMSwxMyw2LDcsMTQsOSwxMywxNSwxNCw4LDEzLDYsNSwxMiw3LDUsMTEsMTIsMTQsMTUsMTQsMTUsOSw4LDksMTQsNSw2LDgsNiw1LDEyLDksMTUsNSwxMSw2LDgsMTMsMTIsNSwxMiwxMywxNCwxMSw4LDUsNl0seT1bOCw5LDksMTEsMTMsMTUsMTUsNSw3LDcsOCwxMSwxNCwxNCwxMiw2LDksMTMsMTUsNywxMiw4LDksMTEsNyw3LDEyLDcsNiwxNSwxMywxMSw5LDcsMTUsMTEsOCw2LDYsMTQsMTIsMTMsNSwxNCwxMywxMyw3LDUsMTUsNSw4LDExLDE0LDE0LDYsMTQsNiw5LDEyLDksMTIsNSwxNSw4LDgsNSwxMiw5LDEyLDUsMTQsNiw4LDEzLDYsNSwxNSwxMywxMSwxMV19LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuPyhYLmNhbGwodGhpcyksdGhpcy5oPVsxNzc5MDMzNzAzLDMxNDQxMzQyNzcsMTAxMzkwNDI0MiwyNzczNDgwNzYyLDEzNTk4OTMxMTksMjYwMDgyMjkyNCw1Mjg3MzQ2MzUsMTU0MTQ1OTIyNV0sdGhpcy5rPVksdm9pZCh0aGlzLlc9bmV3IEFycmF5KDY0KSkpOm5ldyBufWZ1bmN0aW9uIGkoKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGk/KG4uY2FsbCh0aGlzKSx2b2lkKHRoaXMuaD1bMzIzODM3MTAzMiw5MTQxNTA2NjMsODEyNzAyOTk5LDQxNDQ5MTI2OTcsNDI5MDc3NTg1NywxNzUwNjAzMDI1LDE2OTQwNzY4MzksMzIwNDA3NTQyOF0pKTpuZXcgaX1mdW5jdGlvbiBvKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBvPyhYLmNhbGwodGhpcyksdGhpcy5oPVsxNzc5MDMzNzAzLDQwODkyMzU3MjAsMzE0NDEzNDI3NywyMjI3ODczNTk1LDEwMTM5MDQyNDIsNDI3MTE3NTcyMywyNzczNDgwNzYyLDE1OTU3NTAxMjksMTM1OTg5MzExOSwyOTE3NTY1MTM3LDI2MDA4MjI5MjQsNzI1NTExMTk5LDUyODczNDYzNSw0MjE1Mzg5NTQ3LDE1NDE0NTkyMjUsMzI3MDMzMjA5XSx0aGlzLms9Vyx2b2lkKHRoaXMuVz1uZXcgQXJyYXkoMTYwKSkpOm5ldyBvfWZ1bmN0aW9uIGEoKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/KG8uY2FsbCh0aGlzKSx2b2lkKHRoaXMuaD1bMzQxODA3MDM2NSwzMjM4MzcxMDMyLDE2NTQyNzAyNTAsOTE0MTUwNjYzLDI0Mzg1MjkzNzAsODEyNzAyOTk5LDM1NTQ2MjM2MCw0MTQ0OTEyNjk3LDE3MzE0MDU0MTUsNDI5MDc3NTg1NywyMzk0MTgwMjMxLDE3NTA2MDMwMjUsMzY3NTAwODUyNSwxNjk0MDc2ODM5LDEyMDMwNjI4MTMsMzIwNDA3NTQyOF0pKTpuZXcgYX1mdW5jdGlvbiBmKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmPyhYLmNhbGwodGhpcyksdGhpcy5oPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0sdm9pZCh0aGlzLlc9bmV3IEFycmF5KDgwKSkpOm5ldyBmfWZ1bmN0aW9uIHModCxlLHIpe3JldHVybiB0JmVefnQmcn1mdW5jdGlvbiB1KHQsZSxyKXtyZXR1cm4gdCZlXnQmcl5lJnJ9ZnVuY3Rpb24gaCh0LGUscil7cmV0dXJuIHReZV5yfWZ1bmN0aW9uIGModCl7cmV0dXJuIFIodCwyKV5SKHQsMTMpXlIodCwyMil9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gUih0LDYpXlIodCwxMSleUih0LDI1KX1mdW5jdGlvbiBsKHQpe3JldHVybiBSKHQsNyleUih0LDE4KV50Pj4+M31mdW5jdGlvbiBwKHQpe3JldHVybiBSKHQsMTcpXlIodCwxOSledD4+PjEwfWZ1bmN0aW9uIGIodCxlLHIsbil7cmV0dXJuIDA9PT10P3MoZSxyLG4pOjE9PT10fHwzPT09dD9oKGUscixuKToyPT09dD91KGUscixuKTp2b2lkIDB9ZnVuY3Rpb24gdih0LGUscixuLGksbyl7dmFyIGE9dCZyXn50Jmk7cmV0dXJuIGE8MCYmKGErPTQyOTQ5NjcyOTYpLGF9ZnVuY3Rpb24geSh0LGUscixuLGksbyl7dmFyIGE9ZSZuXn5lJm87cmV0dXJuIGE8MCYmKGErPTQyOTQ5NjcyOTYpLGF9ZnVuY3Rpb24gbSh0LGUscixuLGksbyl7dmFyIGE9dCZyXnQmaV5yJmk7cmV0dXJuIGE8MCYmKGErPTQyOTQ5NjcyOTYpLGF9ZnVuY3Rpb24gZyh0LGUscixuLGksbyl7dmFyIGE9ZSZuXmUmb15uJm87cmV0dXJuIGE8MCYmKGErPTQyOTQ5NjcyOTYpLGF9ZnVuY3Rpb24gdyh0LGUpe3ZhciByPU4odCxlLDI4KSxuPU4oZSx0LDIpLGk9TihlLHQsNyksbz1yXm5eaTtyZXR1cm4gbzwwJiYobys9NDI5NDk2NzI5Niksb31mdW5jdGlvbiBfKHQsZSl7dmFyIHI9TCh0LGUsMjgpLG49TChlLHQsMiksaT1MKGUsdCw3KSxvPXJebl5pO3JldHVybiBvPDAmJihvKz00Mjk0OTY3Mjk2KSxvfWZ1bmN0aW9uIE0odCxlKXt2YXIgcj1OKHQsZSwxNCksbj1OKHQsZSwxOCksaT1OKGUsdCw5KSxvPXJebl5pO3JldHVybiBvPDAmJihvKz00Mjk0OTY3Mjk2KSxvfWZ1bmN0aW9uIFModCxlKXt2YXIgcj1MKHQsZSwxNCksbj1MKHQsZSwxOCksaT1MKGUsdCw5KSxvPXJebl5pO3JldHVybiBvPDAmJihvKz00Mjk0OTY3Mjk2KSxvfWZ1bmN0aW9uIEUodCxlKXt2YXIgcj1OKHQsZSwxKSxuPU4odCxlLDgpLGk9VSh0LGUsNyksbz1yXm5eaTtyZXR1cm4gbzwwJiYobys9NDI5NDk2NzI5Niksb31mdW5jdGlvbiBBKHQsZSl7dmFyIHI9TCh0LGUsMSksbj1MKHQsZSw4KSxpPXoodCxlLDcpLG89cl5uXmk7cmV0dXJuIG88MCYmKG8rPTQyOTQ5NjcyOTYpLG99ZnVuY3Rpb24gayh0LGUpe3ZhciByPU4odCxlLDE5KSxuPU4oZSx0LDI5KSxpPVUodCxlLDYpLG89cl5uXmk7cmV0dXJuIG88MCYmKG8rPTQyOTQ5NjcyOTYpLG99ZnVuY3Rpb24geCh0LGUpe3ZhciByPUwodCxlLDE5KSxuPUwoZSx0LDI5KSxpPXoodCxlLDYpLG89cl5uXmk7cmV0dXJuIG88MCYmKG8rPTQyOTQ5NjcyOTYpLG99dmFyIEk9cig0OSksQj1JLnV0aWxzLE89Qi5hc3NlcnQsUj1CLnJvdHIzMixQPUIucm90bDMyLFQ9Qi5zdW0zMixqPUIuc3VtMzJfNCxDPUIuc3VtMzJfNSxOPUIucm90cjY0X2hpLEw9Qi5yb3RyNjRfbG8sVT1CLnNocjY0X2hpLHo9Qi5zaHI2NF9sbyxEPUIuc3VtNjQscT1CLnN1bTY0X2hpLEY9Qi5zdW02NF9sbyxLPUIuc3VtNjRfNF9oaSxHPUIuc3VtNjRfNF9sbyxWPUIuc3VtNjRfNV9oaSxIPUIuc3VtNjRfNV9sbyxYPUkuY29tbW9uLkJsb2NrSGFzaCxZPVsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdLFc9WzExMTYzNTI0MDgsMzYwOTc2NzQ1OCwxODk5NDQ3NDQxLDYwMjg5MTcyNSwzMDQ5MzIzNDcxLDM5NjQ0ODQzOTksMzkyMTAwOTU3MywyMTczMjk1NTQ4LDk2MTk4NzE2Myw0MDgxNjI4NDcyLDE1MDg5NzA5OTMsMzA1MzgzNDI2NSwyNDUzNjM1NzQ4LDI5Mzc2NzE1NzksMjg3MDc2MzIyMSwzNjY0NjA5NTYwLDM2MjQzODEwODAsMjczNDg4MzM5NCwzMTA1OTg0MDEsMTE2NDk5NjU0Miw2MDcyMjUyNzgsMTMyMzYxMDc2NCwxNDI2ODgxOTg3LDM1OTAzMDQ5OTQsMTkyNTA3ODM4OCw0MDY4MTgyMzgzLDIxNjIwNzgyMDYsOTkxMzM2MTEzLDI2MTQ4ODgxMDMsNjMzODAzMzE3LDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCwzODM1MzkwNDAxLDI2NjY2MTM0NTgsNDAyMjIyNDc3NCw5NDQ3MTExMzksMjY0MzQ3MDc4LDIzNDEyNjI3NzMsNjA0ODA3NjI4LDIwMDc4MDA5MzMsNzcwMjU1OTgzLDE0OTU5OTA5MDEsMTI0OTE1MDEyMiwxODU2NDMxMjM1LDE1NTUwODE2OTIsMzE3NTIxODEzMiwxOTk2MDY0OTg2LDIxOTg5NTA4MzcsMjU1NDIyMDg4MiwzOTk5NzE5MzM5LDI4MjE4MzQzNDksNzY2Nzg0MDE2LDI5NTI5OTY4MDgsMjU2NjU5NDg3OSwzMjEwMzEzNjcxLDMyMDMzMzc5NTYsMzMzNjU3MTg5MSwxMDM0NDU3MDI2LDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSwxMTM5MjY5OTMsMzc1ODMyNjM4MywzMzgyNDE4OTUsMTY4NzE3OTM2LDY2NjMwNzIwNSwxMTg4MTc5OTY0LDc3MzUyOTkxMiwxNTQ2MDQ1NzM0LDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSwxMzk2MTgyMjkxLDI2NDM4MzM4MjMsMTY5NTE4MzcwMCwyMzQzNTI3MzkwLDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCwyMTc3MDI2MzUwLDEyMDY3NTkxNDIsMjQ1Njk1NjAzNywzNDQwNzc2MjcsMjczMDQ4NTkyMSwxMjkwODYzNDYwLDI4MjAzMDI0MTEsMzE1ODQ1NDI3MywzMjU5NzMwODAwLDM1MDU5NTI2NTcsMzM0NTc2NDc3MSwxMDYyMTcwMDgsMzUxNjA2NTgxNywzNjA2MDA4MzQ0LDM2MDAzNTI4MDQsMTQzMjcyNTc3Niw0MDk0NTcxOTA5LDE0NjcwMzE1OTQsMjc1NDIzMzQ0LDg1MTE2OTcyMCw0MzAyMjc3MzQsMzEwMDgyMzc1Miw1MDY5NDg2MTYsMTM2MzI1ODE5NSw2NTkwNjA1NTYsMzc1MDY4NTU5Myw4ODM5OTc4NzcsMzc4NTA1MDI4MCw5NTgxMzk1NzEsMzMxODMwNzQyNywxMzIyODIyMjE4LDM4MTI3MjM0MDMsMTUzNzAwMjA2MywyMDAzMDM0OTk1LDE3NDc4NzM3NzksMzYwMjAzNjg5OSwxOTU1NTYyMjIyLDE1NzU5OTAwMTIsMjAyNDEwNDgxNSwxMTI1NTkyOTI4LDIyMjc3MzA0NTIsMjcxNjkwNDMwNiwyMzYxODUyNDI0LDQ0Mjc3NjA0NCwyNDI4NDM2NDc0LDU5MzY5ODM0NCwyNzU2NzM0MTg3LDM3MzMxMTAyNDksMzIwNDAzMTQ3OSwyOTk5MzUxNTczLDMzMjkzMjUyOTgsMzgxNTkyMDQyNywzMzkxNTY5NjE0LDM5MjgzODM5MDAsMzUxNTI2NzI3MSw1NjYyODA3MTEsMzk0MDE4NzYwNiwzNDU0MDY5NTM0LDQxMTg2MzAyNzEsNDAwMDIzOTk5MiwxMTY0MTg0NzQsMTkxNDEzODU1NCwxNzQyOTI0MjEsMjczMTA1NTI3MCwyODkzODAzNTYsMzIwMzk5MzAwNiw0NjAzOTMyNjksMzIwNjIwMzE1LDY4NTQ3MTczMyw1ODc0OTY4MzYsODUyMTQyOTcxLDEwODY3OTI4NTEsMTAxNzAzNjI5OCwzNjU1NDMxMDAsMTEyNjAwMDU4MCwyNjE4Mjk3Njc2LDEyODgwMzM0NzAsMzQwOTg1NTE1OCwxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYsMTYwNzE2NzkxNSw5ODcxNjc0NjgsMTgxNjQwMjMxNiwxMjQ2MTg5NTkxXSxaPVsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsMjQwMDk1OTcwOCwzMzk1NDY5NzgyXTtCLmluaGVyaXRzKG4sWCksZS5zaGEyNTY9bixuLmJsb2NrU2l6ZT01MTIsbi5vdXRTaXplPTI1NixuLmhtYWNTdHJlbmd0aD0xOTIsbi5wYWRMZW5ndGg9NjQsbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLlcsbj0wO248MTY7bisrKXJbbl09dFtlK25dO2Zvcig7bjxyLmxlbmd0aDtuKyspcltuXT1qKHAocltuLTJdKSxyW24tN10sbChyW24tMTVdKSxyW24tMTZdKTt2YXIgaT10aGlzLmhbMF0sbz10aGlzLmhbMV0sYT10aGlzLmhbMl0sZj10aGlzLmhbM10saD10aGlzLmhbNF0sYj10aGlzLmhbNV0sdj10aGlzLmhbNl0seT10aGlzLmhbN107Tyh0aGlzLmsubGVuZ3RoPT09ci5sZW5ndGgpO2Zvcih2YXIgbj0wO248ci5sZW5ndGg7bisrKXt2YXIgbT1DKHksZChoKSxzKGgsYix2KSx0aGlzLmtbbl0scltuXSksZz1UKGMoaSksdShpLG8sYSkpO3k9dix2PWIsYj1oLGg9VChmLG0pLGY9YSxhPW8sbz1pLGk9VChtLGcpfXRoaXMuaFswXT1UKHRoaXMuaFswXSxpKSx0aGlzLmhbMV09VCh0aGlzLmhbMV0sbyksdGhpcy5oWzJdPVQodGhpcy5oWzJdLGEpLHRoaXMuaFszXT1UKHRoaXMuaFszXSxmKSx0aGlzLmhbNF09VCh0aGlzLmhbNF0saCksdGhpcy5oWzVdPVQodGhpcy5oWzVdLGIpLHRoaXMuaFs2XT1UKHRoaXMuaFs2XSx2KSx0aGlzLmhbN109VCh0aGlzLmhbN10seSl9LG4ucHJvdG90eXBlLl9kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuXCJoZXhcIj09PXQ/Qi50b0hleDMyKHRoaXMuaCxcImJpZ1wiKTpCLnNwbGl0MzIodGhpcy5oLFwiYmlnXCIpfSxCLmluaGVyaXRzKGksbiksZS5zaGEyMjQ9aSxpLmJsb2NrU2l6ZT01MTIsaS5vdXRTaXplPTIyNCxpLmhtYWNTdHJlbmd0aD0xOTIsaS5wYWRMZW5ndGg9NjQsaS5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm5cImhleFwiPT09dD9CLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsNyksXCJiaWdcIik6Qi5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLDcpLFwiYmlnXCIpfSxCLmluaGVyaXRzKG8sWCksZS5zaGE1MTI9byxvLmJsb2NrU2l6ZT0xMDI0LG8ub3V0U2l6ZT01MTIsby5obWFjU3RyZW5ndGg9MTkyLG8ucGFkTGVuZ3RoPTEyOCxvLnByb3RvdHlwZS5fcHJlcGFyZUJsb2NrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuVyxuPTA7bjwzMjtuKyspcltuXT10W2Urbl07Zm9yKDtuPHIubGVuZ3RoO24rPTIpe3ZhciBpPWsocltuLTRdLHJbbi0zXSksbz14KHJbbi00XSxyW24tM10pLGE9cltuLTE0XSxmPXJbbi0xM10scz1FKHJbbi0zMF0scltuLTI5XSksdT1BKHJbbi0zMF0scltuLTI5XSksaD1yW24tMzJdLGM9cltuLTMxXTtyW25dPUsoaSxvLGEsZixzLHUsaCxjKSxyW24rMV09RyhpLG8sYSxmLHMsdSxoLGMpfX0sby5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX3ByZXBhcmVCbG9jayh0LGUpO3ZhciByPXRoaXMuVyxuPXRoaXMuaFswXSxpPXRoaXMuaFsxXSxvPXRoaXMuaFsyXSxhPXRoaXMuaFszXSxmPXRoaXMuaFs0XSxzPXRoaXMuaFs1XSx1PXRoaXMuaFs2XSxoPXRoaXMuaFs3XSxjPXRoaXMuaFs4XSxkPXRoaXMuaFs5XSxsPXRoaXMuaFsxMF0scD10aGlzLmhbMTFdLGI9dGhpcy5oWzEyXSxFPXRoaXMuaFsxM10sQT10aGlzLmhbMTRdLGs9dGhpcy5oWzE1XTtPKHRoaXMuay5sZW5ndGg9PT1yLmxlbmd0aCk7Zm9yKHZhciB4PTA7eDxyLmxlbmd0aDt4Kz0yKXt2YXIgST1BLEI9ayxSPU0oYyxkKSxQPVMoYyxkKSxUPXYoYyxkLGwscCxiLEUpLGo9eShjLGQsbCxwLGIsRSksQz10aGlzLmtbeF0sTj10aGlzLmtbeCsxXSxMPXJbeF0sVT1yW3grMV0sej1WKEksQixSLFAsVCxqLEMsTixMLFUpLEs9SChJLEIsUixQLFQsaixDLE4sTCxVKSxJPXcobixpKSxCPV8obixpKSxSPW0obixpLG8sYSxmLHMpLFA9ZyhuLGksbyxhLGYscyksRz1xKEksQixSLFApLFg9RihJLEIsUixQKTtBPWIsaz1FLGI9bCxFPXAsbD1jLHA9ZCxjPXEodSxoLHosSyksZD1GKGgsaCx6LEspLHU9ZixoPXMsZj1vLHM9YSxvPW4sYT1pLG49cSh6LEssRyxYKSxpPUYoeixLLEcsWCl9RCh0aGlzLmgsMCxuLGkpLEQodGhpcy5oLDIsbyxhKSxEKHRoaXMuaCw0LGYscyksRCh0aGlzLmgsNix1LGgpLEQodGhpcy5oLDgsYyxkKSxEKHRoaXMuaCwxMCxsLHApLEQodGhpcy5oLDEyLGIsRSksRCh0aGlzLmgsMTQsQSxrKX0sby5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm5cImhleFwiPT09dD9CLnRvSGV4MzIodGhpcy5oLFwiYmlnXCIpOkIuc3BsaXQzMih0aGlzLmgsXCJiaWdcIil9LEIuaW5oZXJpdHMoYSxvKSxlLnNoYTM4ND1hLGEuYmxvY2tTaXplPTEwMjQsYS5vdXRTaXplPTM4NCxhLmhtYWNTdHJlbmd0aD0xOTIsYS5wYWRMZW5ndGg9MTI4LGEucHJvdG90eXBlLl9kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuXCJoZXhcIj09PXQ/Qi50b0hleDMyKHRoaXMuaC5zbGljZSgwLDEyKSxcImJpZ1wiKTpCLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsMTIpLFwiYmlnXCIpfSxCLmluaGVyaXRzKGYsWCksZS5zaGExPWYsZi5ibG9ja1NpemU9NTEyLGYub3V0U2l6ZT0xNjAsZi5obWFjU3RyZW5ndGg9ODAsZi5wYWRMZW5ndGg9NjQsZi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLlcsbj0wO248MTY7bisrKXJbbl09dFtlK25dO2Zvcig7bjxyLmxlbmd0aDtuKyspcltuXT1QKHJbbi0zXV5yW24tOF1ecltuLTE0XV5yW24tMTZdLDEpO2Zvcih2YXIgaT10aGlzLmhbMF0sbz10aGlzLmhbMV0sYT10aGlzLmhbMl0sZj10aGlzLmhbM10scz10aGlzLmhbNF0sbj0wO248ci5sZW5ndGg7bisrKXt2YXIgdT1+fihuLzIwKSxoPUMoUChpLDUpLGIodSxvLGEsZikscyxyW25dLFpbdV0pO3M9ZixmPWEsYT1QKG8sMzApLG89aSxpPWh9dGhpcy5oWzBdPVQodGhpcy5oWzBdLGkpLHRoaXMuaFsxXT1UKHRoaXMuaFsxXSxvKSx0aGlzLmhbMl09VCh0aGlzLmhbMl0sYSksdGhpcy5oWzNdPVQodGhpcy5oWzNdLGYpLHRoaXMuaFs0XT1UKHRoaXMuaFs0XSxzKX0sZi5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbih0KXtyZXR1cm5cImhleFwiPT09dD9CLnRvSGV4MzIodGhpcy5oLFwiYmlnXCIpOkIuc3BsaXQzMih0aGlzLmgsXCJiaWdcIil9fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQuc2xpY2UoKTtpZighdClyZXR1cm5bXTt2YXIgcj1bXTtpZihcInN0cmluZ1wiPT10eXBlb2YgdClpZihlKXtpZihcImhleFwiPT09ZSl7dD10LnJlcGxhY2UoL1teYS16MC05XSsvZ2ksXCJcIiksdC5sZW5ndGglMiE9PTAmJih0PVwiMFwiK3QpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9MilyLnB1c2gocGFyc2VJbnQodFtuXSt0W24rMV0sMTYpKX19ZWxzZSBmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dC5jaGFyQ29kZUF0KG4pLG89aT4+OCxhPTI1NSZpO28/ci5wdXNoKG8sYSk6ci5wdXNoKGEpfWVsc2UgZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspcltuXT0wfHRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0KXtmb3IodmFyIGU9XCJcIixyPTA7cjx0Lmxlbmd0aDtyKyspZSs9Zih0W3JdLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGV9ZnVuY3Rpb24gbyh0KXt2YXIgZT10Pj4+MjR8dD4+PjgmNjUyODB8dDw8OCYxNjcxMTY4MHwoMjU1JnQpPDwyNDtyZXR1cm4gZT4+PjB9ZnVuY3Rpb24gYSh0LGUpe2Zvcih2YXIgcj1cIlwiLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXTtcImxpdHRsZVwiPT09ZSYmKGk9byhpKSkscis9cyhpLnRvU3RyaW5nKDE2KSl9cmV0dXJuIHJ9ZnVuY3Rpb24gZih0KXtyZXR1cm4gMT09PXQubGVuZ3RoP1wiMFwiK3Q6dH1mdW5jdGlvbiBzKHQpe3JldHVybiA3PT09dC5sZW5ndGg/XCIwXCIrdDo2PT09dC5sZW5ndGg/XCIwMFwiK3Q6NT09PXQubGVuZ3RoP1wiMDAwXCIrdDo0PT09dC5sZW5ndGg/XCIwMDAwXCIrdDozPT09dC5sZW5ndGg/XCIwMDAwMFwiK3Q6Mj09PXQubGVuZ3RoP1wiMDAwMDAwXCIrdDoxPT09dC5sZW5ndGg/XCIwMDAwMDAwXCIrdDp0fWZ1bmN0aW9uIHUodCxlLHIsbil7dmFyIGk9ci1lO3koaSU0PT09MCk7Zm9yKHZhciBvPW5ldyBBcnJheShpLzQpLGE9MCxmPWU7YTxvLmxlbmd0aDthKyssZis9NCl7dmFyIHM7cz1cImJpZ1wiPT09bj90W2ZdPDwyNHx0W2YrMV08PDE2fHRbZisyXTw8OHx0W2YrM106dFtmKzNdPDwyNHx0W2YrMl08PDE2fHRbZisxXTw8OHx0W2ZdLG9bYV09cz4+PjB9cmV0dXJuIG99ZnVuY3Rpb24gaCh0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkoNCp0Lmxlbmd0aCksbj0wLGk9MDtuPHQubGVuZ3RoO24rKyxpKz00KXt2YXIgbz10W25dO1wiYmlnXCI9PT1lPyhyW2ldPW8+Pj4yNCxyW2krMV09bz4+PjE2JjI1NSxyW2krMl09bz4+PjgmMjU1LHJbaSszXT0yNTUmbyk6KHJbaSszXT1vPj4+MjQscltpKzJdPW8+Pj4xNiYyNTUscltpKzFdPW8+Pj44JjI1NSxyW2ldPTI1NSZvKX1yZXR1cm4gcn1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIHQ+Pj5lfHQ8PDMyLWV9ZnVuY3Rpb24gZCh0LGUpe3JldHVybiB0PDxlfHQ+Pj4zMi1lfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gdCtlPj4+MH1mdW5jdGlvbiBwKHQsZSxyKXtyZXR1cm4gdCtlK3I+Pj4wfWZ1bmN0aW9uIGIodCxlLHIsbil7cmV0dXJuIHQrZStyK24+Pj4wfWZ1bmN0aW9uIHYodCxlLHIsbixpKXtyZXR1cm4gdCtlK3IrbitpPj4+MH1mdW5jdGlvbiB5KHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fFwiQXNzZXJ0aW9uIGZhaWxlZFwiKX1mdW5jdGlvbiBtKHQsZSxyLG4pe3ZhciBpPXRbZV0sbz10W2UrMV0sYT1uK28+Pj4wLGY9KGE8bj8xOjApK3IraTt0W2VdPWY+Pj4wLHRbZSsxXT1hfWZ1bmN0aW9uIGcodCxlLHIsbil7dmFyIGk9ZStuPj4+MCxvPShpPGU/MTowKSt0K3I7cmV0dXJuIG8+Pj4wfWZ1bmN0aW9uIHcodCxlLHIsbil7dmFyIGk9ZStuO3JldHVybiBpPj4+MH1mdW5jdGlvbiBfKHQsZSxyLG4saSxvLGEsZil7dmFyIHM9MCx1PWU7dT11K24+Pj4wLHMrPXU8ZT8xOjAsdT11K28+Pj4wLHMrPXU8bz8xOjAsdT11K2Y+Pj4wLHMrPXU8Zj8xOjA7dmFyIGg9dCtyK2krYStzO3JldHVybiBoPj4+MH1mdW5jdGlvbiBNKHQsZSxyLG4saSxvLGEsZil7dmFyIHM9ZStuK28rZjtyZXR1cm4gcz4+PjB9ZnVuY3Rpb24gUyh0LGUscixuLGksbyxhLGYscyx1KXt2YXIgaD0wLGM9ZTtjPWMrbj4+PjAsaCs9YzxlPzE6MCxjPWMrbz4+PjAsaCs9YzxvPzE6MCxjPWMrZj4+PjAsaCs9YzxmPzE6MCxjPWMrdT4+PjAsaCs9Yzx1PzE6MDt2YXIgZD10K3IraSthK3MraDtyZXR1cm4gZD4+PjB9ZnVuY3Rpb24gRSh0LGUscixuLGksbyxhLGYscyx1KXt2YXIgaD1lK24rbytmK3U7cmV0dXJuIGg+Pj4wfWZ1bmN0aW9uIEEodCxlLHIpe3ZhciBuPWU8PDMyLXJ8dD4+PnI7cmV0dXJuIG4+Pj4wfWZ1bmN0aW9uIGsodCxlLHIpe3ZhciBuPXQ8PDMyLXJ8ZT4+PnI7cmV0dXJuIG4+Pj4wfWZ1bmN0aW9uIHgodCxlLHIpe3JldHVybiB0Pj4+cn1mdW5jdGlvbiBJKHQsZSxyKXt2YXIgbj10PDwzMi1yfGU+Pj5yO3JldHVybiBuPj4+MH12YXIgQj1lLE89cigyKTtCLnRvQXJyYXk9bixCLnRvSGV4PWksQi5odG9ubD1vLEIudG9IZXgzMj1hLEIuemVybzI9ZixCLnplcm84PXMsQi5qb2luMzI9dSxCLnNwbGl0MzI9aCxCLnJvdHIzMj1jLEIucm90bDMyPWQsQi5zdW0zMj1sLEIuc3VtMzJfMz1wLEIuc3VtMzJfND1iLEIuc3VtMzJfNT12LEIuYXNzZXJ0PXksQi5pbmhlcml0cz1PLGUuc3VtNjQ9bSxlLnN1bTY0X2hpPWcsZS5zdW02NF9sbz13LGUuc3VtNjRfNF9oaT1fLGUuc3VtNjRfNF9sbz1NLGUuc3VtNjRfNV9oaT1TLGUuc3VtNjRfNV9sbz1FLGUucm90cjY0X2hpPUEsZS5yb3RyNjRfbG89ayxlLnNocjY0X2hpPXgsZS5zaHI2NF9sbz1JfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxMDApLGk9bi5kZWZpbmUoXCJSU0FQcml2YXRlS2V5XCIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleShcInZlcnNpb25cIikuaW50KCksdGhpcy5rZXkoXCJtb2R1bHVzXCIpLmludCgpLHRoaXMua2V5KFwicHVibGljRXhwb25lbnRcIikuaW50KCksdGhpcy5rZXkoXCJwcml2YXRlRXhwb25lbnRcIikuaW50KCksdGhpcy5rZXkoXCJwcmltZTFcIikuaW50KCksdGhpcy5rZXkoXCJwcmltZTJcIikuaW50KCksdGhpcy5rZXkoXCJleHBvbmVudDFcIikuaW50KCksdGhpcy5rZXkoXCJleHBvbmVudDJcIikuaW50KCksdGhpcy5rZXkoXCJjb2VmZmljaWVudFwiKS5pbnQoKSl9KTtlLlJTQVByaXZhdGVLZXk9aTt2YXIgbz1uLmRlZmluZShcIlJTQVB1YmxpY0tleVwiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoXCJtb2R1bHVzXCIpLmludCgpLHRoaXMua2V5KFwicHVibGljRXhwb25lbnRcIikuaW50KCkpfSk7ZS5SU0FQdWJsaWNLZXk9bzt2YXIgYT1uLmRlZmluZShcIlN1YmplY3RQdWJsaWNLZXlJbmZvXCIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleShcImFsZ29yaXRobVwiKS51c2UoZiksdGhpcy5rZXkoXCJzdWJqZWN0UHVibGljS2V5XCIpLmJpdHN0cigpKX0pO2UuUHVibGljS2V5PWE7dmFyIGY9bi5kZWZpbmUoXCJBbGdvcml0aG1JZGVudGlmaWVyXCIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleShcImFsZ29yaXRobVwiKS5vYmppZCgpLHRoaXMua2V5KFwibm9uZVwiKS5udWxsXygpLm9wdGlvbmFsKCksdGhpcy5rZXkoXCJjdXJ2ZVwiKS5vYmppZCgpLm9wdGlvbmFsKCksdGhpcy5rZXkoXCJwYXJhbXNcIikuc2VxKCkub2JqKHRoaXMua2V5KFwicFwiKS5pbnQoKSx0aGlzLmtleShcInFcIikuaW50KCksdGhpcy5rZXkoXCJnXCIpLmludCgpKS5vcHRpb25hbCgpKX0pLHM9bi5kZWZpbmUoXCJQcml2YXRlS2V5SW5mb1wiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoXCJ2ZXJzaW9uXCIpLmludCgpLHRoaXMua2V5KFwiYWxnb3JpdGhtXCIpLnVzZShmKSx0aGlzLmtleShcInN1YmplY3RQcml2YXRlS2V5XCIpLm9jdHN0cigpKX0pO2UuUHJpdmF0ZUtleT1zO3ZhciB1PW4uZGVmaW5lKFwiRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9cIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KFwiYWxnb3JpdGhtXCIpLnNlcSgpLm9iaih0aGlzLmtleShcImlkXCIpLm9iamlkKCksdGhpcy5rZXkoXCJkZWNyeXB0XCIpLnNlcSgpLm9iaih0aGlzLmtleShcImtkZVwiKS5zZXEoKS5vYmoodGhpcy5rZXkoXCJpZFwiKS5vYmppZCgpLHRoaXMua2V5KFwia2RlcGFyYW1zXCIpLnNlcSgpLm9iaih0aGlzLmtleShcInNhbHRcIikub2N0c3RyKCksdGhpcy5rZXkoXCJpdGVyc1wiKS5pbnQoKSkpLHRoaXMua2V5KFwiY2lwaGVyXCIpLnNlcSgpLm9iaih0aGlzLmtleShcImFsZ29cIikub2JqaWQoKSx0aGlzLmtleShcIml2XCIpLm9jdHN0cigpKSkpLHRoaXMua2V5KFwic3ViamVjdFByaXZhdGVLZXlcIikub2N0c3RyKCkpfSk7ZS5FbmNyeXB0ZWRQcml2YXRlS2V5PXU7dmFyIGg9bi5kZWZpbmUoXCJEU0FQcml2YXRlS2V5XCIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleShcInZlcnNpb25cIikuaW50KCksdGhpcy5rZXkoXCJwXCIpLmludCgpLHRoaXMua2V5KFwicVwiKS5pbnQoKSx0aGlzLmtleShcImdcIikuaW50KCksdGhpcy5rZXkoXCJwdWJfa2V5XCIpLmludCgpLHRoaXMua2V5KFwicHJpdl9rZXlcIikuaW50KCkpfSk7ZS5EU0FQcml2YXRlS2V5PWgsZS5EU0FwYXJhbT1uLmRlZmluZShcIkRTQXBhcmFtXCIsZnVuY3Rpb24oKXt0aGlzLmludCgpfSk7dmFyIGM9bi5kZWZpbmUoXCJFQ1ByaXZhdGVLZXlcIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KFwidmVyc2lvblwiKS5pbnQoKSx0aGlzLmtleShcInByaXZhdGVLZXlcIikub2N0c3RyKCksdGhpcy5rZXkoXCJwYXJhbWV0ZXJzXCIpLm9wdGlvbmFsKCkuZXhwbGljaXQoMCkudXNlKGQpLHRoaXMua2V5KFwicHVibGljS2V5XCIpLm9wdGlvbmFsKCkuZXhwbGljaXQoMSkuYml0c3RyKCkpfSk7ZS5FQ1ByaXZhdGVLZXk9Yzt2YXIgZD1uLmRlZmluZShcIkVDUGFyYW1ldGVyc1wiLGZ1bmN0aW9uKCl7dGhpcy5jaG9pY2Uoe25hbWVkQ3VydmU6dGhpcy5vYmppZCgpfSl9KTtlLnNpZ25hdHVyZT1uLmRlZmluZShcInNpZ25hdHVyZVwiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoXCJyXCIpLmludCgpLHRoaXMua2V5KFwic1wiKS5pbnQoKSl9KX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXt2YXIgbj0vUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxccj9cXG5ERUstSW5mbzogQUVTLSgoPzoxMjgpfCg/OjE5Mil8KD86MjU2KSktQ0JDLChbMC05QS1IXSspXFxyP1xcblxccj9cXG4oWzAtOUEtelxcblxcclxcK1xcL1xcPV0rKVxccj9cXG4vbSxpPS9eLS0tLS1CRUdJTiAoLiopIEtFWS0tLS0tXFxyP1xcbi9tLG89L14tLS0tLUJFR0lOICguKikgS0VZLS0tLS1cXHI/XFxuKFswLTlBLXpcXG5cXHJcXCtcXC9cXD1dKylcXHI/XFxuLS0tLS1FTkQgXFwxIEtFWS0tLS0tJC9tLGE9cigxNDgpLGY9cigyMTkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3ZhciBzLHU9dC50b1N0cmluZygpLGg9dS5tYXRjaChuKTtpZihoKXt2YXIgYz1cImFlc1wiK2hbMV0sZD1uZXcgZShoWzJdLFwiaGV4XCIpLGw9bmV3IGUoaFszXS5yZXBsYWNlKC9cXHI/XFxuL2csXCJcIiksXCJiYXNlNjRcIikscD1hKHIsZC5zbGljZSgwLDgpLHBhcnNlSW50KGhbMV0sMTApKS5rZXksYj1bXSx2PWYuY3JlYXRlRGVjaXBoZXJpdihjLHAsZCk7Yi5wdXNoKHYudXBkYXRlKGwpKSxiLnB1c2godi5maW5hbCgpKSxzPWUuY29uY2F0KGIpfWVsc2V7dmFyIHk9dS5tYXRjaChvKTtzPW5ldyBlKHlbMl0ucmVwbGFjZSgvXFxyP1xcbi9nLFwiXCIpLFwiYmFzZTY0XCIpfXZhciBtPXUubWF0Y2goaSlbMV0rXCIgS0VZXCI7cmV0dXJue3RhZzptLGRhdGE6c319fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt0aGlzLm5hbWU9dCx0aGlzLmJvZHk9ZSx0aGlzLmRlY29kZXJzPXt9LHRoaXMuZW5jb2RlcnM9e319dmFyIGk9cigxMDApLG89cigyKSxhPWU7YS5kZWZpbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sbi5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkPWZ1bmN0aW9uKHQpe3ZhciBlO3RyeXtlPXIoMjUxKS5ydW5JblRoaXNDb250ZXh0KFwiKGZ1bmN0aW9uIFwiK3RoaXMubmFtZStcIihlbnRpdHkpIHtcXG4gIHRoaXMuX2luaXROYW1lZChlbnRpdHkpO1xcbn0pXCIpfWNhdGNoKHQpe2U9ZnVuY3Rpb24odCl7dGhpcy5faW5pdE5hbWVkKHQpfX1yZXR1cm4gbyhlLHQpLGUucHJvdG90eXBlLl9pbml0TmFtZWQ9ZnVuY3Rpb24oZSl7dC5jYWxsKHRoaXMsZSl9LG5ldyBlKHRoaXMpfSxuLnByb3RvdHlwZS5fZ2V0RGVjb2Rlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHxcImRlclwiLHRoaXMuZGVjb2RlcnMuaGFzT3duUHJvcGVydHkodCl8fCh0aGlzLmRlY29kZXJzW3RdPXRoaXMuX2NyZWF0ZU5hbWVkKGkuZGVjb2RlcnNbdF0pKSx0aGlzLmRlY29kZXJzW3RdfSxuLnByb3RvdHlwZS5kZWNvZGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLl9nZXREZWNvZGVyKGUpLmRlY29kZSh0LHIpfSxuLnByb3RvdHlwZS5fZ2V0RW5jb2Rlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHxcImRlclwiLHRoaXMuZW5jb2RlcnMuaGFzT3duUHJvcGVydHkodCl8fCh0aGlzLmVuY29kZXJzW3RdPXRoaXMuX2NyZWF0ZU5hbWVkKGkuZW5jb2RlcnNbdF0pKSx0aGlzLmVuY29kZXJzW3RdfSxuLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLl9nZXRFbmNvZGVyKGUpLmVuY29kZSh0LHIpfX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt2YXIgcj17fTt0aGlzLl9iYXNlU3RhdGU9cixyLmVuYz10LHIucGFyZW50PWV8fG51bGwsci5jaGlsZHJlbj1udWxsLHIudGFnPW51bGwsci5hcmdzPW51bGwsci5yZXZlcnNlQXJncz1udWxsLHIuY2hvaWNlPW51bGwsci5vcHRpb25hbD0hMSxyLmFueT0hMSxyLm9iaj0hMSxyLnVzZT1udWxsLHIudXNlRGVjb2Rlcj1udWxsLHIua2V5PW51bGwsci5kZWZhdWx0PW51bGwsci5leHBsaWNpdD1udWxsLHIuaW1wbGljaXQ9bnVsbCxyLmNvbnRhaW5zPW51bGwsci5wYXJlbnR8fChyLmNoaWxkcmVuPVtdLHRoaXMuX3dyYXAoKSl9dmFyIGk9cig2OCkuUmVwb3J0ZXIsbz1yKDY4KS5FbmNvZGVyQnVmZmVyLGE9cig2OCkuRGVjb2RlckJ1ZmZlcixmPXIoNTM4KSxzPVtcInNlcVwiLFwic2Vxb2ZcIixcInNldFwiLFwic2V0b2ZcIixcIm9iamlkXCIsXCJib29sXCIsXCJnZW50aW1lXCIsXCJ1dGN0aW1lXCIsXCJudWxsX1wiLFwiZW51bVwiLFwiaW50XCIsXCJiaXRzdHJcIixcImJtcHN0clwiLFwiY2hhcnN0clwiLFwiZ2Vuc3RyXCIsXCJncmFwaHN0clwiLFwiaWE1c3RyXCIsXCJpc282NDZzdHJcIixcIm51bXN0clwiLFwib2N0c3RyXCIsXCJwcmludHN0clwiLFwidDYxc3RyXCIsXCJ1bmlzdHJcIixcInV0ZjhzdHJcIixcInZpZGVvc3RyXCJdLHU9W1wia2V5XCIsXCJvYmpcIixcInVzZVwiLFwib3B0aW9uYWxcIixcImV4cGxpY2l0XCIsXCJpbXBsaWNpdFwiLFwiZGVmXCIsXCJjaG9pY2VcIixcImFueVwiLFwiY29udGFpbnNcIl0uY29uY2F0KHMpLGg9W1wiX3BlZWtUYWdcIixcIl9kZWNvZGVUYWdcIixcIl91c2VcIixcIl9kZWNvZGVTdHJcIixcIl9kZWNvZGVPYmppZFwiLFwiX2RlY29kZVRpbWVcIixcIl9kZWNvZGVOdWxsXCIsXCJfZGVjb2RlSW50XCIsXCJfZGVjb2RlQm9vbFwiLFwiX2RlY29kZUxpc3RcIixcIl9lbmNvZGVDb21wb3NpdGVcIixcIl9lbmNvZGVTdHJcIixcIl9lbmNvZGVPYmppZFwiLFwiX2VuY29kZVRpbWVcIixcIl9lbmNvZGVOdWxsXCIsXCJfZW5jb2RlSW50XCIsXCJfZW5jb2RlQm9vbFwiXTt0LmV4cG9ydHM9bjt2YXIgYz1bXCJlbmNcIixcInBhcmVudFwiLFwiY2hpbGRyZW5cIixcInRhZ1wiLFwiYXJnc1wiLFwicmV2ZXJzZUFyZ3NcIixcImNob2ljZVwiLFwib3B0aW9uYWxcIixcImFueVwiLFwib2JqXCIsXCJ1c2VcIixcImFsdGVyZWRVc2VcIixcImtleVwiLFwiZGVmYXVsdFwiLFwiZXhwbGljaXRcIixcImltcGxpY2l0XCIsXCJjb250YWluc1wiXTtuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VTdGF0ZSxlPXt9O2MuZm9yRWFjaChmdW5jdGlvbihyKXtlW3JdPXRbcl19KTt2YXIgcj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLnBhcmVudCk7cmV0dXJuIHIuX2Jhc2VTdGF0ZT1lLHJ9LG4ucHJvdG90eXBlLl93cmFwPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmFzZVN0YXRlO3UuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzW2VdPWZ1bmN0aW9uKCl7dmFyIHI9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7cmV0dXJuIHQuY2hpbGRyZW4ucHVzaChyKSxyW2VdLmFwcGx5KHIsYXJndW1lbnRzKX19LHRoaXMpfSxuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7ZihudWxsPT09ZS5wYXJlbnQpLHQuY2FsbCh0aGlzKSxlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0Ll9iYXNlU3RhdGUucGFyZW50PT09dGhpc30sdGhpcyksZi5lcXVhbChlLmNoaWxkcmVuLmxlbmd0aCwxLFwiUm9vdCBub2RlIGNhbiBoYXZlIG9ubHkgb25lIGNoaWxkXCIpfSxuLnByb3RvdHlwZS5fdXNlQXJncz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGUscj10LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3J9LHRoaXMpO3Q9dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuISh0IGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcil9LHRoaXMpLDAhPT1yLmxlbmd0aCYmKGYobnVsbD09PWUuY2hpbGRyZW4pLGUuY2hpbGRyZW49cixyLmZvckVhY2goZnVuY3Rpb24odCl7dC5fYmFzZVN0YXRlLnBhcmVudD10aGlzfSx0aGlzKSksMCE9PXQubGVuZ3RoJiYoZihudWxsPT09ZS5hcmdzKSxlLmFyZ3M9dCxlLnJldmVyc2VBcmdzPXQubWFwKGZ1bmN0aW9uKHQpe2lmKFwib2JqZWN0XCIhPXR5cGVvZiB0fHx0LmNvbnN0cnVjdG9yIT09T2JqZWN0KXJldHVybiB0O3ZhciBlPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3I9PSgwfHIpJiYocnw9MCk7dmFyIG49dFtyXTtlW25dPXJ9KSxlfSkpfSxoLmZvckVhY2goZnVuY3Rpb24odCl7bi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7dGhyb3cgbmV3IEVycm9yKHQrXCIgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogXCIrZS5lbmMpfX0pLHMuZm9yRWFjaChmdW5jdGlvbih0KXtuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2Jhc2VTdGF0ZSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIGYobnVsbD09PWUudGFnKSxlLnRhZz10LHRoaXMuX3VzZUFyZ3MociksdGhpc319KSxuLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBmKG51bGw9PT1lLnVzZSksZS51c2U9dCx0aGlzfSxuLnByb3RvdHlwZS5vcHRpb25hbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gdC5vcHRpb25hbD0hMCx0aGlzfSxuLnByb3RvdHlwZS5kZWY9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBmKG51bGw9PT1lLmRlZmF1bHQpLGUuZGVmYXVsdD10LGUub3B0aW9uYWw9ITAsdGhpc30sbi5wcm90b3R5cGUuZXhwbGljaXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBmKG51bGw9PT1lLmV4cGxpY2l0JiZudWxsPT09ZS5pbXBsaWNpdCksZS5leHBsaWNpdD10LHRoaXN9LG4ucHJvdG90eXBlLmltcGxpY2l0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gZihudWxsPT09ZS5leHBsaWNpdCYmbnVsbD09PWUuaW1wbGljaXQpLGUuaW1wbGljaXQ9dCx0aGlzfSxuLnByb3RvdHlwZS5vYmo9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9iYXNlU3RhdGUsZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiB0Lm9iaj0hMCwwIT09ZS5sZW5ndGgmJnRoaXMuX3VzZUFyZ3MoZSksdGhpc30sbi5wcm90b3R5cGUua2V5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gZihudWxsPT09ZS5rZXkpLGUua2V5PXQsdGhpc30sbi5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmFzZVN0YXRlO3JldHVybiB0LmFueT0hMCx0aGlzfSxuLnByb3RvdHlwZS5jaG9pY2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBmKG51bGw9PT1lLmNob2ljZSksZS5jaG9pY2U9dCx0aGlzLl91c2VBcmdzKE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKSx0aGlzfSxuLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIGYobnVsbD09PWUudXNlKSxlLmNvbnRhaW5zPXQsdGhpc30sbi5wcm90b3R5cGUuX2RlY29kZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09ci5wYXJlbnQpcmV0dXJuIHQud3JhcFJlc3VsdChyLmNoaWxkcmVuWzBdLl9kZWNvZGUodCxlKSk7dmFyIG49ci5kZWZhdWx0LGk9ITAsbz1udWxsO2lmKG51bGwhPT1yLmtleSYmKG89dC5lbnRlcktleShyLmtleSkpLHIub3B0aW9uYWwpe3ZhciBmPW51bGw7aWYobnVsbCE9PXIuZXhwbGljaXQ/Zj1yLmV4cGxpY2l0Om51bGwhPT1yLmltcGxpY2l0P2Y9ci5pbXBsaWNpdDpudWxsIT09ci50YWcmJihmPXIudGFnKSxudWxsIT09Znx8ci5hbnkpe2lmKGk9dGhpcy5fcGVla1RhZyh0LGYsci5hbnkpLHQuaXNFcnJvcihpKSlyZXR1cm4gaX1lbHNle3ZhciBzPXQuc2F2ZSgpO3RyeXtudWxsPT09ci5jaG9pY2U/dGhpcy5fZGVjb2RlR2VuZXJpYyhyLnRhZyx0LGUpOnRoaXMuX2RlY29kZUNob2ljZSh0LGUpLGk9ITB9Y2F0Y2godCl7aT0hMX10LnJlc3RvcmUocyl9fXZhciB1O2lmKHIub2JqJiZpJiYodT10LmVudGVyT2JqZWN0KCkpLGkpe2lmKG51bGwhPT1yLmV4cGxpY2l0KXt2YXIgaD10aGlzLl9kZWNvZGVUYWcodCxyLmV4cGxpY2l0KTtpZih0LmlzRXJyb3IoaCkpcmV0dXJuIGg7dD1ofXZhciBjPXQub2Zmc2V0O2lmKG51bGw9PT1yLnVzZSYmbnVsbD09PXIuY2hvaWNlKXtpZihyLmFueSl2YXIgcz10LnNhdmUoKTt2YXIgZD10aGlzLl9kZWNvZGVUYWcodCxudWxsIT09ci5pbXBsaWNpdD9yLmltcGxpY2l0OnIudGFnLHIuYW55KTtpZih0LmlzRXJyb3IoZCkpcmV0dXJuIGQ7ci5hbnk/bj10LnJhdyhzKTp0PWR9aWYoZSYmZS50cmFjayYmbnVsbCE9PXIudGFnJiZlLnRyYWNrKHQucGF0aCgpLGMsdC5sZW5ndGgsXCJ0YWdnZWRcIiksZSYmZS50cmFjayYmbnVsbCE9PXIudGFnJiZlLnRyYWNrKHQucGF0aCgpLHQub2Zmc2V0LHQubGVuZ3RoLFwiY29udGVudFwiKSxuPXIuYW55P246bnVsbD09PXIuY2hvaWNlP3RoaXMuX2RlY29kZUdlbmVyaWMoci50YWcsdCxlKTp0aGlzLl9kZWNvZGVDaG9pY2UodCxlKSx0LmlzRXJyb3IobikpcmV0dXJuIG47aWYoci5hbnl8fG51bGwhPT1yLmNob2ljZXx8bnVsbD09PXIuY2hpbGRyZW58fHIuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihyKXtyLl9kZWNvZGUodCxlKX0pLHIuY29udGFpbnMmJihcIm9jdHN0clwiPT09ci50YWd8fFwiYml0c3RyXCI9PT1yLnRhZykpe3ZhciBsPW5ldyBhKG4pO249dGhpcy5fZ2V0VXNlKHIuY29udGFpbnMsdC5fcmVwb3J0ZXJTdGF0ZS5vYmopLl9kZWNvZGUobCxlKX19cmV0dXJuIHIub2JqJiZpJiYobj10LmxlYXZlT2JqZWN0KHUpKSxudWxsPT09ci5rZXl8fG51bGw9PT1uJiZpIT09ITA/bnVsbCE9PW8mJnQuZXhpdEtleShvKTp0LmxlYXZlS2V5KG8sci5rZXksbiksbn0sbi5wcm90b3R5cGUuX2RlY29kZUdlbmVyaWM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm5cInNlcVwiPT09dHx8XCJzZXRcIj09PXQ/bnVsbDpcInNlcW9mXCI9PT10fHxcInNldG9mXCI9PT10P3RoaXMuX2RlY29kZUxpc3QoZSx0LG4uYXJnc1swXSxyKTovc3RyJC8udGVzdCh0KT90aGlzLl9kZWNvZGVTdHIoZSx0LHIpOlwib2JqaWRcIj09PXQmJm4uYXJncz90aGlzLl9kZWNvZGVPYmppZChlLG4uYXJnc1swXSxuLmFyZ3NbMV0scik6XCJvYmppZFwiPT09dD90aGlzLl9kZWNvZGVPYmppZChlLG51bGwsbnVsbCxyKTpcImdlbnRpbWVcIj09PXR8fFwidXRjdGltZVwiPT09dD90aGlzLl9kZWNvZGVUaW1lKGUsdCxyKTpcIm51bGxfXCI9PT10P3RoaXMuX2RlY29kZU51bGwoZSxyKTpcImJvb2xcIj09PXQ/dGhpcy5fZGVjb2RlQm9vbChlLHIpOlwiaW50XCI9PT10fHxcImVudW1cIj09PXQ/dGhpcy5fZGVjb2RlSW50KGUsbi5hcmdzJiZuLmFyZ3NbMF0scik6bnVsbCE9PW4udXNlP3RoaXMuX2dldFVzZShuLnVzZSxlLl9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShlLHIpOmUuZXJyb3IoXCJ1bmtub3duIHRhZzogXCIrdCl9LG4ucHJvdG90eXBlLl9nZXRVc2U9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHIudXNlRGVjb2Rlcj10aGlzLl91c2UodCxlKSxmKG51bGw9PT1yLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5wYXJlbnQpLHIudXNlRGVjb2Rlcj1yLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5jaGlsZHJlblswXSxyLmltcGxpY2l0IT09ci51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQmJihyLnVzZURlY29kZXI9ci51c2VEZWNvZGVyLmNsb25lKCksci51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQ9ci5pbXBsaWNpdCksci51c2VEZWNvZGVyfSxuLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fYmFzZVN0YXRlLG49bnVsbCxpPSExO3JldHVybiBPYmplY3Qua2V5cyhyLmNob2ljZSkuc29tZShmdW5jdGlvbihvKXt2YXIgYT10LnNhdmUoKSxmPXIuY2hvaWNlW29dO3RyeXt2YXIgcz1mLl9kZWNvZGUodCxlKTtpZih0LmlzRXJyb3IocykpcmV0dXJuITE7bj17dHlwZTpvLHZhbHVlOnN9LGk9ITB9Y2F0Y2goZSl7cmV0dXJuIHQucmVzdG9yZShhKSwhMX1yZXR1cm4hMH0sdGhpcyksaT9uOnQuZXJyb3IoXCJDaG9pY2Ugbm90IG1hdGNoZWRcIil9LG4ucHJvdG90eXBlLl9jcmVhdGVFbmNvZGVyQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0LHRoaXMucmVwb3J0ZXIpfSxuLnByb3RvdHlwZS5fZW5jb2RlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl9iYXNlU3RhdGU7aWYobnVsbD09PW4uZGVmYXVsdHx8bi5kZWZhdWx0IT09dCl7dmFyIGk9dGhpcy5fZW5jb2RlVmFsdWUodCxlLHIpO2lmKHZvaWQgMCE9PWkmJiF0aGlzLl9za2lwRGVmYXVsdChpLGUscikpcmV0dXJuIGl9fSxuLnByb3RvdHlwZS5fZW5jb2RlVmFsdWU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09bi5wYXJlbnQpcmV0dXJuIG4uY2hpbGRyZW5bMF0uX2VuY29kZSh0LGV8fG5ldyBpKTt2YXIgbz1udWxsO2lmKHRoaXMucmVwb3J0ZXI9ZSxuLm9wdGlvbmFsJiZ2b2lkIDA9PT10KXtpZihudWxsPT09bi5kZWZhdWx0KXJldHVybjt0PW4uZGVmYXVsdH12YXIgYT1udWxsLGY9ITE7aWYobi5hbnkpbz10aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpO2Vsc2UgaWYobi5jaG9pY2Upbz10aGlzLl9lbmNvZGVDaG9pY2UodCxlKTtlbHNlIGlmKG4uY29udGFpbnMpYT10aGlzLl9nZXRVc2Uobi5jb250YWlucyxyKS5fZW5jb2RlKHQsZSksZj0hMDtlbHNlIGlmKG4uY2hpbGRyZW4pYT1uLmNoaWxkcmVuLm1hcChmdW5jdGlvbihyKXtpZihcIm51bGxfXCI9PT1yLl9iYXNlU3RhdGUudGFnKXJldHVybiByLl9lbmNvZGUobnVsbCxlLHQpO2lmKG51bGw9PT1yLl9iYXNlU3RhdGUua2V5KXJldHVybiBlLmVycm9yKFwiQ2hpbGQgc2hvdWxkIGhhdmUgYSBrZXlcIik7dmFyIG49ZS5lbnRlcktleShyLl9iYXNlU3RhdGUua2V5KTtpZihcIm9iamVjdFwiIT10eXBlb2YgdClyZXR1cm4gZS5lcnJvcihcIkNoaWxkIGV4cGVjdGVkLCBidXQgaW5wdXQgaXMgbm90IG9iamVjdFwiKTt2YXIgaT1yLl9lbmNvZGUodFtyLl9iYXNlU3RhdGUua2V5XSxlLHQpO3JldHVybiBlLmxlYXZlS2V5KG4pLGl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pLGE9dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihhKTtlbHNlIGlmKFwic2Vxb2ZcIj09PW4udGFnfHxcInNldG9mXCI9PT1uLnRhZyl7aWYoIW4uYXJnc3x8MSE9PW4uYXJncy5sZW5ndGgpcmV0dXJuIGUuZXJyb3IoXCJUb28gbWFueSBhcmdzIGZvciA6IFwiK24udGFnKTtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gZS5lcnJvcihcInNlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXlcIik7dmFyIHM9dGhpcy5jbG9uZSgpO3MuX2Jhc2VTdGF0ZS5pbXBsaWNpdD1udWxsLGE9dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih0Lm1hcChmdW5jdGlvbihyKXt2YXIgbj10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHRoaXMuX2dldFVzZShuLmFyZ3NbMF0sdCkuX2VuY29kZShyLGUpfSxzKSl9ZWxzZSBudWxsIT09bi51c2U/bz10aGlzLl9nZXRVc2Uobi51c2UscikuX2VuY29kZSh0LGUpOihhPXRoaXMuX2VuY29kZVByaW1pdGl2ZShuLnRhZyx0KSxmPSEwKTt2YXIgbztpZighbi5hbnkmJm51bGw9PT1uLmNob2ljZSl7dmFyIHU9bnVsbCE9PW4uaW1wbGljaXQ/bi5pbXBsaWNpdDpuLnRhZyxoPW51bGw9PT1uLmltcGxpY2l0P1widW5pdmVyc2FsXCI6XCJjb250ZXh0XCI7bnVsbD09PXU/bnVsbD09PW4udXNlJiZlLmVycm9yKFwiVGFnIGNvdWxkIGJlIG9tbWl0ZWQgb25seSBmb3IgLnVzZSgpXCIpOm51bGw9PT1uLnVzZSYmKG89dGhpcy5fZW5jb2RlQ29tcG9zaXRlKHUsZixoLGEpKX1yZXR1cm4gbnVsbCE9PW4uZXhwbGljaXQmJihvPXRoaXMuX2VuY29kZUNvbXBvc2l0ZShuLmV4cGxpY2l0LCExLFwiY29udGV4dFwiLG8pKSxvfSxuLnByb3RvdHlwZS5fZW5jb2RlQ2hvaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fYmFzZVN0YXRlLG49ci5jaG9pY2VbdC50eXBlXTtyZXR1cm4gbnx8ZighMSx0LnR5cGUrXCIgbm90IGZvdW5kIGluIFwiK0pTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHIuY2hvaWNlKSkpLG4uX2VuY29kZSh0LnZhbHVlLGUpfSxuLnByb3RvdHlwZS5fZW5jb2RlUHJpbWl0aXZlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fYmFzZVN0YXRlO2lmKC9zdHIkLy50ZXN0KHQpKXJldHVybiB0aGlzLl9lbmNvZGVTdHIoZSx0KTtpZihcIm9iamlkXCI9PT10JiZyLmFyZ3MpcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGUsci5yZXZlcnNlQXJnc1swXSxyLmFyZ3NbMV0pO2lmKFwib2JqaWRcIj09PXQpcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGUsbnVsbCxudWxsKTtpZihcImdlbnRpbWVcIj09PXR8fFwidXRjdGltZVwiPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlVGltZShlLHQpO2lmKFwibnVsbF9cIj09PXQpcmV0dXJuIHRoaXMuX2VuY29kZU51bGwoKTtpZihcImludFwiPT09dHx8XCJlbnVtXCI9PT10KXJldHVybiB0aGlzLl9lbmNvZGVJbnQoZSxyLmFyZ3MmJnIucmV2ZXJzZUFyZ3NbMF0pO2lmKFwiYm9vbFwiPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlQm9vbChlKTt0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCB0YWc6IFwiK3QpfSxuLnByb3RvdHlwZS5faXNOdW1zdHI9ZnVuY3Rpb24odCl7cmV0dXJuL15bMC05IF0qJC8udGVzdCh0KX0sbi5wcm90b3R5cGUuX2lzUHJpbnRzdHI9ZnVuY3Rpb24odCl7cmV0dXJuL15bQS1aYS16MC05ICdcXChcXClcXCssXFwtXFwuXFwvOj1cXD9dKiQvLnRlc3QodCl9fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXt0aGlzLl9yZXBvcnRlclN0YXRlPXtvYmo6bnVsbCxwYXRoOltdLG9wdGlvbnM6dHx8e30sZXJyb3JzOltdfX1mdW5jdGlvbiBpKHQsZSl7dGhpcy5wYXRoPXQsdGhpcy5yZXRocm93KGUpfXZhciBvPXIoMik7ZS5SZXBvcnRlcj1uLG4ucHJvdG90eXBlLmlzRXJyb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBpfSxuLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtyZXR1cm57b2JqOnQub2JqLHBhdGhMZW46dC5wYXRoLmxlbmd0aH19LG4ucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtlLm9iaj10Lm9iaixlLnBhdGg9ZS5wYXRoLnNsaWNlKDAsdC5wYXRoTGVuKX0sbi5wcm90b3R5cGUuZW50ZXJLZXk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKHQpfSxuLnByb3RvdHlwZS5leGl0S2V5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlcG9ydGVyU3RhdGU7ZS5wYXRoPWUucGF0aC5zbGljZSgwLHQtMSl9LG4ucHJvdG90eXBlLmxlYXZlS2V5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl9yZXBvcnRlclN0YXRlO3RoaXMuZXhpdEtleSh0KSxudWxsIT09bi5vYmomJihuLm9ialtlXT1yKX0sbi5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbihcIi9cIil9LG4ucHJvdG90eXBlLmVudGVyT2JqZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVwb3J0ZXJTdGF0ZSxlPXQub2JqO3JldHVybiB0Lm9iaj17fSxlfSxuLnByb3RvdHlwZS5sZWF2ZU9iamVjdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZXBvcnRlclN0YXRlLHI9ZS5vYmo7cmV0dXJuIGUub2JqPXQscn0sbi5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7dmFyIGUscj10aGlzLl9yZXBvcnRlclN0YXRlLG49dCBpbnN0YW5jZW9mIGk7aWYoZT1uP3Q6bmV3IGkoci5wYXRoLm1hcChmdW5jdGlvbih0KXtyZXR1cm5cIltcIitKU09OLnN0cmluZ2lmeSh0KStcIl1cIn0pLmpvaW4oXCJcIiksdC5tZXNzYWdlfHx0LHQuc3RhY2spLCFyLm9wdGlvbnMucGFydGlhbCl0aHJvdyBlO3JldHVybiBufHxyLmVycm9ycy5wdXNoKGUpLGV9LG4ucHJvdG90eXBlLndyYXBSZXN1bHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtyZXR1cm4gZS5vcHRpb25zLnBhcnRpYWw/e3Jlc3VsdDp0aGlzLmlzRXJyb3IodCk/bnVsbDp0LGVycm9yczplLmVycm9yc306dH0sbyhpLEVycm9yKSxpLnByb3RvdHlwZS5yZXRocm93PWZ1bmN0aW9uKHQpe2lmKHRoaXMubWVzc2FnZT10K1wiIGF0OiBcIisodGhpcy5wYXRofHxcIihzaGFsbG93KVwiKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxpKSwhdGhpcy5zdGFjayl0cnl7dGhyb3cgbmV3IEVycm9yKHRoaXMubWVzc2FnZSl9Y2F0Y2godCl7dGhpcy5zdGFjaz10LnN0YWNrfXJldHVybiB0aGlzfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMjE1KTtlLnRhZ0NsYXNzPXswOlwidW5pdmVyc2FsXCIsMTpcImFwcGxpY2F0aW9uXCIsMjpcImNvbnRleHRcIiwzOlwicHJpdmF0ZVwifSxlLnRhZ0NsYXNzQnlOYW1lPW4uX3JldmVyc2UoZS50YWdDbGFzcyksZS50YWc9ezA6XCJlbmRcIiwxOlwiYm9vbFwiLDI6XCJpbnRcIiwzOlwiYml0c3RyXCIsNDpcIm9jdHN0clwiLDU6XCJudWxsX1wiLDY6XCJvYmppZFwiLDc6XCJvYmpEZXNjXCIsODpcImV4dGVybmFsXCIsOTpcInJlYWxcIiwxMDpcImVudW1cIiwxMTpcImVtYmVkXCIsMTI6XCJ1dGY4c3RyXCIsMTM6XCJyZWxhdGl2ZU9pZFwiLDE2Olwic2VxXCIsMTc6XCJzZXRcIiwxODpcIm51bXN0clwiLDE5OlwicHJpbnRzdHJcIiwyMDpcInQ2MXN0clwiLFxuMjE6XCJ2aWRlb3N0clwiLDIyOlwiaWE1c3RyXCIsMjM6XCJ1dGN0aW1lXCIsMjQ6XCJnZW50aW1lXCIsMjU6XCJncmFwaHN0clwiLDI2OlwiaXNvNjQ2c3RyXCIsMjc6XCJnZW5zdHJcIiwyODpcInVuaXN0clwiLDI5OlwiY2hhcnN0clwiLDMwOlwiYm1wc3RyXCJ9LGUudGFnQnlOYW1lPW4uX3JldmVyc2UoZS50YWcpfSxmdW5jdGlvbih0LGUscil7dmFyIG49ZTtuLmRlcj1yKDIxNiksbi5wZW09cig1MzUpfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXthLmNhbGwodGhpcyx0KSx0aGlzLmVuYz1cInBlbVwifXZhciBpPXIoMiksbz1yKDEpLkJ1ZmZlcixhPXIoMjE2KTtpKG4sYSksdC5leHBvcnRzPW4sbi5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQudG9TdHJpbmcoKS5zcGxpdCgvW1xcclxcbl0rL2cpLG49ZS5sYWJlbC50b1VwcGVyQ2FzZSgpLGk9L14tLS0tLShCRUdJTnxFTkQpIChbXi1dKyktLS0tLSQvLGY9LTEscz0tMSx1PTA7dTxyLmxlbmd0aDt1Kyspe3ZhciBoPXJbdV0ubWF0Y2goaSk7aWYobnVsbCE9PWgmJmhbMl09PT1uKXtpZihmIT09LTEpe2lmKFwiRU5EXCIhPT1oWzFdKWJyZWFrO3M9dTticmVha31pZihcIkJFR0lOXCIhPT1oWzFdKWJyZWFrO2Y9dX19aWYoZj09PS0xfHxzPT09LTEpdGhyb3cgbmV3IEVycm9yKFwiUEVNIHNlY3Rpb24gbm90IGZvdW5kIGZvcjogXCIrbik7dmFyIGM9ci5zbGljZShmKzEscykuam9pbihcIlwiKTtjLnJlcGxhY2UoL1teYS16MC05XFwrXFwvPV0rL2dpLFwiXCIpO3ZhciBkPW5ldyBvKGMsXCJiYXNlNjRcIik7cmV0dXJuIGEucHJvdG90eXBlLmRlY29kZS5jYWxsKHRoaXMsZCxlKX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lO24uZGVyPXIoMjE3KSxuLnBlbT1yKDUzNyl9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe28uY2FsbCh0aGlzLHQpLHRoaXMuZW5jPVwicGVtXCJ9dmFyIGk9cigyKSxvPXIoMjE3KTtpKG4sbyksdC5leHBvcnRzPW4sbi5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPW8ucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsdCksbj1yLnRvU3RyaW5nKFwiYmFzZTY0XCIpLGk9W1wiLS0tLS1CRUdJTiBcIitlLmxhYmVsK1wiLS0tLS1cIl0sYT0wO2E8bi5sZW5ndGg7YSs9NjQpaS5wdXNoKG4uc2xpY2UoYSxhKzY0KSk7cmV0dXJuIGkucHVzaChcIi0tLS0tRU5EIFwiK2UubGFiZWwrXCItLS0tLVwiKSxpLmpvaW4oXCJcXG5cIil9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZXx8XCJBc3NlcnRpb24gZmFpbGVkXCIpfXQuZXhwb3J0cz1yLHIuZXF1YWw9ZnVuY3Rpb24odCxlLHIpe2lmKHQhPWUpdGhyb3cgbmV3IEVycm9yKHJ8fFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIrdCtcIiAhPSBcIitlKX19LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLHIsbyl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuPyh1LmNhbGwodGhpcyksdGhpcy5fY2FjaGU9bmV3IGksdGhpcy5fbGFzdD12b2lkIDAsdGhpcy5fY2lwaGVyPW5ldyBzLkFFUyhyKSx0aGlzLl9wcmV2PW5ldyB0KG8ubGVuZ3RoKSxvLmNvcHkodGhpcy5fcHJldiksdGhpcy5fbW9kZT1lLHZvaWQodGhpcy5fYXV0b3BhZGRpbmc9ITApKTpuZXcgbihlLHIsbyl9ZnVuY3Rpb24gaSgpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgaT92b2lkKHRoaXMuY2FjaGU9bmV3IHQoXCJcIikpOm5ldyBpfWZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlPXRbMTVdLHI9LTE7KytyPGU7KWlmKHRbcisoMTYtZSldIT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gZGVjcnlwdCBkYXRhXCIpO2lmKDE2IT09ZSlyZXR1cm4gdC5zbGljZSgwLDE2LWUpfWZ1bmN0aW9uIGEoZSxyLGkpe3ZhciBvPWNbZS50b0xvd2VyQ2FzZSgpXTtpZighbyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBzdWl0ZSB0eXBlXCIpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBpJiYoaT1uZXcgdChpKSksXCJzdHJpbmdcIj09dHlwZW9mIHImJihyPW5ldyB0KHIpKSxyLmxlbmd0aCE9PW8ua2V5LzgpdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQga2V5IGxlbmd0aCBcIityLmxlbmd0aCk7aWYoaS5sZW5ndGghPT1vLml2KXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIGl2IGxlbmd0aCBcIitpLmxlbmd0aCk7cmV0dXJuXCJzdHJlYW1cIj09PW8udHlwZT9uZXcgZChiW28ubW9kZV0scixpLCEwKTpcImF1dGhcIj09PW8udHlwZT9uZXcgbChiW28ubW9kZV0scixpLCEwKTpuZXcgbihiW28ubW9kZV0scixpKX1mdW5jdGlvbiBmKHQsZSl7dmFyIHI9Y1t0LnRvTG93ZXJDYXNlKCldO2lmKCFyKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIHN1aXRlIHR5cGVcIik7dmFyIG49cChlLCExLHIua2V5LHIuaXYpO3JldHVybiBhKHQsbi5rZXksbi5pdil9dmFyIHM9cigxMDEpLHU9cigxMDMpLGg9cigyKSxjPXIoMTQ3KSxkPXIoMjI2KSxsPXIoMjE4KSxwPXIoMTQ4KTtoKG4sdSksbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLl9jYWNoZS5hZGQoZSk7Zm9yKHZhciByLG4saT1bXTtyPXRoaXMuX2NhY2hlLmdldCh0aGlzLl9hdXRvcGFkZGluZyk7KW49dGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsciksaS5wdXNoKG4pO3JldHVybiB0LmNvbmNhdChpKX0sbi5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY2FjaGUuZmx1c2goKTtpZih0aGlzLl9hdXRvcGFkZGluZylyZXR1cm4gbyh0aGlzLl9tb2RlLmRlY3J5cHQodGhpcyx0KSk7aWYodCl0aHJvdyBuZXcgRXJyb3IoXCJkYXRhIG5vdCBtdWx0aXBsZSBvZiBibG9jayBsZW5ndGhcIil9LG4ucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hdXRvcGFkZGluZz0hIXQsdGhpc30saS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuY2FjaGU9dC5jb25jYXQoW3RoaXMuY2FjaGUsZV0pfSxpLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU7aWYodCl7aWYodGhpcy5jYWNoZS5sZW5ndGg+MTYpcmV0dXJuIGU9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLGV9ZWxzZSBpZih0aGlzLmNhY2hlLmxlbmd0aD49MTYpcmV0dXJuIGU9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLGU7cmV0dXJuIG51bGx9LGkucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZS5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGV9O3ZhciBiPXtFQ0I6cigyMjQpLENCQzpyKDIyMCksQ0ZCOnIoMjIxKSxDRkI4OnIoMjIzKSxDRkIxOnIoMjIyKSxPRkI6cigyMjUpLENUUjpyKDEwMiksR0NNOnIoMTAyKX07ZS5jcmVhdGVEZWNpcGhlcj1mLGUuY3JlYXRlRGVjaXBoZXJpdj1hfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUscixvKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG4/KHMuY2FsbCh0aGlzKSx0aGlzLl9jYWNoZT1uZXcgaSx0aGlzLl9jaXBoZXI9bmV3IGYuQUVTKHIpLHRoaXMuX3ByZXY9bmV3IHQoby5sZW5ndGgpLG8uY29weSh0aGlzLl9wcmV2KSx0aGlzLl9tb2RlPWUsdm9pZCh0aGlzLl9hdXRvcGFkZGluZz0hMCkpOm5ldyBuKGUscixvKX1mdW5jdGlvbiBpKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBpP3ZvaWQodGhpcy5jYWNoZT1uZXcgdChcIlwiKSk6bmV3IGl9ZnVuY3Rpb24gbyhlLHIsaSl7dmFyIG89aFtlLnRvTG93ZXJDYXNlKCldO2lmKCFvKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIHN1aXRlIHR5cGVcIik7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPW5ldyB0KGkpKSxcInN0cmluZ1wiPT10eXBlb2YgciYmKHI9bmV3IHQocikpLHIubGVuZ3RoIT09by5rZXkvOCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBrZXkgbGVuZ3RoIFwiK3IubGVuZ3RoKTtpZihpLmxlbmd0aCE9PW8uaXYpdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgaXYgbGVuZ3RoIFwiK2kubGVuZ3RoKTtyZXR1cm5cInN0cmVhbVwiPT09by50eXBlP25ldyBkKHBbby5tb2RlXSxyLGkpOlwiYXV0aFwiPT09by50eXBlP25ldyBsKHBbby5tb2RlXSxyLGkpOm5ldyBuKHBbby5tb2RlXSxyLGkpfWZ1bmN0aW9uIGEodCxlKXt2YXIgcj1oW3QudG9Mb3dlckNhc2UoKV07aWYoIXIpdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgc3VpdGUgdHlwZVwiKTt2YXIgbj1jKGUsITEsci5rZXksci5pdik7cmV0dXJuIG8odCxuLmtleSxuLml2KX12YXIgZj1yKDEwMSkscz1yKDEwMyksdT1yKDIpLGg9cigxNDcpLGM9cigxNDgpLGQ9cigyMjYpLGw9cigyMTgpO3UobixzKSxuLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuX2NhY2hlLmFkZChlKTtmb3IodmFyIHIsbixpPVtdO3I9dGhpcy5fY2FjaGUuZ2V0KCk7KW49dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsciksaS5wdXNoKG4pO3JldHVybiB0LmNvbmNhdChpKX0sbi5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY2FjaGUuZmx1c2goKTtpZih0aGlzLl9hdXRvcGFkZGluZylyZXR1cm4gdD10aGlzLl9tb2RlLmVuY3J5cHQodGhpcyx0KSx0aGlzLl9jaXBoZXIuc2NydWIoKSx0O2lmKFwiMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTBcIiE9PXQudG9TdHJpbmcoXCJoZXhcIikpdGhyb3cgdGhpcy5fY2lwaGVyLnNjcnViKCksbmV3IEVycm9yKFwiZGF0YSBub3QgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoXCIpfSxuLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXV0b3BhZGRpbmc9ISF0LHRoaXN9LGkucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLmNhY2hlPXQuY29uY2F0KFt0aGlzLmNhY2hlLGVdKX0saS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZS5sZW5ndGg+MTUpe3ZhciB0PXRoaXMuY2FjaGUuc2xpY2UoMCwxNik7cmV0dXJuIHRoaXMuY2FjaGU9dGhpcy5jYWNoZS5zbGljZSgxNiksdH1yZXR1cm4gbnVsbH0saS5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MTYtdGhpcy5jYWNoZS5sZW5ndGgscj1uZXcgdChlKSxuPS0xOysrbjxlOylyLndyaXRlVUludDgoZSxuKTt2YXIgaT10LmNvbmNhdChbdGhpcy5jYWNoZSxyXSk7cmV0dXJuIGl9O3ZhciBwPXtFQ0I6cigyMjQpLENCQzpyKDIyMCksQ0ZCOnIoMjIxKSxDRkI4OnIoMjIzKSxDRkIxOnIoMjIyKSxPRkI6cigyMjUpLENUUjpyKDEwMiksR0NNOnIoMTAyKX07ZS5jcmVhdGVDaXBoZXJpdj1vLGUuY3JlYXRlQ2lwaGVyPWF9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIodCl7dGhpcy5oPXQsdGhpcy5zdGF0ZT1uZXcgZSgxNiksdGhpcy5zdGF0ZS5maWxsKDApLHRoaXMuY2FjaGU9bmV3IGUoXCJcIil9ZnVuY3Rpb24gbih0KXtyZXR1cm5bdC5yZWFkVUludDMyQkUoMCksdC5yZWFkVUludDMyQkUoNCksdC5yZWFkVUludDMyQkUoOCksdC5yZWFkVUludDMyQkUoMTIpXX1mdW5jdGlvbiBpKHQpe3Q9dC5tYXAobyk7dmFyIHI9bmV3IGUoMTYpO3JldHVybiByLndyaXRlVUludDMyQkUodFswXSwwKSxyLndyaXRlVUludDMyQkUodFsxXSw0KSxyLndyaXRlVUludDMyQkUodFsyXSw4KSxyLndyaXRlVUludDMyQkUodFszXSwxMikscn1mdW5jdGlvbiBvKHQpe3ZhciBlLHI7cmV0dXJuIGU9dD5zfHx0PDA/KHI9TWF0aC5hYnModCklcyx0PDA/cy1yOnIpOnR9ZnVuY3Rpb24gYSh0LGUpe3JldHVyblt0WzBdXmVbMF0sdFsxXV5lWzFdLHRbMl1eZVsyXSx0WzNdXmVbM11dfXZhciBmPW5ldyBlKDE2KTtmLmZpbGwoMCksdC5leHBvcnRzPXIsci5wcm90b3R5cGUuZ2hhc2g9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xOysrZTx0Lmxlbmd0aDspdGhpcy5zdGF0ZVtlXV49dFtlXTt0aGlzLl9tdWx0aXBseSgpfSxyLnByb3RvdHlwZS5fbXVsdGlwbHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxyLG89bih0aGlzLmgpLGY9WzAsMCwwLDBdLHM9LTE7KytzPDEyODspe2ZvcihlPTAhPT0odGhpcy5zdGF0ZVt+fihzLzgpXSYxPDw3LXMlOCksZSYmKGY9YShmLG8pKSxyPTAhPT0oMSZvWzNdKSx0PTM7dD4wO3QtLSlvW3RdPW9bdF0+Pj4xfCgxJm9bdC0xXSk8PDMxO29bMF09b1swXT4+PjEsciYmKG9bMF09b1swXV4yMjU8PDI0KX10aGlzLnN0YXRlPWkoZil9LHIucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLmNhY2hlPWUuY29uY2F0KFt0aGlzLmNhY2hlLHRdKTtmb3IodmFyIHI7dGhpcy5jYWNoZS5sZW5ndGg+PTE2OylyPXRoaXMuY2FjaGUuc2xpY2UoMCwxNiksdGhpcy5jYWNoZT10aGlzLmNhY2hlLnNsaWNlKDE2KSx0aGlzLmdoYXNoKHIpfSxyLnByb3RvdHlwZS5maW5hbD1mdW5jdGlvbih0LHIpe3JldHVybiB0aGlzLmNhY2hlLmxlbmd0aCYmdGhpcy5naGFzaChlLmNvbmNhdChbdGhpcy5jYWNoZSxmXSwxNikpLHRoaXMuZ2hhc2goaShbMCx0LDAscl0pKSx0aGlzLnN0YXRlfTt2YXIgcz1NYXRoLnBvdygyLDMyKX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LGUscixuKXt2YXIgYT12KGUpO2lmKGEuY3VydmUpe2lmKFwiZWNkc2FcIiE9PW4pdGhyb3cgbmV3IEVycm9yKFwid3JvbmcgcHJpdmF0ZSBrZXkgdHlwZVwiKTtyZXR1cm4gaSh0LGEpfWlmKFwiZHNhXCI9PT1hLnR5cGUpe2lmKFwiZHNhXCIhPT1uKXRocm93IG5ldyBFcnJvcihcIndyb25nIHByaXZhdGUga2V5IHR5cGVcIik7cmV0dXJuIG8odCxhLHIpfWlmKFwicnNhXCIhPT1uKXRocm93IG5ldyBFcnJvcihcIndyb25nIHByaXZhdGUga2V5IHR5cGVcIik7Zm9yKHZhciBmPWEubW9kdWx1cy5ieXRlTGVuZ3RoKCkscz1bMCwxXTt0Lmxlbmd0aCtzLmxlbmd0aCsxPGY7KXMucHVzaCgyNTUpO3MucHVzaCgwKTtmb3IodmFyIHU9LTE7Kyt1PHQubGVuZ3RoOylzLnB1c2godFt1XSk7dmFyIGg9bChzLGEpO3JldHVybiBofWZ1bmN0aW9uIGkodCxyKXt2YXIgbj1wW3IuY3VydmUuam9pbihcIi5cIildO2lmKCFuKXRocm93IG5ldyBFcnJvcihcInVua25vd24gY3VydmUgXCIrci5jdXJ2ZS5qb2luKFwiLlwiKSk7dmFyIGk9bmV3IG0obiksbz1pLmdlbktleVBhaXIoKTtvLl9pbXBvcnRQcml2YXRlKHIucHJpdmF0ZUtleSk7dmFyIGE9by5zaWduKHQpO3JldHVybiBuZXcgZShhLnRvREVSKCkpfWZ1bmN0aW9uIG8odCxlLHIpe2Zvcih2YXIgbixpPWUucGFyYW1zLnByaXZfa2V5LG89ZS5wYXJhbXMucCx1PWUucGFyYW1zLnEsZD1lLnBhcmFtcy5nLGw9bmV3IHkoMCkscD1zKHQsdSkubW9kKHUpLGI9ITEsdj1mKGksdSx0LHIpO2I9PT0hMTspbj1oKHUsdixyKSxsPWMoZCxuLG8sdSksYj1uLmludm0odSkuaW11bChwLmFkZChpLm11bChsKSkpLm1vZCh1KSxiLmNtcG4oMCl8fChiPSExLGw9bmV3IHkoMCkpO3JldHVybiBhKGwsYil9ZnVuY3Rpb24gYSh0LHIpe3Q9dC50b0FycmF5KCkscj1yLnRvQXJyYXkoKSwxMjgmdFswXSYmKHQ9WzBdLmNvbmNhdCh0KSksMTI4JnJbMF0mJihyPVswXS5jb25jYXQocikpO3ZhciBuPXQubGVuZ3RoK3IubGVuZ3RoKzQsaT1bNDgsbiwyLHQubGVuZ3RoXTtyZXR1cm4gaT1pLmNvbmNhdCh0LFsyLHIubGVuZ3RoXSxyKSxuZXcgZShpKX1mdW5jdGlvbiBmKHQscixuLGkpe2lmKHQ9bmV3IGUodC50b0FycmF5KCkpLHQubGVuZ3RoPHIuYnl0ZUxlbmd0aCgpKXt2YXIgbz1uZXcgZShyLmJ5dGVMZW5ndGgoKS10Lmxlbmd0aCk7by5maWxsKDApLHQ9ZS5jb25jYXQoW28sdF0pfXZhciBhPW4ubGVuZ3RoLGY9dShuLHIpLHM9bmV3IGUoYSk7cy5maWxsKDEpO3ZhciBoPW5ldyBlKGEpO3JldHVybiBoLmZpbGwoMCksaD1kKGksaCkudXBkYXRlKHMpLnVwZGF0ZShuZXcgZShbMF0pKS51cGRhdGUodCkudXBkYXRlKGYpLmRpZ2VzdCgpLHM9ZChpLGgpLnVwZGF0ZShzKS5kaWdlc3QoKSxoPWQoaSxoKS51cGRhdGUocykudXBkYXRlKG5ldyBlKFsxXSkpLnVwZGF0ZSh0KS51cGRhdGUoZikuZGlnZXN0KCkscz1kKGksaCkudXBkYXRlKHMpLmRpZ2VzdCgpLHtrOmgsdjpzfX1mdW5jdGlvbiBzKHQsZSl7dmFyIHI9bmV3IHkodCksbj0odC5sZW5ndGg8PDMpLWUuYml0TGVuZ3RoKCk7cmV0dXJuIG4+MCYmci5pc2hybihuKSxyfWZ1bmN0aW9uIHUodCxyKXt0PXModCxyKSx0PXQubW9kKHIpO3ZhciBuPW5ldyBlKHQudG9BcnJheSgpKTtpZihuLmxlbmd0aDxyLmJ5dGVMZW5ndGgoKSl7dmFyIGk9bmV3IGUoci5ieXRlTGVuZ3RoKCktbi5sZW5ndGgpO2kuZmlsbCgwKSxuPWUuY29uY2F0KFtpLG5dKX1yZXR1cm4gbn1mdW5jdGlvbiBoKHQscixuKXt2YXIgaSxvO2Rve2ZvcihpPW5ldyBlKFwiXCIpOzgqaS5sZW5ndGg8dC5iaXRMZW5ndGgoKTspci52PWQobixyLmspLnVwZGF0ZShyLnYpLmRpZ2VzdCgpLGk9ZS5jb25jYXQoW2ksci52XSk7bz1zKGksdCksci5rPWQobixyLmspLnVwZGF0ZShyLnYpLnVwZGF0ZShuZXcgZShbMF0pKS5kaWdlc3QoKSxyLnY9ZChuLHIuaykudXBkYXRlKHIudikuZGlnZXN0KCl9d2hpbGUoby5jbXAodCkhPT0tMSk7cmV0dXJuIG99ZnVuY3Rpb24gYyh0LGUscixuKXtyZXR1cm4gdC50b1JlZCh5Lm1vbnQocikpLnJlZFBvdyhlKS5mcm9tUmVkKCkubW9kKG4pfXZhciBkPXIoMTQ5KSxsPXIoNTA3KSxwPXIoMjEyKSxiPXIoMTkpLHY9cigyMTMpLHk9cigxOCksbT1iLmVjO3QuZXhwb3J0cz1uLHQuZXhwb3J0cy5nZXRLZXk9Zix0LmV4cG9ydHMubWFrZUtleT1ofSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQscixuLGEpe3ZhciBmPXUobik7aWYoXCJlY1wiPT09Zi50eXBlKXtpZihcImVjZHNhXCIhPT1hKXRocm93IG5ldyBFcnJvcihcIndyb25nIHB1YmxpYyBrZXkgdHlwZVwiKTtyZXR1cm4gaSh0LHIsZil9aWYoXCJkc2FcIj09PWYudHlwZSl7aWYoXCJkc2FcIiE9PWEpdGhyb3cgbmV3IEVycm9yKFwid3JvbmcgcHVibGljIGtleSB0eXBlXCIpO3JldHVybiBvKHQscixmKX1pZihcInJzYVwiIT09YSl0aHJvdyBuZXcgRXJyb3IoXCJ3cm9uZyBwdWJsaWMga2V5IHR5cGVcIik7Zm9yKHZhciBzPWYubW9kdWx1cy5ieXRlTGVuZ3RoKCksYz1bMV0sZD0wO3IubGVuZ3RoK2MubGVuZ3RoKzI8czspYy5wdXNoKDI1NSksZCsrO2MucHVzaCgwKTtmb3IodmFyIGw9LTE7KytsPHIubGVuZ3RoOyljLnB1c2gocltsXSk7Yz1uZXcgZShjKTt2YXIgcD1oLm1vbnQoZi5tb2R1bHVzKTt0PW5ldyBoKHQpLnRvUmVkKHApLHQ9dC5yZWRQb3cobmV3IGgoZi5wdWJsaWNFeHBvbmVudCkpLHQ9bmV3IGUodC5mcm9tUmVkKCkudG9BcnJheSgpKTt2YXIgYj0wO2ZvcihkPDgmJihiPTEpLHM9TWF0aC5taW4odC5sZW5ndGgsYy5sZW5ndGgpLHQubGVuZ3RoIT09Yy5sZW5ndGgmJihiPTEpLGw9LTE7KytsPHM7KWJ8PXRbbF1eY1tsXTtyZXR1cm4gMD09PWJ9ZnVuY3Rpb24gaSh0LGUscil7dmFyIG49ZltyLmRhdGEuYWxnb3JpdGhtLmN1cnZlLmpvaW4oXCIuXCIpXTtpZighbil0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGN1cnZlIFwiK3IuZGF0YS5hbGdvcml0aG0uY3VydmUuam9pbihcIi5cIikpO3ZhciBpPW5ldyBjKG4pLG89ci5kYXRhLnN1YmplY3RQcml2YXRlS2V5LmRhdGE7cmV0dXJuIGkudmVyaWZ5KGUsdCxvKX1mdW5jdGlvbiBvKHQsZSxyKXt2YXIgbj1yLmRhdGEucCxpPXIuZGF0YS5xLG89ci5kYXRhLmcsZj1yLmRhdGEucHViX2tleSxzPXUuc2lnbmF0dXJlLmRlY29kZSh0LFwiZGVyXCIpLGM9cy5zLGQ9cy5yO2EoYyxpKSxhKGQsaSk7dmFyIGw9aC5tb250KG4pLHA9Yy5pbnZtKGkpLGI9by50b1JlZChsKS5yZWRQb3cobmV3IGgoZSkubXVsKHApLm1vZChpKSkuZnJvbVJlZCgpLm11bChmLnRvUmVkKGwpLnJlZFBvdyhkLm11bChwKS5tb2QoaSkpLmZyb21SZWQoKSkubW9kKG4pLm1vZChpKTtyZXR1cm4hYi5jbXAoZCl9ZnVuY3Rpb24gYSh0LGUpe2lmKHQuY21wbigwKTw9MCl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHNpZ1wiKTtpZih0LmNtcChlKT49ZSl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHNpZ1wiKX12YXIgZj1yKDIxMikscz1yKDE5KSx1PXIoMjEzKSxoPXIoMTgpLGM9cy5lYzt0LmV4cG9ydHM9bn0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0KXt0aGlzLmN1cnZlVHlwZT1mW3RdLHRoaXMuY3VydmVUeXBlfHwodGhpcy5jdXJ2ZVR5cGU9e25hbWU6dH0pLHRoaXMuY3VydmU9bmV3IG8uZWModGhpcy5jdXJ2ZVR5cGUubmFtZSksdGhpcy5rZXlzPXZvaWQgMH1mdW5jdGlvbiBpKHQscixuKXtBcnJheS5pc0FycmF5KHQpfHwodD10LnRvQXJyYXkoKSk7dmFyIGk9bmV3IGUodCk7aWYobiYmaS5sZW5ndGg8bil7dmFyIG89bmV3IGUobi1pLmxlbmd0aCk7by5maWxsKDApLGk9ZS5jb25jYXQoW28saV0pfXJldHVybiByP2kudG9TdHJpbmcocik6aX12YXIgbz1yKDIyKSxhPXIoMzApO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCl9O3ZhciBmPXtzZWNwMjU2azE6e25hbWU6XCJzZWNwMjU2azFcIixieXRlTGVuZ3RoOjMyfSxzZWNwMjI0cjE6e25hbWU6XCJwMjI0XCIsYnl0ZUxlbmd0aDoyOH0scHJpbWUyNTZ2MTp7bmFtZTpcInAyNTZcIixieXRlTGVuZ3RoOjMyfSxwcmltZTE5MnYxOntuYW1lOlwicDE5MlwiLGJ5dGVMZW5ndGg6MjR9LGVkMjU1MTk6e25hbWU6XCJlZDI1NTE5XCIsYnl0ZUxlbmd0aDozMn0sc2VjcDM4NHIxOntuYW1lOlwicDM4NFwiLGJ5dGVMZW5ndGg6NDh9LHNlY3A1MjFyMTp7bmFtZTpcInA1MjFcIixieXRlTGVuZ3RoOjY2fX07Zi5wMjI0PWYuc2VjcDIyNHIxLGYucDI1Nj1mLnNlY3AyNTZyMT1mLnByaW1lMjU2djEsZi5wMTkyPWYuc2VjcDE5MnIxPWYucHJpbWUxOTJ2MSxmLnAzODQ9Zi5zZWNwMzg0cjEsZi5wNTIxPWYuc2VjcDUyMXIxLG4ucHJvdG90eXBlLmdlbmVyYXRlS2V5cz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmtleXM9dGhpcy5jdXJ2ZS5nZW5LZXlQYWlyKCksdGhpcy5nZXRQdWJsaWNLZXkodCxlKX0sbi5wcm90b3R5cGUuY29tcHV0ZVNlY3JldD1mdW5jdGlvbih0LHIsbil7cj1yfHxcInV0ZjhcIixlLmlzQnVmZmVyKHQpfHwodD1uZXcgZSh0LHIpKTt2YXIgbz10aGlzLmN1cnZlLmtleUZyb21QdWJsaWModCkuZ2V0UHVibGljKCksYT1vLm11bCh0aGlzLmtleXMuZ2V0UHJpdmF0ZSgpKS5nZXRYKCk7cmV0dXJuIGkoYSxuLHRoaXMuY3VydmVUeXBlLmJ5dGVMZW5ndGgpfSxuLnByb3RvdHlwZS5nZXRQdWJsaWNLZXk9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmtleXMuZ2V0UHVibGljKFwiY29tcHJlc3NlZFwiPT09ZSwhMCk7cmV0dXJuXCJoeWJyaWRcIj09PWUmJihyW3IubGVuZ3RoLTFdJTI/clswXT03OnJbMF09NiksaShyLHQpfSxuLnByb3RvdHlwZS5nZXRQcml2YXRlS2V5PWZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMua2V5cy5nZXRQcml2YXRlKCksdCl9LG4ucHJvdG90eXBlLnNldFB1YmxpY0tleT1mdW5jdGlvbih0LHIpe3JldHVybiByPXJ8fFwidXRmOFwiLGUuaXNCdWZmZXIodCl8fCh0PW5ldyBlKHQscikpLHRoaXMua2V5cy5faW1wb3J0UHVibGljKHQpLHRoaXN9LG4ucHJvdG90eXBlLnNldFByaXZhdGVLZXk9ZnVuY3Rpb24odCxyKXtyPXJ8fFwidXRmOFwiLGUuaXNCdWZmZXIodCl8fCh0PW5ldyBlKHQscikpO3ZhciBuPW5ldyBhKHQpO3JldHVybiBuPW4udG9TdHJpbmcoMTYpLHRoaXMua2V5cy5faW1wb3J0UHJpdmF0ZShuKSx0aGlzfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7dGhpcy50eXBlPXQsdGhpcy5wPW5ldyBvKGUucCwxNiksdGhpcy5yZWQ9ZS5wcmltZT9vLnJlZChlLnByaW1lKTpvLm1vbnQodGhpcy5wKSx0aGlzLnplcm89bmV3IG8oMCkudG9SZWQodGhpcy5yZWQpLHRoaXMub25lPW5ldyBvKDEpLnRvUmVkKHRoaXMucmVkKSx0aGlzLnR3bz1uZXcgbygyKS50b1JlZCh0aGlzLnJlZCksdGhpcy5uPWUubiYmbmV3IG8oZS5uLDE2KSx0aGlzLmc9ZS5nJiZ0aGlzLnBvaW50RnJvbUpTT04oZS5nLGUuZ1JlZCksdGhpcy5fd25hZlQxPW5ldyBBcnJheSg0KSx0aGlzLl93bmFmVDI9bmV3IEFycmF5KDQpLHRoaXMuX3duYWZUMz1uZXcgQXJyYXkoNCksdGhpcy5fd25hZlQ0PW5ldyBBcnJheSg0KTt2YXIgcj10aGlzLm4mJnRoaXMucC5kaXYodGhpcy5uKTshcnx8ci5jbXBuKDEwMCk+MD90aGlzLnJlZE49bnVsbDoodGhpcy5fbWF4d2VsbFRyaWNrPSEwLHRoaXMucmVkTj10aGlzLm4udG9SZWQodGhpcy5yZWQpKX1mdW5jdGlvbiBpKHQsZSl7dGhpcy5jdXJ2ZT10LHRoaXMudHlwZT1lLHRoaXMucHJlY29tcHV0ZWQ9bnVsbH12YXIgbz1yKDMwKSxhPXIoMjIpLGY9YS51dGlscyxzPWYuZ2V0TkFGLHU9Zi5nZXRKU0YsaD1mLmFzc2VydDt0LmV4cG9ydHM9bixuLnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKX0sbi5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIil9LG4ucHJvdG90eXBlLl9maXhlZE5hZk11bD1mdW5jdGlvbih0LGUpe2godC5wcmVjb21wdXRlZCk7dmFyIHI9dC5fZ2V0RG91YmxlcygpLG49cyhlLDEpLGk9KDE8PHIuc3RlcCsxKS0oci5zdGVwJTI9PT0wPzI6MSk7aS89Mztmb3IodmFyIG89W10sYT0wO2E8bi5sZW5ndGg7YSs9ci5zdGVwKXtmb3IodmFyIGY9MCxlPWErci5zdGVwLTE7ZT49YTtlLS0pZj0oZjw8MSkrbltlXTtvLnB1c2goZil9Zm9yKHZhciB1PXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxjPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxkPWk7ZD4wO2QtLSl7Zm9yKHZhciBhPTA7YTxvLmxlbmd0aDthKyspe3ZhciBmPW9bYV07Zj09PWQ/Yz1jLm1peGVkQWRkKHIucG9pbnRzW2FdKTpmPT09LWQmJihjPWMubWl4ZWRBZGQoci5wb2ludHNbYV0ubmVnKCkpKX11PXUuYWRkKGMpfXJldHVybiB1LnRvUCgpfSxuLnByb3RvdHlwZS5fd25hZk11bD1mdW5jdGlvbih0LGUpe3ZhciByPTQsbj10Ll9nZXROQUZQb2ludHMocik7cj1uLnduZDtmb3IodmFyIGk9bi5wb2ludHMsbz1zKGUsciksYT10aGlzLmpwb2ludChudWxsLG51bGwsbnVsbCksZj1vLmxlbmd0aC0xO2Y+PTA7Zi0tKXtmb3IodmFyIGU9MDtmPj0wJiYwPT09b1tmXTtmLS0pZSsrO2lmKGY+PTAmJmUrKyxhPWEuZGJscChlKSxmPDApYnJlYWs7dmFyIHU9b1tmXTtoKDAhPT11KSxhPVwiYWZmaW5lXCI9PT10LnR5cGU/dT4wP2EubWl4ZWRBZGQoaVt1LTE+PjFdKTphLm1peGVkQWRkKGlbLXUtMT4+MV0ubmVnKCkpOnU+MD9hLmFkZChpW3UtMT4+MV0pOmEuYWRkKGlbLXUtMT4+MV0ubmVnKCkpfXJldHVyblwiYWZmaW5lXCI9PT10LnR5cGU/YS50b1AoKTphfSxuLnByb3RvdHlwZS5fd25hZk11bEFkZD1mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz10aGlzLl93bmFmVDEsYT10aGlzLl93bmFmVDIsZj10aGlzLl93bmFmVDMsaD0wLGM9MDtjPG47YysrKXt2YXIgZD1lW2NdLGw9ZC5fZ2V0TkFGUG9pbnRzKHQpO29bY109bC53bmQsYVtjXT1sLnBvaW50c31mb3IodmFyIGM9bi0xO2M+PTE7Yy09Mil7dmFyIHA9Yy0xLGI9YztpZigxPT09b1twXSYmMT09PW9bYl0pe3ZhciB2PVtlW3BdLG51bGwsbnVsbCxlW2JdXTswPT09ZVtwXS55LmNtcChlW2JdLnkpPyh2WzFdPWVbcF0uYWRkKGVbYl0pLHZbMl09ZVtwXS50b0ooKS5taXhlZEFkZChlW2JdLm5lZygpKSk6MD09PWVbcF0ueS5jbXAoZVtiXS55LnJlZE5lZygpKT8odlsxXT1lW3BdLnRvSigpLm1peGVkQWRkKGVbYl0pLHZbMl09ZVtwXS5hZGQoZVtiXS5uZWcoKSkpOih2WzFdPWVbcF0udG9KKCkubWl4ZWRBZGQoZVtiXSksdlsyXT1lW3BdLnRvSigpLm1peGVkQWRkKGVbYl0ubmVnKCkpKTt2YXIgeT1bLTMsLTEsLTUsLTcsMCw3LDUsMSwzXSxtPXUocltwXSxyW2JdKTtoPU1hdGgubWF4KG1bMF0ubGVuZ3RoLGgpLGZbcF09bmV3IEFycmF5KGgpLGZbYl09bmV3IEFycmF5KGgpO2Zvcih2YXIgZz0wO2c8aDtnKyspe3ZhciB3PTB8bVswXVtnXSxfPTB8bVsxXVtnXTtmW3BdW2ddPXlbMyoodysxKSsoXysxKV0sZltiXVtnXT0wLGFbcF09dn19ZWxzZSBmW3BdPXMocltwXSxvW3BdKSxmW2JdPXMocltiXSxvW2JdKSxoPU1hdGgubWF4KGZbcF0ubGVuZ3RoLGgpLGg9TWF0aC5tYXgoZltiXS5sZW5ndGgsaCl9Zm9yKHZhciBNPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxTPXRoaXMuX3duYWZUNCxjPWg7Yz49MDtjLS0pe2Zvcih2YXIgRT0wO2M+PTA7KXtmb3IodmFyIEE9ITAsZz0wO2c8bjtnKyspU1tnXT0wfGZbZ11bY10sMCE9PVNbZ10mJihBPSExKTtpZighQSlicmVhaztFKyssYy0tfWlmKGM+PTAmJkUrKyxNPU0uZGJscChFKSxjPDApYnJlYWs7Zm9yKHZhciBnPTA7ZzxuO2crKyl7dmFyIGQsaz1TW2ddOzAhPT1rJiYoaz4wP2Q9YVtnXVtrLTE+PjFdOms8MCYmKGQ9YVtnXVstay0xPj4xXS5uZWcoKSksTT1cImFmZmluZVwiPT09ZC50eXBlP00ubWl4ZWRBZGQoZCk6TS5hZGQoZCkpfX1mb3IodmFyIGM9MDtjPG47YysrKWFbY109bnVsbDtyZXR1cm4gaT9NOk0udG9QKCl9LG4uQmFzZVBvaW50PWksaS5wcm90b3R5cGUuZXE9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIil9LGkucHJvdG90eXBlLnZhbGlkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VydmUudmFsaWRhdGUodGhpcyl9LG4ucHJvdG90eXBlLmRlY29kZVBvaW50PWZ1bmN0aW9uKHQsZSl7dD1mLnRvQXJyYXkodCxlKTt2YXIgcj10aGlzLnAuYnl0ZUxlbmd0aCgpO2lmKCg0PT09dFswXXx8Nj09PXRbMF18fDc9PT10WzBdKSYmdC5sZW5ndGgtMT09PTIqcil7Nj09PXRbMF0/aCh0W3QubGVuZ3RoLTFdJTI9PT0wKTo3PT09dFswXSYmaCh0W3QubGVuZ3RoLTFdJTI9PT0xKTt2YXIgbj10aGlzLnBvaW50KHQuc2xpY2UoMSwxK3IpLHQuc2xpY2UoMStyLDErMipyKSk7cmV0dXJuIG59aWYoKDI9PT10WzBdfHwzPT09dFswXSkmJnQubGVuZ3RoLTE9PT1yKXJldHVybiB0aGlzLnBvaW50RnJvbVgodC5zbGljZSgxLDErciksMz09PXRbMF0pO3Rocm93IG5ldyBFcnJvcihcIlVua25vd24gcG9pbnQgZm9ybWF0XCIpfSxpLnByb3RvdHlwZS5lbmNvZGVDb21wcmVzc2VkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVuY29kZSh0LCEwKX0saS5wcm90b3R5cGUuX2VuY29kZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmN1cnZlLnAuYnl0ZUxlbmd0aCgpLHI9dGhpcy5nZXRYKCkudG9BcnJheShcImJlXCIsZSk7cmV0dXJuIHQ/W3RoaXMuZ2V0WSgpLmlzRXZlbigpPzI6M10uY29uY2F0KHIpOls0XS5jb25jYXQocix0aGlzLmdldFkoKS50b0FycmF5KFwiYmVcIixlKSl9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbih0LGUpe3JldHVybiBmLmVuY29kZSh0aGlzLl9lbmNvZGUoZSksdCl9LGkucHJvdG90eXBlLnByZWNvbXB1dGU9ZnVuY3Rpb24odCl7aWYodGhpcy5wcmVjb21wdXRlZClyZXR1cm4gdGhpczt2YXIgZT17ZG91YmxlczpudWxsLG5hZjpudWxsLGJldGE6bnVsbH07cmV0dXJuIGUubmFmPXRoaXMuX2dldE5BRlBvaW50cyg4KSxlLmRvdWJsZXM9dGhpcy5fZ2V0RG91Ymxlcyg0LHQpLGUuYmV0YT10aGlzLl9nZXRCZXRhKCksdGhpcy5wcmVjb21wdXRlZD1lLHRoaXN9LGkucHJvdG90eXBlLl9oYXNEb3VibGVzPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLnByZWNvbXB1dGVkKXJldHVybiExO3ZhciBlPXRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztyZXR1cm4hIWUmJmUucG9pbnRzLmxlbmd0aD49TWF0aC5jZWlsKCh0LmJpdExlbmd0aCgpKzEpL2Uuc3RlcCl9LGkucHJvdG90eXBlLl9nZXREb3VibGVzPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5wcmVjb21wdXRlZCYmdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzKXJldHVybiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7Zm9yKHZhciByPVt0aGlzXSxuPXRoaXMsaT0wO2k8ZTtpKz10KXtmb3IodmFyIG89MDtvPHQ7bysrKW49bi5kYmwoKTtyLnB1c2gobil9cmV0dXJue3N0ZXA6dCxwb2ludHM6cn19LGkucHJvdG90eXBlLl9nZXROQUZQb2ludHM9ZnVuY3Rpb24odCl7aWYodGhpcy5wcmVjb21wdXRlZCYmdGhpcy5wcmVjb21wdXRlZC5uYWYpcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQubmFmO2Zvcih2YXIgZT1bdGhpc10scj0oMTw8dCktMSxuPTE9PT1yP251bGw6dGhpcy5kYmwoKSxpPTE7aTxyO2krKyllW2ldPWVbaS0xXS5hZGQobik7cmV0dXJue3duZDp0LHBvaW50czplfX0saS5wcm90b3R5cGUuX2dldEJldGE9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0saS5wcm90b3R5cGUuZGJscD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxyPTA7cjx0O3IrKyllPWUuZGJsKCk7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXt0aGlzLnR3aXN0ZWQ9MSE9PSgwfHQuYSksdGhpcy5tT25lQT10aGlzLnR3aXN0ZWQmJigwfHQuYSk9PT0tMSx0aGlzLmV4dGVuZGVkPXRoaXMubU9uZUEsdS5jYWxsKHRoaXMsXCJlZHdhcmRzXCIsdCksdGhpcy5hPW5ldyBmKHQuYSwxNikudW1vZCh0aGlzLnJlZC5tKSx0aGlzLmE9dGhpcy5hLnRvUmVkKHRoaXMucmVkKSx0aGlzLmM9bmV3IGYodC5jLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5jMj10aGlzLmMucmVkU3FyKCksdGhpcy5kPW5ldyBmKHQuZCwxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuZGQ9dGhpcy5kLnJlZEFkZCh0aGlzLmQpLGgoIXRoaXMudHdpc3RlZHx8MD09PXRoaXMuYy5mcm9tUmVkKCkuY21wbigxKSksdGhpcy5vbmVDPTE9PT0oMHx0LmMpfWZ1bmN0aW9uIGkodCxlLHIsbixpKXt1LkJhc2VQb2ludC5jYWxsKHRoaXMsdCxcInByb2plY3RpdmVcIiksbnVsbD09PWUmJm51bGw9PT1yJiZudWxsPT09bj8odGhpcy54PXRoaXMuY3VydmUuemVybyx0aGlzLnk9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56PXRoaXMuY3VydmUub25lLHRoaXMudD10aGlzLmN1cnZlLnplcm8sdGhpcy56T25lPSEwKToodGhpcy54PW5ldyBmKGUsMTYpLHRoaXMueT1uZXcgZihyLDE2KSx0aGlzLno9bj9uZXcgZihuLDE2KTp0aGlzLmN1cnZlLm9uZSx0aGlzLnQ9aSYmbmV3IGYoaSwxNiksdGhpcy54LnJlZHx8KHRoaXMueD10aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnkucmVkfHwodGhpcy55PXRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuei5yZWR8fCh0aGlzLno9dGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy50JiYhdGhpcy50LnJlZCYmKHRoaXMudD10aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnpPbmU9dGhpcy56PT09dGhpcy5jdXJ2ZS5vbmUsdGhpcy5jdXJ2ZS5leHRlbmRlZCYmIXRoaXMudCYmKHRoaXMudD10aGlzLngucmVkTXVsKHRoaXMueSksdGhpcy56T25lfHwodGhpcy50PXRoaXMudC5yZWRNdWwodGhpcy56LnJlZEludm0oKSkpKSl9dmFyIG89cigxMDQpLGE9cigyMiksZj1yKDMwKSxzPXIoMiksdT1vLmJhc2UsaD1hLnV0aWxzLmFzc2VydDtzKG4sdSksdC5leHBvcnRzPW4sbi5wcm90b3R5cGUuX211bEE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubU9uZUE/dC5yZWROZWcoKTp0aGlzLmEucmVkTXVsKHQpfSxuLnByb3RvdHlwZS5fbXVsQz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vbmVDP3Q6dGhpcy5jLnJlZE11bCh0KX0sbi5wcm90b3R5cGUuanBvaW50PWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0aGlzLnBvaW50KHQsZSxyLG4pfSxuLnByb3RvdHlwZS5wb2ludEZyb21YPWZ1bmN0aW9uKHQsZSl7dD1uZXcgZih0LDE2KSx0LnJlZHx8KHQ9dC50b1JlZCh0aGlzLnJlZCkpO3ZhciByPXQucmVkU3FyKCksbj10aGlzLmMyLnJlZFN1Yih0aGlzLmEucmVkTXVsKHIpKSxpPXRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bChyKSksbz1uLnJlZE11bChpLnJlZEludm0oKSksYT1vLnJlZFNxcnQoKTtpZigwIT09YS5yZWRTcXIoKS5yZWRTdWIobykuY21wKHRoaXMuemVybykpdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBwb2ludFwiKTt2YXIgcz1hLmZyb21SZWQoKS5pc09kZCgpO3JldHVybihlJiYhc3x8IWUmJnMpJiYoYT1hLnJlZE5lZygpKSx0aGlzLnBvaW50KHQsYSl9LG4ucHJvdG90eXBlLnBvaW50RnJvbVk9ZnVuY3Rpb24odCxlKXt0PW5ldyBmKHQsMTYpLHQucmVkfHwodD10LnRvUmVkKHRoaXMucmVkKSk7dmFyIHI9dC5yZWRTcXIoKSxuPXIucmVkU3ViKHRoaXMub25lKSxpPXIucmVkTXVsKHRoaXMuZCkucmVkQWRkKHRoaXMub25lKSxvPW4ucmVkTXVsKGkucmVkSW52bSgpKTtpZigwPT09by5jbXAodGhpcy56ZXJvKSl7aWYoZSl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHBvaW50XCIpO3JldHVybiB0aGlzLnBvaW50KHRoaXMuemVybyx0KX12YXIgYT1vLnJlZFNxcnQoKTtpZigwIT09YS5yZWRTcXIoKS5yZWRTdWIobykuY21wKHRoaXMuemVybykpdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBwb2ludFwiKTtyZXR1cm4gYS5pc09kZCgpIT09ZSYmKGE9YS5yZWROZWcoKSksdGhpcy5wb2ludChhLHQpfSxuLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbih0KXtpZih0LmlzSW5maW5pdHkoKSlyZXR1cm4hMDt0Lm5vcm1hbGl6ZSgpO3ZhciBlPXQueC5yZWRTcXIoKSxyPXQueS5yZWRTcXIoKSxuPWUucmVkTXVsKHRoaXMuYSkucmVkQWRkKHIpLGk9dGhpcy5jMi5yZWRNdWwodGhpcy5vbmUucmVkQWRkKHRoaXMuZC5yZWRNdWwoZSkucmVkTXVsKHIpKSk7cmV0dXJuIDA9PT1uLmNtcChpKX0scyhpLHUuQmFzZVBvaW50KSxuLnByb3RvdHlwZS5wb2ludEZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBpLmZyb21KU09OKHRoaXMsdCl9LG4ucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBuZXcgaSh0aGlzLHQsZSxyLG4pfSxpLmZyb21KU09OPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZVswXSxlWzFdLGVbMl0pfSxpLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpP1wiPEVDIFBvaW50IEluZmluaXR5PlwiOlwiPEVDIFBvaW50IHg6IFwiK3RoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrXCIgeTogXCIrdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwyKStcIiB6OiBcIit0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LDIpK1wiPlwifSxpLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnguY21wbigwKSYmMD09PXRoaXMueS5jbXAodGhpcy56KX0saS5wcm90b3R5cGUuX2V4dERibD1mdW5jdGlvbigpe3ZhciB0PXRoaXMueC5yZWRTcXIoKSxlPXRoaXMueS5yZWRTcXIoKSxyPXRoaXMuei5yZWRTcXIoKTtyPXIucmVkSUFkZChyKTt2YXIgbj10aGlzLmN1cnZlLl9tdWxBKHQpLGk9dGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLnJlZElTdWIodCkucmVkSVN1YihlKSxvPW4ucmVkQWRkKGUpLGE9by5yZWRTdWIociksZj1uLnJlZFN1YihlKSxzPWkucmVkTXVsKGEpLHU9by5yZWRNdWwoZiksaD1pLnJlZE11bChmKSxjPWEucmVkTXVsKG8pO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHMsdSxjLGgpfSxpLnByb3RvdHlwZS5fcHJvakRibD1mdW5jdGlvbigpe3ZhciB0LGUscixuPXRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKSxpPXRoaXMueC5yZWRTcXIoKSxvPXRoaXMueS5yZWRTcXIoKTtpZih0aGlzLmN1cnZlLnR3aXN0ZWQpe3ZhciBhPXRoaXMuY3VydmUuX211bEEoaSksZj1hLnJlZEFkZChvKTtpZih0aGlzLnpPbmUpdD1uLnJlZFN1YihpKS5yZWRTdWIobykucmVkTXVsKGYucmVkU3ViKHRoaXMuY3VydmUudHdvKSksZT1mLnJlZE11bChhLnJlZFN1YihvKSkscj1mLnJlZFNxcigpLnJlZFN1YihmKS5yZWRTdWIoZik7ZWxzZXt2YXIgcz10aGlzLnoucmVkU3FyKCksdT1mLnJlZFN1YihzKS5yZWRJU3ViKHMpO3Q9bi5yZWRTdWIoaSkucmVkSVN1YihvKS5yZWRNdWwodSksZT1mLnJlZE11bChhLnJlZFN1YihvKSkscj1mLnJlZE11bCh1KX19ZWxzZXt2YXIgYT1pLnJlZEFkZChvKSxzPXRoaXMuY3VydmUuX211bEModGhpcy5jLnJlZE11bCh0aGlzLnopKS5yZWRTcXIoKSx1PWEucmVkU3ViKHMpLnJlZFN1YihzKTt0PXRoaXMuY3VydmUuX211bEMobi5yZWRJU3ViKGEpKS5yZWRNdWwodSksZT10aGlzLmN1cnZlLl9tdWxDKGEpLnJlZE11bChpLnJlZElTdWIobykpLHI9YS5yZWRNdWwodSl9cmV0dXJuIHRoaXMuY3VydmUucG9pbnQodCxlLHIpfSxpLnByb3RvdHlwZS5kYmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLmV4dGVuZGVkP3RoaXMuX2V4dERibCgpOnRoaXMuX3Byb2pEYmwoKX0saS5wcm90b3R5cGUuX2V4dEFkZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHQueS5yZWRTdWIodC54KSkscj10aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHQueS5yZWRBZGQodC54KSksbj10aGlzLnQucmVkTXVsKHRoaXMuY3VydmUuZGQpLnJlZE11bCh0LnQpLGk9dGhpcy56LnJlZE11bCh0LnoucmVkQWRkKHQueikpLG89ci5yZWRTdWIoZSksYT1pLnJlZFN1YihuKSxmPWkucmVkQWRkKG4pLHM9ci5yZWRBZGQoZSksdT1vLnJlZE11bChhKSxoPWYucmVkTXVsKHMpLGM9by5yZWRNdWwocyksZD1hLnJlZE11bChmKTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh1LGgsZCxjKX0saS5wcm90b3R5cGUuX3Byb2pBZGQ9ZnVuY3Rpb24odCl7dmFyIGUscixuPXRoaXMuei5yZWRNdWwodC56KSxpPW4ucmVkU3FyKCksbz10aGlzLngucmVkTXVsKHQueCksYT10aGlzLnkucmVkTXVsKHQueSksZj10aGlzLmN1cnZlLmQucmVkTXVsKG8pLnJlZE11bChhKSxzPWkucmVkU3ViKGYpLHU9aS5yZWRBZGQoZiksaD10aGlzLngucmVkQWRkKHRoaXMueSkucmVkTXVsKHQueC5yZWRBZGQodC55KSkucmVkSVN1YihvKS5yZWRJU3ViKGEpLGM9bi5yZWRNdWwocykucmVkTXVsKGgpO3JldHVybiB0aGlzLmN1cnZlLnR3aXN0ZWQ/KGU9bi5yZWRNdWwodSkucmVkTXVsKGEucmVkU3ViKHRoaXMuY3VydmUuX211bEEobykpKSxyPXMucmVkTXVsKHUpKTooZT1uLnJlZE11bCh1KS5yZWRNdWwoYS5yZWRTdWIobykpLHI9dGhpcy5jdXJ2ZS5fbXVsQyhzKS5yZWRNdWwodSkpLHRoaXMuY3VydmUucG9pbnQoYyxlLHIpfSxpLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpP3Q6dC5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLmV4dGVuZGVkP3RoaXMuX2V4dEFkZCh0KTp0aGlzLl9wcm9qQWRkKHQpfSxpLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2hhc0RvdWJsZXModCk/dGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcyx0KTp0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsdCl9LGkucHJvdG90eXBlLm11bEFkZD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxbdGhpcyxlXSxbdCxyXSwyLCExKX0saS5wcm90b3R5cGUuam11bEFkZD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxbdGhpcyxlXSxbdCxyXSwyLCEwKX0saS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7aWYodGhpcy56T25lKXJldHVybiB0aGlzO3ZhciB0PXRoaXMuei5yZWRJbnZtKCk7cmV0dXJuIHRoaXMueD10aGlzLngucmVkTXVsKHQpLHRoaXMueT10aGlzLnkucmVkTXVsKHQpLHRoaXMudCYmKHRoaXMudD10aGlzLnQucmVkTXVsKHQpKSx0aGlzLno9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56T25lPSEwLHRoaXN9LGkucHJvdG90eXBlLm5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWROZWcoKSx0aGlzLnksdGhpcy56LHRoaXMudCYmdGhpcy50LnJlZE5lZygpKX0saS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLHRoaXMueC5mcm9tUmVkKCl9LGkucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKSx0aGlzLnkuZnJvbVJlZCgpfSxpLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fDA9PT10aGlzLmdldFgoKS5jbXAodC5nZXRYKCkpJiYwPT09dGhpcy5nZXRZKCkuY21wKHQuZ2V0WSgpKX0saS5wcm90b3R5cGUuZXFYVG9QPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh0aGlzLnopO2lmKDA9PT10aGlzLnguY21wKGUpKXJldHVybiEwO2Zvcih2YXIgcj10LmNsb25lKCksbj10aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHRoaXMueik7Oyl7aWYoci5pYWRkKHRoaXMuY3VydmUubiksci5jbXAodGhpcy5jdXJ2ZS5wKT49MClyZXR1cm4hMTtpZihlLnJlZElBZGQobiksMD09PXRoaXMueC5jbXAoZSkpcmV0dXJuITB9cmV0dXJuITF9LGkucHJvdG90eXBlLnRvUD1pLnByb3RvdHlwZS5ub3JtYWxpemUsaS5wcm90b3R5cGUubWl4ZWRBZGQ9aS5wcm90b3R5cGUuYWRkfSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtzLmNhbGwodGhpcyxcIm1vbnRcIix0KSx0aGlzLmE9bmV3IGEodC5hLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5iPW5ldyBhKHQuYiwxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuaTQ9bmV3IGEoNCkudG9SZWQodGhpcy5yZWQpLnJlZEludm0oKSx0aGlzLnR3bz1uZXcgYSgyKS50b1JlZCh0aGlzLnJlZCksdGhpcy5hMjQ9dGhpcy5pNC5yZWRNdWwodGhpcy5hLnJlZEFkZCh0aGlzLnR3bykpfWZ1bmN0aW9uIGkodCxlLHIpe3MuQmFzZVBvaW50LmNhbGwodGhpcyx0LFwicHJvamVjdGl2ZVwiKSxudWxsPT09ZSYmbnVsbD09PXI/KHRoaXMueD10aGlzLmN1cnZlLm9uZSx0aGlzLno9dGhpcy5jdXJ2ZS56ZXJvKToodGhpcy54PW5ldyBhKGUsMTYpLHRoaXMuej1uZXcgYShyLDE2KSx0aGlzLngucmVkfHwodGhpcy54PXRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuei5yZWR8fCh0aGlzLno9dGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKSkpfXZhciBvPXIoMTA0KSxhPXIoMzApLGY9cigyKSxzPW8uYmFzZSx1PXIoMjIpLGg9dS51dGlscztmKG4scyksdC5leHBvcnRzPW4sbi5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5ub3JtYWxpemUoKS54LHI9ZS5yZWRTcXIoKSxuPXIucmVkTXVsKGUpLnJlZEFkZChyLnJlZE11bCh0aGlzLmEpKS5yZWRBZGQoZSksaT1uLnJlZFNxcnQoKTtyZXR1cm4gMD09PWkucmVkU3FyKCkuY21wKG4pfSxmKGkscy5CYXNlUG9pbnQpLG4ucHJvdG90eXBlLmRlY29kZVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucG9pbnQoaC50b0FycmF5KHQsZSksMSl9LG4ucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHRoaXMsdCxlKX0sbi5wcm90b3R5cGUucG9pbnRGcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gaS5mcm9tSlNPTih0aGlzLHQpfSxpLnByb3RvdHlwZS5wcmVjb21wdXRlPWZ1bmN0aW9uKCl7fSxpLnByb3RvdHlwZS5fZW5jb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0WCgpLnRvQXJyYXkoXCJiZVwiLHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCkpfSxpLmZyb21KU09OPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZVswXSxlWzFdfHx0Lm9uZSl9LGkucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/XCI8RUMgUG9pbnQgSW5maW5pdHk+XCI6XCI8RUMgUG9pbnQgeDogXCIrdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwyKStcIiB6OiBcIit0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LDIpK1wiPlwifSxpLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnouY21wbigwKX0saS5wcm90b3R5cGUuZGJsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54LnJlZEFkZCh0aGlzLnopLGU9dC5yZWRTcXIoKSxyPXRoaXMueC5yZWRTdWIodGhpcy56KSxuPXIucmVkU3FyKCksaT1lLnJlZFN1YihuKSxvPWUucmVkTXVsKG4pLGE9aS5yZWRNdWwobi5yZWRBZGQodGhpcy5jdXJ2ZS5hMjQucmVkTXVsKGkpKSk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQobyxhKX0saS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlXCIpfSxpLnByb3RvdHlwZS5kaWZmQWRkPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy54LnJlZEFkZCh0aGlzLnopLG49dGhpcy54LnJlZFN1Yih0aGlzLnopLGk9dC54LnJlZEFkZCh0LnopLG89dC54LnJlZFN1Yih0LnopLGE9by5yZWRNdWwociksZj1pLnJlZE11bChuKSxzPWUuei5yZWRNdWwoYS5yZWRBZGQoZikucmVkU3FyKCkpLHU9ZS54LnJlZE11bChhLnJlZElTdWIoZikucmVkU3FyKCkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHMsdSl9LGkucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5jbG9uZSgpLHI9dGhpcyxuPXRoaXMuY3VydmUucG9pbnQobnVsbCxudWxsKSxpPXRoaXMsbz1bXTswIT09ZS5jbXBuKDApO2UuaXVzaHJuKDEpKW8ucHVzaChlLmFuZGxuKDEpKTtmb3IodmFyIGE9by5sZW5ndGgtMTthPj0wO2EtLSkwPT09b1thXT8ocj1yLmRpZmZBZGQobixpKSxuPW4uZGJsKCkpOihuPXIuZGlmZkFkZChuLGkpLHI9ci5kYmwoKSk7cmV0dXJuIG59LGkucHJvdG90eXBlLm11bEFkZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZVwiKX0saS5wcm90b3R5cGUuanVtbEFkZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZVwiKX0saS5wcm90b3R5cGUuZXE9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmdldFgoKS5jbXAodC5nZXRYKCkpfSxpLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PXRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSksdGhpcy56PXRoaXMuY3VydmUub25lLHRoaXN9LGkucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKSx0aGlzLnguZnJvbVJlZCgpfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCl7aC5jYWxsKHRoaXMsXCJzaG9ydFwiLHQpLHRoaXMuYT1uZXcgcyh0LmEsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmI9bmV3IHModC5iLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy50aW52PXRoaXMudHdvLnJlZEludm0oKSx0aGlzLnplcm9BPTA9PT10aGlzLmEuZnJvbVJlZCgpLmNtcG4oMCksdGhpcy50aHJlZUE9MD09PXRoaXMuYS5mcm9tUmVkKCkuc3ViKHRoaXMucCkuY21wbigtMyksdGhpcy5lbmRvPXRoaXMuX2dldEVuZG9tb3JwaGlzbSh0KSx0aGlzLl9lbmRvV25hZlQxPW5ldyBBcnJheSg0KSx0aGlzLl9lbmRvV25hZlQyPW5ldyBBcnJheSg0KX1mdW5jdGlvbiBpKHQsZSxyLG4pe2guQmFzZVBvaW50LmNhbGwodGhpcyx0LFwiYWZmaW5lXCIpLG51bGw9PT1lJiZudWxsPT09cj8odGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy5pbmY9ITApOih0aGlzLng9bmV3IHMoZSwxNiksdGhpcy55PW5ldyBzKHIsMTYpLG4mJih0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpLHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMueC5yZWR8fCh0aGlzLng9dGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy55LnJlZHx8KHRoaXMueT10aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLmluZj0hMSl9ZnVuY3Rpb24gbyh0LGUscixuKXtoLkJhc2VQb2ludC5jYWxsKHRoaXMsdCxcImphY29iaWFuXCIpLG51bGw9PT1lJiZudWxsPT09ciYmbnVsbD09PW4/KHRoaXMueD10aGlzLmN1cnZlLm9uZSx0aGlzLnk9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56PW5ldyBzKDApKToodGhpcy54PW5ldyBzKGUsMTYpLHRoaXMueT1uZXcgcyhyLDE2KSx0aGlzLno9bmV3IHMobiwxNikpLHRoaXMueC5yZWR8fCh0aGlzLng9dGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy55LnJlZHx8KHRoaXMueT10aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnoucmVkfHwodGhpcy56PXRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuek9uZT10aGlzLno9PT10aGlzLmN1cnZlLm9uZX12YXIgYT1yKDEwNCksZj1yKDIyKSxzPXIoMzApLHU9cigyKSxoPWEuYmFzZSxjPWYudXRpbHMuYXNzZXJ0O3UobixoKSx0LmV4cG9ydHM9bixuLnByb3RvdHlwZS5fZ2V0RW5kb21vcnBoaXNtPWZ1bmN0aW9uKHQpe2lmKHRoaXMuemVyb0EmJnRoaXMuZyYmdGhpcy5uJiYxPT09dGhpcy5wLm1vZG4oMykpe3ZhciBlLHI7aWYodC5iZXRhKWU9bmV3IHModC5iZXRhLDE2KS50b1JlZCh0aGlzLnJlZCk7ZWxzZXt2YXIgbj10aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtlPW5bMF0uY21wKG5bMV0pPDA/blswXTpuWzFdLGU9ZS50b1JlZCh0aGlzLnJlZCl9aWYodC5sYW1iZGEpcj1uZXcgcyh0LmxhbWJkYSwxNik7ZWxzZXt2YXIgaT10aGlzLl9nZXRFbmRvUm9vdHModGhpcy5uKTswPT09dGhpcy5nLm11bChpWzBdKS54LmNtcCh0aGlzLmcueC5yZWRNdWwoZSkpP3I9aVswXToocj1pWzFdLGMoMD09PXRoaXMuZy5tdWwocikueC5jbXAodGhpcy5nLngucmVkTXVsKGUpKSkpfXZhciBvO3JldHVybiBvPXQuYmFzaXM/dC5iYXNpcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJue2E6bmV3IHModC5hLDE2KSxiOm5ldyBzKHQuYiwxNil9fSk6dGhpcy5fZ2V0RW5kb0Jhc2lzKHIpLHtiZXRhOmUsbGFtYmRhOnIsYmFzaXM6b319fSxuLnByb3RvdHlwZS5fZ2V0RW5kb1Jvb3RzPWZ1bmN0aW9uKHQpe3ZhciBlPXQ9PT10aGlzLnA/dGhpcy5yZWQ6cy5tb250KHQpLHI9bmV3IHMoMikudG9SZWQoZSkucmVkSW52bSgpLG49ci5yZWROZWcoKSxpPW5ldyBzKDMpLnRvUmVkKGUpLnJlZE5lZygpLnJlZFNxcnQoKS5yZWRNdWwociksbz1uLnJlZEFkZChpKS5mcm9tUmVkKCksYT1uLnJlZFN1YihpKS5mcm9tUmVkKCk7cmV0dXJuW28sYV19LG4ucHJvdG90eXBlLl9nZXRFbmRvQmFzaXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHIsbixpLG8sYSxmLHUsaCxjPXRoaXMubi51c2hybihNYXRoLmZsb29yKHRoaXMubi5iaXRMZW5ndGgoKS8yKSksZD10LGw9dGhpcy5uLmNsb25lKCkscD1uZXcgcygxKSxiPW5ldyBzKDApLHY9bmV3IHMoMCkseT1uZXcgcygxKSxtPTA7MCE9PWQuY21wbigwKTspe3ZhciBnPWwuZGl2KGQpO3U9bC5zdWIoZy5tdWwoZCkpLGg9di5zdWIoZy5tdWwocCkpO3ZhciB3PXkuc3ViKGcubXVsKGIpKTtpZighbiYmdS5jbXAoYyk8MCllPWYubmVnKCkscj1wLG49dS5uZWcoKSxpPWg7ZWxzZSBpZihuJiYyPT09KyttKWJyZWFrO2Y9dSxsPWQsZD11LHY9cCxwPWgseT1iLGI9d31vPXUubmVnKCksYT1oO3ZhciBfPW4uc3FyKCkuYWRkKGkuc3FyKCkpLE09by5zcXIoKS5hZGQoYS5zcXIoKSk7cmV0dXJuIE0uY21wKF8pPj0wJiYobz1lLGE9ciksbi5uZWdhdGl2ZSYmKG49bi5uZWcoKSxpPWkubmVnKCkpLG8ubmVnYXRpdmUmJihvPW8ubmVnKCksYT1hLm5lZygpKSxbe2E6bixiOml9LHthOm8sYjphfV19LG4ucHJvdG90eXBlLl9lbmRvU3BsaXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbmRvLmJhc2lzLHI9ZVswXSxuPWVbMV0saT1uLmIubXVsKHQpLmRpdlJvdW5kKHRoaXMubiksbz1yLmIubmVnKCkubXVsKHQpLmRpdlJvdW5kKHRoaXMubiksYT1pLm11bChyLmEpLGY9by5tdWwobi5hKSxzPWkubXVsKHIuYiksdT1vLm11bChuLmIpLGg9dC5zdWIoYSkuc3ViKGYpLGM9cy5hZGQodSkubmVnKCk7cmV0dXJue2sxOmgsazI6Y319LG4ucHJvdG90eXBlLnBvaW50RnJvbVg9ZnVuY3Rpb24odCxlKXt0PW5ldyBzKHQsMTYpLHQucmVkfHwodD10LnRvUmVkKHRoaXMucmVkKSk7dmFyIHI9dC5yZWRTcXIoKS5yZWRNdWwodCkucmVkSUFkZCh0LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYiksbj1yLnJlZFNxcnQoKTtpZigwIT09bi5yZWRTcXIoKS5yZWRTdWIocikuY21wKHRoaXMuemVybykpdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBwb2ludFwiKTt2YXIgaT1uLmZyb21SZWQoKS5pc09kZCgpO3JldHVybihlJiYhaXx8IWUmJmkpJiYobj1uLnJlZE5lZygpKSx0aGlzLnBvaW50KHQsbil9LG4ucHJvdG90eXBlLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe2lmKHQuaW5mKXJldHVybiEwO3ZhciBlPXQueCxyPXQueSxuPXRoaXMuYS5yZWRNdWwoZSksaT1lLnJlZFNxcigpLnJlZE11bChlKS5yZWRJQWRkKG4pLnJlZElBZGQodGhpcy5iKTtyZXR1cm4gMD09PXIucmVkU3FyKCkucmVkSVN1YihpKS5jbXBuKDApfSxuLnByb3RvdHlwZS5fZW5kb1duYWZNdWxBZGQ9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbj10aGlzLl9lbmRvV25hZlQxLGk9dGhpcy5fZW5kb1duYWZUMixvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBhPXRoaXMuX2VuZG9TcGxpdChlW29dKSxmPXRbb10scz1mLl9nZXRCZXRhKCk7YS5rMS5uZWdhdGl2ZSYmKGEuazEuaW5lZygpLGY9Zi5uZWcoITApKSxhLmsyLm5lZ2F0aXZlJiYoYS5rMi5pbmVnKCkscz1zLm5lZyghMCkpLG5bMipvXT1mLG5bMipvKzFdPXMsaVsyKm9dPWEuazEsaVsyKm8rMV09YS5rMn1mb3IodmFyIHU9dGhpcy5fd25hZk11bEFkZCgxLG4saSwyKm8sciksaD0wO2g8MipvO2grKyluW2hdPW51bGwsaVtoXT1udWxsO3JldHVybiB1fSx1KGksaC5CYXNlUG9pbnQpLG4ucHJvdG90eXBlLnBvaW50PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IGkodGhpcyx0LGUscil9LG4ucHJvdG90eXBlLnBvaW50RnJvbUpTT049ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5mcm9tSlNPTih0aGlzLHQsZSl9LGkucHJvdG90eXBlLl9nZXRCZXRhPWZ1bmN0aW9uKCl7aWYodGhpcy5jdXJ2ZS5lbmRvKXt2YXIgdD10aGlzLnByZWNvbXB1dGVkO2lmKHQmJnQuYmV0YSlyZXR1cm4gdC5iZXRhO3ZhciBlPXRoaXMuY3VydmUucG9pbnQodGhpcy54LnJlZE11bCh0aGlzLmN1cnZlLmVuZG8uYmV0YSksdGhpcy55KTtpZih0KXt2YXIgcj10aGlzLmN1cnZlLG49ZnVuY3Rpb24odCl7cmV0dXJuIHIucG9pbnQodC54LnJlZE11bChyLmVuZG8uYmV0YSksdC55KX07dC5iZXRhPWUsZS5wcmVjb21wdXRlZD17YmV0YTpudWxsLG5hZjp0Lm5hZiYme3duZDp0Lm5hZi53bmQscG9pbnRzOnQubmFmLnBvaW50cy5tYXAobil9LGRvdWJsZXM6dC5kb3VibGVzJiZ7c3RlcDp0LmRvdWJsZXMuc3RlcCxwb2ludHM6dC5kb3VibGVzLnBvaW50cy5tYXAobil9fX1yZXR1cm4gZX19LGkucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByZWNvbXB1dGVkP1t0aGlzLngsdGhpcy55LHRoaXMucHJlY29tcHV0ZWQmJntkb3VibGVzOnRoaXMucHJlY29tcHV0ZWQuZG91YmxlcyYme3N0ZXA6dGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnN0ZXAscG9pbnRzOnRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5wb2ludHMuc2xpY2UoMSl9LG5hZjp0aGlzLnByZWNvbXB1dGVkLm5hZiYme3duZDp0aGlzLnByZWNvbXB1dGVkLm5hZi53bmQscG9pbnRzOnRoaXMucHJlY29tcHV0ZWQubmFmLnBvaW50cy5zbGljZSgxKX19XTpbdGhpcy54LHRoaXMueV19LGkuZnJvbUpTT049ZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHQucG9pbnQoZVswXSxlWzFdLHIpfVwic3RyaW5nXCI9PXR5cGVvZiBlJiYoZT1KU09OLnBhcnNlKGUpKTt2YXIgaT10LnBvaW50KGVbMF0sZVsxXSxyKTtpZighZVsyXSlyZXR1cm4gaTt2YXIgbz1lWzJdO3JldHVybiBpLnByZWNvbXB1dGVkPXtiZXRhOm51bGwsZG91YmxlczpvLmRvdWJsZXMmJntzdGVwOm8uZG91Ymxlcy5zdGVwLHBvaW50czpbaV0uY29uY2F0KG8uZG91Ymxlcy5wb2ludHMubWFwKG4pKX0sbmFmOm8ubmFmJiZ7d25kOm8ubmFmLnduZCxwb2ludHM6W2ldLmNvbmNhdChvLm5hZi5wb2ludHMubWFwKG4pKX19LGl9LGkucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/XCI8RUMgUG9pbnQgSW5maW5pdHk+XCI6XCI8RUMgUG9pbnQgeDogXCIrdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwyKStcIiB5OiBcIit0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LDIpK1wiPlwifSxpLnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5mfSxpLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5pbmYpcmV0dXJuIHQ7aWYodC5pbmYpcmV0dXJuIHRoaXM7aWYodGhpcy5lcSh0KSlyZXR1cm4gdGhpcy5kYmwoKTtpZih0aGlzLm5lZygpLmVxKHQpKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7aWYoMD09PXRoaXMueC5jbXAodC54KSlyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLG51bGwpO3ZhciBlPXRoaXMueS5yZWRTdWIodC55KTswIT09ZS5jbXBuKDApJiYoZT1lLnJlZE11bCh0aGlzLngucmVkU3ViKHQueCkucmVkSW52bSgpKSk7dmFyIHI9ZS5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueCkucmVkSVN1Yih0LngpLG49ZS5yZWRNdWwodGhpcy54LnJlZFN1YihyKSkucmVkSVN1Yih0aGlzLnkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KHIsbil9LGkucHJvdG90eXBlLmRibD1mdW5jdGlvbigpe2lmKHRoaXMuaW5mKXJldHVybiB0aGlzO3ZhciB0PXRoaXMueS5yZWRBZGQodGhpcy55KTtpZigwPT09dC5jbXBuKDApKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7dmFyIGU9dGhpcy5jdXJ2ZS5hLHI9dGhpcy54LnJlZFNxcigpLG49dC5yZWRJbnZtKCksaT1yLnJlZEFkZChyKS5yZWRJQWRkKHIpLnJlZElBZGQoZSkucmVkTXVsKG4pLG89aS5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueC5yZWRBZGQodGhpcy54KSksYT1pLnJlZE11bCh0aGlzLngucmVkU3ViKG8pKS5yZWRJU3ViKHRoaXMueSk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQobyxhKX0saS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnguZnJvbVJlZCgpfSxpLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueS5mcm9tUmVkKCl9LGkucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uZXcgcyh0LDE2KSx0aGlzLl9oYXNEb3VibGVzKHQpP3RoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsdCk6dGhpcy5jdXJ2ZS5lbmRvP3RoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKFt0aGlzXSxbdF0pOnRoaXMuY3VydmUuX3duYWZNdWwodGhpcyx0KX0saS5wcm90b3R5cGUubXVsQWRkPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1bdGhpcyxlXSxpPVt0LHJdO3JldHVybiB0aGlzLmN1cnZlLmVuZG8/dGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQobixpKTp0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsbixpLDIpfSxpLnByb3RvdHlwZS5qbXVsQWRkPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1bdGhpcyxlXSxpPVt0LHJdO3JldHVybiB0aGlzLmN1cnZlLmVuZG8/dGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQobixpLCEwKTp0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsbixpLDIsITApfSxpLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fHRoaXMuaW5mPT09dC5pbmYmJih0aGlzLmluZnx8MD09PXRoaXMueC5jbXAodC54KSYmMD09PXRoaXMueS5jbXAodC55KSl9LGkucHJvdG90eXBlLm5lZz1mdW5jdGlvbih0KXtpZih0aGlzLmluZilyZXR1cm4gdGhpczt2YXIgZT10aGlzLmN1cnZlLnBvaW50KHRoaXMueCx0aGlzLnkucmVkTmVnKCkpO2lmKHQmJnRoaXMucHJlY29tcHV0ZWQpe3ZhciByPXRoaXMucHJlY29tcHV0ZWQsbj1mdW5jdGlvbih0KXtyZXR1cm4gdC5uZWcoKX07ZS5wcmVjb21wdXRlZD17bmFmOnIubmFmJiZ7d25kOnIubmFmLnduZCxwb2ludHM6ci5uYWYucG9pbnRzLm1hcChuKX0sZG91YmxlczpyLmRvdWJsZXMmJntzdGVwOnIuZG91Ymxlcy5zdGVwLHBvaW50czpyLmRvdWJsZXMucG9pbnRzLm1hcChuKX19fXJldHVybiBlfSxpLnByb3RvdHlwZS50b0o9ZnVuY3Rpb24oKXtpZih0aGlzLmluZilyZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCxudWxsLG51bGwpO3ZhciB0PXRoaXMuY3VydmUuanBvaW50KHRoaXMueCx0aGlzLnksdGhpcy5jdXJ2ZS5vbmUpO3JldHVybiB0fSxcbnUobyxoLkJhc2VQb2ludCksbi5wcm90b3R5cGUuanBvaW50PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IG8odGhpcyx0LGUscil9LG8ucHJvdG90eXBlLnRvUD1mdW5jdGlvbigpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7dmFyIHQ9dGhpcy56LnJlZEludm0oKSxlPXQucmVkU3FyKCkscj10aGlzLngucmVkTXVsKGUpLG49dGhpcy55LnJlZE11bChlKS5yZWRNdWwodCk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQocixuKX0sby5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHRoaXMueCx0aGlzLnkucmVkTmVnKCksdGhpcy56KX0sby5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiB0O2lmKHQuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzO3ZhciBlPXQuei5yZWRTcXIoKSxyPXRoaXMuei5yZWRTcXIoKSxuPXRoaXMueC5yZWRNdWwoZSksaT10LngucmVkTXVsKHIpLG89dGhpcy55LnJlZE11bChlLnJlZE11bCh0LnopKSxhPXQueS5yZWRNdWwoci5yZWRNdWwodGhpcy56KSksZj1uLnJlZFN1YihpKSxzPW8ucmVkU3ViKGEpO2lmKDA9PT1mLmNtcG4oMCkpcmV0dXJuIDAhPT1zLmNtcG4oMCk/dGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCxudWxsLG51bGwpOnRoaXMuZGJsKCk7dmFyIHU9Zi5yZWRTcXIoKSxoPXUucmVkTXVsKGYpLGM9bi5yZWRNdWwodSksZD1zLnJlZFNxcigpLnJlZElBZGQoaCkucmVkSVN1YihjKS5yZWRJU3ViKGMpLGw9cy5yZWRNdWwoYy5yZWRJU3ViKGQpKS5yZWRJU3ViKG8ucmVkTXVsKGgpKSxwPXRoaXMuei5yZWRNdWwodC56KS5yZWRNdWwoZik7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGQsbCxwKX0sby5wcm90b3R5cGUubWl4ZWRBZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5pc0luZmluaXR5KCkpcmV0dXJuIHQudG9KKCk7aWYodC5pc0luZmluaXR5KCkpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy56LnJlZFNxcigpLHI9dGhpcy54LG49dC54LnJlZE11bChlKSxpPXRoaXMueSxvPXQueS5yZWRNdWwoZSkucmVkTXVsKHRoaXMueiksYT1yLnJlZFN1YihuKSxmPWkucmVkU3ViKG8pO2lmKDA9PT1hLmNtcG4oMCkpcmV0dXJuIDAhPT1mLmNtcG4oMCk/dGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCxudWxsLG51bGwpOnRoaXMuZGJsKCk7dmFyIHM9YS5yZWRTcXIoKSx1PXMucmVkTXVsKGEpLGg9ci5yZWRNdWwocyksYz1mLnJlZFNxcigpLnJlZElBZGQodSkucmVkSVN1YihoKS5yZWRJU3ViKGgpLGQ9Zi5yZWRNdWwoaC5yZWRJU3ViKGMpKS5yZWRJU3ViKGkucmVkTXVsKHUpKSxsPXRoaXMuei5yZWRNdWwoYSk7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGMsZCxsKX0sby5wcm90b3R5cGUuZGJscD1mdW5jdGlvbih0KXtpZigwPT09dClyZXR1cm4gdGhpcztpZih0aGlzLmlzSW5maW5pdHkoKSlyZXR1cm4gdGhpcztpZighdClyZXR1cm4gdGhpcy5kYmwoKTtpZih0aGlzLmN1cnZlLnplcm9BfHx0aGlzLmN1cnZlLnRocmVlQSl7Zm9yKHZhciBlPXRoaXMscj0wO3I8dDtyKyspZT1lLmRibCgpO3JldHVybiBlfWZvcih2YXIgbj10aGlzLmN1cnZlLmEsaT10aGlzLmN1cnZlLnRpbnYsbz10aGlzLngsYT10aGlzLnksZj10aGlzLnoscz1mLnJlZFNxcigpLnJlZFNxcigpLHU9YS5yZWRBZGQoYSkscj0wO3I8dDtyKyspe3ZhciBoPW8ucmVkU3FyKCksYz11LnJlZFNxcigpLGQ9Yy5yZWRTcXIoKSxsPWgucmVkQWRkKGgpLnJlZElBZGQoaCkucmVkSUFkZChuLnJlZE11bChzKSkscD1vLnJlZE11bChjKSxiPWwucmVkU3FyKCkucmVkSVN1YihwLnJlZEFkZChwKSksdj1wLnJlZElTdWIoYikseT1sLnJlZE11bCh2KTt5PXkucmVkSUFkZCh5KS5yZWRJU3ViKGQpO3ZhciBtPXUucmVkTXVsKGYpO3IrMTx0JiYocz1zLnJlZE11bChkKSksbz1iLGY9bSx1PXl9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG8sdS5yZWRNdWwoaSksZil9LG8ucHJvdG90eXBlLmRibD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT90aGlzOnRoaXMuY3VydmUuemVyb0E/dGhpcy5femVyb0RibCgpOnRoaXMuY3VydmUudGhyZWVBP3RoaXMuX3RocmVlRGJsKCk6dGhpcy5fZGJsKCl9LG8ucHJvdG90eXBlLl96ZXJvRGJsPWZ1bmN0aW9uKCl7dmFyIHQsZSxyO2lmKHRoaXMuek9uZSl7dmFyIG49dGhpcy54LnJlZFNxcigpLGk9dGhpcy55LnJlZFNxcigpLG89aS5yZWRTcXIoKSxhPXRoaXMueC5yZWRBZGQoaSkucmVkU3FyKCkucmVkSVN1YihuKS5yZWRJU3ViKG8pO2E9YS5yZWRJQWRkKGEpO3ZhciBmPW4ucmVkQWRkKG4pLnJlZElBZGQobikscz1mLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihhKSx1PW8ucmVkSUFkZChvKTt1PXUucmVkSUFkZCh1KSx1PXUucmVkSUFkZCh1KSx0PXMsZT1mLnJlZE11bChhLnJlZElTdWIocykpLnJlZElTdWIodSkscj10aGlzLnkucmVkQWRkKHRoaXMueSl9ZWxzZXt2YXIgaD10aGlzLngucmVkU3FyKCksYz10aGlzLnkucmVkU3FyKCksZD1jLnJlZFNxcigpLGw9dGhpcy54LnJlZEFkZChjKS5yZWRTcXIoKS5yZWRJU3ViKGgpLnJlZElTdWIoZCk7bD1sLnJlZElBZGQobCk7dmFyIHA9aC5yZWRBZGQoaCkucmVkSUFkZChoKSxiPXAucmVkU3FyKCksdj1kLnJlZElBZGQoZCk7dj12LnJlZElBZGQodiksdj12LnJlZElBZGQodiksdD1iLnJlZElTdWIobCkucmVkSVN1YihsKSxlPXAucmVkTXVsKGwucmVkSVN1Yih0KSkucmVkSVN1Yih2KSxyPXRoaXMueS5yZWRNdWwodGhpcy56KSxyPXIucmVkSUFkZChyKX1yZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQodCxlLHIpfSxvLnByb3RvdHlwZS5fdGhyZWVEYmw9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7aWYodGhpcy56T25lKXt2YXIgbj10aGlzLngucmVkU3FyKCksaT10aGlzLnkucmVkU3FyKCksbz1pLnJlZFNxcigpLGE9dGhpcy54LnJlZEFkZChpKS5yZWRTcXIoKS5yZWRJU3ViKG4pLnJlZElTdWIobyk7YT1hLnJlZElBZGQoYSk7dmFyIGY9bi5yZWRBZGQobikucmVkSUFkZChuKS5yZWRJQWRkKHRoaXMuY3VydmUuYSkscz1mLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihhKTt0PXM7dmFyIHU9by5yZWRJQWRkKG8pO3U9dS5yZWRJQWRkKHUpLHU9dS5yZWRJQWRkKHUpLGU9Zi5yZWRNdWwoYS5yZWRJU3ViKHMpKS5yZWRJU3ViKHUpLHI9dGhpcy55LnJlZEFkZCh0aGlzLnkpfWVsc2V7dmFyIGg9dGhpcy56LnJlZFNxcigpLGM9dGhpcy55LnJlZFNxcigpLGQ9dGhpcy54LnJlZE11bChjKSxsPXRoaXMueC5yZWRTdWIoaCkucmVkTXVsKHRoaXMueC5yZWRBZGQoaCkpO2w9bC5yZWRBZGQobCkucmVkSUFkZChsKTt2YXIgcD1kLnJlZElBZGQoZCk7cD1wLnJlZElBZGQocCk7dmFyIGI9cC5yZWRBZGQocCk7dD1sLnJlZFNxcigpLnJlZElTdWIoYikscj10aGlzLnkucmVkQWRkKHRoaXMueikucmVkU3FyKCkucmVkSVN1YihjKS5yZWRJU3ViKGgpO3ZhciB2PWMucmVkU3FyKCk7dj12LnJlZElBZGQodiksdj12LnJlZElBZGQodiksdj12LnJlZElBZGQodiksZT1sLnJlZE11bChwLnJlZElTdWIodCkpLnJlZElTdWIodil9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHQsZSxyKX0sby5wcm90b3R5cGUuX2RibD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY3VydmUuYSxlPXRoaXMueCxyPXRoaXMueSxuPXRoaXMueixpPW4ucmVkU3FyKCkucmVkU3FyKCksbz1lLnJlZFNxcigpLGE9ci5yZWRTcXIoKSxmPW8ucmVkQWRkKG8pLnJlZElBZGQobykucmVkSUFkZCh0LnJlZE11bChpKSkscz1lLnJlZEFkZChlKTtzPXMucmVkSUFkZChzKTt2YXIgdT1zLnJlZE11bChhKSxoPWYucmVkU3FyKCkucmVkSVN1Yih1LnJlZEFkZCh1KSksYz11LnJlZElTdWIoaCksZD1hLnJlZFNxcigpO2Q9ZC5yZWRJQWRkKGQpLGQ9ZC5yZWRJQWRkKGQpLGQ9ZC5yZWRJQWRkKGQpO3ZhciBsPWYucmVkTXVsKGMpLnJlZElTdWIoZCkscD1yLnJlZEFkZChyKS5yZWRNdWwobik7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGgsbCxwKX0sby5wcm90b3R5cGUudHJwbD1mdW5jdGlvbigpe2lmKCF0aGlzLmN1cnZlLnplcm9BKXJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTt2YXIgdD10aGlzLngucmVkU3FyKCksZT10aGlzLnkucmVkU3FyKCkscj10aGlzLnoucmVkU3FyKCksbj1lLnJlZFNxcigpLGk9dC5yZWRBZGQodCkucmVkSUFkZCh0KSxvPWkucmVkU3FyKCksYT10aGlzLngucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIodCkucmVkSVN1YihuKTthPWEucmVkSUFkZChhKSxhPWEucmVkQWRkKGEpLnJlZElBZGQoYSksYT1hLnJlZElTdWIobyk7dmFyIGY9YS5yZWRTcXIoKSxzPW4ucmVkSUFkZChuKTtzPXMucmVkSUFkZChzKSxzPXMucmVkSUFkZChzKSxzPXMucmVkSUFkZChzKTt2YXIgdT1pLnJlZElBZGQoYSkucmVkU3FyKCkucmVkSVN1YihvKS5yZWRJU3ViKGYpLnJlZElTdWIocyksaD1lLnJlZE11bCh1KTtoPWgucmVkSUFkZChoKSxoPWgucmVkSUFkZChoKTt2YXIgYz10aGlzLngucmVkTXVsKGYpLnJlZElTdWIoaCk7Yz1jLnJlZElBZGQoYyksYz1jLnJlZElBZGQoYyk7dmFyIGQ9dGhpcy55LnJlZE11bCh1LnJlZE11bChzLnJlZElTdWIodSkpLnJlZElTdWIoYS5yZWRNdWwoZikpKTtkPWQucmVkSUFkZChkKSxkPWQucmVkSUFkZChkKSxkPWQucmVkSUFkZChkKTt2YXIgbD10aGlzLnoucmVkQWRkKGEpLnJlZFNxcigpLnJlZElTdWIocikucmVkSVN1YihmKTtyZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoYyxkLGwpfSxvLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1uZXcgcyh0LGUpLHRoaXMuY3VydmUuX3duYWZNdWwodGhpcyx0KX0sby5wcm90b3R5cGUuZXE9ZnVuY3Rpb24odCl7aWYoXCJhZmZpbmVcIj09PXQudHlwZSlyZXR1cm4gdGhpcy5lcSh0LnRvSigpKTtpZih0aGlzPT09dClyZXR1cm4hMDt2YXIgZT10aGlzLnoucmVkU3FyKCkscj10LnoucmVkU3FyKCk7aWYoMCE9PXRoaXMueC5yZWRNdWwocikucmVkSVN1Yih0LngucmVkTXVsKGUpKS5jbXBuKDApKXJldHVybiExO3ZhciBuPWUucmVkTXVsKHRoaXMueiksaT1yLnJlZE11bCh0LnopO3JldHVybiAwPT09dGhpcy55LnJlZE11bChpKS5yZWRJU3ViKHQueS5yZWRNdWwobikpLmNtcG4oMCl9LG8ucHJvdG90eXBlLmVxWFRvUD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnoucmVkU3FyKCkscj10LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwoZSk7aWYoMD09PXRoaXMueC5jbXAocikpcmV0dXJuITA7Zm9yKHZhciBuPXQuY2xvbmUoKSxpPXRoaXMuY3VydmUucmVkTi5yZWRNdWwoZSk7Oyl7aWYobi5pYWRkKHRoaXMuY3VydmUubiksbi5jbXAodGhpcy5jdXJ2ZS5wKT49MClyZXR1cm4hMTtpZihyLnJlZElBZGQoaSksMD09PXRoaXMueC5jbXAocikpcmV0dXJuITB9cmV0dXJuITF9LG8ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/XCI8RUMgSlBvaW50IEluZmluaXR5PlwiOlwiPEVDIEpQb2ludCB4OiBcIit0aGlzLngudG9TdHJpbmcoMTYsMikrXCIgeTogXCIrdGhpcy55LnRvU3RyaW5nKDE2LDIpK1wiIHo6IFwiK3RoaXMuei50b1N0cmluZygxNiwyKStcIj5cIn0sby5wcm90b3R5cGUuaXNJbmZpbml0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy56LmNtcG4oMCl9fSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0KXtcInNob3J0XCI9PT10LnR5cGU/dGhpcy5jdXJ2ZT1uZXcgZi5jdXJ2ZS5zaG9ydCh0KTpcImVkd2FyZHNcIj09PXQudHlwZT90aGlzLmN1cnZlPW5ldyBmLmN1cnZlLmVkd2FyZHModCk6dGhpcy5jdXJ2ZT1uZXcgZi5jdXJ2ZS5tb250KHQpLHRoaXMuZz10aGlzLmN1cnZlLmcsdGhpcy5uPXRoaXMuY3VydmUubix0aGlzLmhhc2g9dC5oYXNoLHModGhpcy5nLnZhbGlkYXRlKCksXCJJbnZhbGlkIGN1cnZlXCIpLHModGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSxcIkludmFsaWQgY3VydmUsIEcqTiAhPSBPXCIpfWZ1bmN0aW9uIGkodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkobyx0LHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgcj1uZXcgbihlKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sdCx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6cn0pLHJ9fSl9dmFyIG89ZSxhPXIoNTApLGY9cigyMikscz1mLnV0aWxzLmFzc2VydDtvLlByZXNldEN1cnZlPW4saShcInAxOTJcIix7dHlwZTpcInNob3J0XCIscHJpbWU6XCJwMTkyXCIscDpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmXCIsYTpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZjXCIsYjpcIjY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxXCIsbjpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDk5ZGVmODM2IDE0NmJjOWIxIGI0ZDIyODMxXCIsaGFzaDphLnNoYTI1NixnUmVkOiExLGc6W1wiMTg4ZGE4MGUgYjAzMDkwZjYgN2NiZjIwZWIgNDNhMTg4MDAgZjRmZjBhZmQgODJmZjEwMTJcIixcIjA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExXCJdfSksaShcInAyMjRcIix7dHlwZTpcInNob3J0XCIscHJpbWU6XCJwMjI0XCIscDpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxXCIsYTpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlXCIsYjpcImI0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0XCIsbjpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmYxNmEyIGUwYjhmMDNlIDEzZGQyOTQ1IDVjNWMyYTNkXCIsaGFzaDphLnNoYTI1NixnUmVkOiExLGc6W1wiYjcwZTBjYmQgNmJiNGJmN2YgMzIxMzkwYjkgNGEwM2MxZDMgNTZjMjExMjIgMzQzMjgwZDYgMTE1YzFkMjFcIixcImJkMzc2Mzg4IGI1ZjcyM2ZiIDRjMjJkZmU2IGNkNDM3NWEwIDVhMDc0NzY0IDQ0ZDU4MTk5IDg1MDA3ZTM0XCJdfSksaShcInAyNTZcIix7dHlwZTpcInNob3J0XCIscHJpbWU6bnVsbCxwOlwiZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmZcIixhOlwiZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmNcIixiOlwiNWFjNjM1ZDggYWEzYTkzZTcgYjNlYmJkNTUgNzY5ODg2YmMgNjUxZDA2YjAgY2M1M2IwZjYgM2JjZTNjM2UgMjdkMjYwNGJcIixuOlwiZmZmZmZmZmYgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgYmNlNmZhYWQgYTcxNzllODQgZjNiOWNhYzIgZmM2MzI1NTFcIixoYXNoOmEuc2hhMjU2LGdSZWQ6ITEsZzpbXCI2YjE3ZDFmMiBlMTJjNDI0NyBmOGJjZTZlNSA2M2E0NDBmMiA3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NlwiLFwiNGZlMzQyZTIgZmUxYTdmOWIgOGVlN2ViNGEgN2MwZjllMTYgMmJjZTMzNTcgNmIzMTVlY2UgY2JiNjQwNjggMzdiZjUxZjVcIl19KSxpKFwicDM4NFwiLHt0eXBlOlwic2hvcnRcIixwcmltZTpudWxsLHA6XCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZlwiLGE6XCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmY1wiLGI6XCJiMzMxMmZhNyBlMjNlZTdlNCA5ODhlMDU2YiBlM2Y4MmQxOSAxODFkOWM2ZSBmZTgxNDExMiAwMzE0MDg4ZiA1MDEzODc1YSBjNjU2Mzk4ZCA4YTJlZDE5ZCAyYTg1YzhlZCBkM2VjMmFlZlwiLG46XCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBjNzYzNGQ4MSBmNDM3MmRkZiA1ODFhMGRiMiA0OGIwYTc3YSBlY2VjMTk2YSBjY2M1Mjk3M1wiLGhhc2g6YS5zaGEzODQsZ1JlZDohMSxnOltcImFhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4IDU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3XCIsXCIzNjE3ZGU0YSA5NjI2MmM2ZiA1ZDllOThiZiA5MjkyZGMyOSBmOGY0MWRiZCAyODlhMTQ3YyBlOWRhMzExMyBiNWYwYjhjMCAwYTYwYjFjZSAxZDdlODE5ZCA3YTQzMWQ3YyA5MGVhMGU1ZlwiXX0pLGkoXCJwNTIxXCIse3R5cGU6XCJzaG9ydFwiLHByaW1lOm51bGwscDpcIjAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmXCIsYTpcIjAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjXCIsYjpcIjAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViIDk5YjMxNWYzIGI4YjQ4OTkxIDhlZjEwOWUxIDU2MTkzOTUxIGVjN2U5MzdiIDE2NTJjMGJkIDNiYjFiZjA3IDM1NzNkZjg4IDNkMmMzNGYxIGVmNDUxZmQ0IDZiNTAzZjAwXCIsbjpcIjAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZhIDUxODY4NzgzIGJmMmY5NjZiIDdmY2MwMTQ4IGY3MDlhNWQwIDNiYjVjOWI4IDg5OWM0N2FlIGJiNmZiNzFlIDkxMzg2NDA5XCIsaGFzaDphLnNoYTUxMixnUmVkOiExLGc6W1wiMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgMDUzZmI1MjEgZjgyOGFmNjAgNmI0ZDNkYmEgYTE0YjVlNzcgZWZlNzU5MjggZmUxZGMxMjcgYTJmZmE4ZGUgMzM0OGIzYzEgODU2YTQyOWIgZjk3ZTdlMzEgYzJlNWJkNjZcIixcIjAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5IDU3OWI0NDY4IDE3YWZiZDE3IDI3M2U2NjJjIDk3ZWU3Mjk5IDVlZjQyNjQwIGM1NTBiOTAxIDNmYWQwNzYxIDM1M2M3MDg2IGEyNzJjMjQwIDg4YmU5NDc2IDlmZDE2NjUwXCJdfSksaShcImN1cnZlMjU1MTlcIix7dHlwZTpcIm1vbnRcIixwcmltZTpcInAyNTUxOVwiLHA6XCI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkXCIsYTpcIjc2ZDA2XCIsYjpcIjBcIixuOlwiMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZFwiLGhhc2g6YS5zaGEyNTYsZ1JlZDohMSxnOltcIjlcIl19KSxpKFwiZWQyNTUxOVwiLHt0eXBlOlwiZWR3YXJkc1wiLHByaW1lOlwicDI1NTE5XCIscDpcIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWRcIixhOlwiLTFcIixjOlwiMVwiLGQ6XCI1MjAzNmNlZTJiNmZmZTczIDhjYzc0MDc5Nzc3OWU4OTggMDA3MDBhNGQ0MTQxZDhhYiA3NWViNGRjYTEzNTk3OGEzXCIsbjpcIjEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWRcIixoYXNoOmEuc2hhMjU2LGdSZWQ6ITEsZzpbXCIyMTY5MzZkM2NkNmU1M2ZlYzBhNGUyMzFmZGQ2ZGM1YzY5MmNjNzYwOTUyNWE3YjJjOTU2MmQ2MDhmMjVkNTFhXCIsXCI2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4XCJdfSk7dmFyIHU7dHJ5e3U9cig1NTcpfWNhdGNoKHQpe3U9dm9pZCAwfWkoXCJzZWNwMjU2azFcIix7dHlwZTpcInNob3J0XCIscHJpbWU6XCJrMjU2XCIscDpcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmXCIsYTpcIjBcIixiOlwiN1wiLG46XCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBiYWFlZGNlNiBhZjQ4YTAzYiBiZmQyNWU4YyBkMDM2NDE0MVwiLGg6XCIxXCIsaGFzaDphLnNoYTI1NixiZXRhOlwiN2FlOTZhMmI2NTdjMDcxMDZlNjQ0NzllYWMzNDM0ZTk5Y2YwNDk3NTEyZjU4OTk1YzEzOTZjMjg3MTk1MDFlZVwiLGxhbWJkYTpcIjUzNjNhZDRjYzA1YzMwZTBhNTI2MWMwMjg4MTI2NDVhMTIyZTIyZWEyMDgxNjY3OGRmMDI5NjdjMWIyM2JkNzJcIixiYXNpczpbe2E6XCIzMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNVwiLGI6XCItZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzNcIn0se2E6XCIxMTRjYTUwZjdhOGUyZjNmNjU3YzExMDhkOWQ0NGNmZDhcIixiOlwiMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTVcIn1dLGdSZWQ6ITEsZzpbXCI3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4XCIsXCI0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkNGI4XCIsdV19KX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuPyhcInN0cmluZ1wiPT10eXBlb2YgdCYmKGYoby5jdXJ2ZXMuaGFzT3duUHJvcGVydHkodCksXCJVbmtub3duIGN1cnZlIFwiK3QpLHQ9by5jdXJ2ZXNbdF0pLHQgaW5zdGFuY2VvZiBvLmN1cnZlcy5QcmVzZXRDdXJ2ZSYmKHQ9e2N1cnZlOnR9KSx0aGlzLmN1cnZlPXQuY3VydmUuY3VydmUsdGhpcy5uPXRoaXMuY3VydmUubix0aGlzLm5oPXRoaXMubi51c2hybigxKSx0aGlzLmc9dGhpcy5jdXJ2ZS5nLHRoaXMuZz10LmN1cnZlLmcsdGhpcy5nLnByZWNvbXB1dGUodC5jdXJ2ZS5uLmJpdExlbmd0aCgpKzEpLHZvaWQodGhpcy5oYXNoPXQuaGFzaHx8dC5jdXJ2ZS5oYXNoKSk6bmV3IG4odCl9dmFyIGk9cigzMCksbz1yKDIyKSxhPW8udXRpbHMsZj1hLmFzc2VydCxzPXIoNTUxKSx1PXIoNTUyKTt0LmV4cG9ydHM9bixuLnByb3RvdHlwZS5rZXlQYWlyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcyh0aGlzLHQpfSxuLnByb3RvdHlwZS5rZXlGcm9tUHJpdmF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBzLmZyb21Qcml2YXRlKHRoaXMsdCxlKX0sbi5wcm90b3R5cGUua2V5RnJvbVB1YmxpYz1mdW5jdGlvbih0LGUpe3JldHVybiBzLmZyb21QdWJsaWModGhpcyx0LGUpfSxuLnByb3RvdHlwZS5nZW5LZXlQYWlyPWZ1bmN0aW9uKHQpe3R8fCh0PXt9KTtmb3IodmFyIGU9bmV3IG8uaG1hY0RSQkcoe2hhc2g6dGhpcy5oYXNoLHBlcnM6dC5wZXJzLGVudHJvcHk6dC5lbnRyb3B5fHxvLnJhbmQodGhpcy5oYXNoLmhtYWNTdHJlbmd0aCksbm9uY2U6dGhpcy5uLnRvQXJyYXkoKX0pLHI9dGhpcy5uLmJ5dGVMZW5ndGgoKSxuPXRoaXMubi5zdWIobmV3IGkoMikpOzspe3ZhciBhPW5ldyBpKGUuZ2VuZXJhdGUocikpO2lmKCEoYS5jbXAobik+MCkpcmV0dXJuIGEuaWFkZG4oMSksdGhpcy5rZXlGcm9tUHJpdmF0ZShhKX19LG4ucHJvdG90eXBlLl90cnVuY2F0ZVRvTj1mdW5jdGlvbih0LGUpe3ZhciByPTgqdC5ieXRlTGVuZ3RoKCktdGhpcy5uLmJpdExlbmd0aCgpO3JldHVybiByPjAmJih0PXQudXNocm4ocikpLCFlJiZ0LmNtcCh0aGlzLm4pPj0wP3Quc3ViKHRoaXMubik6dH0sbi5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0LGUscixuKXtcIm9iamVjdFwiPT10eXBlb2YgciYmKG49cixyPW51bGwpLG58fChuPXt9KSxlPXRoaXMua2V5RnJvbVByaXZhdGUoZSxyKSx0PXRoaXMuX3RydW5jYXRlVG9OKG5ldyBpKHQsMTYpKTtmb3IodmFyIGE9dGhpcy5uLmJ5dGVMZW5ndGgoKSxmPWUuZ2V0UHJpdmF0ZSgpLnRvQXJyYXkoXCJiZVwiLGEpLHM9dC50b0FycmF5KFwiYmVcIixhKSxoPW5ldyBvLmhtYWNEUkJHKHtoYXNoOnRoaXMuaGFzaCxlbnRyb3B5OmYsbm9uY2U6cyxwZXJzOm4ucGVycyxwZXJzRW5jOm4ucGVyc0VuY30pLGM9dGhpcy5uLnN1YihuZXcgaSgxKSksZD0wOyEwO2QrKyl7dmFyIGw9bi5rP24uayhkKTpuZXcgaShoLmdlbmVyYXRlKHRoaXMubi5ieXRlTGVuZ3RoKCkpKTtpZihsPXRoaXMuX3RydW5jYXRlVG9OKGwsITApLCEobC5jbXBuKDEpPD0wfHxsLmNtcChjKT49MCkpe3ZhciBwPXRoaXMuZy5tdWwobCk7aWYoIXAuaXNJbmZpbml0eSgpKXt2YXIgYj1wLmdldFgoKSx2PWIudW1vZCh0aGlzLm4pO2lmKDAhPT12LmNtcG4oMCkpe3ZhciB5PWwuaW52bSh0aGlzLm4pLm11bCh2Lm11bChlLmdldFByaXZhdGUoKSkuaWFkZCh0KSk7aWYoeT15LnVtb2QodGhpcy5uKSwwIT09eS5jbXBuKDApKXt2YXIgbT0ocC5nZXRZKCkuaXNPZGQoKT8xOjApfCgwIT09Yi5jbXAodik/MjowKTtyZXR1cm4gbi5jYW5vbmljYWwmJnkuY21wKHRoaXMubmgpPjAmJih5PXRoaXMubi5zdWIoeSksbV49MSksbmV3IHUoe3I6dixzOnkscmVjb3ZlcnlQYXJhbTptfSl9fX19fX0sbi5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uKHQsZSxyLG4pe3Q9dGhpcy5fdHJ1bmNhdGVUb04obmV3IGkodCwxNikpLHI9dGhpcy5rZXlGcm9tUHVibGljKHIsbiksZT1uZXcgdShlLFwiaGV4XCIpO3ZhciBvPWUucixhPWUucztpZihvLmNtcG4oMSk8MHx8by5jbXAodGhpcy5uKT49MClyZXR1cm4hMTtpZihhLmNtcG4oMSk8MHx8YS5jbXAodGhpcy5uKT49MClyZXR1cm4hMTt2YXIgZj1hLmludm0odGhpcy5uKSxzPWYubXVsKHQpLnVtb2QodGhpcy5uKSxoPWYubXVsKG8pLnVtb2QodGhpcy5uKTtpZighdGhpcy5jdXJ2ZS5fbWF4d2VsbFRyaWNrKXt2YXIgYz10aGlzLmcubXVsQWRkKHMsci5nZXRQdWJsaWMoKSxoKTtyZXR1cm4hYy5pc0luZmluaXR5KCkmJjA9PT1jLmdldFgoKS51bW9kKHRoaXMubikuY21wKG8pfXZhciBjPXRoaXMuZy5qbXVsQWRkKHMsci5nZXRQdWJsaWMoKSxoKTtyZXR1cm4hYy5pc0luZmluaXR5KCkmJmMuZXFYVG9QKG8pfSxuLnByb3RvdHlwZS5yZWNvdmVyUHViS2V5PWZ1bmN0aW9uKHQsZSxyLG4pe2YoKDMmcik9PT1yLFwiVGhlIHJlY292ZXJ5IHBhcmFtIGlzIG1vcmUgdGhhbiB0d28gYml0c1wiKSxlPW5ldyB1KGUsbik7dmFyIG89dGhpcy5uLGE9bmV3IGkodCkscz1lLnIsaD1lLnMsYz0xJnIsZD1yPj4xO2lmKHMuY21wKHRoaXMuY3VydmUucC51bW9kKHRoaXMuY3VydmUubikpPj0wJiZkKXRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBmaW5kIHNlbmNvbmQga2V5IGNhbmRpbmF0ZVwiKTtzPWQ/dGhpcy5jdXJ2ZS5wb2ludEZyb21YKHMuYWRkKHRoaXMuY3VydmUubiksYyk6dGhpcy5jdXJ2ZS5wb2ludEZyb21YKHMsYyk7dmFyIGw9ZS5yLmludm0obykscD1vLnN1YihhKS5tdWwobCkudW1vZChvKSxiPWgubXVsKGwpLnVtb2Qobyk7cmV0dXJuIHRoaXMuZy5tdWxBZGQocCxzLGIpfSxuLnByb3RvdHlwZS5nZXRLZXlSZWNvdmVyeVBhcmFtPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGU9bmV3IHUoZSxuKSxudWxsIT09ZS5yZWNvdmVyeVBhcmFtKXJldHVybiBlLnJlY292ZXJ5UGFyYW07Zm9yKHZhciBpPTA7aTw0O2krKyl7dmFyIG87dHJ5e289dGhpcy5yZWNvdmVyUHViS2V5KHQsZSxpKX1jYXRjaCh0KXtjb250aW51ZX1pZihvLmVxKHIpKXJldHVybiBpfXRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBmaW5kIHZhbGlkIHJlY292ZXJ5IGZhY3RvclwiKX19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7dGhpcy5lYz10LHRoaXMucHJpdj1udWxsLHRoaXMucHViPW51bGwsZS5wcml2JiZ0aGlzLl9pbXBvcnRQcml2YXRlKGUucHJpdixlLnByaXZFbmMpLGUucHViJiZ0aGlzLl9pbXBvcnRQdWJsaWMoZS5wdWIsZS5wdWJFbmMpfXZhciBpPXIoMzApO3QuZXhwb3J0cz1uLG4uZnJvbVB1YmxpYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGUgaW5zdGFuY2VvZiBuP2U6bmV3IG4odCx7cHViOmUscHViRW5jOnJ9KX0sbi5mcm9tUHJpdmF0ZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGUgaW5zdGFuY2VvZiBuP2U6bmV3IG4odCx7cHJpdjplLHByaXZFbmM6cn0pfSxuLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0UHVibGljKCk7cmV0dXJuIHQuaXNJbmZpbml0eSgpP3tyZXN1bHQ6ITEscmVhc29uOlwiSW52YWxpZCBwdWJsaWMga2V5XCJ9OnQudmFsaWRhdGUoKT90Lm11bCh0aGlzLmVjLmN1cnZlLm4pLmlzSW5maW5pdHkoKT97cmVzdWx0OiEwLHJlYXNvbjpudWxsfTp7cmVzdWx0OiExLHJlYXNvbjpcIlB1YmxpYyBrZXkgKiBOICE9IE9cIn06e3Jlc3VsdDohMSxyZWFzb246XCJQdWJsaWMga2V5IGlzIG5vdCBhIHBvaW50XCJ9fSxuLnByb3RvdHlwZS5nZXRQdWJsaWM9ZnVuY3Rpb24odCxlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdCYmKGU9dCx0PW51bGwpLHRoaXMucHVifHwodGhpcy5wdWI9dGhpcy5lYy5nLm11bCh0aGlzLnByaXYpKSxlP3RoaXMucHViLmVuY29kZShlLHQpOnRoaXMucHVifSxuLnByb3RvdHlwZS5nZXRQcml2YXRlPWZ1bmN0aW9uKHQpe3JldHVyblwiaGV4XCI9PT10P3RoaXMucHJpdi50b1N0cmluZygxNiwyKTp0aGlzLnByaXZ9LG4ucHJvdG90eXBlLl9pbXBvcnRQcml2YXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5wcml2PW5ldyBpKHQsZXx8MTYpLHRoaXMucHJpdj10aGlzLnByaXYudW1vZCh0aGlzLmVjLmN1cnZlLm4pfSxuLnByb3RvdHlwZS5faW1wb3J0UHVibGljPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueHx8dC55P3ZvaWQodGhpcy5wdWI9dGhpcy5lYy5jdXJ2ZS5wb2ludCh0LngsdC55KSk6dm9pZCh0aGlzLnB1Yj10aGlzLmVjLmN1cnZlLmRlY29kZVBvaW50KHQsZSkpfSxuLnByb3RvdHlwZS5kZXJpdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubXVsKHRoaXMucHJpdikuZ2V0WCgpfSxuLnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdGhpcy5lYy5zaWduKHQsdGhpcyxlLHIpfSxuLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lYy52ZXJpZnkodCxlLHRoaXMpfSxuLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuXCI8S2V5IHByaXY6IFwiKyh0aGlzLnByaXYmJnRoaXMucHJpdi50b1N0cmluZygxNiwyKSkrXCIgcHViOiBcIisodGhpcy5wdWImJnRoaXMucHViLmluc3BlY3QoKSkrXCIgPlwifX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIG4/dDp2b2lkKHRoaXMuX2ltcG9ydERFUih0LGUpfHwoYyh0LnImJnQucyxcIlNpZ25hdHVyZSB3aXRob3V0IHIgb3Igc1wiKSx0aGlzLnI9bmV3IHModC5yLDE2KSx0aGlzLnM9bmV3IHModC5zLDE2KSx2b2lkIDA9PT10LnJlY292ZXJ5UGFyYW0/dGhpcy5yZWNvdmVyeVBhcmFtPW51bGw6dGhpcy5yZWNvdmVyeVBhcmFtPXQucmVjb3ZlcnlQYXJhbSkpfWZ1bmN0aW9uIGkoKXt0aGlzLnBsYWNlPTB9ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXRbZS5wbGFjZSsrXTtpZighKDEyOCZyKSlyZXR1cm4gcjtmb3IodmFyIG49MTUmcixpPTAsbz0wLGE9ZS5wbGFjZTtvPG47bysrLGErKylpPDw9OCxpfD10W2FdO3JldHVybiBlLnBsYWNlPWEsaX1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMTshdFtlXSYmISgxMjgmdFtlKzFdKSYmZTxyOyllKys7cmV0dXJuIDA9PT1lP3Q6dC5zbGljZShlKX1mdW5jdGlvbiBmKHQsZSl7aWYoZTwxMjgpcmV0dXJuIHZvaWQgdC5wdXNoKGUpO3ZhciByPTErKE1hdGgubG9nKGUpL01hdGguTE4yPj4+Myk7Zm9yKHQucHVzaCgxMjh8cik7LS1yOyl0LnB1c2goZT4+PihyPDwzKSYyNTUpO3QucHVzaChlKX12YXIgcz1yKDMwKSx1PXIoMjIpLGg9dS51dGlscyxjPWguYXNzZXJ0O3QuZXhwb3J0cz1uLG4ucHJvdG90eXBlLl9pbXBvcnRERVI9ZnVuY3Rpb24odCxlKXt0PWgudG9BcnJheSh0LGUpO3ZhciByPW5ldyBpO2lmKDQ4IT09dFtyLnBsYWNlKytdKXJldHVybiExO3ZhciBuPW8odCxyKTtpZihuK3IucGxhY2UhPT10Lmxlbmd0aClyZXR1cm4hMTtpZigyIT09dFtyLnBsYWNlKytdKXJldHVybiExO3ZhciBhPW8odCxyKSxmPXQuc2xpY2Uoci5wbGFjZSxhK3IucGxhY2UpO2lmKHIucGxhY2UrPWEsMiE9PXRbci5wbGFjZSsrXSlyZXR1cm4hMTt2YXIgdT1vKHQscik7aWYodC5sZW5ndGghPT11K3IucGxhY2UpcmV0dXJuITE7dmFyIGM9dC5zbGljZShyLnBsYWNlLHUrci5wbGFjZSk7cmV0dXJuIDA9PT1mWzBdJiYxMjgmZlsxXSYmKGY9Zi5zbGljZSgxKSksMD09PWNbMF0mJjEyOCZjWzFdJiYoYz1jLnNsaWNlKDEpKSx0aGlzLnI9bmV3IHMoZiksdGhpcy5zPW5ldyBzKGMpLHRoaXMucmVjb3ZlcnlQYXJhbT1udWxsLCEwfSxuLnByb3RvdHlwZS50b0RFUj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnIudG9BcnJheSgpLHI9dGhpcy5zLnRvQXJyYXkoKTtmb3IoMTI4JmVbMF0mJihlPVswXS5jb25jYXQoZSkpLDEyOCZyWzBdJiYocj1bMF0uY29uY2F0KHIpKSxlPWEoZSkscj1hKHIpOyEoclswXXx8MTI4JnJbMV0pOylyPXIuc2xpY2UoMSk7dmFyIG49WzJdO2YobixlLmxlbmd0aCksbj1uLmNvbmNhdChlKSxuLnB1c2goMiksZihuLHIubGVuZ3RoKTt2YXIgaT1uLmNvbmNhdChyKSxvPVs0OF07cmV0dXJuIGYobyxpLmxlbmd0aCksbz1vLmNvbmNhdChpKSxoLmVuY29kZShvLHQpfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCl7aWYoZihcImVkMjU1MTlcIj09PXQsXCJvbmx5IHRlc3RlZCB3aXRoIGVkMjU1MTkgc28gZmFyXCIpLCEodGhpcyBpbnN0YW5jZW9mIG4pKXJldHVybiBuZXcgbih0KTt2YXIgdD1vLmN1cnZlc1t0XS5jdXJ2ZTt0aGlzLmN1cnZlPXQsdGhpcy5nPXQuZyx0aGlzLmcucHJlY29tcHV0ZSh0Lm4uYml0TGVuZ3RoKCkrMSksdGhpcy5wb2ludENsYXNzPXQucG9pbnQoKS5jb25zdHJ1Y3Rvcix0aGlzLmVuY29kaW5nTGVuZ3RoPU1hdGguY2VpbCh0Lm4uYml0TGVuZ3RoKCkvOCksdGhpcy5oYXNoPWkuc2hhNTEyfXZhciBpPXIoNTApLG89cigyMiksYT1vLnV0aWxzLGY9YS5hc3NlcnQscz1hLnBhcnNlQnl0ZXMsdT1yKDU1NCksaD1yKDU1NSk7dC5leHBvcnRzPW4sbi5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0LGUpe3Q9cyh0KTt2YXIgcj10aGlzLmtleUZyb21TZWNyZXQoZSksbj10aGlzLmhhc2hJbnQoci5tZXNzYWdlUHJlZml4KCksdCksaT10aGlzLmcubXVsKG4pLG89dGhpcy5lbmNvZGVQb2ludChpKSxhPXRoaXMuaGFzaEludChvLHIucHViQnl0ZXMoKSx0KS5tdWwoci5wcml2KCkpLGY9bi5hZGQoYSkudW1vZCh0aGlzLmN1cnZlLm4pO3JldHVybiB0aGlzLm1ha2VTaWduYXR1cmUoe1I6aSxTOmYsUmVuY29kZWQ6b30pfSxuLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24odCxlLHIpe3Q9cyh0KSxlPXRoaXMubWFrZVNpZ25hdHVyZShlKTt2YXIgbj10aGlzLmtleUZyb21QdWJsaWMociksaT10aGlzLmhhc2hJbnQoZS5SZW5jb2RlZCgpLG4ucHViQnl0ZXMoKSx0KSxvPXRoaXMuZy5tdWwoZS5TKCkpLGE9ZS5SKCkuYWRkKG4ucHViKCkubXVsKGkpKTtyZXR1cm4gYS5lcShvKX0sbi5wcm90b3R5cGUuaGFzaEludD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmhhc2goKSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0LnVwZGF0ZShhcmd1bWVudHNbZV0pO3JldHVybiBhLmludEZyb21MRSh0LmRpZ2VzdCgpKS51bW9kKHRoaXMuY3VydmUubil9LG4ucHJvdG90eXBlLmtleUZyb21QdWJsaWM9ZnVuY3Rpb24odCl7cmV0dXJuIHUuZnJvbVB1YmxpYyh0aGlzLHQpfSxuLnByb3RvdHlwZS5rZXlGcm9tU2VjcmV0PWZ1bmN0aW9uKHQpe3JldHVybiB1LmZyb21TZWNyZXQodGhpcyx0KX0sbi5wcm90b3R5cGUubWFrZVNpZ25hdHVyZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGg/dDpuZXcgaCh0aGlzLHQpfSxuLnByb3RvdHlwZS5lbmNvZGVQb2ludD1mdW5jdGlvbih0KXt2YXIgZT10LmdldFkoKS50b0FycmF5KFwibGVcIix0aGlzLmVuY29kaW5nTGVuZ3RoKTtyZXR1cm4gZVt0aGlzLmVuY29kaW5nTGVuZ3RoLTFdfD10LmdldFgoKS5pc09kZCgpPzEyODowLGV9LG4ucHJvdG90eXBlLmRlY29kZVBvaW50PWZ1bmN0aW9uKHQpe3Q9YS5wYXJzZUJ5dGVzKHQpO3ZhciBlPXQubGVuZ3RoLTEscj10LnNsaWNlKDAsZSkuY29uY2F0KHRbZV0mLTEyOSksbj0wIT09KDEyOCZ0W2VdKSxpPWEuaW50RnJvbUxFKHIpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50RnJvbVkoaSxuKX0sbi5wcm90b3R5cGUuZW5jb2RlSW50PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvQXJyYXkoXCJsZVwiLHRoaXMuZW5jb2RpbmdMZW5ndGgpfSxuLnByb3RvdHlwZS5kZWNvZGVJbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGEuaW50RnJvbUxFKHQpfSxuLnByb3RvdHlwZS5pc1BvaW50PWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzfX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCxlKXt0aGlzLmVkZHNhPXQsdGhpcy5fc2VjcmV0PWYoZS5zZWNyZXQpLHQuaXNQb2ludChlLnB1Yik/dGhpcy5fcHViPWUucHViOnRoaXMuX3B1YkJ5dGVzPWYoZS5wdWIpfXZhciBpPXIoMjIpLG89aS51dGlscyxhPW8uYXNzZXJ0LGY9by5wYXJzZUJ5dGVzLHM9by5jYWNoZWRQcm9wZXJ0eTtuLmZyb21QdWJsaWM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG4/ZTpuZXcgbih0LHtwdWI6ZX0pfSxuLmZyb21TZWNyZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG4/ZTpuZXcgbih0LHtzZWNyZXQ6ZX0pfSxuLnByb3RvdHlwZS5zZWNyZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VjcmV0fSxzKG4sXCJwdWJCeXRlc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5wdWIoKSl9KSxzKG4sXCJwdWJcIixmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdWJCeXRlcz90aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuX3B1YkJ5dGVzKTp0aGlzLmVkZHNhLmcubXVsKHRoaXMucHJpdigpKX0pLHMobixcInByaXZCeXRlc1wiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGRzYSxlPXRoaXMuaGFzaCgpLHI9dC5lbmNvZGluZ0xlbmd0aC0xLG49ZS5zbGljZSgwLHQuZW5jb2RpbmdMZW5ndGgpO3JldHVybiBuWzBdJj0yNDgsbltyXSY9MTI3LG5bcl18PTY0LG59KSxzKG4sXCJwcml2XCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5wcml2Qnl0ZXMoKSl9KSxzKG4sXCJoYXNoXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5oYXNoKCkudXBkYXRlKHRoaXMuc2VjcmV0KCkpLmRpZ2VzdCgpfSkscyhuLFwibWVzc2FnZVByZWZpeFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzaCgpLnNsaWNlKHRoaXMuZWRkc2EuZW5jb2RpbmdMZW5ndGgpfSksbi5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gYSh0aGlzLl9zZWNyZXQsXCJLZXlQYWlyIGNhbiBvbmx5IHZlcmlmeVwiKSx0aGlzLmVkZHNhLnNpZ24odCx0aGlzKX0sbi5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWRkc2EudmVyaWZ5KHQsZSx0aGlzKX0sbi5wcm90b3R5cGUuZ2V0U2VjcmV0PWZ1bmN0aW9uKHQpe3JldHVybiBhKHRoaXMuX3NlY3JldCxcIktleVBhaXIgaXMgcHVibGljIG9ubHlcIiksby5lbmNvZGUodGhpcy5zZWNyZXQoKSx0KX0sbi5wcm90b3R5cGUuZ2V0UHVibGljPWZ1bmN0aW9uKHQpe3JldHVybiBvLmVuY29kZSh0aGlzLnB1YkJ5dGVzKCksdCl9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbih0LGUpe3RoaXMuZWRkc2E9dCxcIm9iamVjdFwiIT10eXBlb2YgZSYmKGU9dShlKSksQXJyYXkuaXNBcnJheShlKSYmKGU9e1I6ZS5zbGljZSgwLHQuZW5jb2RpbmdMZW5ndGgpLFM6ZS5zbGljZSh0LmVuY29kaW5nTGVuZ3RoKX0pLGYoZS5SJiZlLlMsXCJTaWduYXR1cmUgd2l0aG91dCBSIG9yIFNcIiksdC5pc1BvaW50KGUuUikmJih0aGlzLl9SPWUuUiksZS5TIGluc3RhbmNlb2YgaSYmKHRoaXMuX1M9ZS5TKSx0aGlzLl9SZW5jb2RlZD1BcnJheS5pc0FycmF5KGUuUik/ZS5SOmUuUmVuY29kZWQsdGhpcy5fU2VuY29kZWQ9QXJyYXkuaXNBcnJheShlLlMpP2UuUzplLlNlbmNvZGVkfXZhciBpPXIoMzApLG89cigyMiksYT1vLnV0aWxzLGY9YS5hc3NlcnQscz1hLmNhY2hlZFByb3BlcnR5LHU9YS5wYXJzZUJ5dGVzO3MobixcIlNcIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLlNlbmNvZGVkKCkpfSkscyhuLFwiUlwiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5SZW5jb2RlZCgpKX0pLHMobixcIlJlbmNvZGVkXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLlIoKSl9KSxzKG4sXCJTZW5jb2RlZFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlSW50KHRoaXMuUygpKX0pLG4ucHJvdG90eXBlLnRvQnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SZW5jb2RlZCgpLmNvbmNhdCh0aGlzLlNlbmNvZGVkKCkpfSxuLnByb3RvdHlwZS50b0hleD1mdW5jdGlvbigpe3JldHVybiBhLmVuY29kZSh0aGlzLnRvQnl0ZXMoKSxcImhleFwiKS50b1VwcGVyQ2FzZSgpfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4odCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpcmV0dXJuIG5ldyBuKHQpO3RoaXMuaGFzaD10Lmhhc2gsdGhpcy5wcmVkUmVzaXN0PSEhdC5wcmVkUmVzaXN0LHRoaXMub3V0TGVuPXRoaXMuaGFzaC5vdXRTaXplLHRoaXMubWluRW50cm9weT10Lm1pbkVudHJvcHl8fHRoaXMuaGFzaC5obWFjU3RyZW5ndGgsdGhpcy5yZXNlZWQ9bnVsbCx0aGlzLnJlc2VlZEludGVydmFsPW51bGwsdGhpcy5LPW51bGwsdGhpcy5WPW51bGw7dmFyIGU9YS50b0FycmF5KHQuZW50cm9weSx0LmVudHJvcHlFbmMpLHI9YS50b0FycmF5KHQubm9uY2UsdC5ub25jZUVuYyksaT1hLnRvQXJyYXkodC5wZXJzLHQucGVyc0VuYyk7ZihlLmxlbmd0aD49dGhpcy5taW5FbnRyb3B5LzgsXCJOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6IFwiK3RoaXMubWluRW50cm9weStcIiBiaXRzXCIpLHRoaXMuX2luaXQoZSxyLGkpfXZhciBpPXIoNTApLG89cigyMiksYT1vLnV0aWxzLGY9YS5hc3NlcnQ7dC5leHBvcnRzPW4sbi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuY29uY2F0KGUpLmNvbmNhdChyKTt0aGlzLks9bmV3IEFycmF5KHRoaXMub3V0TGVuLzgpLHRoaXMuVj1uZXcgQXJyYXkodGhpcy5vdXRMZW4vOCk7Zm9yKHZhciBpPTA7aTx0aGlzLlYubGVuZ3RoO2krKyl0aGlzLktbaV09MCx0aGlzLlZbaV09MTt0aGlzLl91cGRhdGUobiksdGhpcy5yZXNlZWQ9MSx0aGlzLnJlc2VlZEludGVydmFsPTI4MTQ3NDk3NjcxMDY1Nn0sbi5wcm90b3R5cGUuX2htYWM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkuaG1hYyh0aGlzLmhhc2gsdGhpcy5LKX0sbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikudXBkYXRlKFswXSk7dCYmKGU9ZS51cGRhdGUodCkpLHRoaXMuSz1lLmRpZ2VzdCgpLHRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCksdCYmKHRoaXMuSz10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikudXBkYXRlKFsxXSkudXBkYXRlKHQpLmRpZ2VzdCgpLHRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCkpfSxuLnByb3RvdHlwZS5yZXNlZWQ9ZnVuY3Rpb24odCxlLHIsbil7XCJzdHJpbmdcIiE9dHlwZW9mIGUmJihuPXIscj1lLGU9bnVsbCksdD1hLnRvQnVmZmVyKHQsZSkscj1hLnRvQnVmZmVyKHIsbiksZih0Lmxlbmd0aD49dGhpcy5taW5FbnRyb3B5LzgsXCJOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6IFwiK3RoaXMubWluRW50cm9weStcIiBiaXRzXCIpLHRoaXMuX3VwZGF0ZSh0LmNvbmNhdChyfHxbXSkpLHRoaXMucmVzZWVkPTF9LG4ucHJvdG90eXBlLmdlbmVyYXRlPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHRoaXMucmVzZWVkPnRoaXMucmVzZWVkSW50ZXJ2YWwpdGhyb3cgbmV3IEVycm9yKFwiUmVzZWVkIGlzIHJlcXVpcmVkXCIpO1wic3RyaW5nXCIhPXR5cGVvZiBlJiYobj1yLHI9ZSxlPW51bGwpLHImJihyPWEudG9BcnJheShyLG4pLHRoaXMuX3VwZGF0ZShyKSk7Zm9yKHZhciBpPVtdO2kubGVuZ3RoPHQ7KXRoaXMuVj10aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCksaT1pLmNvbmNhdCh0aGlzLlYpO3ZhciBvPWkuc2xpY2UoMCx0KTtyZXR1cm4gdGhpcy5fdXBkYXRlKHIpLHRoaXMucmVzZWVkKyssYS5lbmNvZGUobyxlKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXtkb3VibGVzOntzdGVwOjQscG9pbnRzOltbXCJlNjBmY2U5M2I1OWU5ZWM1MzAxMWFhYmMyMWMyM2U5N2IyYTMxMzY5Yjg3YTVhZTljNDRlZTg5ZTJhNmRlYzBhXCIsXCJmN2UzNTA3Mzk5ZTU5NTkyOWRiOTlmMzRmNTc5MzcxMDEyOTY4OTFlNDRkMjNmMGJlMWYzMmNjZTY5NjE2ODIxXCJdLFtcIjgyODIyNjMyMTJjNjA5ZDllYTJhNmUzZTE3MmRlMjM4ZDhjMzljYWJkNWFjMWNhMTA2NDZlMjNmZDVmNTE1MDhcIixcIjExZjhhODA5ODU1N2RmZTQ1ZTgyNTZlODMwYjYwYWNlNjJkNjEzYWMyZjdiMTdiZWQzMWI2ZWFmZjZlMjZjYWZcIl0sW1wiMTc1ZTE1OWY3MjhiODY1YTcyZjk5Y2M2YzZmYzg0NmRlMGI5MzgzM2ZkMjIyMmVkNzNmY2U1YjU1MWU1YjczOVwiLFwiZDM1MDZlMGQ5ZTNjNzllYmE0ZWY5N2E1MWZmNzFmNWVhY2I1OTU1YWRkMjQzNDVjNmVmYTZmZmVlOWZlZDY5NVwiXSxbXCIzNjNkOTBkNDQ3YjAwYzljOTljZWFjMDViNjI2MmVlMDUzNDQxYzdlNTU1NTJmZmU1MjZiYWQ4ZjgzZmY0NjQwXCIsXCI0ZTI3M2FkZmM3MzIyMjE5NTNiNDQ1Mzk3ZjMzNjMxNDViOWE4OTAwODE5OWVjYjYyMDAzYzdmM2JlZTlkZTlcIl0sW1wiOGI0YjVmMTY1ZGYzYzJiZThjNjI0NGI1Yjc0NTYzODg0M2U0YTc4MWExNWJjZDFiNjlmNzlhNTVkZmZkZjgwY1wiLFwiNGFhZDBhNmY2OGQzMDhiNGIzZmJkNzgxM2FiMGRhMDRmOWUzMzY1NDYxNjJlZTU2YjNlZmYwYzY1ZmQ0ZmQzNlwiXSxbXCI3MjNjYmFhNmU1ZGI5OTZkNmJmNzcxYzAwYmQ1NDhjN2I3MDBkYmZmYTZjMGU3N2JjYjYxMTU5MjUyMzJmY2RhXCIsXCI5NmU4NjdiNTU5NWNjNDk4YTkyMTEzNzQ4ODgyNGQ2ZTI2NjBhMDY1Mzc3OTQ5NDgwMWRjMDY5ZDllYjM5ZjVmXCJdLFtcImVlYmZhNGQ0OTNiZWJmOThiYTVmZWVjODEyYzJkM2I1MDk0Nzk2MTIzN2E5MTk4MzlhNTMzZWNhMGU3ZGQ3ZmFcIixcIjVkOWE4Y2EzOTcwZWYwZjI2OWVlN2VkYWYxNzgwODlkOWFlNGNkYzNhNzExZjcxMmRkZmQ0ZmRhZTFkZTg5OTlcIl0sW1wiMTAwZjQ0ZGE2OTZlNzE2NzI3OTFkMGEwOWI3YmRlNDU5ZjEyMTVhMjliM2MwM2JmZWZkNzgzNWIzOWE0OGRiMFwiLFwiY2RkOWUxMzE5MmEwMGI3NzJlYzhmMzMwMGMwOTA2NjZiN2ZmNGExOGZmNTE5NWFjMGZiZDVjZDYyYmM2NWEwOVwiXSxbXCJlMTAzMWJlMjYyYzdlZDFiMWRjOTIyN2E0YTA0YzAxN2E3N2Y4ZDQ0NjRmM2IzODUyYzhhY2RlNmU1MzRmZDJkXCIsXCI5ZDcwNjE5Mjg5NDA0MDVlNmJiNmE0MTc2NTk3NTM1YWYyOTJkZDQxOWUxY2VkNzlhNDRmMThmMjk0NTZhMDBkXCJdLFtcImZlZWE2Y2FlNDZkNTViNTMwYWMyODM5ZjE0M2JkN2VjNWNmOGIyNjZhNDFkNmFmNTJkNWU2ODhkOTA5NDY5NmRcIixcImU1N2M2YjZjOTdkY2UxYmFiMDZlNGUxMmJmM2VjZDVjOTgxYzg5NTdjYzQxNDQyZDMxNTVkZWJmMTgwOTAwODhcIl0sW1wiZGE2N2E5MWQ5MTA0OWNkY2IzNjdiZTRiZTZmZmNhM2NmZWVkNjU3ZDgwODU4M2RlMzNmYTk3OGJjMWVjNmNiMVwiLFwiOWJhY2FhMzU0ODE2NDJiYzQxZjQ2M2Y3ZWM5NzgwZTVkZWM3YWRjNTA4Zjc0MGExN2U5ZWE4ZTI3YTY4YmUxZFwiXSxbXCI1MzkwNGZhYTBiMzM0Y2RkYTZlMDAwOTM1ZWYyMjE1MWVjMDhkMGY3YmIxMTA2OWY1NzU0NWNjYzFhMzdiN2MwXCIsXCI1YmMwODdkMGJjODAxMDZkODhjOWVjY2FjMjBkM2MxYzEzOTk5OTgxZTE0NDM0Njk5ZGNiMDk2YjAyMjc3MWM4XCJdLFtcIjhlN2JjZDBiZDM1OTgzYTc3MTljY2E3NzY0Y2E5MDY3NzliNTNhMDQzYTliOGJjYWVmZjk1OWY0M2FkODYwNDdcIixcIjEwYjc3NzBiMmEzZGE0YjM5NDAzMTA0MjBjYTk1MTQ1NzllODhlMmU0N2ZkNjhiM2VhMTAwNDdlODQ2MDM3MmFcIl0sW1wiMzg1ZWVkMzRjMWNkZmYyMWU2ZDA4MTg2ODliODFiZGU3MWE3ZjRmMTgzOTdlNjY5MGE4NDFlMTU5OWM0Mzg2MlwiLFwiMjgzYmViYzNlOGVhMjNmNTY3MDFkZTE5ZTllYmY0NTc2YjMwNGVlYzIwODZkYzhjYzA0NThmZTU1NDJlNTQ1M1wiXSxbXCI2ZjlkOWI4MDNlY2YxOTE2MzdjNzNhNDQxM2RmYTE4MGZkZGY4NGE1OTQ3ZmJjOWM2MDZlZDg2YzNmYWMzYTdcIixcIjdjODBjNjhlNjAzMDU5YmE2OWI4ZTJhMzBlNDVjNGQ0N2VhNGRkMmY1YzI4MTAwMmQ4Njg5MDYwM2E4NDIxNjBcIl0sW1wiMzMyMmQ0MDEyNDNjNGUyNTgyYTIxNDdjMTA0ZDZlY2JmNzc0ZDE2M2RiMGY1ZTUzMTNiN2UwZTc0MmQwZTZiZFwiLFwiNTZlNzA3OTdlOTY2NGVmNWJmYjAxOWJjNGRkYWY5YjcyODA1ZjYzZWEyODczYWY2MjRmM2EyZTk2YzI4YjJhMFwiXSxbXCI4NTY3MmM3ZDJkZTBiN2RhMmJkMTc3MGQ4OTY2NTg2ODc0MWIzZjlhZjc2NDMzOTc3MjFkNzRkMjgxMzRhYjgzXCIsXCI3YzQ4MWI5YjViNDNiMmViNjM3NDA0OWJmYTYyYzJlNWU3N2YxN2ZjYzUyOThmNDRjOGUzMDk0Zjc5MDMxM2E2XCJdLFtcIjk0OGJmODA5YjE5ODhhNDZiMDZjOWYxOTE5NDEzYjEwZjkyMjZjNjBmNjY4ODMyZmZkOTU5YWY2MGM4MmEwYVwiLFwiNTNhNTYyODU2ZGNiNjY0NmRjNmI3NGM1ZDFjMzQxOGM2ZDRkZmYwOGM5N2NkMmJlZDRjYjdmODhkOGM4ZTU4OVwiXSxbXCI2MjYwY2U3ZjQ2MTgwMWMzNGYwNjdjZTBmMDI4NzNhOGYxYjBlNDRkZmM2OTc1MmFjY2VjZDgxOWYzOGZkOGU4XCIsXCJiYzJkYTgyYjZmYTViNTcxYTdmMDkwNDk3NzZhMWVmN2VjZDI5MjIzODA1MWMxOThjMWE4NGU5NWIyYjRhZTE3XCJdLFtcImU1MDM3ZGUwYWZjMWQ4ZDQzZDgzNDg0MTRiYmY0MTAzMDQzZWM4ZjU3NWJmZGM0MzI5NTNjYzhkMjAzN2ZhMmRcIixcIjQ1NzE1MzRiYWE5NGQzYjVmOWY5OGQwOWZiOTkwYmRkYmQ1ZjViMDNlYzQ4MWYxMGUwZTVkYzg0MWQ3NTViZGFcIl0sW1wiZTA2MzcyYjBmNGEyMDdhZGY1ZWE5MDVlOGYxNzcxYjRlN2U4ZGJkMWM2YTZjNWI3MjU4NjZhMGFlNGZjZTcyNVwiLFwiN2E5MDg5NzRiY2UxOGNmZTEyYTI3YmIyYWQ1YTQ4OGNkNzQ4NGE3Nzg3MTA0ODcwYjI3MDM0Zjk0ZWVlMzFkZFwiXSxbXCIyMTNjN2E3MTVjZDVkNDUzNThkMGJiZjlkYzBjZTAyMjA0YjEwYmRkZTJhM2Y1ODU0MGFkNjkwOGQwNTU5NzU0XCIsXCI0YjZkYWQwYjVhZTQ2MjUwNzAxM2FkMDYyNDViYTE5MGJiNDg1MGY1ZjM2YTdlZWRkZmYyYzI3NTM0YjQ1OGYyXCJdLFtcIjRlN2MyNzJhN2FmNGIzNGU4ZGJiOTM1MmE1NDE5YTg3ZTI4MzhjNzBhZGM2MmNkZGYwY2MzYTNiMDhmYmQ1M2NcIixcIjE3NzQ5Yzc2NmM5ZDBiMThlMTZmZDA5ZjZkZWY2ODFiNTMwYjk2MTRiZmY3ZGQzM2UwYjM5NDE4MTdkY2FhZTZcIl0sW1wiZmVhNzRlM2RiZTc3OGIxYjEwZjIzOGFkNjE2ODZhYTVjNzZlM2RiMmJlNDMwNTc2MzI0MjdlMjg0MGZiMjdiNlwiLFwiNmUwNTY4ZGI5YjBiMTMyOTdjZjY3NGRlY2NiNmFmOTMxMjZiNTk2Yjk3M2Y3Yjc3NzAxZDNkYjdmMjNjYjk2ZlwiXSxbXCI3NmU2NDExM2Y2NzdjZjBlMTBhMjU3MGQ1OTk5NjhkMzE1NDRlMTc5Yjc2MDQzMjk1MmMwMmE0NDE3YmRkZTM5XCIsXCJjOTBkZGY4ZGVlNGU5NWNmNTc3MDY2ZDcwNjgxZjBkMzVlMmEzM2QyYjU2ZDIwMzJiNGIxNzUyZDE5MDFhYzAxXCJdLFtcImM3MzhjNTZiMDNiMmFiZTFlODI4MWJhYTc0M2Y4ZjlhOGY3Y2M2NDNkZjI2Y2JlZTNhYjE1MDI0MmJjYmI4OTFcIixcIjg5M2ZiNTc4OTUxYWQyNTM3ZjcxOGYyZWFjYmZiYmJiODIzMTRlZWY3ODgwY2ZlOTE3ZTczNWQ5Njk5YTg0YzNcIl0sW1wiZDg5NTYyNjU0OGI2NWI4MWUyNjRjNzYzN2M5NzI4NzdkMWQ3MmU1ZjNhOTI1MDE0MzcyZTlmNjU4OGY2YzE0YlwiLFwiZmViZmFhMzhmMmJjN2VhZTcyOGVjNjA4MThjMzQwZWIwMzQyOGQ2MzJiYjA2N2UxNzkzNjNlZDc1ZDdkOTkxZlwiXSxbXCJiOGRhOTQwMzJhOTU3NTE4ZWIwZjY0MzM1NzFlODc2MWNlZmZjNzM2OTNlODRlZGQ0OTE1MGE1NjRmNjc2ZTAzXCIsXCIyODA0ZGZhNDQ4MDVhMWU0ZDdjOTljYzk3NjI4MDhiMDkyY2M1ODRkOTVmZjNiNTExNDg4ZTRlNzRlZmRmNmU3XCJdLFtcImU4MGZlYTE0NDQxZmIzM2E3ZDhhZGFiOTQ3NWQ3ZmFiMjAxOWVmZmI1MTU2YTc5MmYxYTExNzc4ZTNjMGRmNWRcIixcImVlZDFkZTdmNjM4ZTAwNzcxZTg5NzY4Y2EzY2E5NDQ3MmQxNTVlODBhZjMyMmVhOWZjYjQyOTFiNmFjOWVjNzhcIl0sW1wiYTMwMTY5N2JkZmNkNzA0MzEzYmE0OGU1MWQ1Njc1NDNmMmExODIwMzFlZmQ2OTE1ZGRjMDdiYmNjNGUxNjA3MFwiLFwiNzM3MGY5MWNmYjY3ZTRmNTA4MTgwOWZhMjVkNDBmOWIxNzM1ZGJmN2MwYTExYTEzMGMwZDFhMDQxZTE3N2VhMVwiXSxbXCI5MGFkODViMzg5ZDZiOTM2NDYzZjlkMDUxMjY3OGRlMjA4Y2MzMzBiMTEzMDdmZmZhYjdhYzYzZTNmYjA0ZWQ0XCIsXCJlNTA3YTM2MjBhMzgyNjFhZmZkY2JkOTQyNzIyMmI4MzlhZWZhYmUxNTgyODk0ZDk5MWQ0ZDQ4Y2I2ZWYxNTBcIl0sW1wiOGY2OGI5ZDJmNjNiNWYzMzkyMzljMWFkOTgxZjE2MmVlODhjNTY3ODcyM2VhMzM1MWI3YjQ0NGM5ZWM0YzBkYVwiLFwiNjYyYTlmMmRiYTA2Mzk4NmRlMWQ5MGMyYjZiZTIxNWRiYmVhMmNmZTk1NTEwYmZkZjIzY2JmNzk1MDFmZmY4MlwiXSxbXCJlNGYzZmIwMTc2YWY4NWQ2NWZmOTlmZjkxOThjMzYwOTFmNDhlODY1MDM2ODFlM2U2Njg2ZmQ1MDUzMjMxZTExXCIsXCIxZTYzNjMzYWQwZWY0ZjFjMTY2MWE2ZDBlYTAyYjcyODZjYzdlNzRlYzk1MWQxYzk4MjJjMzg1NzZmZWI3M2JjXCJdLFtcIjhjMDBmYTliMThlYmYzMzFlYjk2MTUzN2E0NWE0MjY2YzcwMzRmMmYwZDRlMWQwNzE2ZmI2ZWFlMjBlYWUyOWVcIixcImVmYTQ3MjY3ZmVhNTIxYTFhOWRjMzQzYTM3MzZjOTc0YzJmYWRhZmE4MWUzNmM1NGU3ZDJhNGM2NjcwMjQxNGJcIl0sW1wiZTdhMjZjZTY5ZGQ0ODI5ZjNlMTBjZWMwYTllOThlZDMxNDNkMDg0ZjMwOGI5MmMwOTk3ZmRkZmM2MGNiM2U0MVwiLFwiMmE3NThlMzAwZmE3OTg0YjQ3MWIwMDZhMWFhZmJiMThkMGE2YjJjMDQyMGU4M2UyMGU4YTk0MjFjZjJjZmQ1MVwiXSxbXCJiNjQ1OWUwZWUzNjYyZWM4ZDIzNTQwYzIyM2JjYmRjNTcxY2JjYjk2N2Q3OTQyNGYzY2YyOWViM2RlNmI4MGVmXCIsXCI2N2M4NzZkMDZmM2UwNmRlMWRhZGYxNmU1NjYxZGIzYzRiM2FlNmQ0OGUzNWIyZmYzMGJmMGI2MWE3MWJhNDVcIl0sW1wiZDY4YTgwYzgyODBiYjg0MDc5MzIzNGFhMTE4ZjA2MjMxZDZmMWZjNjdlNzNjNWE1ZGVkYTBmNWI0OTY5NDNlOFwiLFwiZGI4YmE5ZmZmNGI1ODZkMDBjNGIxZjkxNzdiMGUyOGI1YjBlN2I4Zjc4NDUyOTVhMjk0Yzg0MjY2YjEzMzEyMFwiXSxbXCIzMjRhZWQ3ZGY2NWM4MDQyNTJkYzAyNzA5MDdhMzBiMDk2MTJhZWI5NzM0NDljZWE0MDk1OTgwZmMyOGQzZDVkXCIsXCI2NDhhMzY1Nzc0YjYxZjJmZjEzMGMwYzM1YWVjMWY0ZjE5MjEzYjBjN2UzMzI4NDM5NjcyMjRhZjk2YWI3Yzg0XCJdLFtcIjRkZjljMTQ5MTljZGU2MWY2ZDUxZGZkYmU1ZmVlNWRjZWVjNDE0M2JhOGQxY2E4ODhlOGJkMzczZmQwNTRjOTZcIixcIjM1ZWM1MTA5MmQ4NzI4MDUwOTc0YzIzYTFkODVkNGI1ZDUwNmNkYzI4ODQ5MDE5MmViYWMwNmNhZDEwZDVkXCJdLFtcIjljMzkxOWE4NGE0NzQ4NzBmYWVkOGE5YzFjYzY2MDIxNTIzNDg5MDU0ZDdmMDMwOGNiZmM5OWM4YWMxZjk4Y2RcIixcImRkYjg0ZjBmNGE0ZGRkNTc1ODRmMDQ0YmYyNjBlNjQxOTA1MzI2Zjc2YzY0YzhlNmJlN2U1ZTAzZDRmYzU5OWRcIl0sW1wiNjA1NzE3MGIxZGQxMmZkZjhkZTA1ZjI4MWQ4ZTA2YmI5MWUxNDkzYThiOTFkNGNjNWEyMTM4MjEyMGE5NTllNVwiLFwiOWExYWYwYjI2YTZhNDgwN2FkZDlhMmRhZjcxZGYyNjI0NjUxNTJiYzNlZTI0YzY1ZTg5OWJlOTMyMzg1YTJhOFwiXSxbXCJhNTc2ZGY4ZTIzYTA4NDExNDIxNDM5YTQ1MThkYTMxODgwY2VmMGZiYTdkNGRmMTJiMWE2OTczZWVjYjk0MjY2XCIsXCI0MGE2YmYyMGU3NjY0MGIyYzkyYjk3YWZlNThjZDgyYzQzMmUxMGE3ZjUxNGQ5ZjNlZThiZTExYWUxYjI4ZWM4XCJdLFtcIjc3NzhhNzhjMjhkZWMzZTMwYTA1ZmU5NjI5ZGU4YzM4YmIzMGQxZjVjZjlhM2EyMDhmNzYzODg5YmU1OGFkNzFcIixcIjM0NjI2ZDlhYjVhNWIyMmZmNzA5OGUxMmYyZmY1ODAwODdiMzg0MTFmZjI0YWM1NjNiNTEzZmMxZmQ5ZjQzYWNcIl0sW1wiOTI4OTU1ZWU2MzdhODQ0NjM3MjlmZDMwZTdhZmQyZWQ1Zjk2Mjc0ZTVhZDdlNWNiMDllZGE5YzA2ZDkwM2FjXCIsXCJjMjU2MjEwMDNkM2Y0MmE4MjdiNzhhMTMwOTNhOTVlZWFjM2QyNmVmYThhOGQ4M2ZjNTE4MGU5MzViY2QwOTFmXCJdLFtcIjg1ZDBmZWYzZWM2ZGIxMDkzOTkwNjRmM2EwZTNiMjg1NTY0NWI0YTkwN2FkMzU0NTI3YWFlNzUxNjNkODI3NTFcIixcIjFmMDM2NDg0MTNhMzhjMGJlMjlkNDk2ZTU4MmNmNTY2M2U4NzUxZTk2ODc3MzMxNTgyYzIzN2EyNGViMWY5NjJcIl0sW1wiZmYyYjBkY2U5N2VlY2U5N2MxYzliNjA0MTc5OGI4NWRmZGZiNmQ4ODgyZGEyMDMwOGY1NDA0ODI0NTI2MDg3ZVwiLFwiNDkzZDEzZmVmNTI0YmExODhhZjRjNGRjNTRkMDc5MzZjN2I3ZWQ2ZmI5MGUyY2ViMmM5NTFlMDFmMGMyOTkwN1wiXSxbXCI4MjdmYmJlNGIxZTg4MGVhOWVkMmIyZTYzMDFiMjEyYjU3ZjFlZTE0OGNkNmRkMjg3ODBlNWUyY2Y4NTZlMjQxXCIsXCJjNjBmOWM5MjNjNzI3YjBiNzFiZWYyYzY3ZDFkMTI2ODdmZjdhNjMxODY5MDMxNjZkNjA1YjY4YmFlYzI5M2VjXCJdLFtcImVhYTY0OWYyMWY1MWJkYmFlN2JlNGFlMzRjZTZlNTIxN2E1OGZkY2U3ZjQ3ZjlhYTdmM2I1OGZhMjEyMGUyYjNcIixcImJlMzI3OWVkNWJiYmIwM2FjNjlhODBmODk4NzlhYTVhMDFhNmI5NjVmMTNmN2U1OWQ0N2E1MzA1YmE1YWQ5M2RcIl0sW1wiZTRhNDJkNDNjNWNmMTY5ZDkzOTFkZjZkZWNmNDJlZTU0MWI2ZDhmMGM5YTEzNzQwMWUyMzYzMmRkYTM0ZDI0ZlwiLFwiNGQ5ZjkyZTcxNmQxYzczNTI2ZmM5OWNjZmI4YWQzNGNlODg2ZWVkZmE4ZDhlNGYxM2E3ZjcxMzFkZWJhOTQxNFwiXSxbXCIxZWM4MGZlZjM2MGNiZGQ5NTQxNjBmYWRhYjM1MmI2YjkyYjUzNTc2YTg4ZmVhNDk0NzE3M2I5ZDQzMDBiZjE5XCIsXCJhZWVmZTkzNzU2YjUzNDBkMmYzYTQ5NThhN2FiYmY1ZTAxNDZlNzdmNjI5NWEwN2I2NzFjZGMxY2MxMDdjZWZkXCJdLFtcIjE0NmE3NzhjMDQ2NzBjMmY5MWIwMGFmNDY4MGRmYThiY2UzNDkwNzE3ZDU4YmE4ODlkZGI1OTI4MzY2NjQyYmVcIixcImIzMThlMGVjMzM1NDAyOGFkZDY2OTgyN2Y5ZDRiMjg3MGFhYTk3MWQyZjdlNWVkMWQwYjI5NzQ4M2Q4M2VmZDBcIl0sW1wiZmE1MGMwZjYxZDIyZTVmMDdlM2FjZWJiMWFhMDdiMTI4ZDAwMTIyMDlhMjhiOTc3NmQ3NmE4NzkzMTgwZWVmOVwiLFwiNmI4NGM2OTIyMzk3ZWJhOWI3MmNkMjg3MjI4MWE2OGE1ZTY4MzI5M2E1N2EyMTNiMzhjZDhkN2QzZjRmMjgxMVwiXSxbXCJkYTFkNjFkMGNhNzIxYTExYjFhNWJmNmI3ZDg4ZTg0MjFhMjg4YWI1ZDViYmE1MjIwZTUzZDMyYjVmMDY3ZWMyXCIsXCI4MTU3ZjU1YTdjOTkzMDZjNzljMDc2NjE2MWM5MWUyOTY2YTczODk5ZDI3OWI0OGE2NTVmYmEwZjFhZDgzNmYxXCJdLFtcImE4ZTI4MmZmMGM5NzA2OTA3MjE1ZmY5OGU4ZmQ0MTY2MTUzMTFkZTA0NDZmMWUwNjJhNzNiMDYxMGQwNjRlMTNcIixcIjdmOTczNTViOGRiODFjMDlhYmZiN2YzYzViMjUxNTg4OGI2NzlhM2U1MGRkNmJkNmNlZjdjNzMxMTFmNGNjMGNcIl0sW1wiMTc0YTUzYjljOWEyODU4NzJkMzllNTZlNjkxM2NhYjE1ZDU5YjFmYTUxMjUwOGMwMjJmMzgyZGU4MzE5NDk3Y1wiLFwiY2NjOWRjMzdhYmZjOWMxNjU3YjQxNTVmMmM0N2Y5ZTY2NDZiM2ExZDhjYjk4NTQzODNkYTEzYWMwNzlhZmE3M1wiXSxbXCI5NTkzOTY5ODE5NDM3ODVjM2QzZTU3ZWRmNTAxOGNkYmUwMzllNzMwZTQ5MThiM2Q4ODRmZGZmMDk0NzViN2JhXCIsXCIyZTdlNTUyODg4YzMzMWRkOGJhMDM4NmE0YjljZDY4NDljNjUzZjY0Yzg3MDkzODVlOWI4YWJmODc1MjRmMmZkXCJdLFtcImQyYTYzYTUwYWU0MDFlNTZkNjQ1YTExNTNiMTA5YThmY2NhMGE0M2Q1NjFmYmEyZGJiNTEzNDBjOWQ4MmIxNTFcIixcImU4MmQ4NmZiNjQ0M2ZjYjc1NjVhZWU1OGIyOTQ4MjIwYTcwZjc1MGFmNDg0Y2E1MmQ0MTQyMTc0ZGNmODk0MDVcIl0sW1wiNjQ1ODdlMjMzNTQ3MWViODkwZWU3ODk2ZDdjZmRjODY2YmFjYmRiZDM4MzkzMTdiMzQzNmY5YjQ1NjE3ZTA3M1wiLFwiZDk5ZmNkZDViZjY5MDJlMmFlOTZkZDY0NDdjMjk5YTE4NWI5MGEzOTEzM2FlYWIzNTgyOTllNWU5ZmFmNjU4OVwiXSxbXCI4NDgxYmRlMGU0ZTRkODg1YjNhNTQ2ZDNlNTQ5ZGUwNDJmMGFhNmNlYTI1MGU3ZmQzNThkNmM4NmRkNDVlNDU4XCIsXCIzOGVlN2I4Y2JhNTQwNGRkODRhMjViZjM5Y2VjYjJjYTkwMGE3OWM0MmIyNjJlNTU2ZDY0YjFiNTk3NzkwNTdlXCJdLFtcIjEzNDY0YTU3YTc4MTAyYWE2MmI2OTc5YWU4MTdmNDYzN2ZmY2ZlZDNjNGIxY2UzMGJjZDYzMDNmNmNhZjY2NmJcIixcIjY5YmUxNTkwMDQ2MTQ1ODBlZjdlNDMzNDUzY2NiMGNhNDhmMzAwYTgxZDA5NDJlMTNmNDk1YTkwN2Y2ZWNjMjdcIl0sW1wiYmM0YTlkZjViNzEzZmUyZTlhZWY0MzBiY2MxZGM5N2EwY2Q5Y2NlZGUyZjI4NTg4Y2FkYTNhMGQyZDgzZjM2NlwiLFwiZDNhODFjYTZlNzg1YzA2MzgzOTM3YWRmNGI3OThjYWE2ZThhOWZiZmE1NDdiMTZkNzU4ZDY2NjU4MWYzM2MxXCJdLFtcIjhjMjhhOTdiZjgyOThiYzBkMjNkOGM3NDk0NTJhMzJlNjk0YjY1ZTMwYTk0NzJhMzk1NGFiMzBmZTUzMjRjYWFcIixcIjQwYTMwNDYzYTMzMDUxOTMzNzhmZWRmMzFmN2NjMGViN2FlNzg0ZjA0NTFjYjk0NTllNzFkYzczY2JlZjk0ODJcIl0sW1wiOGVhOTY2NjEzOTUyN2E4YzFkZDk0Y2U0ZjA3MWZkMjNjOGIzNTBjNWE0YmIzMzc0OGM0YmExMTFmYWNjYWUwXCIsXCI2MjBlZmFiYmM4ZWUyNzgyZTI0ZTdjMGNmYjk1YzVkNzM1Yjc4M2JlOWNmMGY4ZTk1NWFmMzRhMzBlNjJiOTQ1XCJdLFtcImRkMzYyNWZhZWY1YmEwNjA3NDY2OTcxNmJiZDM3ODhkODliZGRlODE1OTU5OTY4MDkyZjc2Y2M0ZWI5YTk3ODdcIixcIjdhMTg4ZmEzNTIwZTMwZDQ2MWRhMjUwMTA0NTczMWNhOTQxNDYxOTgyODgzMzk1OTM3ZjY4ZDAwYzY0NGE1NzNcIl0sW1wiZjcxMGQ3OWQ5ZWI5NjIyOTdlNGY2MjMyYjQwZThmN2ZlYjJiYzYzODE0NjE0ZDY5MmMxMmRlNzUyNDA4MjIxZVwiLFwiZWE5OGU2NzIzMmQzYjMyOTVkM2I1MzU1MzIxMTVjY2FjODYxMmM3MjE4NTE2MTc1MjZhZTQ3YTljNzdiZmM4MlwiXV19LG5hZjp7d25kOjcscG9pbnRzOltbXCJmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5XCIsXCIzODhmN2IwZjYzMmRlODE0MGZlMzM3ZTYyYTM3ZjM1NjY1MDBhOTk5MzRjMjIzMWI2Y2I5ZmQ3NTg0YjhlNjcyXCJdLFtcIjJmOGJkZTRkMWEwNzIwOTM1NWI0YTcyNTBhNWM1MTI4ZTg4Yjg0YmRkYzYxOWFiN2NiYThkNTY5YjI0MGVmZTRcIixcImQ4YWMyMjI2MzZlNWUzZDZkNGRiYTlkZGE2YzljNDI2Zjc4ODI3MWJhYjBkNjg0MGRjYTg3ZDNhYTZhYzYyZDZcIl0sW1wiNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliY1wiLFwiNmFlYmNhNDBiYTI1NTk2MGEzMTc4ZDZkODYxYTU0ZGJhODEzZDBiODEzZmRlN2I1YTUwODI2MjgwODcyNjRkYVwiXSxbXCJhY2Q0ODRlMmYwYzdmNjUzMDlhZDE3OGE5ZjU1OWFiZGUwOTc5Njk3NGM1N2U3MTRjMzVmMTEwZGZjMjdjY2JlXCIsXCJjYzMzODkyMWIwYTdkOWZkNjQzODA5NzE3NjNiNjFlOWFkZDg4OGE0Mzc1ZjhlMGYwNWNjMjYyYWM2NGY5YzM3XCJdLFtcIjc3NGFlN2Y4NThhOTQxMWU1ZWY0MjQ2YjcwYzY1YWFjNTY0OTk4MGJlNWMxNzg5MWJiZWMxNzg5NWRhMDA4Y2JcIixcImQ5ODRhMDMyZWI2YjVlMTkwMjQzZGQ1NmQ3YjdiMzY1MzcyZGIxZTJkZmY5ZDZhODMwMWQ3NGM5Yzk1M2M2MWJcIl0sW1wiZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOFwiLFwiYWIwOTAyZThkODgwYTg5NzU4MjEyZWI2NWNkYWY0NzNhMWEwNmRhNTIxZmE5MWYyOWI1Y2I1MmRiMDNlZDgxXCJdLFtcImQ3OTI0ZDRmN2Q0M2VhOTY1YTQ2NWFlMzA5NWZmNDExMzFlNTk0NmYzYzg1Zjc5ZTQ0YWRiY2Y4ZTI3ZTA4MGVcIixcIjU4MWUyODcyYTg2YzcyYTY4Mzg0MmVjMjI4Y2M2ZGVmZWE0MGFmMmJkODk2ZDNhNWM1MDRkYzlmZjZhMjZiNThcIl0sW1wiZGVmZGVhNGNkYjY3Nzc1MGE0MjBmZWU4MDdlYWNmMjFlYjk4OThhZTc5Yjk3Njg3NjZlNGZhYTA0YTJkNGEzNFwiLFwiNDIxMWFiMDY5NDYzNTE2OGU5OTdiMGVhZDJhOTNkYWVjZWQxZjRhMDRhOTVjMGY2Y2ZiMTk5ZjY5ZTU2ZWI3N1wiXSxbXCIyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjXCIsXCI4NWU4OWJjMDM3OTQ1ZDkzYjM0MzA4M2I1YTFjODYxMzFhMDFmNjBjNTAyNjk3NjNiNTcwYzg1NGU1YzA5YjdhXCJdLFtcIjM1MmJiZjRhNGNkZDEyNTY0ZjkzZmEzMzJjZTMzMzMwMWQ5YWQ0MDI3MWY4MTA3MTgxMzQwYWVmMjViZTU5ZDVcIixcIjMyMWViNDA3NTM0OGY1MzRkNTljMTgyNTlkZGEzZTFmNGExYjNiMmU3MWIxMDM5YzY3YmQzZDhiY2Y4MTk5OGNcIl0sW1wiMmZhMjEwNGQ2YjM4ZDExYjAyMzAwMTA1NTk4NzkxMjRlNDJhYjhkZmVmZjVmZjI5ZGM5Y2RhZGQ0ZWNhY2MzZlwiLFwiMmRlMTA2ODI5NWRkODY1YjY0NTY5MzM1YmQ1ZGQ4MDE4MWQ3MGVjZmM4ODI2NDg0MjNiYTc2YjUzMmI3ZDY3XCJdLFtcIjkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTRcIixcIjczMDE2ZjdiZjIzNGFhZGU1ZDFhYTcxYmRlYTJiMWZmM2ZjMGRlMmE4ODc5MTJmZmU1NGEzMmNlOTdjYjM0MDJcIl0sW1wiZGFlZDRmMmJlM2E4YmYyNzhlNzAxMzJmYjBiZWI3NTIyZjU3MGUxNDRiZjYxNWMwN2U5OTZkNDQzZGVlODcyOVwiLFwiYTY5ZGNlNGE3ZDZjOThlOGQ0YTFhY2E4N2VmOGQ3MDAzZjgzYzIzMGYzYWZhNzI2YWI0MGU1MjI5MGJlMWM1NVwiXSxbXCJjNDRkMTJjNzA2NWQ4MTJlOGFjZjI4ZDdjYmIxOWY5MDExZWNkOWU5ZmRmMjgxYjBlNmEzYjVlODdkMjJlN2RiXCIsXCIyMTE5YTQ2MGNlMzI2Y2RjNzZjNDU5MjZjOTgyZmRhYzBlMTA2ZTg2MWVkZjYxYzVhMDM5MDYzZjBlMGU2NDgyXCJdLFtcIjZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjRcIixcImUwMjJjZjQyYzJiZDRhNzA4YjNmNTEyNmYxNmEyNGFkOGIzM2JhNDhkMDQyM2I2ZWZkNWU2MzQ4MTAwZDhhODJcIl0sW1wiMTY5N2ZmYTZmZDlkZTYyN2MwNzdlM2QyZmU1NDEwODRjZTEzMzAwYjBiZWMxMTQ2Zjk1YWU1N2YwZDBiZDZhNVwiLFwiYjljMzk4ZjE4NjgwNmY1ZDI3NTYxNTA2ZTQ1NTc0MzNhMmNmMTUwMDllNDk4YWU3YWRlZTlkNjNkMDFiMjM5NlwiXSxbXCI2MDViZGIwMTk5ODE3MThiOTg2ZDBmMDdlODM0Y2IwZDlkZWI4MzYwZmZiN2Y2MWRmOTgyMzQ1ZWYyN2E3NDc5XCIsXCIyOTcyZDJkZTRmOGQyMDY4MWE3OGQ5M2VjOTZmZTIzYzI2YmZhZTg0ZmIxNGRiNDNiMDFlMWU5MDU2YjhjNDlcIl0sW1wiNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZFwiLFwiODBmYzA2YmQ4Y2M1YjAxMDk4MDg4YTE5NTBlZWQwZGIwMWFhMTMyOTY3YWI0NzIyMzVmNTY0MjQ4M2IyNWVhZlwiXSxbXCI4MGM2MGFkMDA0MGYyN2RhZGU1YjRiMDZjNDA4ZTU2YjJjNTBlOWY1NmI5YjhiNDI1ZTU1NWMyZjg2MzA4YjZmXCIsXCIxYzM4MzAzZjFjYzVjMzBmMjZlNjZiYWQ3ZmU3MmY3MGE2NWVlZDRjYmU3MDI0ZWIxYWEwMWY1NjQzMGJkNTdhXCJdLFtcIjdhOTM3NWFkNjE2N2FkNTRhYTc0YzYzNDhjYzU0ZDM0NGNjNWRjOTQ4N2Q4NDcwNDlkNWVhYmIwZmEwM2M4ZmJcIixcImQwZTNmYTllY2E4NzI2OTA5NTU5ZTBkNzkyNjkwNDZiZGM1OWVhMTBjNzBjZTJiMDJkNDk5ZWMyMjRkYzdmN1wiXSxbXCJkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5XCIsXCJlZWNmNDEyNTMxMzZlNWY5OTk2NmYyMTg4MWZkNjU2ZWJjNDM0NTQwNWM1MjBkYmMwNjM0NjViNTIxNDA5OTMzXCJdLFtcIjQ5MzcwYTRiNWY0MzQxMmVhMjVmNTE0ZThlY2RhZDA1MjY2MTE1ZTRhN2VjYjEzODcyMzE4MDhmOGI0NTk2M1wiLFwiNzU4ZjNmNDFhZmQ2ZWQ0MjhiMzA4MWIwNTEyZmQ2MmE1NGMzZjNhZmJiNWI2NzY0YjY1MzA1MmExMjk0OWM5YVwiXSxbXCI3N2YyMzA5MzZlZTg4Y2JiZDczZGY5MzBkNjQ3MDJlZjg4MWQ4MTFlMGUxNDk4ZTJmMWMxM2ViMWZjMzQ1ZDc0XCIsXCI5NThlZjQyYTc4ODZiNjQwMGEwODI2NmU5YmExYjM3ODk2Yzk1MzMwZDk3MDc3Y2JiZThlYjNjNzY3MWM2MGQ2XCJdLFtcImYyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzBcIixcImUwZGVkYzliM2IyZjhkYWQ0ZGExZjMyZGVjMjUzMWRmOWViNWZiZWIwNTk4ZTRmZDFhMTE3ZGJhNzAzYTNjMzdcIl0sW1wiNDYzYjNkOWY2NjI2MjFmYjFiNGJlOGZiYmUyNTIwMTI1YTIxNmNkZmM5ZGFlM2RlYmNiYTQ4NTBjNjkwZDQ1YlwiLFwiNWVkNDMwZDc4YzI5NmMzNTQzMTE0MzA2ZGQ4NjIyZDdjNjIyZTI3Yzk3MGExZGUzMWNiMzc3YjAxYWY3MzA3ZVwiXSxbXCJmMTZmODA0MjQ0ZTQ2ZTJhMDkyMzJkNGFmZjNiNTk5NzZiOThmYWMxNDMyOGEyZDFhMzI0OTZiNDk5OThmMjQ3XCIsXCJjZWRhYmQ5YjgyMjAzZjdlMTNkMjA2ZmNkZjRlMzNkOTJhNmM1M2MyNmU1Y2NlMjZkNjU3OTk2MmM0ZTMxZGY2XCJdLFtcImNhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDFcIixcImNiNDc0NjYwZWYzNWY1ZjJhNDFiNjQzZmE1ZTQ2MDU3NWY0ZmE5Yjc5NjIyMzJhNWMzMmY5MDgzMThhMDQ0NzZcIl0sW1wiMjYwMGNhNGIyODJjYjk4NmY4NWQwZjE3MDk5NzlkOGI0NGEwOWMwN2NiODZkN2MxMjQ0OTdiYzg2ZjA4MjEyMFwiLFwiNDExOWI4ODc1M2MxNWJkNmE2OTNiMDNmY2RkYmI0NWQ1YWM2YmU3NGFiNWYwZWY0NGIwYmU5NDc1YTdlNGI0MFwiXSxbXCI3NjM1Y2E3MmQ3ZTg0MzJjMzM4ZWM1M2NkMTIyMjBiYzAxYzQ4Njg1ZTI0ZjdkYzhjNjAyYTc3NDY5OThlNDM1XCIsXCI5MWI2NDk2MDk0ODlkNjEzZDFkNWU1OTBmNzhlNmQ3NGVjZmMwNjFkNTcwNDhiYWQ5ZTc2ZjMwMmM1YjljNjFcIl0sW1wiNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOFwiLFwiNjczZmI4NmU1YmRhMzBmYjNjZDBlZDMwNGVhNDlhMDIzZWUzM2QwMTk3YTY5NWQwYzVkOTgwOTNjNTM2NjgzXCJdLFtcImUzZTZiZDEwNzFhMWU5NmFmZjU3ODU5YzgyZDU3MGYwMzMwODAwNjYxZDFjOTUyZjlmZTI2OTQ2OTFkOWI5ZThcIixcIjU5YzllMGJiYTM5NGU3NmY0MGMwYWE1ODM3OWEzY2I2YTVhMjI4Mzk5M2U5MGM0MTY3MDAyYWY0OTIwZTM3ZjVcIl0sW1wiMTg2YjQ4M2QwNTZhMDMzODI2YWU3M2Q4OGY3MzI5ODVjNGNjYjFmMzJiYTM1ZjRiNGNjNDdmZGNmMDRhYTZlYlwiLFwiM2I5NTJkMzJjNjdjZjc3ZTJlMTc0NDZlMjA0MTgwYWIyMWZiODA5MDg5NTEzOGI0YTRhNzk3Zjg2ZTgwODg4YlwiXSxbXCJkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmXCIsXCI1NWViMmRhZmQ4NGQ2Y2NkNWY4NjJiNzg1ZGMzOWQ0YWIxNTcyMjI3MjBlZjlkYTIxN2I4YzQ1Y2YyYmEyNDE3XCJdLFtcIjVlZGQ1Y2MyM2M1MWU4N2E0OTdjYTgxNWQ1ZGNlMGY4YWI1MjU1NGY4NDllZDg5OTVkZTY0YzVmMzRjZTcxNDNcIixcImVmYWU5YzhkYmMxNDEzMDY2MWU4Y2VjMDMwYzg5YWQwYzEzYzY2YzBkMTdhMjkwNWNkYzcwNmFiNzM5OWE4NjhcIl0sW1wiMjkwNzk4YzJiNjQ3NjgzMGRhMTJmZTAyMjg3ZTllNzc3YWEzZmJhMWMzNTViMTdhNzIyZDM2MmY4NDYxNGZiYVwiLFwiZTM4ZGE3NmRjZDQ0MDYyMTk4OGQwMGJjZjc5YWYyNWQ1YjI5YzA5NGRiMmEyMzE0NmQwMDNhZmQ0MTk0M2U3YVwiXSxbXCJhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1XCIsXCJmOThhM2ZkODMxZWIyYjc0OWE5M2IwZTZmMzVjZmI0MGM4Y2Q1YWE2NjdhMTU1ODFiYzJmZWRlZDQ5OGZkOWM2XCJdLFtcIjc2NmRiYjI0ZDEzNGU3NDVjY2NhYTI4Yzk5YmYyNzQ5MDZiYjY2YjI2ZGNmOThkZjhkMmZlZDUwZDg4NDI0OWFcIixcIjc0NGIxMTUyZWFjYmU1ZTM4ZGNjODg3OTgwZGEzOGI4OTc1ODRhNjVmYTA2Y2VkZDJjOTI0Zjk3Y2JhYzU5OTZcIl0sW1wiNTlkYmY0NmY4Yzk0NzU5YmEyMTI3N2MzMzc4NGY0MTY0NWY3YjQ0ZjZjNTk2YTU4Y2U5MmU2NjYxOTFhYmUzZVwiLFwiYzUzNGFkNDQxNzVmYmMzMDBmNGVhNmNlNjQ4MzA5YTA0MmNlNzM5YTc5MTk3OThjZDg1ZTIxNmM0YTMwN2Y2ZVwiXSxbXCJmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4XCIsXCJlMTM4MTdiNDRlZTE0ZGU2NjNiZjRiYzgwODM0MWYzMjY5NDllMjFhNmE3NWMyNTcwNzc4NDE5YmRhZjU3MzNkXCJdLFtcIjc3NTRiNGZhMGU4YWNlZDA2ZDQxNjdhMmM1OWNjYTRjZGExODY5YzA2ZWJhZGZiNjQ4ODU1MDAxNWE4ODUyMmNcIixcIjMwZTkzZTg2NGU2NjlkODIyMjRiOTY3YzMwMjBiOGZhOGQxZTRlMzUwYjZjYmNjNTM3YTQ4YjU3ODQxMTYzYTJcIl0sW1wiOTQ4ZGNhZGY1OTkwZTA0OGFhMzg3NGQ0NmFiZWY5ZDcwMTg1OGY5NWRlODA0MWQyYTY4MjhjOTllMjI2MjUxOVwiLFwiZTQ5MWE0MjUzN2Y2ZTU5N2Q1ZDI4YTMyMjRiMWJjMjVkZjkxNTRlZmJkMmVmMWQyY2JiYTJjYWU1MzQ3ZDU3ZVwiXSxbXCI3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiXCIsXCIxMDBiNjEwZWM0ZmZiNDc2MGQ1YzFmYzEzM2VmNmY2YjEyNTA3YTA1MWYwNGFjNTc2MGFmYTViMjlkYjgzNDM3XCJdLFtcIjM1MTQwODc4MzQ5NjRiNTRiMTViMTYwNjQ0ZDkxNTQ4NWExNjk3NzIyNWI4ODQ3YmIwZGQwODUxMzdlYzQ3Y2FcIixcImVmMGFmYmIyMDU2MjA1NDQ4ZTE2NTJjNDhlODEyN2ZjNjAzOWU3N2MxNWMyMzc4YjdlN2QxNWEwZGUyOTMzMTFcIl0sW1wiZDNjYzMwYWQ2YjQ4M2U0YmM3OWNlMmM5ZGQ4YmM1NDk5M2U5NDdlYjhkZjc4N2I0NDI5NDNkM2Y3YjUyN2VhZlwiLFwiOGIzNzhhMjJkODI3Mjc4ZDg5YzVlOWJlOGY5NTA4YWUzYzJhZDQ2MjkwMzU4NjMwYWZiMzRkYjA0ZWVkZTBhNFwiXSxbXCIxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwXCIsXCI2ODY1MWNmOWI2ZGE5MDNlMDkxNDQ0OGM2Y2Q5ZDRjYTg5Njg3OGY1MjgyYmU0YzhjYzA2ZTJhNDA0MDc4NTc1XCJdLFtcIjczM2NlODBkYTk1NWE4YTI2OTAyYzk1NjMzZTYyYTk4NTE5MjQ3NGI1YWYyMDdkYTZkZjdiNGZkNWZjNjFjZDRcIixcImY1NDM1YTJiZDJiYWRmN2Q0ODVhNGQ4YjhkYjlmY2NlM2UxZWY4ZTAyMDFlNDU3OGM1NDY3M2JjMWRjNWVhMWRcIl0sW1wiMTVkOTQ0MTI1NDk0NTA2NGNmMWExYzMzYmJkM2I0OWY4OTY2YzUwOTIxNzFlNjk5ZWYyNThkZmFiODFjMDQ1Y1wiLFwiZDU2ZWIzMGI2OTQ2M2U3MjM0ZjUxMzdiNzNiODQxNzc0MzQ4MDBiYWNlYmZjNjg1ZmMzN2JiZTllZmU0MDcwZFwiXSxbXCJhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwXCIsXCJlZGQ3N2Y1MGJjYjVhM2NhYjJlOTA3MzczMDk2NjdmMjY0MTQ2MmE1NDA3MGYzZDUxOTIxMmQzOWMxOTdhNjI5XCJdLFtcImUyMmZiZTE1YzBhZjhjY2M1NzgwYzA3MzVmODRkYmU5YTc5MGJhZGVlODI0NWMwNmM3Y2EzNzMzMWNiMzY5ODBcIixcImE4NTViYWJhZDVjZDYwYzg4YjQzMGE2OWY1M2ExYTdhMzgyODkxNTQ5NjQ3OTliZTQzZDA2ZDc3ZDMxZGEwNlwiXSxbXCIzMTEwOTFkZDk4NjBlOGUyMGVlMTM0NzNjMTE1NWY1ZjY5NjM1ZTM5NDcwNGVhYTc0MDA5NDUyMjQ2Y2ZhOWIzXCIsXCI2NmRiNjU2Zjg3ZDFmMDRmZmZkMWYwNDc4OGMwNjgzMDg3MWVjNWE2NGZlZWU2ODViZDgwZjBiMTI4NmQ4Mzc0XCJdLFtcIjM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGZcIixcIjk0MTQ2ODVlOTdiMWI1OTU0YmQ0NmY3MzAxNzQxMzZkNTdmMWNlZWI0ODc0NDNkYzUzMjE4NTdiYTczYWJlZVwiXSxbXCJmMjE5ZWE1ZDZiNTQ3MDFjMWMxNGRlNWI1NTdlYjQyYThkMTNmM2FiYmNkMDhhZmZjYzJhNWU2YjA0OWI4ZDYzXCIsXCI0Y2I5NTk1N2U4M2Q0MGIwZjczYWY0NTQ0Y2NjZjZiMWY0YjA4ZDNjMDdiMjdmYjhkOGMyOTYyYTQwMDc2NmQxXCJdLFtcImQ3Yjg3NDBmNzRhOGZiYWFiMWY2ODNkYjhmNDVkZTI2NTQzYTU0OTBiY2E2MjcwODcyMzY5MTI0NjlhMGI0NDhcIixcImZhNzc5NjgxMjhkOWM5MmVlMTAxMGYzMzdhZDQ3MTdlZmYxNWRiNWVkM2MwNDliMzQxMWUwMzE1ZWFhNDU5M2JcIl0sW1wiMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZlwiLFwiNWYzMDMyZjU4OTIxNTZlMzljY2QzZDc5MTViOWUxZGEyZTZkYWM5ZTZmMjZlOTYxMTE4ZDE0Yjg0NjJlMTY2MVwiXSxbXCI3NDYxZjM3MTkxNGFiMzI2NzEwNDVhMTU1ZDk4MzFlYTg3OTNkNzdjZDU5NTkyYzQzNDBmODZjYmMxODM0N2I1XCIsXCI4ZWMwYmEyMzhiOTZiZWMwY2JkZGRjYWUwYWE0NDI1NDJlZWUxZmY1MGM5ODZlYTZiMzk4NDdiM2NjMDkyZmY2XCJdLFtcImVlMDc5YWRiMWRmMTg2MDA3NDM1NmEyNWFhMzgyMDZhNmQ3MTZiMmMzZTY3NDUzZDI4NzY5OGJhZDdiMmIyZDZcIixcIjhkYzI0MTJhYWZlM2JlNWM0YzVmMzdlMGVjYzVmOWY2YTQ0Njk4OWFmMDRjNGUyNWViYWFjNDc5ZWMxYzhjMWVcIl0sW1wiMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNVwiLFwiNWU0NjMxMTUwZTYyZmI0MGQwZThjMmE3Y2E1ODA0YTM5ZDU4MTg2YTUwZTQ5NzEzOTYyNjc3OGUyNWIwNjc0ZFwiXSxbXCJlYWE1Zjk4MGMyNDVmNmYwMzg5NzgyOTBhZmE3MGI2YmQ4ODU1ODk3Zjk4YjZhYTQ4NWI5NjA2NWQ1MzdiZDk5XCIsXCJmNjVmNWQzZTI5MmMyZTA4MTlhNTI4MzkxYzk5NDYyNGQ3ODQ4NjlkN2U2ZWE2N2ZiMTgwNDEwMjRlZGMwN2RjXCJdLFtcIjc4Yzk0MDc1NDRhYzEzMjY5MmVlMTkxMGEwMjQzOTk1OGFlMDQ4NzcxNTEzNDJlYTk2YzRiNmIzNWE0OWY1MVwiLFwiZjNlMDMxOTE2OWViOWI4NWQ1NDA0Nzk1NTM5YTVlNjhmYTFmYmQ1ODNjMDY0ZDI0NjJiNjc1ZjE5NGEzZGRiNFwiXSxbXCI0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1XCIsXCI0MjI0MmE5NjkyODNhNWYzMzliYTdmMDc1ZTM2YmEyYWY5MjVjZTMwZDc2N2VkNmU1NWY0YjAzMTg4MGQ1NjJjXCJdLFtcImE1OThhODAzMGRhNmQ4NmM2YmM3ZjJmNTE0NGVhNTQ5ZDI4MjExZWE1OGZhYTcwZWJmNGMxZTY2NWMxZmU5YjVcIixcIjIwNGI1ZDZmODQ4MjJjMzA3ZTRiNGE3MTQwNzM3YWVjMjNmYzYzYjY1YjM1Zjg2YTEwMDI2ZGJkMmQ4NjRlNmJcIl0sW1wiYzQxOTE2MzY1YWJiMmI1ZDA5MTkyZjVmMmRiZWFmZWMyMDhmMDIwZjEyNTcwYTE4NGRiYWRjM2U1ODU5NTk5N1wiLFwiNGYxNDM1MWQwMDg3ZWZhNDlkMjQ1YjMyODk4NDk4OWQ1Y2FmOTQ1MGYzNGJmYzBlZDE2ZTk2YjU4ZmE5OTEzXCJdLFtcIjg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODFcIixcIjczODY3ZjU5YzA2NTllODE5MDRmOWExYzc1NDM2OThlNjI1NjJkNjc0NGMxNjljZTdhMzZkZTAxYThkNjE1NFwiXSxbXCI1ZTk1YmIzOTlhNjk3MWQzNzYwMjY5NDdmODliZGUyZjI4MmIzMzgxMDkyOGJlNGRlZDExMmFjNGQ3MGUyMGQ1XCIsXCIzOWYyM2YzNjY4MDkwODViZWViZmM3MTE4MTMxMzc3NWE5OWM5YWVkN2Q4YmEzOGIxNjEzODRjNzQ2MDEyODY1XCJdLFtcIjM2ZTQ2NDFhNTM5NDhmZDQ3NmMzOWY4YTk5ZmQ5NzRlNWVjMDc1NjRiNTMxNWQ4YmY5OTQ3MWJjYTBlZjJmNjZcIixcImQyNDI0YjFiMWFiZTRlYjgxNjQyMjdiMDg1YzlhYTk0NTZlYTEzNDkzZmQ1NjNlMDZmZDUxY2Y1Njk0Yzc4ZmNcIl0sW1wiMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2XCIsXCJlYWQxMjE2ODU5NWZlMWJlOTkyNTIxMjliNmU1NmIzMzkxZjdhYjE0MTBjZDFlMGVmM2RjZGNhYmQyZmRhMjI0XCJdLFtcIjhhYjg5ODE2ZGFkZmQ2YjZhMWYyNjM0ZmNmMDBlYzg0MDM3ODEwMjVlZDY4OTBjNDg0OTc0MjcwNmJkNDNlZGVcIixcIjZmZGNlZjA5ZjJmNmQwYTA0NGU2NTRhZWY2MjQxMzZmNTAzZDQ1OWMzZTg5ODQ1ODU4YTQ3YTkxMjljZGQyNGVcIl0sW1wiMWUzM2YxYTc0NmM5YzU3NzgxMzMzNDRkOTI5OWZjYWEyMGIwOTM4ZThhY2ZmMjU0NGJiNDAyODRiOGM1ZmI5NFwiLFwiNjA2NjAyNTdkZDExYjNhYTljOGVkNjE4ZDI0ZWRmZjIzMDZkMzIwZjFkMDMwMTBlMzNhN2QyMDU3ZjNiM2I2XCJdLFtcIjg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzFcIixcIjNkOThhOWNkZDAyNmRkNDNmMzkwNDhmMjVhODg0N2Y0ZmNhZmFkMTg5NWQ3YTYzM2M2ZmVkM2MzNWU5OTk1MTFcIl0sW1wiMjlkZjlmYmQ4ZDllNDY1MDkyNzVmNGIxMjVkNmQ0NWQ3ZmJlOWEzYjg3OGE3YWY4NzJhMjgwMDY2MWFjNWY1MVwiLFwiYjRjNGZlOTljNzc1YTYwNmUyZDg4NjIxNzkxMzlmZmRhNjFkYzg2MWMwMTllNTVjZDI4NzZlYjJhMjdkODRiXCJdLFtcImEwYjFjYWUwNmIwYTg0N2EzZmVhNmU2NzFhYWY4YWRmZGZlNThjYTJmNzY4MTA1YzgwODJiMmU0NDlmY2UyNTJcIixcImFlNDM0MTAyZWRkZTA5NThlYzRiMTlkOTE3YTZhMjhlNmI3MmRhMTgzNGFmZjBlNjUwZjA0OTUwM2EyOTZjZjJcIl0sW1wiNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1XCIsXCJjZjIxNzQxMThjOGI2ZDdhNGI0OGY2ZDUzNGNlNWM3OTQyMmMwODZhNjM0NjA1MDJiODI3Y2U2MmEzMjY2ODNjXCJdLFtcImQyNGE0NGUwNDdlMTliNmY1YWZiODFjN2NhMmY2OTA4MGE1MDc2Njg5YTAxMDkxOWY0MjcyNWMyYjc4OWEzM2JcIixcIjZmYjhkNTU5MWI0NjZmOGZjNjNkYjUwZjFjMGYxYzY5MDEzZjk5Njg4N2I4MjQ0ZDJjZGVjNDE3YWZlYThmYTNcIl0sW1wiZWEwMTYwNmE3YTZjOWNkZDI0OWZkZmNmYWNiOTk1ODQwMDFlZGQyOGFiYmFiNzdiNTEwNGU5OGU4ZTNiMzVkNFwiLFwiMzIyYWY0OTA4YzczMTJiMGNmYmZlMzY5ZjdhN2IzY2RiN2Q0NDk0YmMyODIzNzAwY2ZkNjUyMTg4YTNlYTk4ZFwiXSxbXCJhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmXCIsXCI2NzQ5ZTY3YzAyOWI4NWY1MmEwMzRlYWZkMDk2ODM2YjI1MjA4MTg2ODBlMjZhYzhmM2RmYmNkYjcxNzQ5NzAwXCJdLFtcImUzYWUxOTc0NTY2Y2EwNmNjNTE2ZDQ3ZTBmYjE2NWE2NzRhM2RhYmNmY2ExNWU3MjJmMGUzNDUwZjQ1ODg5XCIsXCIyYWVhYmU3ZTQ1MzE1MTAxMTYyMTdmMDdiZjRkMDczMDBkZTk3ZTQ4NzRmODFmNTMzNDIwYTcyZWViMGJkNmE0XCJdLFtcIjU5MWVlMzU1MzEzZDk5NzIxY2Y2OTkzZmZlZDFlM2UzMDE5OTNmZjNlZDI1ODgwMjA3NWVhOGNlZDM5N2UyNDZcIixcImIwZWE1NThhMTEzYzMwYmVhNjBmYzQ3NzU0NjBjNzkwMWZmMGIwNTNkMjVjYTJiZGVlZTk4ZjFhNGJlNWQxOTZcIl0sW1wiMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NFwiLFwiOTk4Yzc0YThjZDQ1YWMwMTI4OWQ1ODMzYTdiZWI0NzQ0ZmY1MzZiMDFiMjU3YmU0YzU3NjdiZWE5M2VhNTdhNFwiXSxbXCIzYzVkMmExYmEzOWM1YTE3OTAwMDA3MzhjOWUwYzQwYjhkY2RmZDU0Njg3NTRiNjQwNTU0MDE1N2UwMTdhYTdhXCIsXCJiMjI4NDI3OTk5NWEzNGUyZjlkNGRlNzM5NmZjMThiODBmOWI4YjlmZGQyNzBmNjY2MWY3OWNhNGM4MWJkMjU3XCJdLFtcImNjODcwNGI4YTYwYTBkZWZhM2E5OWE3Mjk5ZjJlOWMzZmJjMzk1YWZiMDRhYzA3ODQyNWVmOGExNzkzY2MwMzBcIixcImJkZDQ2MDM5ZmVlZDE3ODgxZDFlMDg2MmRiMzQ3ZjhjZjM5NWI3NGZjNGJjZGM0ZTk0MGI3NGUzYWMxZjFiMTNcIl0sW1wiYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5N1wiLFwiNmYwYTI1NmJjNWVmZGY0MjlhMmZiNjI0MmYxYTQzYTJkOWI5MjViYjRhNGIzYTI2YmI4ZTBmNDVlYjU5NjA5NlwiXSxbXCJjMTRmOGYyY2NiMjdkNmYxMDlmNmQwOGQwM2NjOTZhNjliYThjMzRlZWMwN2JiY2Y1NjZkNDhlMzNkYTY1OTNcIixcImMzNTlkNjkyM2JiMzk4ZjdmZDQ0NzNlMTZmZTFjMjg0NzViNzQwZGQwOTgwNzVlNmMwZTg2NDkxMTNkYzNhMzhcIl0sW1wiYTZjYmMzMDQ2YmM2YTQ1MGJhYzI0Nzg5ZmExNzExNWE0Yzk3MzllZDc1ZjhmMjFjZTQ0MWY3MmUwYjkwZTZlZlwiLFwiMjFhZTdmNDY4MGU4ODliYjEzMDYxOWUyYzBmOTVhMzYwY2ViNTczYzcwNjAzMTM5ODYyYWZkNjE3ZmE5YjlmXCJdLFtcIjM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzhcIixcIjYwZWE3ZjYxYTM1MzUyNGQxYzk4N2Y2ZWNlYzkyZjA4NmQ1NjVhYjY4Nzg3MGNiMTI2ODlmZjFlMzFjNzQ0NDhcIl0sW1wiZGE2NTQ1ZDIxODFkYjhkOTgzZjdkY2IzNzVlZjU4NjZkNDdjNjdiMWJmMzFjOGNmODU1ZWY3NDM3YjcyNjU2YVwiLFwiNDliOTY3MTVhYjY4NzhhNzllNzhmMDdjZTU2ODBjNWQ2NjczMDUxYjQ5MzViZDg5N2ZlYTgyNGI3N2RjMjA4YVwiXSxbXCJjNDA3NDdjYzlkMDEyY2IxYTEzYjgxNDgzMDljNmRlN2VjMjVkNjk0NWQ2NTcxNDZiOWQ1OTk0YjhmZWIxMTExXCIsXCI1Y2E1NjA3NTNiZTJhMTJmYzZkZTZjYWYyY2I0ODk1NjVkYjkzNjE1NmI5NTE0ZTFiYjVlODMwMzdlMGZhMmQ0XCJdLFtcIjRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDJcIixcIjc1NzFkNzRlZTVlMGZiOTJhN2E4YjMzYTA3NzgzMzQxYTU0OTIxNDRjYzU0YmNjNDBhOTQ0NzM2OTM2MDY0MzdcIl0sW1wiMzc3NWFiNzA4OWJjNmFmODIzYWJhMmUxYWY3MGIyMzZkMjUxY2FkYjBjODY3NDMyODc1MjJhMWIzYjBkZWRlYVwiLFwiYmU1MmQxMDdiY2ZhMDlkOGJjYjk3MzZhODI4Y2ZhN2ZhYzhkYjE3YmY3YTc2YTJjNDJhZDk2MTQwOTAxOGNmN1wiXSxbXCJjZWUzMWNiZjdlMzRlYzM3OWQ5NGZiODE0ZDNkNzc1YWQ5NTQ1OTVkMTMxNGJhODg0Njk1OWUzZTgyZjc0ZTI2XCIsXCI4ZmQ2NGExNGMwNmI1ODljMjZiOTQ3YWUyYmNmNmJmYTAxNDllZjBiZTE0ZWQ0ZDgwZjQ0OGEwMWM0M2IxYzZkXCJdLFtcImI0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODZcIixcIjM5ZTVjOTkyNWI1YTU0YjA3NDMzYTRmMThjNjE3MjZmOGJiMTMxYzAxMmNhNTQyZWIyNGE4YWMwNzIwMDY4MmFcIl0sW1wiZDQyNjNkZmMzZDJkZjkyM2EwMTc5YTQ4OTY2ZDMwY2U4NGUyNTE1YWZjM2RjY2MxYjc3OTA3NzkyZWJjYzYwZVwiLFwiNjJkZmFmMDdhMGY3OGZlYjMwZTMwZDYyOTU4NTNjZTE4OWUxMjc3NjBhZDZjZjdmYWUxNjRlMTIyYTIwOGQ1NFwiXSxbXCI0ODQ1NzUyNDgyMGZhNjVhNGY4ZDM1ZWI2OTMwODU3YzAwMzJhY2MwYTRhMmRlNDIyMjMzZWVkYTg5NzYxMmM0XCIsXCIyNWE3NDhhYjM2Nzk3OWQ5ODczM2MzOGExZmExYzJlN2RjNmNjMDdkYjJkNjBhOWFlN2E3NmFhYTQ5YmQwZjc3XCJdLFtcImRmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGFcIixcImVjZmI3MDU2Y2YxZGUwNDJmOTQyMGJhYjM5Njc5M2MwYzM5MGJkZTc0YjRiYmRmZjE2YTgzYWUwOWE5YTc1MTdcIl0sW1wiNmQ3ZWY2YjE3NTQzZjgzNzNjNTczZjQ0ZTFmMzg5ODM1ZDg5YmNiYzYwNjJjZWQzNmM4MmRmODNiOGZhZTg1OVwiLFwiY2Q0NTBlYzMzNTQzODk4NmRmZWZhMTBjNTdmZWE5YmNjNTIxYTA5NTliMmQ4MGJiZjc0YjE5MGRjYTcxMmQxMFwiXSxbXCJlNzU2MDVkNTkxMDJhNWEyNjg0NTAwZDNiOTkxZjJlM2YzYzg4YjkzMjI1NTQ3MDM1YWYyNWFmNjZlMDQ1NDFmXCIsXCJmNWM1NDc1NGE4ZjcxZWU1NDBiOWI0ODcyODQ3M2UzMTRmNzI5YWM1MzA4YjA2OTM4MzYwOTkwZTJiZmFkMTI1XCJdLFtcImViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGNcIixcIjZjYjlhODg3NmQ5Y2I4NTIwNjA5YWYzYWRkMjZjZDIwYTBhN2NkOGE5NDExMTMxY2U4NWY0NDEwMDA5OTIyM2VcIl0sW1wiMTNlODdiMDI3ZDg1MTRkMzU5MzlmMmU2ODkyYjE5OTIyMTU0NTk2OTQxODg4MzM2ZGMzNTYzZTNiOGRiYTk0MlwiLFwiZmVmNWEzYzY4MDU5YTZkZWM1ZDYyNDExNGJmMWU5MWFhYzJiOWRhNTY4ZDZhYmViMjU3MGQ1NTY0NmI4YWRmMVwiXSxbXCJlZTE2MzAyNmU5ZmQ2ZmUwMTdjMzhmMDZhNWJlNmZjMTI1NDI0YjM3MWNlMjcwOGU3YmY0NDkxNjkxZTU3NjRhXCIsXCIxYWNiMjUwZjI1NWRkNjFjNDNkOTRjY2M2NzBkMGY1OGY0OWFlM2ZhMTViOTY2MjNlNTQzMGRhMGFkNmM2MmIyXCJdLFtcImIyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODBcIixcIjVmMzEwZDRiM2M5OWI5ZWJiMTlmNzdkNDFjMWRlZTAxOGNmMGQzNGZkNDE5MTYxNDAwM2U5NDVhMTIxNmU0MjNcIl0sW1wiZmYwN2YzMTE4YTlkZjAzNWU5ZmFkODVlYjZjN2JmZTQyYjAyZjAxY2E5OWNlZWEzYmY3ZmZkYmE5M2M0NzUwZFwiLFwiNDM4MTM2ZDYwM2U4NThhM2E1YzQ0MGMzOGVjY2JhZGRjMWQyOTQyMTE0ZTJlZGRkNDc0MGQwOThjZWQxZjBkOFwiXSxbXCI4ZDhiOTg1NWM3YzA1MmEzNDE0NmZkMjBmZmI2NThiZWE0YjlmNjllMGQ4MjVlYmVjMTZlOGMzY2UyYjUyNmExXCIsXCJjZGI1NTllZWRjMmQ3OWY5MjZiYWY0NGZiODRlYTRkNDRiY2Y1MGZlZTUxZDdjZWIzMGUyZTdmNDYzMDM2NzU4XCJdLFtcIjUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjNcIixcImMzYjk5N2QwNTBlZTVkNDIzZWJhZjY2YTZkYjlmNTdiMzE4MGM5MDI4NzU2NzlkZTkyNGI2OWQ4NGE3YjM3NVwiXSxbXCJlNjJmOTQ5MGQzZDUxZGE2Mzk1ZWZkMjRlODA5MTljYzdkMGYyOWMzZjNmYTQ4YzZmZmY1NDNiZWNiZDQzMzUyXCIsXCI2ZDg5YWQ3YmE0ODc2YjBiMjJjMmNhMjgwYzY4Mjg2MmYzNDJjODU5MWYxZGFmNTE3MGUwN2JmZDljY2FmYTdkXCJdLFtcIjdmMzBlYTI0NzZiMzk5YjQ5NTc1MDljODhmNzdkMDE5MWFmYTJmZjVjYjdiMTRmZDZkOGU3ZDY1YWFhYjExOTNcIixcImNhNWVmN2Q0YjIzMWM5NGMzYjE1Mzg5YTVmNjMxMWU5ZGFmZjdiYjY3YjEwM2U5ODgwZWY0YmZmNjM3YWNhZWNcIl0sW1wiNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMFwiLFwiOTczMTE0MWQ4MWZjOGY4MDg0ZDM3YzZlNzU0MjAwNmIzZWUxYjQwZDYwZGZlNTM2MmE1YjEzMmZkMTdkZGMwXCJdLFtcIjMyYjc4YzdkZTllZTUxMmE3Mjg5NWJlNmI5Y2JlZmE2ZTJmM2M0Y2NjZTQ0NWM5NmI5ZjJjODFlMjc3OGFkNThcIixcImVlMTg0OWY1MTNkZjcxZTMyZWZjMzg5NmVlMjgyNjBjNzNiYjgwNTQ3YWUyMjc1YmE0OTcyMzc3OTRjODc1M2NcIl0sW1wiZTJjYjc0ZmRkYzhlOWZiY2QwNzZlZWYyYTdjNzJiMGNlMzdkNTBmMDgyNjlkZmMwNzRiNTgxNTUwNTQ3YTRmN1wiLFwiZDNhYTJlZDcxYzlkZDIyNDdhNjJkZjA2MjczNmViMGJhZGRlYTllMzYxMjJkMmJlODY0MWFiY2IwMDVjYzRhNFwiXSxbXCI4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4XCIsXCJjNGUxMDIwOTE2OTgwYTRkYTVkMDFhYzVlNmFkMzMwNzM0ZWYwZDc5MDY2MzFjNGYyMzkwNDI2YjJlZGQ3OTFmXCJdLFtcIjQxNjJkNDg4Yjg5NDAyMDM5YjU4NGM2ZmM2YzMwODg3MDU4N2Q5YzQ2ZjY2MGI4NzhhYjY1YzgyYzcxMWQ2N2VcIixcIjY3MTYzZTkwMzIzNjI4OWY3NzZmMjJjMjVmYjhhM2FmYzE3MzJmMmI4NGI0ZTk1ZGJkYTQ3YWU1YTA4NTI2NDlcIl0sW1wiM2ZhZDNmYTg0Y2FmMGYzNGYwZjg5YmZkMmRjZjU0ZmMxNzVkNzY3YWVjM2U1MDY4NGYzYmE0YTRiZjVmNjgzZFwiLFwiY2QxYmM3Y2I2Y2M0MDdiYjJmMGNhNjQ3YzcxOGE3MzBjZjcxODcyZTdkMGQyYTUzZmEyMGVmY2RmZTYxODI2XCJdLFtcIjY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmJcIixcIjI5OWQyMWY5NDEzZjMzYjNlZGY0M2IyNTcwMDQ1ODBiNzBkYjU3ZGEwYjE4MjI1OWUwOWVlY2M2OWUwZDM4YTVcIl0sW1wiZDMyZjRkYTU0YWRlNzRhYmI4MWI4MTVhZDFmYjNiMjYzZDgyZDZjNjkyNzE0YmNmZjg3ZDI5YmQ1ZWU5ZjA4ZlwiLFwiZjk0MjllNzM4YjhlNTNiOTY4ZTk5MDE2YzA1OTcwNzc4MmUxNGY0NTM1MzU5ZDU4MmZjNDE2OTEwYjNlZWE4N1wiXSxbXCIzMGU0ZTY3MDQzNTM4NTU1NmU1OTM2NTcxMzU4NDVkMzZmYmI2OTMxZjcyYjA4Y2IxZWQ5NTRmMWUzY2UzZmY2XCIsXCI0NjJmOWJjZTYxOTg5ODYzODQ5OTM1MDExM2JiYzliMTBhODc4ZDM1ZGE3MDc0MGRjNjk1YTU1OWViODhkYjdiXCJdLFtcImJlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTdcIixcIjYyMTg4YmM0OWQ2MWU1NDI4NTczZDQ4YTc0ZTFjNjU1YjFjNjEwOTA5MDU2ODJhMGQ1NTU4ZWQ3MmRjY2I5YmNcIl0sW1wiOTMxNDQ0MjNhY2UzNDUxZWQyOWUwZmI5YWMyYWYyMTFjYjZlODRhNjAxZGY1OTkzYzQxOTg1OWZmZjVkZjA0YVwiLFwiN2MxMGRmYjE2NGMzNDI1ZjVjNzFhM2Y5ZDc5OTIwMzhmMTA2NTIyNGY3MmJiOWQxZDkwMmE2ZDEzMDM3YjQ3Y1wiXSxbXCJiMDE1ZjgwNDRmNWZjYmRjZjIxY2EyNmQ2YzM0ZmI4MTk3ODI5MjA1YzdiN2QyYTdjYjY2NDE4YzE1N2IxMTJjXCIsXCJhYjhjMWUwODZkMDRlODEzNzQ0YTY1NWIyZGY4ZDVmODNiM2NkYzZmYWEzMDg4YzFkM2FlYTE0NTRlM2ExZDVmXCJdLFtcImQ1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTJcIixcIjRjYjA0NDM3ZjM5MWVkNzMxMTFhMTNjYzFkNGRkMGRiMTY5MzQ2NWMyMjQwNDgwZDg5NTVlODU5MmYyNzQ0N2FcIl0sW1wiZDNhZTQxMDQ3ZGQ3Y2EwNjVkYmY4ZWQ3N2I5OTI0Mzk5ODMwMDVjZDcyZTE2ZDZmOTk2YTUzMTZkMzY5NjZiYlwiLFwiYmQxYWViMjFhZDIyZWJiMjJhMTBmMDMwMzQxN2M2ZDk2NGY4Y2RkN2RmMGFjYTYxNGIxMGRjMTRkMTI1YWM0NlwiXSxbXCI0NjNlMjc2M2Q4ODVmOTU4ZmM2NmNkZDIyODAwZjBhNDg3MTk3ZDBhODJlMzc3YjQ5ZjgwYWY4N2M4OTdiMDY1XCIsXCJiZmVmYWNkYjBlNWQwZmQ3ZGYzYTMxMWE5NGRlMDYyYjI2YjgwYzYxZmJjOTc1MDhiNzk5OTI2NzFlZjdjYTdmXCJdLFtcIjc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTdcIixcIjYwM2MxMmRhZjNkOTg2MmVmMmIyNWZlMWRlMjg5YWVkMjRlZDI5MWUwZWM2NzA4NzAzYTViZDU2N2YzMmVkMDNcIl0sW1wiNzRhMWFkNmI1Zjc2ZTM5ZGIyZGQyNDk0MTBlYWM3Zjk5ZTc0YzU5Y2I4M2QyZDBlZDVmZjE1NDNkYTc3MDNlOVwiLFwiY2M2MTU3ZWYxOGM5YzYzY2Q2MTkzZDgzNjMxYmJlYTAwOTNlMDk2ODk0MmU4YzMzZDU3MzdmZDc5MGUwZGIwOFwiXSxbXCIzMDY4MmE1MDcwMzM3NWY2MDJkNDE2NjY0YmExOWI3ZmM5YmFiNDJjNzI3NDc0NjNhNzFkMDg5NmIyMmY2ZGEzXCIsXCI1NTNlMDRmNmIwMThiNGZhNmM4ZjM5ZTdmMzExZDMxNzYyOTBkMGUwZjE5Y2E3M2YxNzcxNGQ5OTc3YTIyZmY4XCJdLFtcIjllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTdcIixcIjcxMmZjZGQxYjkwNTNmMDkwMDNhMzQ4MWZhNzc2MmU5ZmZkN2M4ZWYzNWEzODUwOWUyZmJmMjYyOTAwODM3M1wiXSxbXCIxNzZlMjY5ODlhNDNjOWNmZWJhNDAyOWMyMDI1MzhjMjgxNzJlNTY2ZTNjNGZjZTczMjI4NTdmM2JlMzI3ZDY2XCIsXCJlZDhjYzlkMDRiMjllYjg3N2QyNzBiNDg3OGRjNDNjMTlhZWZkMzFmNGVlZTA5ZWU3YjQ3ODM0YzFmYTRiMWMzXCJdLFtcIjc1ZDQ2ZWZlYTM3NzFlNmU2OGFiYjg5YTEzYWQ3NDdlY2YxODkyMzkzZGZjNGYxYjcwMDQ3ODhjNTAzNzRkYThcIixcIjk4NTIzOTBhOTk1MDc2NzlmZDBiODZmZDJiMzlhODY4ZDdlZmMyMjE1MTM0NmUxYTNjYTQ3MjY1ODZhNmJlZDhcIl0sW1wiODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMVwiLFwiOWU5OTQ5ODBkOTkxN2UyMmI3NmIwNjE5MjdmYTA0MTQzZDA5NmNjYzU0OTYzZTZhNWViZmE1ZjNmOGUyODZjMVwiXSxbXCIxYjM4OTAzYTQzZjdmMTE0ZWQ0NTAwYjRlYWM3MDgzZmRlZmVjZTFjZjI5YzYzNTI4ZDU2MzQ0NmY5NzJjMTgwXCIsXCI0MDM2ZWRjOTMxYTYwYWU4ODkzNTNmNzdmZDUzZGU0YTI3MDhiMjZiNmY1ZGE3MmFkMzM5NDExOWRhZjQwOGY5XCJdXVxufX19LGZ1bmN0aW9uKHQsZSxyKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5zbGljZSgpO2lmKCF0KXJldHVybltdO3ZhciByPVtdO2lmKFwic3RyaW5nXCIhPXR5cGVvZiB0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylyW25dPTB8dFtuXTtyZXR1cm4gcn1pZihlKXtpZihcImhleFwiPT09ZSl7dD10LnJlcGxhY2UoL1teYS16MC05XSsvZ2ksXCJcIiksdC5sZW5ndGglMiE9PTAmJih0PVwiMFwiK3QpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9MilyLnB1c2gocGFyc2VJbnQodFtuXSt0W24rMV0sMTYpKX19ZWxzZSBmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dC5jaGFyQ29kZUF0KG4pLG89aT4+OCxhPTI1NSZpO28/ci5wdXNoKG8sYSk6ci5wdXNoKGEpfXJldHVybiByfWZ1bmN0aW9uIGkodCl7cmV0dXJuIDE9PT10Lmxlbmd0aD9cIjBcIit0OnR9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGU9XCJcIixyPTA7cjx0Lmxlbmd0aDtyKyspZSs9aSh0W3JdLnRvU3RyaW5nKDE2KSk7cmV0dXJuIGV9ZnVuY3Rpb24gYSh0LGUpe2Zvcih2YXIgcj1bXSxuPTE8PGUrMSxpPXQuY2xvbmUoKTtpLmNtcG4oMSk+PTA7KXt2YXIgbztpZihpLmlzT2RkKCkpe3ZhciBhPWkuYW5kbG4obi0xKTtvPWE+KG4+PjEpLTE/KG4+PjEpLWE6YSxpLmlzdWJuKG8pfWVsc2Ugbz0wO3IucHVzaChvKTtmb3IodmFyIGY9MCE9PWkuY21wbigwKSYmMD09PWkuYW5kbG4obi0xKT9lKzE6MSxzPTE7czxmO3MrKylyLnB1c2goMCk7aS5pdXNocm4oZil9cmV0dXJuIHJ9ZnVuY3Rpb24gZih0LGUpe3ZhciByPVtbXSxbXV07dD10LmNsb25lKCksZT1lLmNsb25lKCk7Zm9yKHZhciBuPTAsaT0wO3QuY21wbigtbik+MHx8ZS5jbXBuKC1pKT4wOyl7dmFyIG89dC5hbmRsbigzKStuJjMsYT1lLmFuZGxuKDMpK2kmMzszPT09byYmKG89LTEpLDM9PT1hJiYoYT0tMSk7dmFyIGY7aWYoMD09PSgxJm8pKWY9MDtlbHNle3ZhciBzPXQuYW5kbG4oNykrbiY3O2Y9MyE9PXMmJjUhPT1zfHwyIT09YT9vOi1vfXJbMF0ucHVzaChmKTt2YXIgdTtpZigwPT09KDEmYSkpdT0wO2Vsc2V7dmFyIHM9ZS5hbmRsbig3KStpJjc7dT0zIT09cyYmNSE9PXN8fDIhPT1vP2E6LWF9clsxXS5wdXNoKHUpLDIqbj09PWYrMSYmKG49MS1uKSwyKmk9PT11KzEmJihpPTEtaSksdC5pdXNocm4oMSksZS5pdXNocm4oMSl9cmV0dXJuIHJ9ZnVuY3Rpb24gcyh0LGUscil7dmFyIG49XCJfXCIrZTt0LnByb3RvdHlwZVtlXT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzW25dP3RoaXNbbl06dGhpc1tuXT1yLmNhbGwodGhpcyl9fWZ1bmN0aW9uIHUodCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/Yy50b0FycmF5KHQsXCJoZXhcIik6dH1mdW5jdGlvbiBoKHQpe3JldHVybiBuZXcgZCh0LFwiaGV4XCIsXCJsZVwiKX12YXIgYz1lLGQ9cigzMCk7Yy5hc3NlcnQ9ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZXx8XCJBc3NlcnRpb24gZmFpbGVkXCIpfSxjLnRvQXJyYXk9bixjLnplcm8yPWksYy50b0hleD1vLGMuZW5jb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuXCJoZXhcIj09PWU/byh0KTp0fSxjLmdldE5BRj1hLGMuZ2V0SlNGPWYsYy5jYWNoZWRQcm9wZXJ0eT1zLGMucGFyc2VCeXRlcz11LGMuaW50RnJvbUxFPWh9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3RoaXMucmFuZD10fXZhciBpO2lmKHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXx8KGk9bmV3IG4obnVsbCkpLGkuZ2VuZXJhdGUodCl9LHQuZXhwb3J0cy5SYW5kPW4sbi5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhbmQodCl9LFwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cpd2luZG93LmNyeXB0byYmd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXM/bi5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodCk7cmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpLGV9OndpbmRvdy5tc0NyeXB0byYmd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz9uLnByb3RvdHlwZS5fcmFuZD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKSxlfTpuLnByb3RvdHlwZS5fcmFuZD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZCB5ZXRcIil9O2Vsc2UgdHJ5e3ZhciBvPXIoNjEwKTtuLnByb3RvdHlwZS5fcmFuZD1mdW5jdGlvbih0KXtyZXR1cm4gby5yYW5kb21CeXRlcyh0KX19Y2F0Y2godCl7bi5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBVaW50OEFycmF5KHQpLHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdPXRoaXMucmFuZC5nZXRCeXRlKCk7cmV0dXJuIGV9fX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4oKXt0aGlzLnBlbmRpbmc9bnVsbCx0aGlzLnBlbmRpbmdUb3RhbD0wLHRoaXMuYmxvY2tTaXplPXRoaXMuY29uc3RydWN0b3IuYmxvY2tTaXplLHRoaXMub3V0U2l6ZT10aGlzLmNvbnN0cnVjdG9yLm91dFNpemUsdGhpcy5obWFjU3RyZW5ndGg9dGhpcy5jb25zdHJ1Y3Rvci5obWFjU3RyZW5ndGgsdGhpcy5wYWRMZW5ndGg9dGhpcy5jb25zdHJ1Y3Rvci5wYWRMZW5ndGgvOCx0aGlzLmVuZGlhbj1cImJpZ1wiLHRoaXMuX2RlbHRhOD10aGlzLmJsb2NrU2l6ZS84LHRoaXMuX2RlbHRhMzI9dGhpcy5ibG9ja1NpemUvMzJ9dmFyIGk9cig1MCksbz1pLnV0aWxzLGE9by5hc3NlcnQ7ZS5CbG9ja0hhc2g9bixuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtpZih0PW8udG9BcnJheSh0LGUpLHRoaXMucGVuZGluZz90aGlzLnBlbmRpbmc9dGhpcy5wZW5kaW5nLmNvbmNhdCh0KTp0aGlzLnBlbmRpbmc9dCx0aGlzLnBlbmRpbmdUb3RhbCs9dC5sZW5ndGgsdGhpcy5wZW5kaW5nLmxlbmd0aD49dGhpcy5fZGVsdGE4KXt0PXRoaXMucGVuZGluZzt2YXIgcj10Lmxlbmd0aCV0aGlzLl9kZWx0YTg7dGhpcy5wZW5kaW5nPXQuc2xpY2UodC5sZW5ndGgtcix0Lmxlbmd0aCksMD09PXRoaXMucGVuZGluZy5sZW5ndGgmJih0aGlzLnBlbmRpbmc9bnVsbCksdD1vLmpvaW4zMih0LDAsdC5sZW5ndGgtcix0aGlzLmVuZGlhbik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz10aGlzLl9kZWx0YTMyKXRoaXMuX3VwZGF0ZSh0LG4sbit0aGlzLl9kZWx0YTMyKX1yZXR1cm4gdGhpc30sbi5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZSh0aGlzLl9wYWQoKSksYShudWxsPT09dGhpcy5wZW5kaW5nKSx0aGlzLl9kaWdlc3QodCl9LG4ucHJvdG90eXBlLl9wYWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBlbmRpbmdUb3RhbCxlPXRoaXMuX2RlbHRhOCxyPWUtKHQrdGhpcy5wYWRMZW5ndGgpJWUsbj1uZXcgQXJyYXkocit0aGlzLnBhZExlbmd0aCk7blswXT0xMjg7Zm9yKHZhciBpPTE7aTxyO2krKyluW2ldPTA7aWYodDw8PTMsXCJiaWdcIj09PXRoaXMuZW5kaWFuKXtmb3IodmFyIG89ODtvPHRoaXMucGFkTGVuZ3RoO28rKyluW2krK109MDtuW2krK109MCxuW2krK109MCxuW2krK109MCxuW2krK109MCxuW2krK109dD4+PjI0JjI1NSxuW2krK109dD4+PjE2JjI1NSxuW2krK109dD4+PjgmMjU1LG5baSsrXT0yNTUmdH1lbHNle25baSsrXT0yNTUmdCxuW2krK109dD4+PjgmMjU1LG5baSsrXT10Pj4+MTYmMjU1LG5baSsrXT10Pj4+MjQmMjU1LG5baSsrXT0wLG5baSsrXT0wLG5baSsrXT0wLG5baSsrXT0wO2Zvcih2YXIgbz04O288dGhpcy5wYWRMZW5ndGg7bysrKW5baSsrXT0wfXJldHVybiBufX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj8odGhpcy5IYXNoPXQsdGhpcy5ibG9ja1NpemU9dC5ibG9ja1NpemUvOCx0aGlzLm91dFNpemU9dC5vdXRTaXplLzgsdGhpcy5pbm5lcj1udWxsLHRoaXMub3V0ZXI9bnVsbCx2b2lkIHRoaXMuX2luaXQoby50b0FycmF5KGUscikpKTpuZXcgbih0LGUscil9dmFyIGk9cig1MCksbz1pLnV0aWxzLGE9by5hc3NlcnQ7dC5leHBvcnRzPW4sbi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCl7dC5sZW5ndGg+dGhpcy5ibG9ja1NpemUmJih0PShuZXcgdGhpcy5IYXNoKS51cGRhdGUodCkuZGlnZXN0KCkpLGEodC5sZW5ndGg8PXRoaXMuYmxvY2tTaXplKTtmb3IodmFyIGU9dC5sZW5ndGg7ZTx0aGlzLmJsb2NrU2l6ZTtlKyspdC5wdXNoKDApO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV1ePTU0O3RoaXMuaW5uZXI9KG5ldyB0aGlzLkhhc2gpLnVwZGF0ZSh0KTtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdXj0xMDY7dGhpcy5vdXRlcj0obmV3IHRoaXMuSGFzaCkudXBkYXRlKHQpfSxuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pbm5lci51cGRhdGUodCxlKSx0aGlzfSxuLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaW5uZXIuZGlnZXN0KCkpLHRoaXMub3V0ZXIuZGlnZXN0KHQpfX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG4/KGwuY2FsbCh0aGlzKSx0aGlzLmg9WzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OCwzMjg1Mzc3NTIwXSx2b2lkKHRoaXMuZW5kaWFuPVwibGl0dGxlXCIpKTpuZXcgbn1mdW5jdGlvbiBpKHQsZSxyLG4pe3JldHVybiB0PD0xNT9lXnJebjp0PD0zMT9lJnJ8fmUmbjp0PD00Nz8oZXx+cilebjp0PD02Mz9lJm58ciZ+bjplXihyfH5uKX1mdW5jdGlvbiBvKHQpe3JldHVybiB0PD0xNT8wOnQ8PTMxPzE1MTg1MDAyNDk6dDw9NDc/MTg1OTc3NTM5Mzp0PD02Mz8yNDAwOTU5NzA4OjI4NDA4NTM4Mzh9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdDw9MTU/MTM1MjgyOTkyNjp0PD0zMT8xNTQ4NjAzNjg0OnQ8PTQ3PzE4MzYwNzI2OTE6dDw9NjM/MjA1Mzk5NDIxNzowfXZhciBmPXIoNTApLHM9Zi51dGlscyx1PXMucm90bDMyLGg9cy5zdW0zMixjPXMuc3VtMzJfMyxkPXMuc3VtMzJfNCxsPWYuY29tbW9uLkJsb2NrSGFzaDtzLmluaGVyaXRzKG4sbCksZS5yaXBlbWQxNjA9bixuLmJsb2NrU2l6ZT01MTIsbi5vdXRTaXplPTE2MCxuLmhtYWNTdHJlbmd0aD0xOTIsbi5wYWRMZW5ndGg9NjQsbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLmhbMF0sbj10aGlzLmhbMV0sZj10aGlzLmhbMl0scz10aGlzLmhbM10sbD10aGlzLmhbNF0sbT1yLGc9bix3PWYsXz1zLE09bCxTPTA7Uzw4MDtTKyspe3ZhciBFPWgodShkKHIsaShTLG4sZixzKSx0W3BbU10rZV0sbyhTKSksdltTXSksbCk7cj1sLGw9cyxzPXUoZiwxMCksZj1uLG49RSxFPWgodShkKG0saSg3OS1TLGcsdyxfKSx0W2JbU10rZV0sYShTKSkseVtTXSksTSksbT1NLE09XyxfPXUodywxMCksdz1nLGc9RX1FPWModGhpcy5oWzFdLGYsXyksdGhpcy5oWzFdPWModGhpcy5oWzJdLHMsTSksdGhpcy5oWzJdPWModGhpcy5oWzNdLGwsbSksdGhpcy5oWzNdPWModGhpcy5oWzRdLHIsZyksdGhpcy5oWzRdPWModGhpcy5oWzBdLG4sdyksdGhpcy5oWzBdPUV9LG4ucHJvdG90eXBlLl9kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuXCJoZXhcIj09PXQ/cy50b0hleDMyKHRoaXMuaCxcImxpdHRsZVwiKTpzLnNwbGl0MzIodGhpcy5oLFwibGl0dGxlXCIpfTt2YXIgcD1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSw3LDQsMTMsMSwxMCw2LDE1LDMsMTIsMCw5LDUsMiwxNCwxMSw4LDMsMTAsMTQsNCw5LDE1LDgsMSwyLDcsMCw2LDEzLDExLDUsMTIsMSw5LDExLDEwLDAsOCwxMiw0LDEzLDMsNywxNSwxNCw1LDYsMiw0LDAsNSw5LDcsMTIsMiwxMCwxNCwxLDMsOCwxMSw2LDE1LDEzXSxiPVs1LDE0LDcsMCw5LDIsMTEsNCwxMyw2LDE1LDgsMSwxMCwzLDEyLDYsMTEsMyw3LDAsMTMsNSwxMCwxNCwxNSw4LDEyLDQsOSwxLDIsMTUsNSwxLDMsNywxNCw2LDksMTEsOCwxMiwyLDEwLDAsNCwxMyw4LDYsNCwxLDMsMTEsMTUsMCw1LDEyLDIsMTMsOSw3LDEwLDE0LDEyLDE1LDEwLDQsMSw1LDgsNyw2LDIsMTMsMTQsMCwzLDksMTFdLHY9WzExLDE0LDE1LDEyLDUsOCw3LDksMTEsMTMsMTQsMTUsNiw3LDksOCw3LDYsOCwxMywxMSw5LDcsMTUsNywxMiwxNSw5LDExLDcsMTMsMTIsMTEsMTMsNiw3LDE0LDksMTMsMTUsMTQsOCwxMyw2LDUsMTIsNyw1LDExLDEyLDE0LDE1LDE0LDE1LDksOCw5LDE0LDUsNiw4LDYsNSwxMiw5LDE1LDUsMTEsNiw4LDEzLDEyLDUsMTIsMTMsMTQsMTEsOCw1LDZdLHk9WzgsOSw5LDExLDEzLDE1LDE1LDUsNyw3LDgsMTEsMTQsMTQsMTIsNiw5LDEzLDE1LDcsMTIsOCw5LDExLDcsNywxMiw3LDYsMTUsMTMsMTEsOSw3LDE1LDExLDgsNiw2LDE0LDEyLDEzLDUsMTQsMTMsMTMsNyw1LDE1LDUsOCwxMSwxNCwxNCw2LDE0LDYsOSwxMiw5LDEyLDUsMTUsOCw4LDUsMTIsOSwxMiw1LDE0LDYsOCwxMyw2LDUsMTUsMTMsMTEsMTFdfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbigpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj8oWC5jYWxsKHRoaXMpLHRoaXMuaD1bMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdLHRoaXMuaz1ZLHZvaWQodGhpcy5XPW5ldyBBcnJheSg2NCkpKTpuZXcgbn1mdW5jdGlvbiBpKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBpPyhuLmNhbGwodGhpcyksdm9pZCh0aGlzLmg9WzMyMzgzNzEwMzIsOTE0MTUwNjYzLDgxMjcwMjk5OSw0MTQ0OTEyNjk3LDQyOTA3NzU4NTcsMTc1MDYwMzAyNSwxNjk0MDc2ODM5LDMyMDQwNzU0MjhdKSk6bmV3IGl9ZnVuY3Rpb24gbygpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbz8oWC5jYWxsKHRoaXMpLHRoaXMuaD1bMTc3OTAzMzcwMyw0MDg5MjM1NzIwLDMxNDQxMzQyNzcsMjIyNzg3MzU5NSwxMDEzOTA0MjQyLDQyNzExNzU3MjMsMjc3MzQ4MDc2MiwxNTk1NzUwMTI5LDEzNTk4OTMxMTksMjkxNzU2NTEzNywyNjAwODIyOTI0LDcyNTUxMTE5OSw1Mjg3MzQ2MzUsNDIxNTM4OTU0NywxNTQxNDU5MjI1LDMyNzAzMzIwOV0sdGhpcy5rPVcsdm9pZCh0aGlzLlc9bmV3IEFycmF5KDE2MCkpKTpuZXcgb31mdW5jdGlvbiBhKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBhPyhvLmNhbGwodGhpcyksdm9pZCh0aGlzLmg9WzM0MTgwNzAzNjUsMzIzODM3MTAzMiwxNjU0MjcwMjUwLDkxNDE1MDY2MywyNDM4NTI5MzcwLDgxMjcwMjk5OSwzNTU0NjIzNjAsNDE0NDkxMjY5NywxNzMxNDA1NDE1LDQyOTA3NzU4NTcsMjM5NDE4MDIzMSwxNzUwNjAzMDI1LDM2NzUwMDg1MjUsMTY5NDA3NjgzOSwxMjAzMDYyODEzLDMyMDQwNzU0MjhdKSk6bmV3IGF9ZnVuY3Rpb24gZigpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgZj8oWC5jYWxsKHRoaXMpLHRoaXMuaD1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdLHZvaWQodGhpcy5XPW5ldyBBcnJheSg4MCkpKTpuZXcgZn1mdW5jdGlvbiBzKHQsZSxyKXtyZXR1cm4gdCZlXn50JnJ9ZnVuY3Rpb24gdSh0LGUscil7cmV0dXJuIHQmZV50JnJeZSZyfWZ1bmN0aW9uIGgodCxlLHIpe3JldHVybiB0XmVecn1mdW5jdGlvbiBjKHQpe3JldHVybiBSKHQsMileUih0LDEzKV5SKHQsMjIpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIFIodCw2KV5SKHQsMTEpXlIodCwyNSl9ZnVuY3Rpb24gbCh0KXtyZXR1cm4gUih0LDcpXlIodCwxOCledD4+PjN9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gUih0LDE3KV5SKHQsMTkpXnQ+Pj4xMH1mdW5jdGlvbiBiKHQsZSxyLG4pe3JldHVybiAwPT09dD9zKGUscixuKToxPT09dHx8Mz09PXQ/aChlLHIsbik6Mj09PXQ/dShlLHIsbik6dm9pZCAwfWZ1bmN0aW9uIHYodCxlLHIsbixpLG8pe3ZhciBhPXQmcl5+dCZpO3JldHVybiBhPDAmJihhKz00Mjk0OTY3Mjk2KSxhfWZ1bmN0aW9uIHkodCxlLHIsbixpLG8pe3ZhciBhPWUmbl5+ZSZvO3JldHVybiBhPDAmJihhKz00Mjk0OTY3Mjk2KSxhfWZ1bmN0aW9uIG0odCxlLHIsbixpLG8pe3ZhciBhPXQmcl50JmleciZpO3JldHVybiBhPDAmJihhKz00Mjk0OTY3Mjk2KSxhfWZ1bmN0aW9uIGcodCxlLHIsbixpLG8pe3ZhciBhPWUmbl5lJm9ebiZvO3JldHVybiBhPDAmJihhKz00Mjk0OTY3Mjk2KSxhfWZ1bmN0aW9uIHcodCxlKXt2YXIgcj1OKHQsZSwyOCksbj1OKGUsdCwyKSxpPU4oZSx0LDcpLG89cl5uXmk7cmV0dXJuIG88MCYmKG8rPTQyOTQ5NjcyOTYpLG99ZnVuY3Rpb24gXyh0LGUpe3ZhciByPUwodCxlLDI4KSxuPUwoZSx0LDIpLGk9TChlLHQsNyksbz1yXm5eaTtyZXR1cm4gbzwwJiYobys9NDI5NDk2NzI5Niksb31mdW5jdGlvbiBNKHQsZSl7dmFyIHI9Tih0LGUsMTQpLG49Tih0LGUsMTgpLGk9TihlLHQsOSksbz1yXm5eaTtyZXR1cm4gbzwwJiYobys9NDI5NDk2NzI5Niksb31mdW5jdGlvbiBTKHQsZSl7dmFyIHI9TCh0LGUsMTQpLG49TCh0LGUsMTgpLGk9TChlLHQsOSksbz1yXm5eaTtyZXR1cm4gbzwwJiYobys9NDI5NDk2NzI5Niksb31mdW5jdGlvbiBFKHQsZSl7dmFyIHI9Tih0LGUsMSksbj1OKHQsZSw4KSxpPVUodCxlLDcpLG89cl5uXmk7cmV0dXJuIG88MCYmKG8rPTQyOTQ5NjcyOTYpLG99ZnVuY3Rpb24gQSh0LGUpe3ZhciByPUwodCxlLDEpLG49TCh0LGUsOCksaT16KHQsZSw3KSxvPXJebl5pO3JldHVybiBvPDAmJihvKz00Mjk0OTY3Mjk2KSxvfWZ1bmN0aW9uIGsodCxlKXt2YXIgcj1OKHQsZSwxOSksbj1OKGUsdCwyOSksaT1VKHQsZSw2KSxvPXJebl5pO3JldHVybiBvPDAmJihvKz00Mjk0OTY3Mjk2KSxvfWZ1bmN0aW9uIHgodCxlKXt2YXIgcj1MKHQsZSwxOSksbj1MKGUsdCwyOSksaT16KHQsZSw2KSxvPXJebl5pO3JldHVybiBvPDAmJihvKz00Mjk0OTY3Mjk2KSxvfXZhciBJPXIoNTApLEI9SS51dGlscyxPPUIuYXNzZXJ0LFI9Qi5yb3RyMzIsUD1CLnJvdGwzMixUPUIuc3VtMzIsaj1CLnN1bTMyXzQsQz1CLnN1bTMyXzUsTj1CLnJvdHI2NF9oaSxMPUIucm90cjY0X2xvLFU9Qi5zaHI2NF9oaSx6PUIuc2hyNjRfbG8sRD1CLnN1bTY0LHE9Qi5zdW02NF9oaSxGPUIuc3VtNjRfbG8sSz1CLnN1bTY0XzRfaGksRz1CLnN1bTY0XzRfbG8sVj1CLnN1bTY0XzVfaGksSD1CLnN1bTY0XzVfbG8sWD1JLmNvbW1vbi5CbG9ja0hhc2gsWT1bMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSxXPVsxMTE2MzUyNDA4LDM2MDk3Njc0NTgsMTg5OTQ0NzQ0MSw2MDI4OTE3MjUsMzA0OTMyMzQ3MSwzOTY0NDg0Mzk5LDM5MjEwMDk1NzMsMjE3MzI5NTU0OCw5NjE5ODcxNjMsNDA4MTYyODQ3MiwxNTA4OTcwOTkzLDMwNTM4MzQyNjUsMjQ1MzYzNTc0OCwyOTM3NjcxNTc5LDI4NzA3NjMyMjEsMzY2NDYwOTU2MCwzNjI0MzgxMDgwLDI3MzQ4ODMzOTQsMzEwNTk4NDAxLDExNjQ5OTY1NDIsNjA3MjI1Mjc4LDEzMjM2MTA3NjQsMTQyNjg4MTk4NywzNTkwMzA0OTk0LDE5MjUwNzgzODgsNDA2ODE4MjM4MywyMTYyMDc4MjA2LDk5MTMzNjExMywyNjE0ODg4MTAzLDYzMzgwMzMxNywzMjQ4MjIyNTgwLDM0Nzk3NzQ4NjgsMzgzNTM5MDQwMSwyNjY2NjEzNDU4LDQwMjIyMjQ3NzQsOTQ0NzExMTM5LDI2NDM0NzA3OCwyMzQxMjYyNzczLDYwNDgwNzYyOCwyMDA3ODAwOTMzLDc3MDI1NTk4MywxNDk1OTkwOTAxLDEyNDkxNTAxMjIsMTg1NjQzMTIzNSwxNTU1MDgxNjkyLDMxNzUyMTgxMzIsMTk5NjA2NDk4NiwyMTk4OTUwODM3LDI1NTQyMjA4ODIsMzk5OTcxOTMzOSwyODIxODM0MzQ5LDc2Njc4NDAxNiwyOTUyOTk2ODA4LDI1NjY1OTQ4NzksMzIxMDMxMzY3MSwzMjAzMzM3OTU2LDMzMzY1NzE4OTEsMTAzNDQ1NzAyNiwzNTg0NTI4NzExLDI0NjY5NDg5MDEsMTEzOTI2OTkzLDM3NTgzMjYzODMsMzM4MjQxODk1LDE2ODcxNzkzNiw2NjYzMDcyMDUsMTE4ODE3OTk2NCw3NzM1Mjk5MTIsMTU0NjA0NTczNCwxMjk0NzU3MzcyLDE1MjI4MDU0ODUsMTM5NjE4MjI5MSwyNjQzODMzODIzLDE2OTUxODM3MDAsMjM0MzUyNzM5MCwxOTg2NjYxMDUxLDEwMTQ0Nzc0ODAsMjE3NzAyNjM1MCwxMjA2NzU5MTQyLDI0NTY5NTYwMzcsMzQ0MDc3NjI3LDI3MzA0ODU5MjEsMTI5MDg2MzQ2MCwyODIwMzAyNDExLDMxNTg0NTQyNzMsMzI1OTczMDgwMCwzNTA1OTUyNjU3LDMzNDU3NjQ3NzEsMTA2MjE3MDA4LDM1MTYwNjU4MTcsMzYwNjAwODM0NCwzNjAwMzUyODA0LDE0MzI3MjU3NzYsNDA5NDU3MTkwOSwxNDY3MDMxNTk0LDI3NTQyMzM0NCw4NTExNjk3MjAsNDMwMjI3NzM0LDMxMDA4MjM3NTIsNTA2OTQ4NjE2LDEzNjMyNTgxOTUsNjU5MDYwNTU2LDM3NTA2ODU1OTMsODgzOTk3ODc3LDM3ODUwNTAyODAsOTU4MTM5NTcxLDMzMTgzMDc0MjcsMTMyMjgyMjIxOCwzODEyNzIzNDAzLDE1MzcwMDIwNjMsMjAwMzAzNDk5NSwxNzQ3ODczNzc5LDM2MDIwMzY4OTksMTk1NTU2MjIyMiwxNTc1OTkwMDEyLDIwMjQxMDQ4MTUsMTEyNTU5MjkyOCwyMjI3NzMwNDUyLDI3MTY5MDQzMDYsMjM2MTg1MjQyNCw0NDI3NzYwNDQsMjQyODQzNjQ3NCw1OTM2OTgzNDQsMjc1NjczNDE4NywzNzMzMTEwMjQ5LDMyMDQwMzE0NzksMjk5OTM1MTU3MywzMzI5MzI1Mjk4LDM4MTU5MjA0MjcsMzM5MTU2OTYxNCwzOTI4MzgzOTAwLDM1MTUyNjcyNzEsNTY2MjgwNzExLDM5NDAxODc2MDYsMzQ1NDA2OTUzNCw0MTE4NjMwMjcxLDQwMDAyMzk5OTIsMTE2NDE4NDc0LDE5MTQxMzg1NTQsMTc0MjkyNDIxLDI3MzEwNTUyNzAsMjg5MzgwMzU2LDMyMDM5OTMwMDYsNDYwMzkzMjY5LDMyMDYyMDMxNSw2ODU0NzE3MzMsNTg3NDk2ODM2LDg1MjE0Mjk3MSwxMDg2NzkyODUxLDEwMTcwMzYyOTgsMzY1NTQzMTAwLDExMjYwMDA1ODAsMjYxODI5NzY3NiwxMjg4MDMzNDcwLDM0MDk4NTUxNTgsMTUwMTUwNTk0OCw0MjM0NTA5ODY2LDE2MDcxNjc5MTUsOTg3MTY3NDY4LDE4MTY0MDIzMTYsMTI0NjE4OTU5MV0sWj1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml07Qi5pbmhlcml0cyhuLFgpLGUuc2hhMjU2PW4sbi5ibG9ja1NpemU9NTEyLG4ub3V0U2l6ZT0yNTYsbi5obWFjU3RyZW5ndGg9MTkyLG4ucGFkTGVuZ3RoPTY0LG4ucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5XLG49MDtuPDE2O24rKylyW25dPXRbZStuXTtmb3IoO248ci5sZW5ndGg7bisrKXJbbl09aihwKHJbbi0yXSkscltuLTddLGwocltuLTE1XSkscltuLTE2XSk7dmFyIGk9dGhpcy5oWzBdLG89dGhpcy5oWzFdLGE9dGhpcy5oWzJdLGY9dGhpcy5oWzNdLGg9dGhpcy5oWzRdLGI9dGhpcy5oWzVdLHY9dGhpcy5oWzZdLHk9dGhpcy5oWzddO08odGhpcy5rLmxlbmd0aD09PXIubGVuZ3RoKTtmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIG09Qyh5LGQoaCkscyhoLGIsdiksdGhpcy5rW25dLHJbbl0pLGc9VChjKGkpLHUoaSxvLGEpKTt5PXYsdj1iLGI9aCxoPVQoZixtKSxmPWEsYT1vLG89aSxpPVQobSxnKX10aGlzLmhbMF09VCh0aGlzLmhbMF0saSksdGhpcy5oWzFdPVQodGhpcy5oWzFdLG8pLHRoaXMuaFsyXT1UKHRoaXMuaFsyXSxhKSx0aGlzLmhbM109VCh0aGlzLmhbM10sZiksdGhpcy5oWzRdPVQodGhpcy5oWzRdLGgpLHRoaXMuaFs1XT1UKHRoaXMuaFs1XSxiKSx0aGlzLmhbNl09VCh0aGlzLmhbNl0sdiksdGhpcy5oWzddPVQodGhpcy5oWzddLHkpfSxuLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKHQpe3JldHVyblwiaGV4XCI9PT10P0IudG9IZXgzMih0aGlzLmgsXCJiaWdcIik6Qi5zcGxpdDMyKHRoaXMuaCxcImJpZ1wiKX0sQi5pbmhlcml0cyhpLG4pLGUuc2hhMjI0PWksaS5ibG9ja1NpemU9NTEyLGkub3V0U2l6ZT0yMjQsaS5obWFjU3RyZW5ndGg9MTkyLGkucGFkTGVuZ3RoPTY0LGkucHJvdG90eXBlLl9kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuXCJoZXhcIj09PXQ/Qi50b0hleDMyKHRoaXMuaC5zbGljZSgwLDcpLFwiYmlnXCIpOkIuc3BsaXQzMih0aGlzLmguc2xpY2UoMCw3KSxcImJpZ1wiKX0sQi5pbmhlcml0cyhvLFgpLGUuc2hhNTEyPW8sby5ibG9ja1NpemU9MTAyNCxvLm91dFNpemU9NTEyLG8uaG1hY1N0cmVuZ3RoPTE5MixvLnBhZExlbmd0aD0xMjgsby5wcm90b3R5cGUuX3ByZXBhcmVCbG9jaz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLlcsbj0wO248MzI7bisrKXJbbl09dFtlK25dO2Zvcig7bjxyLmxlbmd0aDtuKz0yKXt2YXIgaT1rKHJbbi00XSxyW24tM10pLG89eChyW24tNF0scltuLTNdKSxhPXJbbi0xNF0sZj1yW24tMTNdLHM9RShyW24tMzBdLHJbbi0yOV0pLHU9QShyW24tMzBdLHJbbi0yOV0pLGg9cltuLTMyXSxjPXJbbi0zMV07cltuXT1LKGksbyxhLGYscyx1LGgsYykscltuKzFdPUcoaSxvLGEsZixzLHUsaCxjKX19LG8ucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlKXt0aGlzLl9wcmVwYXJlQmxvY2sodCxlKTt2YXIgcj10aGlzLlcsbj10aGlzLmhbMF0saT10aGlzLmhbMV0sbz10aGlzLmhbMl0sYT10aGlzLmhbM10sZj10aGlzLmhbNF0scz10aGlzLmhbNV0sdT10aGlzLmhbNl0saD10aGlzLmhbN10sYz10aGlzLmhbOF0sZD10aGlzLmhbOV0sbD10aGlzLmhbMTBdLHA9dGhpcy5oWzExXSxiPXRoaXMuaFsxMl0sRT10aGlzLmhbMTNdLEE9dGhpcy5oWzE0XSxrPXRoaXMuaFsxNV07Tyh0aGlzLmsubGVuZ3RoPT09ci5sZW5ndGgpO2Zvcih2YXIgeD0wO3g8ci5sZW5ndGg7eCs9Mil7dmFyIEk9QSxCPWssUj1NKGMsZCksUD1TKGMsZCksVD12KGMsZCxsLHAsYixFKSxqPXkoYyxkLGwscCxiLEUpLEM9dGhpcy5rW3hdLE49dGhpcy5rW3grMV0sTD1yW3hdLFU9clt4KzFdLHo9VihJLEIsUixQLFQsaixDLE4sTCxVKSxLPUgoSSxCLFIsUCxULGosQyxOLEwsVSksST13KG4saSksQj1fKG4saSksUj1tKG4saSxvLGEsZixzKSxQPWcobixpLG8sYSxmLHMpLEc9cShJLEIsUixQKSxYPUYoSSxCLFIsUCk7QT1iLGs9RSxiPWwsRT1wLGw9YyxwPWQsYz1xKHUsaCx6LEspLGQ9RihoLGgseixLKSx1PWYsaD1zLGY9byxzPWEsbz1uLGE9aSxuPXEoeixLLEcsWCksaT1GKHosSyxHLFgpfUQodGhpcy5oLDAsbixpKSxEKHRoaXMuaCwyLG8sYSksRCh0aGlzLmgsNCxmLHMpLEQodGhpcy5oLDYsdSxoKSxEKHRoaXMuaCw4LGMsZCksRCh0aGlzLmgsMTAsbCxwKSxEKHRoaXMuaCwxMixiLEUpLEQodGhpcy5oLDE0LEEsayl9LG8ucHJvdG90eXBlLl9kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuXCJoZXhcIj09PXQ/Qi50b0hleDMyKHRoaXMuaCxcImJpZ1wiKTpCLnNwbGl0MzIodGhpcy5oLFwiYmlnXCIpfSxCLmluaGVyaXRzKGEsbyksZS5zaGEzODQ9YSxhLmJsb2NrU2l6ZT0xMDI0LGEub3V0U2l6ZT0zODQsYS5obWFjU3RyZW5ndGg9MTkyLGEucGFkTGVuZ3RoPTEyOCxhLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKHQpe3JldHVyblwiaGV4XCI9PT10P0IudG9IZXgzMih0aGlzLmguc2xpY2UoMCwxMiksXCJiaWdcIik6Qi5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLDEyKSxcImJpZ1wiKX0sQi5pbmhlcml0cyhmLFgpLGUuc2hhMT1mLGYuYmxvY2tTaXplPTUxMixmLm91dFNpemU9MTYwLGYuaG1hY1N0cmVuZ3RoPTgwLGYucGFkTGVuZ3RoPTY0LGYucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5XLG49MDtuPDE2O24rKylyW25dPXRbZStuXTtmb3IoO248ci5sZW5ndGg7bisrKXJbbl09UChyW24tM11ecltuLThdXnJbbi0xNF1ecltuLTE2XSwxKTtmb3IodmFyIGk9dGhpcy5oWzBdLG89dGhpcy5oWzFdLGE9dGhpcy5oWzJdLGY9dGhpcy5oWzNdLHM9dGhpcy5oWzRdLG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIHU9fn4obi8yMCksaD1DKFAoaSw1KSxiKHUsbyxhLGYpLHMscltuXSxaW3VdKTtzPWYsZj1hLGE9UChvLDMwKSxvPWksaT1ofXRoaXMuaFswXT1UKHRoaXMuaFswXSxpKSx0aGlzLmhbMV09VCh0aGlzLmhbMV0sbyksdGhpcy5oWzJdPVQodGhpcy5oWzJdLGEpLHRoaXMuaFszXT1UKHRoaXMuaFszXSxmKSx0aGlzLmhbNF09VCh0aGlzLmhbNF0scyl9LGYucHJvdG90eXBlLl9kaWdlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuXCJoZXhcIj09PXQ/Qi50b0hleDMyKHRoaXMuaCxcImJpZ1wiKTpCLnNwbGl0MzIodGhpcy5oLFwiYmlnXCIpfX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LnNsaWNlKCk7aWYoIXQpcmV0dXJuW107dmFyIHI9W107aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpaWYoZSl7aWYoXCJoZXhcIj09PWUpe3Q9dC5yZXBsYWNlKC9bXmEtejAtOV0rL2dpLFwiXCIpLHQubGVuZ3RoJTIhPT0wJiYodD1cIjBcIit0KTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTIpci5wdXNoKHBhcnNlSW50KHRbbl0rdFtuKzFdLDE2KSl9fWVsc2UgZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXQuY2hhckNvZGVBdChuKSxvPWk+PjgsYT0yNTUmaTtvP3IucHVzaChvLGEpOnIucHVzaChhKX1lbHNlIGZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXJbbl09MHx0W25dO3JldHVybiByfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlPVwiXCIscj0wO3I8dC5sZW5ndGg7cisrKWUrPWYodFtyXS50b1N0cmluZygxNikpO3JldHVybiBlfWZ1bmN0aW9uIG8odCl7dmFyIGU9dD4+PjI0fHQ+Pj44JjY1MjgwfHQ8PDgmMTY3MTE2ODB8KDI1NSZ0KTw8MjQ7cmV0dXJuIGU+Pj4wfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIHI9XCJcIixuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07XCJsaXR0bGVcIj09PWUmJihpPW8oaSkpLHIrPXMoaS50b1N0cmluZygxNikpfXJldHVybiByfWZ1bmN0aW9uIGYodCl7cmV0dXJuIDE9PT10Lmxlbmd0aD9cIjBcIit0OnR9ZnVuY3Rpb24gcyh0KXtyZXR1cm4gNz09PXQubGVuZ3RoP1wiMFwiK3Q6Nj09PXQubGVuZ3RoP1wiMDBcIit0OjU9PT10Lmxlbmd0aD9cIjAwMFwiK3Q6ND09PXQubGVuZ3RoP1wiMDAwMFwiK3Q6Mz09PXQubGVuZ3RoP1wiMDAwMDBcIit0OjI9PT10Lmxlbmd0aD9cIjAwMDAwMFwiK3Q6MT09PXQubGVuZ3RoP1wiMDAwMDAwMFwiK3Q6dH1mdW5jdGlvbiB1KHQsZSxyLG4pe3ZhciBpPXItZTt5KGklND09PTApO2Zvcih2YXIgbz1uZXcgQXJyYXkoaS80KSxhPTAsZj1lO2E8by5sZW5ndGg7YSsrLGYrPTQpe3ZhciBzO3M9XCJiaWdcIj09PW4/dFtmXTw8MjR8dFtmKzFdPDwxNnx0W2YrMl08PDh8dFtmKzNdOnRbZiszXTw8MjR8dFtmKzJdPDwxNnx0W2YrMV08PDh8dFtmXSxvW2FdPXM+Pj4wfXJldHVybiBvfWZ1bmN0aW9uIGgodCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KDQqdC5sZW5ndGgpLG49MCxpPTA7bjx0Lmxlbmd0aDtuKyssaSs9NCl7dmFyIG89dFtuXTtcImJpZ1wiPT09ZT8ocltpXT1vPj4+MjQscltpKzFdPW8+Pj4xNiYyNTUscltpKzJdPW8+Pj44JjI1NSxyW2krM109MjU1Jm8pOihyW2krM109bz4+PjI0LHJbaSsyXT1vPj4+MTYmMjU1LHJbaSsxXT1vPj4+OCYyNTUscltpXT0yNTUmbyl9cmV0dXJuIHJ9ZnVuY3Rpb24gYyh0LGUpe3JldHVybiB0Pj4+ZXx0PDwzMi1lfWZ1bmN0aW9uIGQodCxlKXtyZXR1cm4gdDw8ZXx0Pj4+MzItZX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHQrZT4+PjB9ZnVuY3Rpb24gcCh0LGUscil7cmV0dXJuIHQrZStyPj4+MH1mdW5jdGlvbiBiKHQsZSxyLG4pe3JldHVybiB0K2UrcituPj4+MH1mdW5jdGlvbiB2KHQsZSxyLG4saSl7cmV0dXJuIHQrZStyK24raT4+PjB9ZnVuY3Rpb24geSh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcihlfHxcIkFzc2VydGlvbiBmYWlsZWRcIil9ZnVuY3Rpb24gbSh0LGUscixuKXt2YXIgaT10W2VdLG89dFtlKzFdLGE9bitvPj4+MCxmPShhPG4/MTowKStyK2k7dFtlXT1mPj4+MCx0W2UrMV09YX1mdW5jdGlvbiBnKHQsZSxyLG4pe3ZhciBpPWUrbj4+PjAsbz0oaTxlPzE6MCkrdCtyO3JldHVybiBvPj4+MH1mdW5jdGlvbiB3KHQsZSxyLG4pe3ZhciBpPWUrbjtyZXR1cm4gaT4+PjB9ZnVuY3Rpb24gXyh0LGUscixuLGksbyxhLGYpe3ZhciBzPTAsdT1lO3U9dStuPj4+MCxzKz11PGU/MTowLHU9dStvPj4+MCxzKz11PG8/MTowLHU9dStmPj4+MCxzKz11PGY/MTowO3ZhciBoPXQrcitpK2ErcztyZXR1cm4gaD4+PjB9ZnVuY3Rpb24gTSh0LGUscixuLGksbyxhLGYpe3ZhciBzPWUrbitvK2Y7cmV0dXJuIHM+Pj4wfWZ1bmN0aW9uIFModCxlLHIsbixpLG8sYSxmLHMsdSl7dmFyIGg9MCxjPWU7Yz1jK24+Pj4wLGgrPWM8ZT8xOjAsYz1jK28+Pj4wLGgrPWM8bz8xOjAsYz1jK2Y+Pj4wLGgrPWM8Zj8xOjAsYz1jK3U+Pj4wLGgrPWM8dT8xOjA7dmFyIGQ9dCtyK2krYStzK2g7cmV0dXJuIGQ+Pj4wfWZ1bmN0aW9uIEUodCxlLHIsbixpLG8sYSxmLHMsdSl7dmFyIGg9ZStuK28rZit1O3JldHVybiBoPj4+MH1mdW5jdGlvbiBBKHQsZSxyKXt2YXIgbj1lPDwzMi1yfHQ+Pj5yO3JldHVybiBuPj4+MH1mdW5jdGlvbiBrKHQsZSxyKXt2YXIgbj10PDwzMi1yfGU+Pj5yO3JldHVybiBuPj4+MH1mdW5jdGlvbiB4KHQsZSxyKXtyZXR1cm4gdD4+PnJ9ZnVuY3Rpb24gSSh0LGUscil7dmFyIG49dDw8MzItcnxlPj4+cjtyZXR1cm4gbj4+PjB9dmFyIEI9ZSxPPXIoMik7Qi50b0FycmF5PW4sQi50b0hleD1pLEIuaHRvbmw9byxCLnRvSGV4MzI9YSxCLnplcm8yPWYsQi56ZXJvOD1zLEIuam9pbjMyPXUsQi5zcGxpdDMyPWgsQi5yb3RyMzI9YyxCLnJvdGwzMj1kLEIuc3VtMzI9bCxCLnN1bTMyXzM9cCxCLnN1bTMyXzQ9YixCLnN1bTMyXzU9dixCLmFzc2VydD15LEIuaW5oZXJpdHM9TyxlLnN1bTY0PW0sZS5zdW02NF9oaT1nLGUuc3VtNjRfbG89dyxlLnN1bTY0XzRfaGk9XyxlLnN1bTY0XzRfbG89TSxlLnN1bTY0XzVfaGk9UyxlLnN1bTY0XzVfbG89RSxlLnJvdHI2NF9oaT1BLGUucm90cjY0X2xvPWssZS5zaHI2NF9oaT14LGUuc2hyNjRfbG89SX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiOyhmdW5jdGlvbih0KXtmdW5jdGlvbiByKGUscil7aWYoZS5sZW5ndGglbyE9PTApe3ZhciBuPWUubGVuZ3RoKyhvLWUubGVuZ3RoJW8pO2U9dC5jb25jYXQoW2UsYV0sbil9Zm9yKHZhciBpPVtdLGY9cj9lLnJlYWRJbnQzMkJFOmUucmVhZEludDMyTEUscz0wO3M8ZS5sZW5ndGg7cys9bylpLnB1c2goZi5jYWxsKGUscykpO3JldHVybiBpfWZ1bmN0aW9uIG4oZSxyLG4pe2Zvcih2YXIgaT1uZXcgdChyKSxvPW4/aS53cml0ZUludDMyQkU6aS53cml0ZUludDMyTEUsYT0wO2E8ZS5sZW5ndGg7YSsrKW8uY2FsbChpLGVbYV0sNCphLCEwKTtyZXR1cm4gaX1mdW5jdGlvbiBpKGUsaSxvLGEpe3QuaXNCdWZmZXIoZSl8fChlPW5ldyB0KGUpKTt2YXIgcz1pKHIoZSxhKSxlLmxlbmd0aCpmKTtyZXR1cm4gbihzLG8sYSl9dmFyIG89NCxhPW5ldyB0KG8pO2EuZmlsbCgwKTt2YXIgZj04O2UuaGFzaD1pfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe2kuY2FsbCh0aGlzKSx0aGlzLmhhc2hNb2RlPVwic3RyaW5nXCI9PXR5cGVvZiB0LHRoaXMuaGFzaE1vZGU/dGhpc1t0XT10aGlzLl9maW5hbE9yRGlnZXN0OnRoaXMuZmluYWw9dGhpcy5fZmluYWxPckRpZ2VzdCx0aGlzLl9kZWNvZGVyPW51bGwsdGhpcy5fZW5jb2Rpbmc9bnVsbH12YXIgaT1yKDMxKS5UcmFuc2Zvcm0sbz1yKDIpLGE9cig1MikuU3RyaW5nRGVjb2Rlcjt0LmV4cG9ydHM9bixvKG4saSksbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQscixuKXtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9bmV3IGUodCxyKSk7dmFyIGk9dGhpcy5fdXBkYXRlKHQpO3JldHVybiB0aGlzLmhhc2hNb2RlP3RoaXM6KG4mJihpPXRoaXMuX3RvU3RyaW5nKGksbikpLGkpfSxuLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZz1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUuZ2V0QXV0aFRhZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcInRyeWluZyB0byBnZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGVcIil9LG4ucHJvdG90eXBlLnNldEF1dGhUYWc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlXCIpfSxuLnByb3RvdHlwZS5zZXRBQUQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJ0cnlpbmcgdG8gc2V0IGFhZCBpbiB1bnN1cHBvcnRlZCBzdGF0ZVwiKX0sbi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dmFyIG47dHJ5e3RoaXMuaGFzaE1vZGU/dGhpcy5fdXBkYXRlKHQpOnRoaXMucHVzaCh0aGlzLl91cGRhdGUodCkpfWNhdGNoKHQpe249dH1maW5hbGx5e3Iobil9fSxuLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24odCl7dmFyIGU7dHJ5e3RoaXMucHVzaCh0aGlzLl9maW5hbCgpKX1jYXRjaCh0KXtlPXR9ZmluYWxseXt0KGUpfX0sbi5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3Q9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fZmluYWwoKXx8bmV3IGUoXCJcIik7cmV0dXJuIHQmJihyPXRoaXMuX3RvU3RyaW5nKHIsdCwhMCkpLHJ9LG4ucHJvdG90eXBlLl90b1N0cmluZz1mdW5jdGlvbih0LGUscil7aWYodGhpcy5fZGVjb2Rlcnx8KHRoaXMuX2RlY29kZXI9bmV3IGEoZSksdGhpcy5fZW5jb2Rpbmc9ZSksdGhpcy5fZW5jb2RpbmchPT1lKXRocm93IG5ldyBFcnJvcihcImNhbid0IHN3aXRjaCBlbmNvZGluZ3NcIik7dmFyIG49dGhpcy5fZGVjb2Rlci53cml0ZSh0KTtyZXR1cm4gciYmKG4rPXRoaXMuX2RlY29kZXIuZW5kKCkpLG59fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe2Zvcih2YXIgZT1bXSxyPTAsbj0wO3I8dC5sZW5ndGg7cisrLG4rPTgpZVtuPj4+NV18PXRbcl08PDI0LW4lMzI7cmV0dXJuIGV9ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9W10scj0wO3I8MzIqdC5sZW5ndGg7cis9OCllLnB1c2godFtyPj4+NV0+Pj4yNC1yJTMyJjI1NSk7cmV0dXJuIGV9ZnVuY3Rpb24gaSh0LGUscil7Zm9yKHZhciBuPTA7bjwxNjtuKyspe3ZhciBpPXIrbixjPWVbaV07ZVtpXT0xNjcxMTkzNSYoYzw8OHxjPj4+MjQpfDQyNzgyNTUzNjAmKGM8PDI0fGM+Pj44KX12YXIgbSxnLHcsXyxNLFMsRSxBLGsseDtTPW09dFswXSxFPWc9dFsxXSxBPXc9dFsyXSxrPV89dFszXSx4PU09dFs0XTt2YXIgSTtmb3Iobj0wO248ODA7bis9MSlJPW0rZVtyK2Rbbl1dfDAsSSs9bjwxNj9vKGcsdyxfKSt2WzBdOm48MzI/YShnLHcsXykrdlsxXTpuPDQ4P2YoZyx3LF8pK3ZbMl06bjw2ND9zKGcsdyxfKSt2WzNdOnUoZyx3LF8pK3ZbNF0sSXw9MCxJPWgoSSxwW25dKSxJPUkrTXwwLG09TSxNPV8sXz1oKHcsMTApLHc9ZyxnPUksST1TK2VbcitsW25dXXwwLEkrPW48MTY/dShFLEEsaykreVswXTpuPDMyP3MoRSxBLGspK3lbMV06bjw0OD9mKEUsQSxrKSt5WzJdOm48NjQ/YShFLEEsaykreVszXTpvKEUsQSxrKSt5WzRdLEl8PTAsST1oKEksYltuXSksST1JK3h8MCxTPXgseD1rLGs9aChBLDEwKSxBPUUsRT1JO0k9dFsxXSt3K2t8MCx0WzFdPXRbMl0rXyt4fDAsdFsyXT10WzNdK00rU3wwLHRbM109dFs0XSttK0V8MCx0WzRdPXRbMF0rZytBfDAsdFswXT1JfWZ1bmN0aW9uIG8odCxlLHIpe3JldHVybiB0XmVecn1mdW5jdGlvbiBhKHQsZSxyKXtyZXR1cm4gdCZlfH50JnJ9ZnVuY3Rpb24gZih0LGUscil7cmV0dXJuKHR8fmUpXnJ9ZnVuY3Rpb24gcyh0LGUscil7cmV0dXJuIHQmcnxlJn5yfWZ1bmN0aW9uIHUodCxlLHIpe3JldHVybiB0XihlfH5yKX1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuIHQ8PGV8dD4+PjMyLWV9ZnVuY3Rpb24gYyh0KXt2YXIgbz1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdO1wic3RyaW5nXCI9PXR5cGVvZiB0JiYodD1uZXcgZSh0LFwidXRmOFwiKSk7dmFyIGE9cih0KSxmPTgqdC5sZW5ndGgscz04KnQubGVuZ3RoO2FbZj4+PjVdfD0xMjg8PDI0LWYlMzIsYVsoZis2ND4+Pjk8PDQpKzE0XT0xNjcxMTkzNSYoczw8OHxzPj4+MjQpfDQyNzgyNTUzNjAmKHM8PDI0fHM+Pj44KTtmb3IodmFyIHU9MDt1PGEubGVuZ3RoO3UrPTE2KWkobyxhLHUpO2Zvcih1PTA7dTw1O3UrKyl7dmFyIGg9b1t1XTtvW3VdPTE2NzExOTM1JihoPDw4fGg+Pj4yNCl8NDI3ODI1NTM2MCYoaDw8MjR8aD4+PjgpfXZhciBjPW4obyk7cmV0dXJuIG5ldyBlKGMpfS8qKiBAcHJlc2VydmVcbihjKSAyMDEyIGJ5IEPDqWRyaWMgTWVzbmlsLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbnZhciBkPVswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDcsNCwxMywxLDEwLDYsMTUsMywxMiwwLDksNSwyLDE0LDExLDgsMywxMCwxNCw0LDksMTUsOCwxLDIsNywwLDYsMTMsMTEsNSwxMiwxLDksMTEsMTAsMCw4LDEyLDQsMTMsMyw3LDE1LDE0LDUsNiwyLDQsMCw1LDksNywxMiwyLDEwLDE0LDEsMyw4LDExLDYsMTUsMTNdLGw9WzUsMTQsNywwLDksMiwxMSw0LDEzLDYsMTUsOCwxLDEwLDMsMTIsNiwxMSwzLDcsMCwxMyw1LDEwLDE0LDE1LDgsMTIsNCw5LDEsMiwxNSw1LDEsMyw3LDE0LDYsOSwxMSw4LDEyLDIsMTAsMCw0LDEzLDgsNiw0LDEsMywxMSwxNSwwLDUsMTIsMiwxMyw5LDcsMTAsMTQsMTIsMTUsMTAsNCwxLDUsOCw3LDYsMiwxMywxNCwwLDMsOSwxMV0scD1bMTEsMTQsMTUsMTIsNSw4LDcsOSwxMSwxMywxNCwxNSw2LDcsOSw4LDcsNiw4LDEzLDExLDksNywxNSw3LDEyLDE1LDksMTEsNywxMywxMiwxMSwxMyw2LDcsMTQsOSwxMywxNSwxNCw4LDEzLDYsNSwxMiw3LDUsMTEsMTIsMTQsMTUsMTQsMTUsOSw4LDksMTQsNSw2LDgsNiw1LDEyLDksMTUsNSwxMSw2LDgsMTMsMTIsNSwxMiwxMywxNCwxMSw4LDUsNl0sYj1bOCw5LDksMTEsMTMsMTUsMTUsNSw3LDcsOCwxMSwxNCwxNCwxMiw2LDksMTMsMTUsNywxMiw4LDksMTEsNyw3LDEyLDcsNiwxNSwxMywxMSw5LDcsMTUsMTEsOCw2LDYsMTQsMTIsMTMsNSwxNCwxMywxMyw3LDUsMTUsNSw4LDExLDE0LDE0LDYsMTQsNiw5LDEyLDksMTIsNSwxNSw4LDgsNSwxMiw5LDEyLDUsMTQsNiw4LDEzLDYsNSwxNSwxMywxMSwxMV0sdj1bMCwxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsMjQwMDk1OTcwOCwyODQwODUzODM4XSx5PVsxMzUyODI5OTI2LDE1NDg2MDM2ODQsMTgzNjA3MjY5MSwyMDUzOTk0MjE3LDBdO3QuZXhwb3J0cz1jfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBlPXQuZXhwb3J0cz1mdW5jdGlvbih0KXt0PXQudG9Mb3dlckNhc2UoKTt2YXIgcj1lW3RdO2lmKCFyKXRocm93IG5ldyBFcnJvcih0K1wiIGlzIG5vdCBzdXBwb3J0ZWQgKHdlIGFjY2VwdCBwdWxsIHJlcXVlc3RzKVwiKTtyZXR1cm4gbmV3IHJ9O2Uuc2hhPXIoNTY5KSxlLnNoYTE9cig1NzApLGUuc2hhMjI0PXIoNTcxKSxlLnNoYTI1Nj1yKDIyNyksZS5zaGEzODQ9cig1NzIpLGUuc2hhNTEyPXIoMjI4KX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKCl7dGhpcy5pbml0KCksdGhpcy5fdz1oLHMuY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiBpKHQpe3JldHVybiB0PDw1fHQ+Pj4yN31mdW5jdGlvbiBvKHQpe3JldHVybiB0PDwzMHx0Pj4+Mn1mdW5jdGlvbiBhKHQsZSxyLG4pe3JldHVybiAwPT09dD9lJnJ8fmUmbjoyPT09dD9lJnJ8ZSZufHImbjplXnJebn12YXIgZj1yKDIpLHM9cig2MCksdT1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdLGg9bmV3IEFycmF5KDgwKTtmKG4scyksbi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjAsdGhpc30sbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fdyxyPTB8dGhpcy5fYSxuPTB8dGhpcy5fYixmPTB8dGhpcy5fYyxzPTB8dGhpcy5fZCxoPTB8dGhpcy5fZSxjPTA7YzwxNjsrK2MpZVtjXT10LnJlYWRJbnQzMkJFKDQqYyk7Zm9yKDtjPDgwOysrYyllW2NdPWVbYy0zXV5lW2MtOF1eZVtjLTE0XV5lW2MtMTZdO2Zvcih2YXIgZD0wO2Q8ODA7KytkKXt2YXIgbD1+fihkLzIwKSxwPWkocikrYShsLG4sZixzKStoK2VbZF0rdVtsXXwwO2g9cyxzPWYsZj1vKG4pLG49cixyPXB9dGhpcy5fYT1yK3RoaXMuX2F8MCx0aGlzLl9iPW4rdGhpcy5fYnwwLHRoaXMuX2M9Zit0aGlzLl9jfDAsdGhpcy5fZD1zK3RoaXMuX2R8MCx0aGlzLl9lPWgrdGhpcy5fZXwwfSxuLnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciB0PW5ldyBlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz1ufSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKCl7dGhpcy5pbml0KCksdGhpcy5fdz1jLHUuY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiBpKHQpe3JldHVybiB0PDwxfHQ+Pj4zMX1mdW5jdGlvbiBvKHQpe3JldHVybiB0PDw1fHQ+Pj4yN31mdW5jdGlvbiBhKHQpe3JldHVybiB0PDwzMHx0Pj4+Mn1mdW5jdGlvbiBmKHQsZSxyLG4pe3JldHVybiAwPT09dD9lJnJ8fmUmbjoyPT09dD9lJnJ8ZSZufHImbjplXnJebn12YXIgcz1yKDIpLHU9cig2MCksaD1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdLGM9bmV3IEFycmF5KDgwKTtzKG4sdSksbi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjAsdGhpc30sbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fdyxyPTB8dGhpcy5fYSxuPTB8dGhpcy5fYixzPTB8dGhpcy5fYyx1PTB8dGhpcy5fZCxjPTB8dGhpcy5fZSxkPTA7ZDwxNjsrK2QpZVtkXT10LnJlYWRJbnQzMkJFKDQqZCk7Zm9yKDtkPDgwOysrZCllW2RdPWkoZVtkLTNdXmVbZC04XV5lW2QtMTRdXmVbZC0xNl0pO2Zvcih2YXIgbD0wO2w8ODA7KytsKXt2YXIgcD1+fihsLzIwKSxiPW8ocikrZihwLG4scyx1KStjK2VbbF0raFtwXXwwO2M9dSx1PXMscz1hKG4pLG49cixyPWJ9dGhpcy5fYT1yK3RoaXMuX2F8MCx0aGlzLl9iPW4rdGhpcy5fYnwwLHRoaXMuX2M9cyt0aGlzLl9jfDAsdGhpcy5fZD11K3RoaXMuX2R8MCx0aGlzLl9lPWMrdGhpcy5fZXwwfSxuLnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciB0PW5ldyBlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz1ufSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKCl7dGhpcy5pbml0KCksdGhpcy5fdz1mLGEuY2FsbCh0aGlzLDY0LDU2KX12YXIgaT1yKDIpLG89cigyMjcpLGE9cig2MCksZj1uZXcgQXJyYXkoNjQpO2kobixvKSxuLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2E9MzIzODM3MTAzMix0aGlzLl9iPTkxNDE1MDY2Myx0aGlzLl9jPTgxMjcwMjk5OSx0aGlzLl9kPTQxNDQ5MTI2OTcsdGhpcy5fZT00MjkwNzc1ODU3LHRoaXMuX2Y9MTc1MDYwMzAyNSx0aGlzLl9nPTE2OTQwNzY4MzksdGhpcy5faD0zMjA0MDc1NDI4LHRoaXN9LG4ucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGUoMjgpO3JldHVybiB0LndyaXRlSW50MzJCRSh0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKHRoaXMuX2IsNCksdC53cml0ZUludDMyQkUodGhpcy5fYyw4KSx0LndyaXRlSW50MzJCRSh0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSh0aGlzLl9lLDE2KSx0LndyaXRlSW50MzJCRSh0aGlzLl9mLDIwKSx0LndyaXRlSW50MzJCRSh0aGlzLl9nLDI0KSx0fSx0LmV4cG9ydHM9bn0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3RoaXMuaW5pdCgpLHRoaXMuX3c9ZixhLmNhbGwodGhpcywxMjgsMTEyKX12YXIgaT1yKDIpLG89cigyMjgpLGE9cig2MCksZj1uZXcgQXJyYXkoMTYwKTtpKG4sbyksbi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9haD0zNDE4MDcwMzY1LHRoaXMuX2JoPTE2NTQyNzAyNTAsdGhpcy5fY2g9MjQzODUyOTM3MCx0aGlzLl9kaD0zNTU0NjIzNjAsdGhpcy5fZWg9MTczMTQwNTQxNSx0aGlzLl9maD0yMzk0MTgwMjMxLHRoaXMuX2doPTM2NzUwMDg1MjUsdGhpcy5faGg9MTIwMzA2MjgxMyx0aGlzLl9hbD0zMjM4MzcxMDMyLHRoaXMuX2JsPTkxNDE1MDY2Myx0aGlzLl9jbD04MTI3MDI5OTksdGhpcy5fZGw9NDE0NDkxMjY5Nyx0aGlzLl9lbD00MjkwNzc1ODU3LHRoaXMuX2ZsPTE3NTA2MDMwMjUsdGhpcy5fZ2w9MTY5NDA3NjgzOSx0aGlzLl9obD0zMjA0MDc1NDI4LHRoaXN9LG4ucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7ci53cml0ZUludDMyQkUodCxuKSxyLndyaXRlSW50MzJCRShlLG4rNCl9dmFyIHI9bmV3IGUoNDgpO3JldHVybiB0KHRoaXMuX2FoLHRoaXMuX2FsLDApLHQodGhpcy5fYmgsdGhpcy5fYmwsOCksdCh0aGlzLl9jaCx0aGlzLl9jbCwxNiksdCh0aGlzLl9kaCx0aGlzLl9kbCwyNCksdCh0aGlzLl9laCx0aGlzLl9lbCwzMiksdCh0aGlzLl9maCx0aGlzLl9mbCw0MCkscn0sdC5leHBvcnRzPW59KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSl7dmFyIHI9bmV3IHQoYVtlXS5wcmltZSxcImhleFwiKSxuPW5ldyB0KGFbZV0uZ2VuLFwiaGV4XCIpO3JldHVybiBuZXcgZihyLG4pfWZ1bmN0aW9uIGkoZSxyLG4sYSl7cmV0dXJuIHQuaXNCdWZmZXIocil8fHZvaWQgMD09PXNbcl0/aShlLFwiYmluYXJ5XCIscixuKToocj1yfHxcImJpbmFyeVwiLGE9YXx8XCJiaW5hcnlcIixuPW58fG5ldyB0KFsyXSksdC5pc0J1ZmZlcihuKXx8KG49bmV3IHQobixhKSksXCJudW1iZXJcIj09dHlwZW9mIGU/bmV3IGYobyhlLG4pLG4sITApOih0LmlzQnVmZmVyKGUpfHwoZT1uZXcgdChlLHIpKSxuZXcgZihlLG4sITApKSl9dmFyIG89cigyMjkpLGE9cig0NjgpLGY9cig1NzQpLHM9e2JpbmFyeTohMCxoZXg6ITAsYmFzZTY0OiEwfTtlLkRpZmZpZUhlbGxtYW5Hcm91cD1lLmNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cD1lLmdldERpZmZpZUhlbGxtYW49bixlLmNyZWF0ZURpZmZpZUhlbGxtYW49ZS5EaWZmaWVIZWxsbWFuPWl9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxyKXtyZXR1cm4gcj1yfHxcInV0ZjhcIixlLmlzQnVmZmVyKHQpfHwodD1uZXcgZSh0LHIpKSx0aGlzLl9wdWI9bmV3IHModCksdGhpc31mdW5jdGlvbiBpKHQscil7cmV0dXJuIHI9cnx8XCJ1dGY4XCIsZS5pc0J1ZmZlcih0KXx8KHQ9bmV3IGUodCxyKSksdGhpcy5fcHJpdj1uZXcgcyh0KSx0aGlzfWZ1bmN0aW9uIG8odCxlKXt2YXIgcj1lLnRvU3RyaW5nKFwiaGV4XCIpLG49W3IsdC50b1N0cmluZygxNildLmpvaW4oXCJfXCIpO2lmKG4gaW4gbSlyZXR1cm4gbVtuXTt2YXIgaT0wO2lmKHQuaXNFdmVuKCl8fCF2LnNpbXBsZVNpZXZlfHwhdi5mZXJtYXRUZXN0KHQpfHwhaC50ZXN0KHQpKXJldHVybiBpKz0xLGkrPVwiMDJcIj09PXJ8fFwiMDVcIj09PXI/ODo0LG1bbl09aSxpO2gudGVzdCh0LnNocm4oMSkpfHwoaSs9Mik7dmFyIG87c3dpdGNoKHIpe2Nhc2VcIjAyXCI6dC5tb2QoYykuY21wKGQpJiYoaSs9OCk7YnJlYWs7Y2FzZVwiMDVcIjpvPXQubW9kKGwpLG8uY21wKHApJiZvLmNtcChiKSYmKGkrPTgpO2JyZWFrO2RlZmF1bHQ6aSs9NH1yZXR1cm4gbVtuXT1pLGl9ZnVuY3Rpb24gYSh0LGUscil7dGhpcy5zZXRHZW5lcmF0b3IoZSksdGhpcy5fX3ByaW1lPW5ldyBzKHQpLHRoaXMuX3ByaW1lPXMubW9udCh0aGlzLl9fcHJpbWUpLHRoaXMuX3ByaW1lTGVuPXQubGVuZ3RoLHRoaXMuX3B1Yj12b2lkIDAsdGhpcy5fcHJpdj12b2lkIDAsdGhpcy5fcHJpbWVDb2RlPXZvaWQgMCxyPyh0aGlzLnNldFB1YmxpY0tleT1uLHRoaXMuc2V0UHJpdmF0ZUtleT1pKTp0aGlzLl9wcmltZUNvZGU9OH1mdW5jdGlvbiBmKHQscil7dmFyIG49bmV3IGUodC50b0FycmF5KCkpO3JldHVybiByP24udG9TdHJpbmcocik6bn12YXIgcz1yKDE1MCksdT1yKDIzMCksaD1uZXcgdSxjPW5ldyBzKDI0KSxkPW5ldyBzKDExKSxsPW5ldyBzKDEwKSxwPW5ldyBzKDMpLGI9bmV3IHMoNyksdj1yKDIyOSkseT1yKDYxKTt0LmV4cG9ydHM9YTt2YXIgbT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYS5wcm90b3R5cGUsXCJ2ZXJpZnlFcnJvclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVyblwibnVtYmVyXCIhPXR5cGVvZiB0aGlzLl9wcmltZUNvZGUmJih0aGlzLl9wcmltZUNvZGU9byh0aGlzLl9fcHJpbWUsdGhpcy5fX2dlbikpLHRoaXMuX3ByaW1lQ29kZX19KSxhLnByb3RvdHlwZS5nZW5lcmF0ZUtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJpdnx8KHRoaXMuX3ByaXY9bmV3IHMoeSh0aGlzLl9wcmltZUxlbikpKSx0aGlzLl9wdWI9dGhpcy5fZ2VuLnRvUmVkKHRoaXMuX3ByaW1lKS5yZWRQb3codGhpcy5fcHJpdikuZnJvbVJlZCgpLHRoaXMuZ2V0UHVibGljS2V5KCl9LGEucHJvdG90eXBlLmNvbXB1dGVTZWNyZXQ9ZnVuY3Rpb24odCl7dD1uZXcgcyh0KSx0PXQudG9SZWQodGhpcy5fcHJpbWUpO3ZhciByPXQucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKSxuPW5ldyBlKHIudG9BcnJheSgpKSxpPXRoaXMuZ2V0UHJpbWUoKTtpZihuLmxlbmd0aDxpLmxlbmd0aCl7dmFyIG89bmV3IGUoaS5sZW5ndGgtbi5sZW5ndGgpO28uZmlsbCgwKSxuPWUuY29uY2F0KFtvLG5dKX1yZXR1cm4gbn0sYS5wcm90b3R5cGUuZ2V0UHVibGljS2V5PWZ1bmN0aW9uKHQpe3JldHVybiBmKHRoaXMuX3B1Yix0KX0sYS5wcm90b3R5cGUuZ2V0UHJpdmF0ZUtleT1mdW5jdGlvbih0KXtyZXR1cm4gZih0aGlzLl9wcml2LHQpfSxhLnByb3RvdHlwZS5nZXRQcmltZT1mdW5jdGlvbih0KXtyZXR1cm4gZih0aGlzLl9fcHJpbWUsdCl9LGEucHJvdG90eXBlLmdldEdlbmVyYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gZih0aGlzLl9nZW4sdCl9LGEucHJvdG90eXBlLnNldEdlbmVyYXRvcj1mdW5jdGlvbih0LHIpe3JldHVybiByPXJ8fFwidXRmOFwiLGUuaXNCdWZmZXIodCl8fCh0PW5ldyBlKHQscikpLHRoaXMuX19nZW49dCx0aGlzLl9nZW49bmV3IHModCksdGhpc319KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXt0aGlzLnJhbmQ9dH12YXIgaTtpZih0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGl8fChpPW5ldyBuKG51bGwpKSxpLmdlbmVyYXRlKHQpfSx0LmV4cG9ydHMuUmFuZD1uLG4ucHJvdG90eXBlLmdlbmVyYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYW5kKHQpfSxcIm9iamVjdFwiPT10eXBlb2Ygd2luZG93KXdpbmRvdy5jcnlwdG8mJndpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzP24ucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBVaW50OEFycmF5KHQpO3JldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKSxlfTp3aW5kb3cubXNDcnlwdG8mJndpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM/bi5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodCk7cmV0dXJuIHdpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoZSksZX06bi5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQgeWV0XCIpfTtlbHNlIHRyeXt2YXIgbz1yKDYxMSk7bi5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8ucmFuZG9tQnl0ZXModCl9fWNhdGNoKHQpe24ucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVWludDhBcnJheSh0KSxyPTA7cjxlLmxlbmd0aDtyKyspZVtyXT10aGlzLnJhbmQuZ2V0Qnl0ZSgpO3JldHVybiBlfX19LGZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5wb3coMiwzMCktMTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihcIm51bWJlclwiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiSXRlcmF0aW9ucyBub3QgYSBudW1iZXJcIik7aWYodDwwKXRocm93IG5ldyBUeXBlRXJyb3IoXCJCYWQgaXRlcmF0aW9uc1wiKTtpZihcIm51bWJlclwiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiS2V5IGxlbmd0aCBub3QgYSBudW1iZXJcIik7aWYoZTwwfHxlPnJ8fGUhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJCYWQga2V5IGxlbmd0aFwiKX19LGZ1bmN0aW9uKHQsZSxyKXtlLnB1YmxpY0VuY3J5cHQ9cig1OTMpLGUucHJpdmF0ZURlY3J5cHQ9cig1OTIpLGUucHJpdmF0ZUVuY3J5cHQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5wdWJsaWNFbmNyeXB0KHQsciwhMCl9LGUucHVibGljRGVjcnlwdD1mdW5jdGlvbih0LHIpe3JldHVybiBlLnByaXZhdGVEZWNyeXB0KHQsciwhMCl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxMDYpLGk9bi5kZWZpbmUoXCJSU0FQcml2YXRlS2V5XCIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleShcInZlcnNpb25cIikuaW50KCksdGhpcy5rZXkoXCJtb2R1bHVzXCIpLmludCgpLHRoaXMua2V5KFwicHVibGljRXhwb25lbnRcIikuaW50KCksdGhpcy5rZXkoXCJwcml2YXRlRXhwb25lbnRcIikuaW50KCksdGhpcy5rZXkoXCJwcmltZTFcIikuaW50KCksdGhpcy5rZXkoXCJwcmltZTJcIikuaW50KCksdGhpcy5rZXkoXCJleHBvbmVudDFcIikuaW50KCksdGhpcy5rZXkoXCJleHBvbmVudDJcIikuaW50KCksdGhpcy5rZXkoXCJjb2VmZmljaWVudFwiKS5pbnQoKSl9KTtlLlJTQVByaXZhdGVLZXk9aTt2YXIgbz1uLmRlZmluZShcIlJTQVB1YmxpY0tleVwiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoXCJtb2R1bHVzXCIpLmludCgpLHRoaXMua2V5KFwicHVibGljRXhwb25lbnRcIikuaW50KCkpfSk7ZS5SU0FQdWJsaWNLZXk9bzt2YXIgYT1uLmRlZmluZShcIlN1YmplY3RQdWJsaWNLZXlJbmZvXCIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleShcImFsZ29yaXRobVwiKS51c2UoZiksdGhpcy5rZXkoXCJzdWJqZWN0UHVibGljS2V5XCIpLmJpdHN0cigpKX0pO2UuUHVibGljS2V5PWE7dmFyIGY9bi5kZWZpbmUoXCJBbGdvcml0aG1JZGVudGlmaWVyXCIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleShcImFsZ29yaXRobVwiKS5vYmppZCgpLHRoaXMua2V5KFwibm9uZVwiKS5udWxsXygpLm9wdGlvbmFsKCksdGhpcy5rZXkoXCJjdXJ2ZVwiKS5vYmppZCgpLm9wdGlvbmFsKCksdGhpcy5rZXkoXCJwYXJhbXNcIikuc2VxKCkub2JqKHRoaXMua2V5KFwicFwiKS5pbnQoKSx0aGlzLmtleShcInFcIikuaW50KCksdGhpcy5rZXkoXCJnXCIpLmludCgpKS5vcHRpb25hbCgpKX0pLHM9bi5kZWZpbmUoXCJQcml2YXRlS2V5SW5mb1wiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoXCJ2ZXJzaW9uXCIpLmludCgpLHRoaXMua2V5KFwiYWxnb3JpdGhtXCIpLnVzZShmKSx0aGlzLmtleShcInN1YmplY3RQcml2YXRlS2V5XCIpLm9jdHN0cigpKX0pO2UuUHJpdmF0ZUtleT1zO3ZhciB1PW4uZGVmaW5lKFwiRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9cIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KFwiYWxnb3JpdGhtXCIpLnNlcSgpLm9iaih0aGlzLmtleShcImlkXCIpLm9iamlkKCksdGhpcy5rZXkoXCJkZWNyeXB0XCIpLnNlcSgpLm9iaih0aGlzLmtleShcImtkZVwiKS5zZXEoKS5vYmoodGhpcy5rZXkoXCJpZFwiKS5vYmppZCgpLHRoaXMua2V5KFwia2RlcGFyYW1zXCIpLnNlcSgpLm9iaih0aGlzLmtleShcInNhbHRcIikub2N0c3RyKCksdGhpcy5rZXkoXCJpdGVyc1wiKS5pbnQoKSkpLHRoaXMua2V5KFwiY2lwaGVyXCIpLnNlcSgpLm9iaih0aGlzLmtleShcImFsZ29cIikub2JqaWQoKSx0aGlzLmtleShcIml2XCIpLm9jdHN0cigpKSkpLHRoaXMua2V5KFwic3ViamVjdFByaXZhdGVLZXlcIikub2N0c3RyKCkpfSk7ZS5FbmNyeXB0ZWRQcml2YXRlS2V5PXU7dmFyIGg9bi5kZWZpbmUoXCJEU0FQcml2YXRlS2V5XCIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleShcInZlcnNpb25cIikuaW50KCksdGhpcy5rZXkoXCJwXCIpLmludCgpLHRoaXMua2V5KFwicVwiKS5pbnQoKSx0aGlzLmtleShcImdcIikuaW50KCksdGhpcy5rZXkoXCJwdWJfa2V5XCIpLmludCgpLHRoaXMua2V5KFwicHJpdl9rZXlcIikuaW50KCkpfSk7ZS5EU0FQcml2YXRlS2V5PWgsZS5EU0FwYXJhbT1uLmRlZmluZShcIkRTQXBhcmFtXCIsZnVuY3Rpb24oKXt0aGlzLmludCgpfSk7dmFyIGM9bi5kZWZpbmUoXCJFQ1ByaXZhdGVLZXlcIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KFwidmVyc2lvblwiKS5pbnQoKSx0aGlzLmtleShcInByaXZhdGVLZXlcIikub2N0c3RyKCksdGhpcy5rZXkoXCJwYXJhbWV0ZXJzXCIpLm9wdGlvbmFsKCkuZXhwbGljaXQoMCkudXNlKGQpLHRoaXMua2V5KFwicHVibGljS2V5XCIpLm9wdGlvbmFsKCkuZXhwbGljaXQoMSkuYml0c3RyKCkpfSk7ZS5FQ1ByaXZhdGVLZXk9Yzt2YXIgZD1uLmRlZmluZShcIkVDUGFyYW1ldGVyc1wiLGZ1bmN0aW9uKCl7dGhpcy5jaG9pY2Uoe25hbWVkQ3VydmU6dGhpcy5vYmppZCgpfSl9KTtlLnNpZ25hdHVyZT1uLmRlZmluZShcInNpZ25hdHVyZVwiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoXCJyXCIpLmludCgpLHRoaXMua2V5KFwic1wiKS5pbnQoKSl9KX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXt2YXIgbj0vUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxccj9cXG5ERUstSW5mbzogQUVTLSgoPzoxMjgpfCg/OjE5Mil8KD86MjU2KSktQ0JDLChbMC05QS1IXSspXFxyP1xcblxccj9cXG4oWzAtOUEtelxcblxcclxcK1xcL1xcPV0rKVxccj9cXG4vbSxpPS9eLS0tLS1CRUdJTiAoLiopIEtFWS0tLS0tXFxyP1xcbi9tLG89L14tLS0tLUJFR0lOICguKikgS0VZLS0tLS1cXHI/XFxuKFswLTlBLXpcXG5cXHJcXCtcXC9cXD1dKylcXHI/XFxuLS0tLS1FTkQgXFwxIEtFWS0tLS0tJC9tLGE9cigxNTMpLGY9cigyMzkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LHIpe3ZhciBzLHU9dC50b1N0cmluZygpLGg9dS5tYXRjaChuKTtpZihoKXt2YXIgYz1cImFlc1wiK2hbMV0sZD1uZXcgZShoWzJdLFwiaGV4XCIpLGw9bmV3IGUoaFszXS5yZXBsYWNlKC9cXHI/XFxuL2csXCJcIiksXCJiYXNlNjRcIikscD1hKHIsZC5zbGljZSgwLDgpLHBhcnNlSW50KGhbMV0sMTApKS5rZXksYj1bXSx2PWYuY3JlYXRlRGVjaXBoZXJpdihjLHAsZCk7Yi5wdXNoKHYudXBkYXRlKGwpKSxiLnB1c2godi5maW5hbCgpKSxzPWUuY29uY2F0KGIpfWVsc2V7dmFyIHk9dS5tYXRjaChvKTtzPW5ldyBlKHlbMl0ucmVwbGFjZSgvXFxyP1xcbi9nLFwiXCIpLFwiYmFzZTY0XCIpfXZhciBtPXUubWF0Y2goaSlbMV0rXCIgS0VZXCI7cmV0dXJue3RhZzptLGRhdGE6c319fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt0aGlzLm5hbWU9dCx0aGlzLmJvZHk9ZSx0aGlzLmRlY29kZXJzPXt9LHRoaXMuZW5jb2RlcnM9e319dmFyIGk9cigxMDYpLG89cigyKSxhPWU7YS5kZWZpbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sbi5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkPWZ1bmN0aW9uKHQpe3ZhciBlO3RyeXtlPXIoMjUxKS5ydW5JblRoaXNDb250ZXh0KFwiKGZ1bmN0aW9uIFwiK3RoaXMubmFtZStcIihlbnRpdHkpIHtcXG4gIHRoaXMuX2luaXROYW1lZChlbnRpdHkpO1xcbn0pXCIpfWNhdGNoKHQpe2U9ZnVuY3Rpb24odCl7dGhpcy5faW5pdE5hbWVkKHQpfX1yZXR1cm4gbyhlLHQpLGUucHJvdG90eXBlLl9pbml0TmFtZWQ9ZnVuY3Rpb24oZSl7dC5jYWxsKHRoaXMsZSl9LG5ldyBlKHRoaXMpfSxuLnByb3RvdHlwZS5fZ2V0RGVjb2Rlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHxcImRlclwiLHRoaXMuZGVjb2RlcnMuaGFzT3duUHJvcGVydHkodCl8fCh0aGlzLmRlY29kZXJzW3RdPXRoaXMuX2NyZWF0ZU5hbWVkKGkuZGVjb2RlcnNbdF0pKSx0aGlzLmRlY29kZXJzW3RdfSxuLnByb3RvdHlwZS5kZWNvZGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLl9nZXREZWNvZGVyKGUpLmRlY29kZSh0LHIpfSxuLnByb3RvdHlwZS5fZ2V0RW5jb2Rlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD10fHxcImRlclwiLHRoaXMuZW5jb2RlcnMuaGFzT3duUHJvcGVydHkodCl8fCh0aGlzLmVuY29kZXJzW3RdPXRoaXMuX2NyZWF0ZU5hbWVkKGkuZW5jb2RlcnNbdF0pKSx0aGlzLmVuY29kZXJzW3RdfSxuLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLl9nZXRFbmNvZGVyKGUpLmVuY29kZSh0LHIpfX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt2YXIgcj17fTt0aGlzLl9iYXNlU3RhdGU9cixyLmVuYz10LHIucGFyZW50PWV8fG51bGwsci5jaGlsZHJlbj1udWxsLHIudGFnPW51bGwsci5hcmdzPW51bGwsci5yZXZlcnNlQXJncz1udWxsLHIuY2hvaWNlPW51bGwsci5vcHRpb25hbD0hMSxyLmFueT0hMSxyLm9iaj0hMSxyLnVzZT1udWxsLHIudXNlRGVjb2Rlcj1udWxsLHIua2V5PW51bGwsci5kZWZhdWx0PW51bGwsci5leHBsaWNpdD1udWxsLHIuaW1wbGljaXQ9bnVsbCxyLmNvbnRhaW5zPW51bGwsci5wYXJlbnR8fChyLmNoaWxkcmVuPVtdLHRoaXMuX3dyYXAoKSl9dmFyIGk9cig3MSkuUmVwb3J0ZXIsbz1yKDcxKS5FbmNvZGVyQnVmZmVyLGE9cig3MSkuRGVjb2RlckJ1ZmZlcixmPXIoNTg4KSxzPVtcInNlcVwiLFwic2Vxb2ZcIixcInNldFwiLFwic2V0b2ZcIixcIm9iamlkXCIsXCJib29sXCIsXCJnZW50aW1lXCIsXCJ1dGN0aW1lXCIsXCJudWxsX1wiLFwiZW51bVwiLFwiaW50XCIsXCJiaXRzdHJcIixcImJtcHN0clwiLFwiY2hhcnN0clwiLFwiZ2Vuc3RyXCIsXCJncmFwaHN0clwiLFwiaWE1c3RyXCIsXCJpc282NDZzdHJcIixcIm51bXN0clwiLFwib2N0c3RyXCIsXCJwcmludHN0clwiLFwidDYxc3RyXCIsXCJ1bmlzdHJcIixcInV0ZjhzdHJcIixcInZpZGVvc3RyXCJdLHU9W1wia2V5XCIsXCJvYmpcIixcInVzZVwiLFwib3B0aW9uYWxcIixcImV4cGxpY2l0XCIsXCJpbXBsaWNpdFwiLFwiZGVmXCIsXCJjaG9pY2VcIixcImFueVwiLFwiY29udGFpbnNcIl0uY29uY2F0KHMpLGg9W1wiX3BlZWtUYWdcIixcIl9kZWNvZGVUYWdcIixcIl91c2VcIixcIl9kZWNvZGVTdHJcIixcIl9kZWNvZGVPYmppZFwiLFwiX2RlY29kZVRpbWVcIixcIl9kZWNvZGVOdWxsXCIsXCJfZGVjb2RlSW50XCIsXCJfZGVjb2RlQm9vbFwiLFwiX2RlY29kZUxpc3RcIixcIl9lbmNvZGVDb21wb3NpdGVcIixcIl9lbmNvZGVTdHJcIixcIl9lbmNvZGVPYmppZFwiLFwiX2VuY29kZVRpbWVcIixcIl9lbmNvZGVOdWxsXCIsXCJfZW5jb2RlSW50XCIsXCJfZW5jb2RlQm9vbFwiXTt0LmV4cG9ydHM9bjt2YXIgYz1bXCJlbmNcIixcInBhcmVudFwiLFwiY2hpbGRyZW5cIixcInRhZ1wiLFwiYXJnc1wiLFwicmV2ZXJzZUFyZ3NcIixcImNob2ljZVwiLFwib3B0aW9uYWxcIixcImFueVwiLFwib2JqXCIsXCJ1c2VcIixcImFsdGVyZWRVc2VcIixcImtleVwiLFwiZGVmYXVsdFwiLFwiZXhwbGljaXRcIixcImltcGxpY2l0XCIsXCJjb250YWluc1wiXTtuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VTdGF0ZSxlPXt9O2MuZm9yRWFjaChmdW5jdGlvbihyKXtlW3JdPXRbcl19KTt2YXIgcj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLnBhcmVudCk7cmV0dXJuIHIuX2Jhc2VTdGF0ZT1lLHJ9LG4ucHJvdG90eXBlLl93cmFwPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmFzZVN0YXRlO3UuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzW2VdPWZ1bmN0aW9uKCl7dmFyIHI9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7cmV0dXJuIHQuY2hpbGRyZW4ucHVzaChyKSxyW2VdLmFwcGx5KHIsYXJndW1lbnRzKX19LHRoaXMpfSxuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7ZihudWxsPT09ZS5wYXJlbnQpLHQuY2FsbCh0aGlzKSxlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0Ll9iYXNlU3RhdGUucGFyZW50PT09dGhpc30sdGhpcyksZi5lcXVhbChlLmNoaWxkcmVuLmxlbmd0aCwxLFwiUm9vdCBub2RlIGNhbiBoYXZlIG9ubHkgb25lIGNoaWxkXCIpfSxuLnByb3RvdHlwZS5fdXNlQXJncz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGUscj10LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3J9LHRoaXMpO3Q9dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuISh0IGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcil9LHRoaXMpLDAhPT1yLmxlbmd0aCYmKGYobnVsbD09PWUuY2hpbGRyZW4pLGUuY2hpbGRyZW49cixyLmZvckVhY2goZnVuY3Rpb24odCl7dC5fYmFzZVN0YXRlLnBhcmVudD10aGlzfSx0aGlzKSksMCE9PXQubGVuZ3RoJiYoZihudWxsPT09ZS5hcmdzKSxlLmFyZ3M9dCxlLnJldmVyc2VBcmdzPXQubWFwKGZ1bmN0aW9uKHQpe2lmKFwib2JqZWN0XCIhPXR5cGVvZiB0fHx0LmNvbnN0cnVjdG9yIT09T2JqZWN0KXJldHVybiB0O3ZhciBlPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3I9PSgwfHIpJiYocnw9MCk7dmFyIG49dFtyXTtlW25dPXJ9KSxlfSkpfSxoLmZvckVhY2goZnVuY3Rpb24odCl7bi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7dGhyb3cgbmV3IEVycm9yKHQrXCIgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogXCIrZS5lbmMpfX0pLHMuZm9yRWFjaChmdW5jdGlvbih0KXtuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2Jhc2VTdGF0ZSxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIGYobnVsbD09PWUudGFnKSxlLnRhZz10LHRoaXMuX3VzZUFyZ3MociksdGhpc319KSxuLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBmKG51bGw9PT1lLnVzZSksZS51c2U9dCx0aGlzfSxuLnByb3RvdHlwZS5vcHRpb25hbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gdC5vcHRpb25hbD0hMCx0aGlzfSxuLnByb3RvdHlwZS5kZWY9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBmKG51bGw9PT1lLmRlZmF1bHQpLGUuZGVmYXVsdD10LGUub3B0aW9uYWw9ITAsdGhpc30sbi5wcm90b3R5cGUuZXhwbGljaXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBmKG51bGw9PT1lLmV4cGxpY2l0JiZudWxsPT09ZS5pbXBsaWNpdCksZS5leHBsaWNpdD10LHRoaXN9LG4ucHJvdG90eXBlLmltcGxpY2l0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gZihudWxsPT09ZS5leHBsaWNpdCYmbnVsbD09PWUuaW1wbGljaXQpLGUuaW1wbGljaXQ9dCx0aGlzfSxuLnByb3RvdHlwZS5vYmo9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9iYXNlU3RhdGUsZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiB0Lm9iaj0hMCwwIT09ZS5sZW5ndGgmJnRoaXMuX3VzZUFyZ3MoZSksdGhpc30sbi5wcm90b3R5cGUua2V5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gZihudWxsPT09ZS5rZXkpLGUua2V5PXQsdGhpc30sbi5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmFzZVN0YXRlO3JldHVybiB0LmFueT0hMCx0aGlzfSxuLnByb3RvdHlwZS5jaG9pY2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBmKG51bGw9PT1lLmNob2ljZSksZS5jaG9pY2U9dCx0aGlzLl91c2VBcmdzKE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKSx0aGlzfSxuLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIGYobnVsbD09PWUudXNlKSxlLmNvbnRhaW5zPXQsdGhpc30sbi5wcm90b3R5cGUuX2RlY29kZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09ci5wYXJlbnQpcmV0dXJuIHQud3JhcFJlc3VsdChyLmNoaWxkcmVuWzBdLl9kZWNvZGUodCxlKSk7dmFyIG49ci5kZWZhdWx0LGk9ITAsbz1udWxsO2lmKG51bGwhPT1yLmtleSYmKG89dC5lbnRlcktleShyLmtleSkpLHIub3B0aW9uYWwpe3ZhciBmPW51bGw7aWYobnVsbCE9PXIuZXhwbGljaXQ/Zj1yLmV4cGxpY2l0Om51bGwhPT1yLmltcGxpY2l0P2Y9ci5pbXBsaWNpdDpudWxsIT09ci50YWcmJihmPXIudGFnKSxudWxsIT09Znx8ci5hbnkpe2lmKGk9dGhpcy5fcGVla1RhZyh0LGYsci5hbnkpLHQuaXNFcnJvcihpKSlyZXR1cm4gaX1lbHNle3ZhciBzPXQuc2F2ZSgpO3RyeXtudWxsPT09ci5jaG9pY2U/dGhpcy5fZGVjb2RlR2VuZXJpYyhyLnRhZyx0LGUpOnRoaXMuX2RlY29kZUNob2ljZSh0LGUpLGk9ITB9Y2F0Y2godCl7aT0hMX10LnJlc3RvcmUocyl9fXZhciB1O2lmKHIub2JqJiZpJiYodT10LmVudGVyT2JqZWN0KCkpLGkpe2lmKG51bGwhPT1yLmV4cGxpY2l0KXt2YXIgaD10aGlzLl9kZWNvZGVUYWcodCxyLmV4cGxpY2l0KTtpZih0LmlzRXJyb3IoaCkpcmV0dXJuIGg7dD1ofXZhciBjPXQub2Zmc2V0O2lmKG51bGw9PT1yLnVzZSYmbnVsbD09PXIuY2hvaWNlKXtpZihyLmFueSl2YXIgcz10LnNhdmUoKTt2YXIgZD10aGlzLl9kZWNvZGVUYWcodCxudWxsIT09ci5pbXBsaWNpdD9yLmltcGxpY2l0OnIudGFnLHIuYW55KTtpZih0LmlzRXJyb3IoZCkpcmV0dXJuIGQ7ci5hbnk/bj10LnJhdyhzKTp0PWR9aWYoZSYmZS50cmFjayYmbnVsbCE9PXIudGFnJiZlLnRyYWNrKHQucGF0aCgpLGMsdC5sZW5ndGgsXCJ0YWdnZWRcIiksZSYmZS50cmFjayYmbnVsbCE9PXIudGFnJiZlLnRyYWNrKHQucGF0aCgpLHQub2Zmc2V0LHQubGVuZ3RoLFwiY29udGVudFwiKSxuPXIuYW55P246bnVsbD09PXIuY2hvaWNlP3RoaXMuX2RlY29kZUdlbmVyaWMoci50YWcsdCxlKTp0aGlzLl9kZWNvZGVDaG9pY2UodCxlKSx0LmlzRXJyb3IobikpcmV0dXJuIG47aWYoci5hbnl8fG51bGwhPT1yLmNob2ljZXx8bnVsbD09PXIuY2hpbGRyZW58fHIuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihyKXtyLl9kZWNvZGUodCxlKX0pLHIuY29udGFpbnMmJihcIm9jdHN0clwiPT09ci50YWd8fFwiYml0c3RyXCI9PT1yLnRhZykpe3ZhciBsPW5ldyBhKG4pO249dGhpcy5fZ2V0VXNlKHIuY29udGFpbnMsdC5fcmVwb3J0ZXJTdGF0ZS5vYmopLl9kZWNvZGUobCxlKX19cmV0dXJuIHIub2JqJiZpJiYobj10LmxlYXZlT2JqZWN0KHUpKSxudWxsPT09ci5rZXl8fG51bGw9PT1uJiZpIT09ITA/bnVsbCE9PW8mJnQuZXhpdEtleShvKTp0LmxlYXZlS2V5KG8sci5rZXksbiksbn0sbi5wcm90b3R5cGUuX2RlY29kZUdlbmVyaWM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm5cInNlcVwiPT09dHx8XCJzZXRcIj09PXQ/bnVsbDpcInNlcW9mXCI9PT10fHxcInNldG9mXCI9PT10P3RoaXMuX2RlY29kZUxpc3QoZSx0LG4uYXJnc1swXSxyKTovc3RyJC8udGVzdCh0KT90aGlzLl9kZWNvZGVTdHIoZSx0LHIpOlwib2JqaWRcIj09PXQmJm4uYXJncz90aGlzLl9kZWNvZGVPYmppZChlLG4uYXJnc1swXSxuLmFyZ3NbMV0scik6XCJvYmppZFwiPT09dD90aGlzLl9kZWNvZGVPYmppZChlLG51bGwsbnVsbCxyKTpcImdlbnRpbWVcIj09PXR8fFwidXRjdGltZVwiPT09dD90aGlzLl9kZWNvZGVUaW1lKGUsdCxyKTpcIm51bGxfXCI9PT10P3RoaXMuX2RlY29kZU51bGwoZSxyKTpcImJvb2xcIj09PXQ/dGhpcy5fZGVjb2RlQm9vbChlLHIpOlwiaW50XCI9PT10fHxcImVudW1cIj09PXQ/dGhpcy5fZGVjb2RlSW50KGUsbi5hcmdzJiZuLmFyZ3NbMF0scik6bnVsbCE9PW4udXNlP3RoaXMuX2dldFVzZShuLnVzZSxlLl9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShlLHIpOmUuZXJyb3IoXCJ1bmtub3duIHRhZzogXCIrdCl9LG4ucHJvdG90eXBlLl9nZXRVc2U9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHIudXNlRGVjb2Rlcj10aGlzLl91c2UodCxlKSxmKG51bGw9PT1yLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5wYXJlbnQpLHIudXNlRGVjb2Rlcj1yLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5jaGlsZHJlblswXSxyLmltcGxpY2l0IT09ci51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQmJihyLnVzZURlY29kZXI9ci51c2VEZWNvZGVyLmNsb25lKCksci51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQ9ci5pbXBsaWNpdCksci51c2VEZWNvZGVyfSxuLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fYmFzZVN0YXRlLG49bnVsbCxpPSExO3JldHVybiBPYmplY3Qua2V5cyhyLmNob2ljZSkuc29tZShmdW5jdGlvbihvKXt2YXIgYT10LnNhdmUoKSxmPXIuY2hvaWNlW29dO3RyeXt2YXIgcz1mLl9kZWNvZGUodCxlKTtpZih0LmlzRXJyb3IocykpcmV0dXJuITE7bj17dHlwZTpvLHZhbHVlOnN9LGk9ITB9Y2F0Y2goZSl7cmV0dXJuIHQucmVzdG9yZShhKSwhMX1yZXR1cm4hMH0sdGhpcyksaT9uOnQuZXJyb3IoXCJDaG9pY2Ugbm90IG1hdGNoZWRcIil9LG4ucHJvdG90eXBlLl9jcmVhdGVFbmNvZGVyQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0LHRoaXMucmVwb3J0ZXIpfSxuLnByb3RvdHlwZS5fZW5jb2RlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl9iYXNlU3RhdGU7aWYobnVsbD09PW4uZGVmYXVsdHx8bi5kZWZhdWx0IT09dCl7dmFyIGk9dGhpcy5fZW5jb2RlVmFsdWUodCxlLHIpO2lmKHZvaWQgMCE9PWkmJiF0aGlzLl9za2lwRGVmYXVsdChpLGUscikpcmV0dXJuIGl9fSxuLnByb3RvdHlwZS5fZW5jb2RlVmFsdWU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09bi5wYXJlbnQpcmV0dXJuIG4uY2hpbGRyZW5bMF0uX2VuY29kZSh0LGV8fG5ldyBpKTt2YXIgbz1udWxsO2lmKHRoaXMucmVwb3J0ZXI9ZSxuLm9wdGlvbmFsJiZ2b2lkIDA9PT10KXtpZihudWxsPT09bi5kZWZhdWx0KXJldHVybjt0PW4uZGVmYXVsdH12YXIgYT1udWxsLGY9ITE7aWYobi5hbnkpbz10aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHQpO2Vsc2UgaWYobi5jaG9pY2Upbz10aGlzLl9lbmNvZGVDaG9pY2UodCxlKTtlbHNlIGlmKG4uY29udGFpbnMpYT10aGlzLl9nZXRVc2Uobi5jb250YWlucyxyKS5fZW5jb2RlKHQsZSksZj0hMDtlbHNlIGlmKG4uY2hpbGRyZW4pYT1uLmNoaWxkcmVuLm1hcChmdW5jdGlvbihyKXtpZihcIm51bGxfXCI9PT1yLl9iYXNlU3RhdGUudGFnKXJldHVybiByLl9lbmNvZGUobnVsbCxlLHQpO2lmKG51bGw9PT1yLl9iYXNlU3RhdGUua2V5KXJldHVybiBlLmVycm9yKFwiQ2hpbGQgc2hvdWxkIGhhdmUgYSBrZXlcIik7dmFyIG49ZS5lbnRlcktleShyLl9iYXNlU3RhdGUua2V5KTtpZihcIm9iamVjdFwiIT10eXBlb2YgdClyZXR1cm4gZS5lcnJvcihcIkNoaWxkIGV4cGVjdGVkLCBidXQgaW5wdXQgaXMgbm90IG9iamVjdFwiKTt2YXIgaT1yLl9lbmNvZGUodFtyLl9iYXNlU3RhdGUua2V5XSxlLHQpO3JldHVybiBlLmxlYXZlS2V5KG4pLGl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pLGE9dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihhKTtlbHNlIGlmKFwic2Vxb2ZcIj09PW4udGFnfHxcInNldG9mXCI9PT1uLnRhZyl7aWYoIW4uYXJnc3x8MSE9PW4uYXJncy5sZW5ndGgpcmV0dXJuIGUuZXJyb3IoXCJUb28gbWFueSBhcmdzIGZvciA6IFwiK24udGFnKTtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gZS5lcnJvcihcInNlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXlcIik7dmFyIHM9dGhpcy5jbG9uZSgpO3MuX2Jhc2VTdGF0ZS5pbXBsaWNpdD1udWxsLGE9dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih0Lm1hcChmdW5jdGlvbihyKXt2YXIgbj10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIHRoaXMuX2dldFVzZShuLmFyZ3NbMF0sdCkuX2VuY29kZShyLGUpfSxzKSl9ZWxzZSBudWxsIT09bi51c2U/bz10aGlzLl9nZXRVc2Uobi51c2UscikuX2VuY29kZSh0LGUpOihhPXRoaXMuX2VuY29kZVByaW1pdGl2ZShuLnRhZyx0KSxmPSEwKTt2YXIgbztpZighbi5hbnkmJm51bGw9PT1uLmNob2ljZSl7dmFyIHU9bnVsbCE9PW4uaW1wbGljaXQ/bi5pbXBsaWNpdDpuLnRhZyxoPW51bGw9PT1uLmltcGxpY2l0P1widW5pdmVyc2FsXCI6XCJjb250ZXh0XCI7bnVsbD09PXU/bnVsbD09PW4udXNlJiZlLmVycm9yKFwiVGFnIGNvdWxkIGJlIG9tbWl0ZWQgb25seSBmb3IgLnVzZSgpXCIpOm51bGw9PT1uLnVzZSYmKG89dGhpcy5fZW5jb2RlQ29tcG9zaXRlKHUsZixoLGEpKX1yZXR1cm4gbnVsbCE9PW4uZXhwbGljaXQmJihvPXRoaXMuX2VuY29kZUNvbXBvc2l0ZShuLmV4cGxpY2l0LCExLFwiY29udGV4dFwiLG8pKSxvfSxuLnByb3RvdHlwZS5fZW5jb2RlQ2hvaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fYmFzZVN0YXRlLG49ci5jaG9pY2VbdC50eXBlXTtyZXR1cm4gbnx8ZighMSx0LnR5cGUrXCIgbm90IGZvdW5kIGluIFwiK0pTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHIuY2hvaWNlKSkpLG4uX2VuY29kZSh0LnZhbHVlLGUpfSxuLnByb3RvdHlwZS5fZW5jb2RlUHJpbWl0aXZlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fYmFzZVN0YXRlO2lmKC9zdHIkLy50ZXN0KHQpKXJldHVybiB0aGlzLl9lbmNvZGVTdHIoZSx0KTtpZihcIm9iamlkXCI9PT10JiZyLmFyZ3MpcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGUsci5yZXZlcnNlQXJnc1swXSxyLmFyZ3NbMV0pO2lmKFwib2JqaWRcIj09PXQpcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGUsbnVsbCxudWxsKTtpZihcImdlbnRpbWVcIj09PXR8fFwidXRjdGltZVwiPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlVGltZShlLHQpO2lmKFwibnVsbF9cIj09PXQpcmV0dXJuIHRoaXMuX2VuY29kZU51bGwoKTtpZihcImludFwiPT09dHx8XCJlbnVtXCI9PT10KXJldHVybiB0aGlzLl9lbmNvZGVJbnQoZSxyLmFyZ3MmJnIucmV2ZXJzZUFyZ3NbMF0pO2lmKFwiYm9vbFwiPT09dClyZXR1cm4gdGhpcy5fZW5jb2RlQm9vbChlKTt0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCB0YWc6IFwiK3QpfSxuLnByb3RvdHlwZS5faXNOdW1zdHI9ZnVuY3Rpb24odCl7cmV0dXJuL15bMC05IF0qJC8udGVzdCh0KX0sbi5wcm90b3R5cGUuX2lzUHJpbnRzdHI9ZnVuY3Rpb24odCl7cmV0dXJuL15bQS1aYS16MC05ICdcXChcXClcXCssXFwtXFwuXFwvOj1cXD9dKiQvLnRlc3QodCl9fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXt0aGlzLl9yZXBvcnRlclN0YXRlPXtvYmo6bnVsbCxwYXRoOltdLG9wdGlvbnM6dHx8e30sZXJyb3JzOltdfX1mdW5jdGlvbiBpKHQsZSl7dGhpcy5wYXRoPXQsdGhpcy5yZXRocm93KGUpfXZhciBvPXIoMik7ZS5SZXBvcnRlcj1uLG4ucHJvdG90eXBlLmlzRXJyb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBpfSxuLnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtyZXR1cm57b2JqOnQub2JqLHBhdGhMZW46dC5wYXRoLmxlbmd0aH19LG4ucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtlLm9iaj10Lm9iaixlLnBhdGg9ZS5wYXRoLnNsaWNlKDAsdC5wYXRoTGVuKX0sbi5wcm90b3R5cGUuZW50ZXJLZXk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKHQpfSxuLnByb3RvdHlwZS5leGl0S2V5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlcG9ydGVyU3RhdGU7ZS5wYXRoPWUucGF0aC5zbGljZSgwLHQtMSl9LG4ucHJvdG90eXBlLmxlYXZlS2V5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl9yZXBvcnRlclN0YXRlO3RoaXMuZXhpdEtleSh0KSxudWxsIT09bi5vYmomJihuLm9ialtlXT1yKX0sbi5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbihcIi9cIil9LG4ucHJvdG90eXBlLmVudGVyT2JqZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVwb3J0ZXJTdGF0ZSxlPXQub2JqO3JldHVybiB0Lm9iaj17fSxlfSxuLnByb3RvdHlwZS5sZWF2ZU9iamVjdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZXBvcnRlclN0YXRlLHI9ZS5vYmo7cmV0dXJuIGUub2JqPXQscn0sbi5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7dmFyIGUscj10aGlzLl9yZXBvcnRlclN0YXRlLG49dCBpbnN0YW5jZW9mIGk7aWYoZT1uP3Q6bmV3IGkoci5wYXRoLm1hcChmdW5jdGlvbih0KXtyZXR1cm5cIltcIitKU09OLnN0cmluZ2lmeSh0KStcIl1cIn0pLmpvaW4oXCJcIiksdC5tZXNzYWdlfHx0LHQuc3RhY2spLCFyLm9wdGlvbnMucGFydGlhbCl0aHJvdyBlO3JldHVybiBufHxyLmVycm9ycy5wdXNoKGUpLGV9LG4ucHJvdG90eXBlLndyYXBSZXN1bHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtyZXR1cm4gZS5vcHRpb25zLnBhcnRpYWw/e3Jlc3VsdDp0aGlzLmlzRXJyb3IodCk/bnVsbDp0LGVycm9yczplLmVycm9yc306dH0sbyhpLEVycm9yKSxpLnByb3RvdHlwZS5yZXRocm93PWZ1bmN0aW9uKHQpe2lmKHRoaXMubWVzc2FnZT10K1wiIGF0OiBcIisodGhpcy5wYXRofHxcIihzaGFsbG93KVwiKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxpKSwhdGhpcy5zdGFjayl0cnl7dGhyb3cgbmV3IEVycm9yKHRoaXMubWVzc2FnZSl9Y2F0Y2godCl7dGhpcy5zdGFjaz10LnN0YWNrfXJldHVybiB0aGlzfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMjM1KTtlLnRhZ0NsYXNzPXswOlwidW5pdmVyc2FsXCIsMTpcImFwcGxpY2F0aW9uXCIsMjpcImNvbnRleHRcIiwzOlwicHJpdmF0ZVwifSxlLnRhZ0NsYXNzQnlOYW1lPW4uX3JldmVyc2UoZS50YWdDbGFzcyksZS50YWc9ezA6XCJlbmRcIiwxOlwiYm9vbFwiLDI6XCJpbnRcIiwzOlwiYml0c3RyXCIsNDpcIm9jdHN0clwiLDU6XCJudWxsX1wiLDY6XCJvYmppZFwiLDc6XCJvYmpEZXNjXCIsODpcImV4dGVybmFsXCIsOTpcInJlYWxcIiwxMDpcImVudW1cIiwxMTpcImVtYmVkXCIsMTI6XCJ1dGY4c3RyXCIsMTM6XCJyZWxhdGl2ZU9pZFwiLDE2Olwic2VxXCIsMTc6XCJzZXRcIiwxODpcIm51bXN0clwiLDE5OlwicHJpbnRzdHJcIiwyMDpcInQ2MXN0clwiLDIxOlwidmlkZW9zdHJcIiwyMjpcImlhNXN0clwiLDIzOlwidXRjdGltZVwiLDI0OlwiZ2VudGltZVwiLDI1OlwiZ3JhcGhzdHJcIiwyNjpcImlzbzY0NnN0clwiLDI3OlwiZ2Vuc3RyXCIsMjg6XCJ1bmlzdHJcIiwyOTpcImNoYXJzdHJcIiwzMDpcImJtcHN0clwifSxlLnRhZ0J5TmFtZT1uLl9yZXZlcnNlKGUudGFnKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPWU7bi5kZXI9cigyMzYpLG4ucGVtPXIoNTg1KX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7YS5jYWxsKHRoaXMsdCksdGhpcy5lbmM9XCJwZW1cIn12YXIgaT1yKDIpLG89cigxKS5CdWZmZXIsYT1yKDIzNik7aShuLGEpLHQuZXhwb3J0cz1uLG4ucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10LnRvU3RyaW5nKCkuc3BsaXQoL1tcXHJcXG5dKy9nKSxuPWUubGFiZWwudG9VcHBlckNhc2UoKSxpPS9eLS0tLS0oQkVHSU58RU5EKSAoW14tXSspLS0tLS0kLyxmPS0xLHM9LTEsdT0wO3U8ci5sZW5ndGg7dSsrKXt2YXIgaD1yW3VdLm1hdGNoKGkpO2lmKG51bGwhPT1oJiZoWzJdPT09bil7aWYoZiE9PS0xKXtpZihcIkVORFwiIT09aFsxXSlicmVhaztzPXU7YnJlYWt9aWYoXCJCRUdJTlwiIT09aFsxXSlicmVhaztmPXV9fWlmKGY9PT0tMXx8cz09PS0xKXRocm93IG5ldyBFcnJvcihcIlBFTSBzZWN0aW9uIG5vdCBmb3VuZCBmb3I6IFwiK24pO3ZhciBjPXIuc2xpY2UoZisxLHMpLmpvaW4oXCJcIik7Yy5yZXBsYWNlKC9bXmEtejAtOVxcK1xcLz1dKy9naSxcIlwiKTt2YXIgZD1uZXcgbyhjLFwiYmFzZTY0XCIpO3JldHVybiBhLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLGQsZSl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49ZTtuLmRlcj1yKDIzNyksbi5wZW09cig1ODcpfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtvLmNhbGwodGhpcyx0KSx0aGlzLmVuYz1cInBlbVwifXZhciBpPXIoMiksbz1yKDIzNyk7aShuLG8pLHQuZXhwb3J0cz1uLG4ucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1vLnByb3RvdHlwZS5lbmNvZGUuY2FsbCh0aGlzLHQpLG49ci50b1N0cmluZyhcImJhc2U2NFwiKSxpPVtcIi0tLS0tQkVHSU4gXCIrZS5sYWJlbCtcIi0tLS0tXCJdLGE9MDthPG4ubGVuZ3RoO2ErPTY0KWkucHVzaChuLnNsaWNlKGEsYSs2NCkpO3JldHVybiBpLnB1c2goXCItLS0tLUVORCBcIitlLmxhYmVsK1wiLS0tLS1cIiksaS5qb2luKFwiXFxuXCIpfX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fFwiQXNzZXJ0aW9uIGZhaWxlZFwiKX10LmV4cG9ydHM9cixyLmVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtpZih0IT1lKXRocm93IG5ldyBFcnJvcihyfHxcIkFzc2VydGlvbiBmYWlsZWQ6IFwiK3QrXCIgIT0gXCIrZSl9fSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSxyLG8pe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj8odS5jYWxsKHRoaXMpLHRoaXMuX2NhY2hlPW5ldyBpLHRoaXMuX2xhc3Q9dm9pZCAwLHRoaXMuX2NpcGhlcj1uZXcgcy5BRVMociksdGhpcy5fcHJldj1uZXcgdChvLmxlbmd0aCksby5jb3B5KHRoaXMuX3ByZXYpLHRoaXMuX21vZGU9ZSx2b2lkKHRoaXMuX2F1dG9wYWRkaW5nPSEwKSk6bmV3IG4oZSxyLG8pfWZ1bmN0aW9uIGkoKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGk/dm9pZCh0aGlzLmNhY2hlPW5ldyB0KFwiXCIpKTpuZXcgaX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT10WzE1XSxyPS0xOysrcjxlOylpZih0W3IrKDE2LWUpXSE9PWUpdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGRlY3J5cHQgZGF0YVwiKTtpZigxNiE9PWUpcmV0dXJuIHQuc2xpY2UoMCwxNi1lKX1mdW5jdGlvbiBhKGUscixpKXt2YXIgbz1jW2UudG9Mb3dlckNhc2UoKV07aWYoIW8pdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgc3VpdGUgdHlwZVwiKTtpZihcInN0cmluZ1wiPT10eXBlb2YgaSYmKGk9bmV3IHQoaSkpLFwic3RyaW5nXCI9PXR5cGVvZiByJiYocj1uZXcgdChyKSksci5sZW5ndGghPT1vLmtleS84KXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIGtleSBsZW5ndGggXCIrci5sZW5ndGgpO2lmKGkubGVuZ3RoIT09by5pdil0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBpdiBsZW5ndGggXCIraS5sZW5ndGgpO3JldHVyblwic3RyZWFtXCI9PT1vLnR5cGU/bmV3IGQoYltvLm1vZGVdLHIsaSwhMCk6XCJhdXRoXCI9PT1vLnR5cGU/bmV3IGwoYltvLm1vZGVdLHIsaSwhMCk6bmV3IG4oYltvLm1vZGVdLHIsaSl9ZnVuY3Rpb24gZih0LGUpe3ZhciByPWNbdC50b0xvd2VyQ2FzZSgpXTtpZighcil0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBzdWl0ZSB0eXBlXCIpO3ZhciBuPXAoZSwhMSxyLmtleSxyLml2KTtyZXR1cm4gYSh0LG4ua2V5LG4uaXYpfXZhciBzPXIoMTA3KSx1PXIoMTA5KSxoPXIoMiksYz1yKDE1MiksZD1yKDI0NiksbD1yKDIzOCkscD1yKDE1Myk7aChuLHUpLG4ucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5fY2FjaGUuYWRkKGUpO2Zvcih2YXIgcixuLGk9W107cj10aGlzLl9jYWNoZS5nZXQodGhpcy5fYXV0b3BhZGRpbmcpOyluPXRoaXMuX21vZGUuZGVjcnlwdCh0aGlzLHIpLGkucHVzaChuKTtyZXR1cm4gdC5jb25jYXQoaSl9LG4ucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NhY2hlLmZsdXNoKCk7aWYodGhpcy5fYXV0b3BhZGRpbmcpcmV0dXJuIG8odGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsdCkpO2lmKHQpdGhyb3cgbmV3IEVycm9yKFwiZGF0YSBub3QgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoXCIpfSxuLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXV0b3BhZGRpbmc9ISF0LHRoaXN9LGkucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLmNhY2hlPXQuY29uY2F0KFt0aGlzLmNhY2hlLGVdKX0saS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlO2lmKHQpe2lmKHRoaXMuY2FjaGUubGVuZ3RoPjE2KXJldHVybiBlPXRoaXMuY2FjaGUuc2xpY2UoMCwxNiksdGhpcy5jYWNoZT10aGlzLmNhY2hlLnNsaWNlKDE2KSxlfWVsc2UgaWYodGhpcy5jYWNoZS5sZW5ndGg+PTE2KXJldHVybiBlPXRoaXMuY2FjaGUuc2xpY2UoMCwxNiksdGhpcy5jYWNoZT10aGlzLmNhY2hlLnNsaWNlKDE2KSxlO3JldHVybiBudWxsfSxpLnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbigpe2lmKHRoaXMuY2FjaGUubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlfTt2YXIgYj17RUNCOnIoMjQ0KSxDQkM6cigyNDApLENGQjpyKDI0MSksQ0ZCODpyKDI0MyksQ0ZCMTpyKDI0MiksT0ZCOnIoMjQ1KSxDVFI6cigxMDgpLEdDTTpyKDEwOCl9O2UuY3JlYXRlRGVjaXBoZXI9ZixlLmNyZWF0ZURlY2lwaGVyaXY9YX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLHIsbyl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuPyhzLmNhbGwodGhpcyksdGhpcy5fY2FjaGU9bmV3IGksdGhpcy5fY2lwaGVyPW5ldyBmLkFFUyhyKSx0aGlzLl9wcmV2PW5ldyB0KG8ubGVuZ3RoKSxvLmNvcHkodGhpcy5fcHJldiksdGhpcy5fbW9kZT1lLHZvaWQodGhpcy5fYXV0b3BhZGRpbmc9ITApKTpuZXcgbihlLHIsbyl9ZnVuY3Rpb24gaSgpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgaT92b2lkKHRoaXMuY2FjaGU9bmV3IHQoXCJcIikpOm5ldyBpfWZ1bmN0aW9uIG8oZSxyLGkpe3ZhciBvPWhbZS50b0xvd2VyQ2FzZSgpXTtpZighbyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBzdWl0ZSB0eXBlXCIpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBpJiYoaT1uZXcgdChpKSksXCJzdHJpbmdcIj09dHlwZW9mIHImJihyPW5ldyB0KHIpKSxyLmxlbmd0aCE9PW8ua2V5LzgpdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQga2V5IGxlbmd0aCBcIityLmxlbmd0aCk7aWYoaS5sZW5ndGghPT1vLml2KXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIGl2IGxlbmd0aCBcIitpLmxlbmd0aCk7cmV0dXJuXCJzdHJlYW1cIj09PW8udHlwZT9uZXcgZChwW28ubW9kZV0scixpKTpcImF1dGhcIj09PW8udHlwZT9uZXcgbChwW28ubW9kZV0scixpKTpuZXcgbihwW28ubW9kZV0scixpKX1mdW5jdGlvbiBhKHQsZSl7dmFyIHI9aFt0LnRvTG93ZXJDYXNlKCldO2lmKCFyKXRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIHN1aXRlIHR5cGVcIik7dmFyIG49YyhlLCExLHIua2V5LHIuaXYpO3JldHVybiBvKHQsbi5rZXksbi5pdil9dmFyIGY9cigxMDcpLHM9cigxMDkpLHU9cigyKSxoPXIoMTUyKSxjPXIoMTUzKSxkPXIoMjQ2KSxsPXIoMjM4KTt1KG4scyksbi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLl9jYWNoZS5hZGQoZSk7Zm9yKHZhciByLG4saT1bXTtyPXRoaXMuX2NhY2hlLmdldCgpOyluPXRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLHIpLGkucHVzaChuKTtyZXR1cm4gdC5jb25jYXQoaSl9LG4ucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NhY2hlLmZsdXNoKCk7aWYodGhpcy5fYXV0b3BhZGRpbmcpcmV0dXJuIHQ9dGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsdCksdGhpcy5fY2lwaGVyLnNjcnViKCksdDtpZihcIjEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwXCIhPT10LnRvU3RyaW5nKFwiaGV4XCIpKXRocm93IHRoaXMuX2NpcGhlci5zY3J1YigpLG5ldyBFcnJvcihcImRhdGEgbm90IG11bHRpcGxlIG9mIGJsb2NrIGxlbmd0aFwiKX0sbi5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2F1dG9wYWRkaW5nPSEhdCx0aGlzfSxpLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5jYWNoZT10LmNvbmNhdChbdGhpcy5jYWNoZSxlXSl9LGkucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe2lmKHRoaXMuY2FjaGUubGVuZ3RoPjE1KXt2YXIgdD10aGlzLmNhY2hlLnNsaWNlKDAsMTYpO3JldHVybiB0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLHR9cmV0dXJuIG51bGx9LGkucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTE2LXRoaXMuY2FjaGUubGVuZ3RoLHI9bmV3IHQoZSksbj0tMTsrK248ZTspci53cml0ZVVJbnQ4KGUsbik7dmFyIGk9dC5jb25jYXQoW3RoaXMuY2FjaGUscl0pO3JldHVybiBpfTt2YXIgcD17RUNCOnIoMjQ0KSxDQkM6cigyNDApLENGQjpyKDI0MSksQ0ZCODpyKDI0MyksQ0ZCMTpyKDI0MiksT0ZCOnIoMjQ1KSxDVFI6cigxMDgpLEdDTTpyKDEwOCl9O2UuY3JlYXRlQ2lwaGVyaXY9byxlLmNyZWF0ZUNpcGhlcj1hfSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe3RoaXMuaD10LHRoaXMuc3RhdGU9bmV3IGUoMTYpLHRoaXMuc3RhdGUuZmlsbCgwKSx0aGlzLmNhY2hlPW5ldyBlKFwiXCIpfWZ1bmN0aW9uIG4odCl7cmV0dXJuW3QucmVhZFVJbnQzMkJFKDApLHQucmVhZFVJbnQzMkJFKDQpLHQucmVhZFVJbnQzMkJFKDgpLHQucmVhZFVJbnQzMkJFKDEyKV19ZnVuY3Rpb24gaSh0KXt0PXQubWFwKG8pO3ZhciByPW5ldyBlKDE2KTtyZXR1cm4gci53cml0ZVVJbnQzMkJFKHRbMF0sMCksci53cml0ZVVJbnQzMkJFKHRbMV0sNCksci53cml0ZVVJbnQzMkJFKHRbMl0sOCksci53cml0ZVVJbnQzMkJFKHRbM10sMTIpLHJ9ZnVuY3Rpb24gbyh0KXt2YXIgZSxyO3JldHVybiBlPXQ+c3x8dDwwPyhyPU1hdGguYWJzKHQpJXMsdDwwP3MtcjpyKTp0fWZ1bmN0aW9uIGEodCxlKXtyZXR1cm5bdFswXV5lWzBdLHRbMV1eZVsxXSx0WzJdXmVbMl0sdFszXV5lWzNdXX12YXIgZj1uZXcgZSgxNik7Zi5maWxsKDApLHQuZXhwb3J0cz1yLHIucHJvdG90eXBlLmdoYXNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMTsrK2U8dC5sZW5ndGg7KXRoaXMuc3RhdGVbZV1ePXRbZV07dGhpcy5fbXVsdGlwbHkoKX0sci5wcm90b3R5cGUuX211bHRpcGx5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUscixvPW4odGhpcy5oKSxmPVswLDAsMCwwXSxzPS0xOysrczwxMjg7KXtmb3IoZT0wIT09KHRoaXMuc3RhdGVbfn4ocy84KV0mMTw8Ny1zJTgpLGUmJihmPWEoZixvKSkscj0wIT09KDEmb1szXSksdD0zO3Q+MDt0LS0pb1t0XT1vW3RdPj4+MXwoMSZvW3QtMV0pPDwzMTtvWzBdPW9bMF0+Pj4xLHImJihvWzBdPW9bMF1eMjI1PDwyNCl9dGhpcy5zdGF0ZT1pKGYpfSxyLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5jYWNoZT1lLmNvbmNhdChbdGhpcy5jYWNoZSx0XSk7Zm9yKHZhciByO3RoaXMuY2FjaGUubGVuZ3RoPj0xNjspcj10aGlzLmNhY2hlLnNsaWNlKDAsMTYpLHRoaXMuY2FjaGU9dGhpcy5jYWNoZS5zbGljZSgxNiksdGhpcy5naGFzaChyKX0sci5wcm90b3R5cGUuZmluYWw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy5jYWNoZS5sZW5ndGgmJnRoaXMuZ2hhc2goZS5jb25jYXQoW3RoaXMuY2FjaGUsZl0sMTYpKSx0aGlzLmdoYXNoKGkoWzAsdCwwLHJdKSksdGhpcy5zdGF0ZX07dmFyIHM9TWF0aC5wb3coMiwzMil9KS5jYWxsKGUscigxKS5CdWZmZXIpfSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxyKXt2YXIgbj0odC5tb2R1bHVzLHQubW9kdWx1cy5ieXRlTGVuZ3RoKCkpLGk9KHIubGVuZ3RoLGMoXCJzaGExXCIpLnVwZGF0ZShuZXcgZShcIlwiKSkuZGlnZXN0KCkpLGE9aS5sZW5ndGg7aWYoMCE9PXJbMF0pdGhyb3cgbmV3IEVycm9yKFwiZGVjcnlwdGlvbiBlcnJvclwiKTt2YXIgdT1yLnNsaWNlKDEsYSsxKSxoPXIuc2xpY2UoYSsxKSxkPXModSxmKGgsYSkpLGw9cyhoLGYoZCxuLWEtMSkpO2lmKG8oaSxsLnNsaWNlKDAsYSkpKXRocm93IG5ldyBFcnJvcihcImRlY3J5cHRpb24gZXJyb3JcIik7Zm9yKHZhciBwPWE7MD09PWxbcF07KXArKztpZigxIT09bFtwKytdKXRocm93IG5ldyBFcnJvcihcImRlY3J5cHRpb24gZXJyb3JcIik7cmV0dXJuIGwuc2xpY2UocCl9ZnVuY3Rpb24gaSh0LGUscil7Zm9yKHZhciBuPWUuc2xpY2UoMCwyKSxpPTIsbz0wOzAhPT1lW2krK107KWlmKGk+PWUubGVuZ3RoKXtvKys7YnJlYWt9dmFyIGE9ZS5zbGljZSgyLGktMSk7ZS5zbGljZShpLTEsaSk7aWYoKFwiMDAwMlwiIT09bi50b1N0cmluZyhcImhleFwiKSYmIXJ8fFwiMDAwMVwiIT09bi50b1N0cmluZyhcImhleFwiKSYmcikmJm8rKyxhLmxlbmd0aDw4JiZvKyssbyl0aHJvdyBuZXcgRXJyb3IoXCJkZWNyeXB0aW9uIGVycm9yXCIpO3JldHVybiBlLnNsaWNlKGkpfWZ1bmN0aW9uIG8odCxyKXt0PW5ldyBlKHQpLHI9bmV3IGUocik7dmFyIG49MCxpPXQubGVuZ3RoO3QubGVuZ3RoIT09ci5sZW5ndGgmJihuKyssaT1NYXRoLm1pbih0Lmxlbmd0aCxyLmxlbmd0aCkpO2Zvcih2YXIgbz0tMTsrK288aTspbis9dFtvXV5yW29dO3JldHVybiBufXZhciBhPXIoMjMzKSxmPXIoMjMxKSxzPXIoMjQ4KSx1PXIoNzApLGg9cigyMzIpLGM9cig1OSksZD1yKDI0Nyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQscixvKXt2YXIgZjtmPXQucGFkZGluZz90LnBhZGRpbmc6bz8xOjQ7dmFyIHM9YSh0KSxjPXMubW9kdWx1cy5ieXRlTGVuZ3RoKCk7aWYoci5sZW5ndGg+Y3x8bmV3IHUocikuY21wKHMubW9kdWx1cyk+PTApdGhyb3cgbmV3IEVycm9yKFwiZGVjcnlwdGlvbiBlcnJvclwiKTt2YXIgbDtsPW8/ZChuZXcgdShyKSxzKTpoKHIscyk7dmFyIHA9bmV3IGUoYy1sLmxlbmd0aCk7aWYocC5maWxsKDApLGw9ZS5jb25jYXQoW3AsbF0sYyksND09PWYpcmV0dXJuIG4ocyxsKTtpZigxPT09ZilyZXR1cm4gaShzLGwsbyk7aWYoMz09PWYpcmV0dXJuIGw7dGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBwYWRkaW5nXCIpfX0pLmNhbGwoZSxyKDEpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LHIpe3ZhciBuPXQubW9kdWx1cy5ieXRlTGVuZ3RoKCksaT1yLmxlbmd0aCxvPXMoXCJzaGExXCIpLnVwZGF0ZShuZXcgZShcIlwiKSkuZGlnZXN0KCksYT1vLmxlbmd0aCxkPTIqYTtpZihpPm4tZC0yKXRocm93IG5ldyBFcnJvcihcIm1lc3NhZ2UgdG9vIGxvbmdcIik7dmFyIGw9bmV3IGUobi1pLWQtMik7bC5maWxsKDApO3ZhciBwPW4tYS0xLGI9ZihhKSx2PWgoZS5jb25jYXQoW28sbCxuZXcgZShbMV0pLHJdLHApLHUoYixwKSkseT1oKGIsdSh2LGEpKTtyZXR1cm4gbmV3IGMoZS5jb25jYXQoW25ldyBlKFswXSkseSx2XSxuKSl9ZnVuY3Rpb24gaSh0LHIsbil7dmFyIGk9ci5sZW5ndGgsYT10Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO2lmKGk+YS0xMSl0aHJvdyBuZXcgRXJyb3IoXCJtZXNzYWdlIHRvbyBsb25nXCIpO3ZhciBmO3JldHVybiBuPyhmPW5ldyBlKGEtaS0zKSxmLmZpbGwoMjU1KSk6Zj1vKGEtaS0zKSxuZXcgYyhlLmNvbmNhdChbbmV3IGUoWzAsbj8xOjJdKSxmLG5ldyBlKFswXSkscl0sYSkpfWZ1bmN0aW9uIG8odCxyKXtmb3IodmFyIG4saT1uZXcgZSh0KSxvPTAsYT1mKDIqdCkscz0wO288dDspcz09PWEubGVuZ3RoJiYoYT1mKDIqdCkscz0wKSxuPWFbcysrXSxuJiYoaVtvKytdPW4pO3JldHVybiBpfXZhciBhPXIoMjMzKSxmPXIoNjEpLHM9cig1OSksdT1yKDIzMSksaD1yKDI0OCksYz1yKDcwKSxkPXIoMjQ3KSxsPXIoMjMyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLHIpe3ZhciBvO289dC5wYWRkaW5nP3QucGFkZGluZzpyPzE6NDt2YXIgZixzPWEodCk7aWYoND09PW8pZj1uKHMsZSk7ZWxzZSBpZigxPT09bylmPWkocyxlLHIpO2Vsc2V7aWYoMyE9PW8pdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBwYWRkaW5nXCIpO2lmKGY9bmV3IGMoZSksZi5jbXAocy5tb2R1bHVzKT49MCl0aHJvdyBuZXcgRXJyb3IoXCJkYXRhIHRvbyBsb25nIGZvciBtb2R1bHVzXCIpfXJldHVybiByP2woZixzKTpkKGYscyl9fSkuY2FsbChlLHIoMSkuQnVmZmVyKX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXtmdW5jdGlvbiByKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgaT10W25dO1wiLlwiPT09aT90LnNwbGljZShuLDEpOlwiLi5cIj09PWk/KHQuc3BsaWNlKG4sMSksXG5yKyspOnImJih0LnNwbGljZShuLDEpLHItLSl9aWYoZSlmb3IoO3ItLTtyKXQudW5zaGlmdChcIi4uXCIpO3JldHVybiB0fWZ1bmN0aW9uIG4odCxlKXtpZih0LmZpbHRlcilyZXR1cm4gdC5maWx0ZXIoZSk7Zm9yKHZhciByPVtdLG49MDtuPHQubGVuZ3RoO24rKyllKHRbbl0sbix0KSYmci5wdXNoKHRbbl0pO3JldHVybiByfXZhciBpPS9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvLG89ZnVuY3Rpb24odCl7cmV0dXJuIGkuZXhlYyh0KS5zbGljZSgxKX07ZS5yZXNvbHZlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVwiXCIsaT0hMSxvPWFyZ3VtZW50cy5sZW5ndGgtMTtvPj0tMSYmIWk7by0tKXt2YXIgYT1vPj0wP2FyZ3VtZW50c1tvXTp0LmN3ZCgpO2lmKFwic3RyaW5nXCIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5nc1wiKTthJiYoZT1hK1wiL1wiK2UsaT1cIi9cIj09PWEuY2hhckF0KDApKX1yZXR1cm4gZT1yKG4oZS5zcGxpdChcIi9cIiksZnVuY3Rpb24odCl7cmV0dXJuISF0fSksIWkpLmpvaW4oXCIvXCIpLChpP1wiL1wiOlwiXCIpK2V8fFwiLlwifSxlLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXt2YXIgaT1lLmlzQWJzb2x1dGUodCksbz1cIi9cIj09PWEodCwtMSk7cmV0dXJuIHQ9cihuKHQuc3BsaXQoXCIvXCIpLGZ1bmN0aW9uKHQpe3JldHVybiEhdH0pLCFpKS5qb2luKFwiL1wiKSx0fHxpfHwodD1cIi5cIiksdCYmbyYmKHQrPVwiL1wiKSwoaT9cIi9cIjpcIlwiKSt0fSxlLmlzQWJzb2x1dGU9ZnVuY3Rpb24odCl7cmV0dXJuXCIvXCI9PT10LmNoYXJBdCgwKX0sZS5qb2luPWZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBlLm5vcm1hbGl6ZShuKHQsZnVuY3Rpb24odCxlKXtpZihcInN0cmluZ1wiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3NcIik7cmV0dXJuIHR9KS5qb2luKFwiL1wiKSl9LGUucmVsYXRpdmU9ZnVuY3Rpb24odCxyKXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGgmJlwiXCI9PT10W2VdO2UrKyk7Zm9yKHZhciByPXQubGVuZ3RoLTE7cj49MCYmXCJcIj09PXRbcl07ci0tKTtyZXR1cm4gZT5yP1tdOnQuc2xpY2UoZSxyLWUrMSl9dD1lLnJlc29sdmUodCkuc3Vic3RyKDEpLHI9ZS5yZXNvbHZlKHIpLnN1YnN0cigxKTtmb3IodmFyIGk9bih0LnNwbGl0KFwiL1wiKSksbz1uKHIuc3BsaXQoXCIvXCIpKSxhPU1hdGgubWluKGkubGVuZ3RoLG8ubGVuZ3RoKSxmPWEscz0wO3M8YTtzKyspaWYoaVtzXSE9PW9bc10pe2Y9czticmVha31mb3IodmFyIHU9W10scz1mO3M8aS5sZW5ndGg7cysrKXUucHVzaChcIi4uXCIpO3JldHVybiB1PXUuY29uY2F0KG8uc2xpY2UoZikpLHUuam9pbihcIi9cIil9LGUuc2VwPVwiL1wiLGUuZGVsaW1pdGVyPVwiOlwiLGUuZGlybmFtZT1mdW5jdGlvbih0KXt2YXIgZT1vKHQpLHI9ZVswXSxuPWVbMV07cmV0dXJuIHJ8fG4/KG4mJihuPW4uc3Vic3RyKDAsbi5sZW5ndGgtMSkpLHIrbik6XCIuXCJ9LGUuYmFzZW5hbWU9ZnVuY3Rpb24odCxlKXt2YXIgcj1vKHQpWzJdO3JldHVybiBlJiZyLnN1YnN0cigtMSplLmxlbmd0aCk9PT1lJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLWUubGVuZ3RoKSkscn0sZS5leHRuYW1lPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpWzNdfTt2YXIgYT1cImJcIj09PVwiYWJcIi5zdWJzdHIoLTEpP2Z1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdC5zdWJzdHIoZSxyKX06ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPDAmJihlPXQubGVuZ3RoK2UpLHQuc3Vic3RyKGUscil9fSkuY2FsbChlLHIoMjYpKX0sZnVuY3Rpb24odCxlLHIpe3QuZXhwb3J0cz1yKDUxKX0sZnVuY3Rpb24odCxlLHIpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4oKXt0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXZhciBpPShyKDEpLkJ1ZmZlcixyKDE1NikpO3QuZXhwb3J0cz1uLG4ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSxuLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDp0aGlzLmhlYWR9OzA9PT10aGlzLmxlbmd0aCYmKHRoaXMudGFpbD1lKSx0aGlzLmhlYWQ9ZSwrK3RoaXMubGVuZ3RofSxuLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LG4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LG4ucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVyblwiXCI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPVwiXCIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sbi5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gaS5hbGxvYygwKTtpZigxPT09dGhpcy5sZW5ndGgpcmV0dXJuIHRoaXMuaGVhZC5kYXRhO2Zvcih2YXIgZT1pLmFsbG9jVW5zYWZlKHQ+Pj4wKSxyPXRoaXMuaGVhZCxuPTA7cjspci5kYXRhLmNvcHkoZSxuKSxuKz1yLmRhdGEubGVuZ3RoLHI9ci5uZXh0O3JldHVybiBlfX0sZnVuY3Rpb24odCxlKXt2YXIgcj17fS50b1N0cmluZzt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuXCJbb2JqZWN0IEFycmF5XVwiPT1yLmNhbGwodCl9fSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIodCxlKXtmdW5jdGlvbiByKCl7aWYoIWkpe2lmKG4oXCJ0aHJvd0RlcHJlY2F0aW9uXCIpKXRocm93IG5ldyBFcnJvcihlKTtuKFwidHJhY2VEZXByZWNhdGlvblwiKT9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUud2FybihlKSxpPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1pZihuKFwibm9EZXByZWNhdGlvblwiKSlyZXR1cm4gdDt2YXIgaT0hMTtyZXR1cm4gcn1mdW5jdGlvbiBuKHQpe3RyeXtpZighZS5sb2NhbFN0b3JhZ2UpcmV0dXJuITF9Y2F0Y2godCl7cmV0dXJuITF9dmFyIHI9ZS5sb2NhbFN0b3JhZ2VbdF07cmV0dXJuIG51bGwhPXImJlwidHJ1ZVwiPT09U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCl9dC5leHBvcnRzPXJ9KS5jYWxsKGUscigzOSkpfSxmdW5jdGlvbih0LGUscil7dC5leHBvcnRzPXIoMjQ5KX0sZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihuKXt2YXIgaT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gcigzMSl9Y2F0Y2godCl7fX0oKTtlPXQuZXhwb3J0cz1yKDI1MCksZS5TdHJlYW09aXx8ZSxlLlJlYWRhYmxlPWUsZS5Xcml0YWJsZT1yKDE1NSksZS5EdXBsZXg9cig1MSksZS5UcmFuc2Zvcm09cigxNTQpLGUuUGFzc1Rocm91Z2g9cigyNDkpLCFuLmJyb3dzZXImJlwiZGlzYWJsZVwiPT09bi5lbnYuUkVBREFCTEVfU1RSRUFNJiZpJiYodC5leHBvcnRzPWkpfSkuY2FsbChlLHIoMjYpKX0sZnVuY3Rpb24odCxlLHIpe3QuZXhwb3J0cz1yKDE1NCl9LGZ1bmN0aW9uKHQsZSxyKXt0LmV4cG9ydHM9cigxNTUpfSxmdW5jdGlvbih0LGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH19LGZ1bmN0aW9uKHQsZSl7XCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTp0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LmNvcHkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuZmlsbCYmXCJmdW5jdGlvblwiPT10eXBlb2YgdC5yZWFkVUludDh9fSxmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gaSh0LHIpe3ZhciBuPXtzZWVuOltdLHN0eWxpemU6YX07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihuLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKG4uY29sb3JzPWFyZ3VtZW50c1szXSksYihyKT9uLnNob3dIaWRkZW49cjpyJiZlLl9leHRlbmQobixyKSxfKG4uc2hvd0hpZGRlbikmJihuLnNob3dIaWRkZW49ITEpLF8obi5kZXB0aCkmJihuLmRlcHRoPTIpLF8obi5jb2xvcnMpJiYobi5jb2xvcnM9ITEpLF8obi5jdXN0b21JbnNwZWN0KSYmKG4uY3VzdG9tSW5zcGVjdD0hMCksbi5jb2xvcnMmJihuLnN0eWxpemU9bykscyhuLHQsbi5kZXB0aCl9ZnVuY3Rpb24gbyh0LGUpe3ZhciByPWkuc3R5bGVzW2VdO3JldHVybiByP1wiXHUwMDFiW1wiK2kuY29sb3JzW3JdWzBdK1wibVwiK3QrXCJcdTAwMWJbXCIraS5jb2xvcnNbcl1bMV0rXCJtXCI6dH1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIHR9ZnVuY3Rpb24gZih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQscil7ZVt0XT0hMH0pLGV9ZnVuY3Rpb24gcyh0LHIsbil7aWYodC5jdXN0b21JbnNwZWN0JiZyJiZrKHIuaW5zcGVjdCkmJnIuaW5zcGVjdCE9PWUuaW5zcGVjdCYmKCFyLmNvbnN0cnVjdG9yfHxyLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PXIpKXt2YXIgaT1yLmluc3BlY3Qobix0KTtyZXR1cm4gZyhpKXx8KGk9cyh0LGksbikpLGl9dmFyIG89dSh0LHIpO2lmKG8pcmV0dXJuIG87dmFyIGE9T2JqZWN0LmtleXMociksYj1mKGEpO2lmKHQuc2hvd0hpZGRlbiYmKGE9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikpLEEocikmJihhLmluZGV4T2YoXCJtZXNzYWdlXCIpPj0wfHxhLmluZGV4T2YoXCJkZXNjcmlwdGlvblwiKT49MCkpcmV0dXJuIGgocik7aWYoMD09PWEubGVuZ3RoKXtpZihrKHIpKXt2YXIgdj1yLm5hbWU/XCI6IFwiK3IubmFtZTpcIlwiO3JldHVybiB0LnN0eWxpemUoXCJbRnVuY3Rpb25cIit2K1wiXVwiLFwic3BlY2lhbFwiKX1pZihNKHIpKXJldHVybiB0LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwicmVnZXhwXCIpO2lmKEUocikpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwiZGF0ZVwiKTtpZihBKHIpKXJldHVybiBoKHIpfXZhciB5PVwiXCIsbT0hMSx3PVtcIntcIixcIn1cIl07aWYocChyKSYmKG09ITAsdz1bXCJbXCIsXCJdXCJdKSxrKHIpKXt2YXIgXz1yLm5hbWU/XCI6IFwiK3IubmFtZTpcIlwiO3k9XCIgW0Z1bmN0aW9uXCIrXytcIl1cIn1pZihNKHIpJiYoeT1cIiBcIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocikpLEUocikmJih5PVwiIFwiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwocikpLEEocikmJih5PVwiIFwiK2gocikpLDA9PT1hLmxlbmd0aCYmKCFtfHwwPT1yLmxlbmd0aCkpcmV0dXJuIHdbMF0reSt3WzFdO2lmKG48MClyZXR1cm4gTShyKT90LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwicmVnZXhwXCIpOnQuc3R5bGl6ZShcIltPYmplY3RdXCIsXCJzcGVjaWFsXCIpO3Quc2Vlbi5wdXNoKHIpO3ZhciBTO3JldHVybiBTPW0/Yyh0LHIsbixiLGEpOmEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBkKHQscixuLGIsZSxtKX0pLHQuc2Vlbi5wb3AoKSxsKFMseSx3KX1mdW5jdGlvbiB1KHQsZSl7aWYoXyhlKSlyZXR1cm4gdC5zdHlsaXplKFwidW5kZWZpbmVkXCIsXCJ1bmRlZmluZWRcIik7aWYoZyhlKSl7dmFyIHI9XCInXCIrSlNPTi5zdHJpbmdpZnkoZSkucmVwbGFjZSgvXlwifFwiJC9nLFwiXCIpLnJlcGxhY2UoLycvZyxcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCdcIicpK1wiJ1wiO3JldHVybiB0LnN0eWxpemUocixcInN0cmluZ1wiKX1yZXR1cm4gbShlKT90LnN0eWxpemUoXCJcIitlLFwibnVtYmVyXCIpOmIoZSk/dC5zdHlsaXplKFwiXCIrZSxcImJvb2xlYW5cIik6dihlKT90LnN0eWxpemUoXCJudWxsXCIsXCJudWxsXCIpOnZvaWQgMH1mdW5jdGlvbiBoKHQpe3JldHVyblwiW1wiK0Vycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpK1wiXVwifWZ1bmN0aW9uIGModCxlLHIsbixpKXtmb3IodmFyIG89W10sYT0wLGY9ZS5sZW5ndGg7YTxmOysrYSlSKGUsU3RyaW5nKGEpKT9vLnB1c2goZCh0LGUscixuLFN0cmluZyhhKSwhMCkpOm8ucHVzaChcIlwiKTtyZXR1cm4gaS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cXGQrJC8pfHxvLnB1c2goZCh0LGUscixuLGksITApKX0pLG99ZnVuY3Rpb24gZCh0LGUscixuLGksbyl7dmFyIGEsZix1O2lmKHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpfHx7dmFsdWU6ZVtpXX0sdS5nZXQ/Zj11LnNldD90LnN0eWxpemUoXCJbR2V0dGVyL1NldHRlcl1cIixcInNwZWNpYWxcIik6dC5zdHlsaXplKFwiW0dldHRlcl1cIixcInNwZWNpYWxcIik6dS5zZXQmJihmPXQuc3R5bGl6ZShcIltTZXR0ZXJdXCIsXCJzcGVjaWFsXCIpKSxSKG4saSl8fChhPVwiW1wiK2krXCJdXCIpLGZ8fCh0LnNlZW4uaW5kZXhPZih1LnZhbHVlKTwwPyhmPXYocik/cyh0LHUudmFsdWUsbnVsbCk6cyh0LHUudmFsdWUsci0xKSxmLmluZGV4T2YoXCJcXG5cIik+LTEmJihmPW8/Zi5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCIgIFwiK3R9KS5qb2luKFwiXFxuXCIpLnN1YnN0cigyKTpcIlxcblwiK2Yuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKHQpe3JldHVyblwiICAgXCIrdH0pLmpvaW4oXCJcXG5cIikpKTpmPXQuc3R5bGl6ZShcIltDaXJjdWxhcl1cIixcInNwZWNpYWxcIikpLF8oYSkpe2lmKG8mJmkubWF0Y2goL15cXGQrJC8pKXJldHVybiBmO2E9SlNPTi5zdHJpbmdpZnkoXCJcIitpKSxhLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKT8oYT1hLnN1YnN0cigxLGEubGVuZ3RoLTIpLGE9dC5zdHlsaXplKGEsXCJuYW1lXCIpKTooYT1hLnJlcGxhY2UoLycvZyxcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLFwiJ1wiKSxhPXQuc3R5bGl6ZShhLFwic3RyaW5nXCIpKX1yZXR1cm4gYStcIjogXCIrZn1mdW5jdGlvbiBsKHQsZSxyKXt2YXIgbj0wLGk9dC5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gbisrLGUuaW5kZXhPZihcIlxcblwiKT49MCYmbisrLHQrZS5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZyxcIlwiKS5sZW5ndGgrMX0sMCk7cmV0dXJuIGk+NjA/clswXSsoXCJcIj09PWU/XCJcIjplK1wiXFxuIFwiKStcIiBcIit0LmpvaW4oXCIsXFxuICBcIikrXCIgXCIrclsxXTpyWzBdK2UrXCIgXCIrdC5qb2luKFwiLCBcIikrXCIgXCIrclsxXX1mdW5jdGlvbiBwKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfWZ1bmN0aW9uIGIodCl7cmV0dXJuXCJib29sZWFuXCI9PXR5cGVvZiB0fWZ1bmN0aW9uIHYodCl7cmV0dXJuIG51bGw9PT10fWZ1bmN0aW9uIHkodCl7cmV0dXJuIG51bGw9PXR9ZnVuY3Rpb24gbSh0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdH1mdW5jdGlvbiBnKHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0fWZ1bmN0aW9uIHcodCl7cmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIHR9ZnVuY3Rpb24gXyh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBNKHQpe3JldHVybiBTKHQpJiZcIltvYmplY3QgUmVnRXhwXVwiPT09SSh0KX1mdW5jdGlvbiBTKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBFKHQpe3JldHVybiBTKHQpJiZcIltvYmplY3QgRGF0ZV1cIj09PUkodCl9ZnVuY3Rpb24gQSh0KXtyZXR1cm4gUyh0KSYmKFwiW29iamVjdCBFcnJvcl1cIj09PUkodCl8fHQgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gayh0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0fWZ1bmN0aW9uIHgodCl7cmV0dXJuIG51bGw9PT10fHxcImJvb2xlYW5cIj09dHlwZW9mIHR8fFwibnVtYmVyXCI9PXR5cGVvZiB0fHxcInN0cmluZ1wiPT10eXBlb2YgdHx8XCJzeW1ib2xcIj09dHlwZW9mIHR8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiB0fWZ1bmN0aW9uIEkodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBCKHQpe3JldHVybiB0PDEwP1wiMFwiK3QudG9TdHJpbmcoMTApOnQudG9TdHJpbmcoMTApfWZ1bmN0aW9uIE8oKXt2YXIgdD1uZXcgRGF0ZSxlPVtCKHQuZ2V0SG91cnMoKSksQih0LmdldE1pbnV0ZXMoKSksQih0LmdldFNlY29uZHMoKSldLmpvaW4oXCI6XCIpO3JldHVyblt0LmdldERhdGUoKSxDW3QuZ2V0TW9udGgoKV0sZV0uam9pbihcIiBcIil9ZnVuY3Rpb24gUih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX12YXIgUD0vJVtzZGolXS9nO2UuZm9ybWF0PWZ1bmN0aW9uKHQpe2lmKCFnKHQpKXtmb3IodmFyIGU9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZS5wdXNoKGkoYXJndW1lbnRzW3JdKSk7cmV0dXJuIGUuam9pbihcIiBcIil9Zm9yKHZhciByPTEsbj1hcmd1bWVudHMsbz1uLmxlbmd0aCxhPVN0cmluZyh0KS5yZXBsYWNlKFAsZnVuY3Rpb24odCl7aWYoXCIlJVwiPT09dClyZXR1cm5cIiVcIjtpZihyPj1vKXJldHVybiB0O3N3aXRjaCh0KXtjYXNlXCIlc1wiOnJldHVybiBTdHJpbmcobltyKytdKTtjYXNlXCIlZFwiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlXCIlalwiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobltyKytdKX1jYXRjaCh0KXtyZXR1cm5cIltDaXJjdWxhcl1cIn1kZWZhdWx0OnJldHVybiB0fX0pLGY9bltyXTtyPG87Zj1uWysrcl0pYSs9dihmKXx8IVMoZik/XCIgXCIrZjpcIiBcIitpKGYpO3JldHVybiBhfSxlLmRlcHJlY2F0ZT1mdW5jdGlvbihyLGkpe2Z1bmN0aW9uIG8oKXtpZighYSl7aWYobi50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihpKTtuLnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShpKTpjb25zb2xlLmVycm9yKGkpLGE9ITB9cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfWlmKF8odC5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5kZXByZWNhdGUocixpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKG4ubm9EZXByZWNhdGlvbj09PSEwKXJldHVybiByO3ZhciBhPSExO3JldHVybiBvfTt2YXIgVCxqPXt9O2UuZGVidWdsb2c9ZnVuY3Rpb24odCl7aWYoXyhUKSYmKFQ9bi5lbnYuTk9ERV9ERUJVR3x8XCJcIiksdD10LnRvVXBwZXJDYXNlKCksIWpbdF0paWYobmV3IFJlZ0V4cChcIlxcXFxiXCIrdCtcIlxcXFxiXCIsXCJpXCIpLnRlc3QoVCkpe3ZhciByPW4ucGlkO2pbdF09ZnVuY3Rpb24oKXt2YXIgbj1lLmZvcm1hdC5hcHBseShlLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcihcIiVzICVkOiAlc1wiLHQscixuKX19ZWxzZSBqW3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4galt0XX0sZS5pbnNwZWN0PWksaS5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LGkuc3R5bGVzPXtzcGVjaWFsOlwiY3lhblwiLG51bWJlcjpcInllbGxvd1wiLGJvb2xlYW46XCJ5ZWxsb3dcIix1bmRlZmluZWQ6XCJncmV5XCIsbnVsbDpcImJvbGRcIixzdHJpbmc6XCJncmVlblwiLGRhdGU6XCJtYWdlbnRhXCIscmVnZXhwOlwicmVkXCJ9LGUuaXNBcnJheT1wLGUuaXNCb29sZWFuPWIsZS5pc051bGw9dixlLmlzTnVsbE9yVW5kZWZpbmVkPXksZS5pc051bWJlcj1tLGUuaXNTdHJpbmc9ZyxlLmlzU3ltYm9sPXcsZS5pc1VuZGVmaW5lZD1fLGUuaXNSZWdFeHA9TSxlLmlzT2JqZWN0PVMsZS5pc0RhdGU9RSxlLmlzRXJyb3I9QSxlLmlzRnVuY3Rpb249ayxlLmlzUHJpbWl0aXZlPXgsZS5pc0J1ZmZlcj1yKDYwNSk7dmFyIEM9W1wiSmFuXCIsXCJGZWJcIixcIk1hclwiLFwiQXByXCIsXCJNYXlcIixcIkp1blwiLFwiSnVsXCIsXCJBdWdcIixcIlNlcFwiLFwiT2N0XCIsXCJOb3ZcIixcIkRlY1wiXTtlLmxvZz1mdW5jdGlvbigpe2NvbnNvbGUubG9nKFwiJXMgLSAlc1wiLE8oKSxlLmZvcm1hdC5hcHBseShlLGFyZ3VtZW50cykpfSxlLmluaGVyaXRzPXIoNjA0KSxlLl9leHRlbmQ9ZnVuY3Rpb24odCxlKXtpZighZXx8IVMoZSkpcmV0dXJuIHQ7Zm9yKHZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7bi0tOyl0W3Jbbl1dPWVbcltuXV07cmV0dXJuIHR9fSkuY2FsbChlLHIoMzkpLHIoMjYpKX0sZnVuY3Rpb24odCxlKXt2YXIgcj1bXS5pbmRleE9mO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKHIpcmV0dXJuIHQuaW5kZXhPZihlKTtmb3IodmFyIG49MDtuPHQubGVuZ3RoOysrbilpZih0W25dPT09ZSlyZXR1cm4gbjtyZXR1cm4tMX19LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLHIpe3IoMjUzKSx0LmV4cG9ydHM9cigyNTIpfV0pfSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2ZpdmUtYmVsbHMtY29uZGl0aW9uL2Rpc3QvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcblxuLyoqXG4gKiBAcHVibGljXG4gKiBTZXJpYWxpemVzIGEgY3J5cHRvLWNvbmRpdGlvbiBjbGFzcyAoQ29uZGl0aW9uIG9yIEZ1bGZpbGxtZW50KSBpbnRvIGEgQmlnY2hhaW5EQi1jb21wYXRpYmxlIEpTT05cbiAqIEBwYXJhbSB7Y2MuRnVsZmlsbG1lbnR9IGZ1bGZpbGxtZW50IGJhc2U1OCBlbmNvZGVkIEVkMjU1MTkgcHVibGljIGtleSBmb3IgdGhlIHJlY2lwaWVudCBvZiB0aGUgVHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtvYmplY3R9IEVkMjU1MTkgQ29uZGl0aW9uICh0aGF0IHdpbGwgbmVlZCB0byB3cmFwcGVkIGluIGFuIE91dHB1dClcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2NKc29uaWZ5KGZ1bGZpbGxtZW50KSB7XG5cbiAgICBsZXQgY29uZGl0aW9uVXJpO1xuXG4gICAgaWYgKCdnZXRDb25kaXRpb25VcmknIGluIGZ1bGZpbGxtZW50KVxuICAgICAgICBjb25kaXRpb25VcmkgPSBmdWxmaWxsbWVudC5nZXRDb25kaXRpb25VcmkoKTtcbiAgICBlbHNlIGlmICgnc2VyaWFsaXplVXJpJyBpbiBmdWxmaWxsbWVudClcbiAgICAgICAgY29uZGl0aW9uVXJpID0gZnVsZmlsbG1lbnQuc2VyaWFsaXplVXJpKCk7XG5cbiAgICBsZXQganNvbkJvZHkgPSB7XG4gICAgICAgICdkZXRhaWxzJzoge30sXG4gICAgICAgICd1cmknOiBjb25kaXRpb25VcmksXG4gICAgfTtcblxuICAgIGlmIChmdWxmaWxsbWVudC5nZXRUeXBlSWQoKSA9PT0gMCkge1xuICAgICAgICBqc29uQm9keS5kZXRhaWxzLnR5cGVfaWQgPSAwO1xuICAgICAgICBqc29uQm9keS5kZXRhaWxzLmJpdG1hc2sgPSAzO1xuXG4gICAgICAgIGlmICgncHJlaW1hZ2UnIGluIGZ1bGZpbGxtZW50KSB7XG4gICAgICAgICAgICBqc29uQm9keS5kZXRhaWxzLnByZWltYWdlID0gZnVsZmlsbG1lbnQucHJlaW1hZ2UudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGpzb25Cb2R5LmRldGFpbHMudHlwZSA9ICdmdWxmaWxsbWVudCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnVsZmlsbG1lbnQuZ2V0VHlwZUlkKCkgPT09IDIpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnZGV0YWlscyc6IHtcbiAgICAgICAgICAgICAgICAndHlwZV9pZCc6IDIsXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiAnZnVsZmlsbG1lbnQnLFxuICAgICAgICAgICAgICAgICdiaXRtYXNrJzogZnVsZmlsbG1lbnQuZ2V0Qml0bWFzaygpLFxuICAgICAgICAgICAgICAgICd0aHJlc2hvbGQnOiBmdWxmaWxsbWVudC50aHJlc2hvbGQsXG4gICAgICAgICAgICAgICAgJ3N1YmZ1bGZpbGxtZW50cyc6IGZ1bGZpbGxtZW50LnN1YmNvbmRpdGlvbnMubWFwKChzdWJjb25kaXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViY29uZGl0aW9uSnNvbiA9IGNjSnNvbmlmeShzdWJjb25kaXRpb24uYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIHN1YmNvbmRpdGlvbkpzb24uZGV0YWlscy53ZWlnaHQgPSAxO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ViY29uZGl0aW9uSnNvbi5kZXRhaWxzO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3VyaSc6IGNvbmRpdGlvblVyaSxcbiAgICAgICAgfTtcblxuICAgIGlmIChmdWxmaWxsbWVudC5nZXRUeXBlSWQoKSA9PT0gNCkge1xuICAgICAgICBqc29uQm9keS5kZXRhaWxzLnR5cGVfaWQgPSA0O1xuICAgICAgICBqc29uQm9keS5kZXRhaWxzLmJpdG1hc2sgPSAzMjtcblxuICAgICAgICBpZiAoJ3B1YmxpY0tleScgaW4gZnVsZmlsbG1lbnQpIHtcbiAgICAgICAgICAgIGpzb25Cb2R5LmRldGFpbHMuc2lnbmF0dXJlID0gbnVsbDtcbiAgICAgICAgICAgIGpzb25Cb2R5LmRldGFpbHMucHVibGljX2tleSA9IGJhc2U1OC5lbmNvZGUoZnVsZmlsbG1lbnQucHVibGljS2V5KTtcbiAgICAgICAgICAgIGpzb25Cb2R5LmRldGFpbHMudHlwZSA9ICdmdWxmaWxsbWVudCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ2hhc2gnIGluIGZ1bGZpbGxtZW50KSB7XG4gICAgICAgIGpzb25Cb2R5LmRldGFpbHMuaGFzaCA9IGJhc2U1OC5lbmNvZGUoZnVsZmlsbG1lbnQuaGFzaCk7XG4gICAgICAgIGpzb25Cb2R5LmRldGFpbHMubWF4X2Z1bGZpbGxtZW50X2xlbmd0aCA9IGZ1bGZpbGxtZW50Lm1heEZ1bGZpbGxtZW50TGVuZ3RoO1xuICAgICAgICBqc29uQm9keS5kZXRhaWxzLnR5cGUgPSAnY29uZGl0aW9uJztcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbkJvZHk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHJhbnNhY3Rpb24vdXRpbHMvY2NKc29uaWZ5LmpzIiwiaW1wb3J0IGhhc2hUcmFuc2FjdGlvbiBmcm9tICcuL2hhc2hUcmFuc2FjdGlvbic7XG5cblxuZnVuY3Rpb24gbWFrZVRyYW5zYWN0aW9uVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ2lkJzogbnVsbCxcbiAgICAgICAgJ29wZXJhdGlvbic6IG51bGwsXG4gICAgICAgICdvdXRwdXRzJzogW10sXG4gICAgICAgICdpbnB1dHMnOiBbXSxcbiAgICAgICAgJ21ldGFkYXRhJzogbnVsbCxcbiAgICAgICAgJ2Fzc2V0JzogbnVsbCxcbiAgICAgICAgJ3ZlcnNpb24nOiAnMC45JyxcbiAgICB9O1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VUcmFuc2FjdGlvbihvcGVyYXRpb24sIGFzc2V0LCBtZXRhZGF0YSA9IG51bGwsIG91dHB1dHMgPSBbXSwgaW5wdXRzID0gW10pIHtcbiAgICBjb25zdCB0eCA9IG1ha2VUcmFuc2FjdGlvblRlbXBsYXRlKCk7XG4gICAgdHgub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgIHR4LmFzc2V0ID0gYXNzZXQ7XG4gICAgdHgubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0eC5pbnB1dHMgPSBpbnB1dHM7XG4gICAgdHgub3V0cHV0cyA9IG91dHB1dHM7XG5cbiAgICAvLyBIYXNoaW5nIG11c3QgYmUgZG9uZSBhZnRlciwgYXMgdGhlIGhhc2ggaXMgb2YgdGhlIFRyYW5zYWN0aW9uICh1cCB0byBub3cpXG4gICAgdHguaWQgPSBoYXNoVHJhbnNhY3Rpb24odHgpO1xuICAgIHJldHVybiB0eDtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90cmFuc2FjdGlvbi9tYWtlVHJhbnNhY3Rpb24uanMiLCJpbXBvcnQgc3RhYmxlU3RyaW5naWZ5IGZyb20gJ2pzb24tc3RhYmxlLXN0cmluZ2lmeSc7XG5pbXBvcnQgY2xvbmUgZnJvbSAnY2xvbmUnO1xuXG5cbi8qKlxuICogQHB1YmxpY1xuICogQ2Fub25pY2FsbHkgc2VyaWFsaXplcyBhIHRyYW5zYWN0aW9uIGludG8gYSBzdHJpbmcgYnkgc29ydGluZyB0aGUga2V5c1xuICogQHBhcmFtIHtvYmplY3R9ICh0cmFuc2FjdGlvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gYSBjYW5vbmljYWxseSBzZXJpYWxpemVkIFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNlcmlhbGl6ZVRyYW5zYWN0aW9uSW50b0Nhbm9uaWNhbFN0cmluZyh0cmFuc2FjdGlvbikge1xuICAgIC8vIEJpZ2NoYWluREIgc2lnbnMgZnVsZmlsbG1lbnRzIGJ5IHNlcmlhbGl6aW5nIHRyYW5zYWN0aW9ucyBpbnRvIGEgXCJjYW5vbmljYWxcIiBmb3JtYXQgd2hlcmVcbiAgICBjb25zdCB0eCA9IGNsb25lKHRyYW5zYWN0aW9uKTtcbiAgICAvLyBUT0RPOiBzZXQgZnVsZmlsbG1lbnRzIHRvIG51bGxcbiAgICAvLyBTb3J0IHRoZSBrZXlzXG4gICAgcmV0dXJuIHN0YWJsZVN0cmluZ2lmeSh0eCwgKGEsIGIpID0+IChhLmtleSA+IGIua2V5ID8gMSA6IC0xKSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3RyYW5zYWN0aW9uL3NlcmlhbGl6ZVRyYW5zYWN0aW9uSW50b0Nhbm9uaWNhbFN0cmluZy5qcyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuNC4wJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvcmUuanNcbi8vIG1vZHVsZSBpZCA9IDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWlvYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAxM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XHJcbn0gY2F0Y2goZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcclxuXHRcdGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBnZXRBcGlVcmxzIGZyb20gJy4vZ2V0QXBpVXJscyc7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi9yZXF1ZXN0JztcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAcGFyYW0gdHhfaWRcbiAqIEBwYXJhbSBBUElfUEFUSFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTdGF0dXModHhfaWQsIEFQSV9QQVRIKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QoZ2V0QXBpVXJscyhBUElfUEFUSClbJ3N0YXR1c2VzJ10sIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAgICAgdHhfaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Nvbm5lY3Rpb24vZ2V0U3RhdHVzLmpzIiwiaW1wb3J0IGdldEFwaVVybHMgZnJvbSAnLi9nZXRBcGlVcmxzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB0eElkXG4gKiBAcGFyYW0gQVBJX1BBVEhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb24odHhJZCwgQVBJX1BBVEgpIHtcbiAgICByZXR1cm4gcmVxdWVzdChnZXRBcGlVcmxzKEFQSV9QQVRIKVsndHJhbnNhY3Rpb25zX2RldGFpbCddLCB7XG4gICAgICAgICAgICB1cmxUZW1wbGF0ZVNwZWM6IHtcbiAgICAgICAgICAgICAgICB0eElkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Nvbm5lY3Rpb24vZ2V0VHJhbnNhY3Rpb24uanMiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlSW5wdXRUZW1wbGF0ZShwdWJsaWNLZXlzID0gW10sIGZ1bGZpbGxzID0gbnVsbCwgZnVsZmlsbG1lbnQgPSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnVsZmlsbG1lbnQsXG4gICAgICAgIGZ1bGZpbGxzLFxuICAgICAgICAnb3duZXJzX2JlZm9yZSc6IHB1YmxpY0tleXMsXG4gICAgfTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHJhbnNhY3Rpb24vbWFrZUlucHV0VGVtcGxhdGUuanMiLCJ2YXIgY2xvbmUgPSAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9pbnN0YW5jZW9mKG9iaiwgdHlwZSkge1xuICByZXR1cm4gdHlwZSAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIHR5cGU7XG59XG5cbnZhciBuYXRpdmVNYXA7XG50cnkge1xuICBuYXRpdmVNYXAgPSBNYXA7XG59IGNhdGNoKF8pIHtcbiAgLy8gbWF5YmUgYSByZWZlcmVuY2UgZXJyb3IgYmVjYXVzZSBubyBgTWFwYC4gR2l2ZSBpdCBhIGR1bW15IHZhbHVlIHRoYXQgbm9cbiAgLy8gdmFsdWUgd2lsbCBldmVyIGJlIGFuIGluc3RhbmNlb2YuXG4gIG5hdGl2ZU1hcCA9IGZ1bmN0aW9uKCkge307XG59XG5cbnZhciBuYXRpdmVTZXQ7XG50cnkge1xuICBuYXRpdmVTZXQgPSBTZXQ7XG59IGNhdGNoKF8pIHtcbiAgbmF0aXZlU2V0ID0gZnVuY3Rpb24oKSB7fTtcbn1cblxudmFyIG5hdGl2ZVByb21pc2U7XG50cnkge1xuICBuYXRpdmVQcm9taXNlID0gUHJvbWlzZTtcbn0gY2F0Y2goXykge1xuICBuYXRpdmVQcm9taXNlID0gZnVuY3Rpb24oKSB7fTtcbn1cblxuLyoqXG4gKiBDbG9uZXMgKGNvcGllcykgYW4gT2JqZWN0IHVzaW5nIGRlZXAgY29weWluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnkgZGVmYXVsdCwgYnV0IGlmIHlvdSBhcmUgY2VydGFpblxuICogdGhlcmUgYXJlIG5vIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4geW91ciBvYmplY3QsIHlvdSBjYW4gc2F2ZSBzb21lIENQVSB0aW1lXG4gKiBieSBjYWxsaW5nIGNsb25lKG9iaiwgZmFsc2UpLlxuICpcbiAqIENhdXRpb246IGlmIGBjaXJjdWxhcmAgaXMgZmFsc2UgYW5kIGBwYXJlbnRgIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZXMsXG4gKiB5b3VyIHByb2dyYW0gbWF5IGVudGVyIGFuIGluZmluaXRlIGxvb3AgYW5kIGNyYXNoLlxuICpcbiAqIEBwYXJhbSBgcGFyZW50YCAtIHRoZSBvYmplY3QgdG8gYmUgY2xvbmVkXG4gKiBAcGFyYW0gYGNpcmN1bGFyYCAtIHNldCB0byB0cnVlIGlmIHRoZSBvYmplY3QgdG8gYmUgY2xvbmVkIG1heSBjb250YWluXG4gKiAgICBjaXJjdWxhciByZWZlcmVuY2VzLiAob3B0aW9uYWwgLSB0cnVlIGJ5IGRlZmF1bHQpXG4gKiBAcGFyYW0gYGRlcHRoYCAtIHNldCB0byBhIG51bWJlciBpZiB0aGUgb2JqZWN0IGlzIG9ubHkgdG8gYmUgY2xvbmVkIHRvXG4gKiAgICBhIHBhcnRpY3VsYXIgZGVwdGguIChvcHRpb25hbCAtIGRlZmF1bHRzIHRvIEluZmluaXR5KVxuICogQHBhcmFtIGBwcm90b3R5cGVgIC0gc2V0cyB0aGUgcHJvdG90eXBlIHRvIGJlIHVzZWQgd2hlbiBjbG9uaW5nIGFuIG9iamVjdC5cbiAqICAgIChvcHRpb25hbCAtIGRlZmF1bHRzIHRvIHBhcmVudCBwcm90b3R5cGUpLlxuICogQHBhcmFtIGBpbmNsdWRlTm9uRW51bWVyYWJsZWAgLSBzZXQgdG8gdHJ1ZSBpZiB0aGUgbm9uLWVudW1lcmFibGUgcHJvcGVydGllc1xuICogICAgc2hvdWxkIGJlIGNsb25lZCBhcyB3ZWxsLiBOb24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9uIHRoZSBwcm90b3R5cGVcbiAqICAgIGNoYWluIHdpbGwgYmUgaWdub3JlZC4gKG9wdGlvbmFsIC0gZmFsc2UgYnkgZGVmYXVsdClcbiovXG5mdW5jdGlvbiBjbG9uZShwYXJlbnQsIGNpcmN1bGFyLCBkZXB0aCwgcHJvdG90eXBlLCBpbmNsdWRlTm9uRW51bWVyYWJsZSkge1xuICBpZiAodHlwZW9mIGNpcmN1bGFyID09PSAnb2JqZWN0Jykge1xuICAgIGRlcHRoID0gY2lyY3VsYXIuZGVwdGg7XG4gICAgcHJvdG90eXBlID0gY2lyY3VsYXIucHJvdG90eXBlO1xuICAgIGluY2x1ZGVOb25FbnVtZXJhYmxlID0gY2lyY3VsYXIuaW5jbHVkZU5vbkVudW1lcmFibGU7XG4gICAgY2lyY3VsYXIgPSBjaXJjdWxhci5jaXJjdWxhcjtcbiAgfVxuICAvLyBtYWludGFpbiB0d28gYXJyYXlzIGZvciBjaXJjdWxhciByZWZlcmVuY2VzLCB3aGVyZSBjb3JyZXNwb25kaW5nIHBhcmVudHNcbiAgLy8gYW5kIGNoaWxkcmVuIGhhdmUgdGhlIHNhbWUgaW5kZXhcbiAgdmFyIGFsbFBhcmVudHMgPSBbXTtcbiAgdmFyIGFsbENoaWxkcmVuID0gW107XG5cbiAgdmFyIHVzZUJ1ZmZlciA9IHR5cGVvZiBCdWZmZXIgIT0gJ3VuZGVmaW5lZCc7XG5cbiAgaWYgKHR5cGVvZiBjaXJjdWxhciA9PSAndW5kZWZpbmVkJylcbiAgICBjaXJjdWxhciA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBkZXB0aCA9PSAndW5kZWZpbmVkJylcbiAgICBkZXB0aCA9IEluZmluaXR5O1xuXG4gIC8vIHJlY3Vyc2UgdGhpcyBmdW5jdGlvbiBzbyB3ZSBkb24ndCByZXNldCBhbGxQYXJlbnRzIGFuZCBhbGxDaGlsZHJlblxuICBmdW5jdGlvbiBfY2xvbmUocGFyZW50LCBkZXB0aCkge1xuICAgIC8vIGNsb25pbmcgbnVsbCBhbHdheXMgcmV0dXJucyBudWxsXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGRlcHRoID09PSAwKVxuICAgICAgcmV0dXJuIHBhcmVudDtcblxuICAgIHZhciBjaGlsZDtcbiAgICB2YXIgcHJvdG87XG4gICAgaWYgKHR5cGVvZiBwYXJlbnQgIT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKF9pbnN0YW5jZW9mKHBhcmVudCwgbmF0aXZlTWFwKSkge1xuICAgICAgY2hpbGQgPSBuZXcgbmF0aXZlTWFwKCk7XG4gICAgfSBlbHNlIGlmIChfaW5zdGFuY2VvZihwYXJlbnQsIG5hdGl2ZVNldCkpIHtcbiAgICAgIGNoaWxkID0gbmV3IG5hdGl2ZVNldCgpO1xuICAgIH0gZWxzZSBpZiAoX2luc3RhbmNlb2YocGFyZW50LCBuYXRpdmVQcm9taXNlKSkge1xuICAgICAgY2hpbGQgPSBuZXcgbmF0aXZlUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHBhcmVudC50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmVzb2x2ZShfY2xvbmUodmFsdWUsIGRlcHRoIC0gMSkpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICByZWplY3QoX2Nsb25lKGVyciwgZGVwdGggLSAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjbG9uZS5fX2lzQXJyYXkocGFyZW50KSkge1xuICAgICAgY2hpbGQgPSBbXTtcbiAgICB9IGVsc2UgaWYgKGNsb25lLl9faXNSZWdFeHAocGFyZW50KSkge1xuICAgICAgY2hpbGQgPSBuZXcgUmVnRXhwKHBhcmVudC5zb3VyY2UsIF9fZ2V0UmVnRXhwRmxhZ3MocGFyZW50KSk7XG4gICAgICBpZiAocGFyZW50Lmxhc3RJbmRleCkgY2hpbGQubGFzdEluZGV4ID0gcGFyZW50Lmxhc3RJbmRleDtcbiAgICB9IGVsc2UgaWYgKGNsb25lLl9faXNEYXRlKHBhcmVudCkpIHtcbiAgICAgIGNoaWxkID0gbmV3IERhdGUocGFyZW50LmdldFRpbWUoKSk7XG4gICAgfSBlbHNlIGlmICh1c2VCdWZmZXIgJiYgQnVmZmVyLmlzQnVmZmVyKHBhcmVudCkpIHtcbiAgICAgIGNoaWxkID0gbmV3IEJ1ZmZlcihwYXJlbnQubGVuZ3RoKTtcbiAgICAgIHBhcmVudC5jb3B5KGNoaWxkKTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9IGVsc2UgaWYgKF9pbnN0YW5jZW9mKHBhcmVudCwgRXJyb3IpKSB7XG4gICAgICBjaGlsZCA9IE9iamVjdC5jcmVhdGUocGFyZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBwcm90b3R5cGUgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50KTtcbiAgICAgICAgY2hpbGQgPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjaGlsZCA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTtcbiAgICAgICAgcHJvdG8gPSBwcm90b3R5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICB2YXIgaW5kZXggPSBhbGxQYXJlbnRzLmluZGV4T2YocGFyZW50KTtcblxuICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgIHJldHVybiBhbGxDaGlsZHJlbltpbmRleF07XG4gICAgICB9XG4gICAgICBhbGxQYXJlbnRzLnB1c2gocGFyZW50KTtcbiAgICAgIGFsbENoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH1cblxuICAgIGlmIChfaW5zdGFuY2VvZihwYXJlbnQsIG5hdGl2ZU1hcCkpIHtcbiAgICAgIHBhcmVudC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdmFyIGtleUNoaWxkID0gX2Nsb25lKGtleSwgZGVwdGggLSAxKTtcbiAgICAgICAgdmFyIHZhbHVlQ2hpbGQgPSBfY2xvbmUodmFsdWUsIGRlcHRoIC0gMSk7XG4gICAgICAgIGNoaWxkLnNldChrZXlDaGlsZCwgdmFsdWVDaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZW9mKHBhcmVudCwgbmF0aXZlU2V0KSkge1xuICAgICAgcGFyZW50LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIGVudHJ5Q2hpbGQgPSBfY2xvbmUodmFsdWUsIGRlcHRoIC0gMSk7XG4gICAgICAgIGNoaWxkLmFkZChlbnRyeUNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgaW4gcGFyZW50KSB7XG4gICAgICB2YXIgYXR0cnM7XG4gICAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgYXR0cnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dHJzICYmIGF0dHJzLnNldCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2hpbGRbaV0gPSBfY2xvbmUocGFyZW50W2ldLCBkZXB0aCAtIDEpO1xuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocGFyZW50KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBEb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGNsb25pbmcgYSBzeW1ib2wgYmVjYXVzZSBpdCBpcyBhIHByaW1pdGl2ZSxcbiAgICAgICAgLy8gbGlrZSBhIG51bWJlciBvciBzdHJpbmcuXG4gICAgICAgIHZhciBzeW1ib2wgPSBzeW1ib2xzW2ldO1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocGFyZW50LCBzeW1ib2wpO1xuICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlICYmICFpbmNsdWRlTm9uRW51bWVyYWJsZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkW3N5bWJvbF0gPSBfY2xvbmUocGFyZW50W3N5bWJvbF0sIGRlcHRoIC0gMSk7XG4gICAgICAgIGlmICghZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoaWxkLCBzeW1ib2wsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5jbHVkZU5vbkVudW1lcmFibGUpIHtcbiAgICAgIHZhciBhbGxQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocGFyZW50KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gYWxsUHJvcGVydHlOYW1lc1tpXTtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHBhcmVudCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRbcHJvcGVydHlOYW1lXSA9IF9jbG9uZShwYXJlbnRbcHJvcGVydHlOYW1lXSwgZGVwdGggLSAxKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoaWxkLCBwcm9wZXJ0eU5hbWUsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICByZXR1cm4gX2Nsb25lKHBhcmVudCwgZGVwdGgpO1xufVxuXG4vKipcbiAqIFNpbXBsZSBmbGF0IGNsb25lIHVzaW5nIHByb3RvdHlwZSwgYWNjZXB0cyBvbmx5IG9iamVjdHMsIHVzZWZ1bGwgZm9yIHByb3BlcnR5XG4gKiBvdmVycmlkZSBvbiBGTEFUIGNvbmZpZ3VyYXRpb24gb2JqZWN0IChubyBuZXN0ZWQgcHJvcHMpLlxuICpcbiAqIFVTRSBXSVRIIENBVVRJT04hIFRoaXMgbWF5IG5vdCBiZWhhdmUgYXMgeW91IHdpc2ggaWYgeW91IGRvIG5vdCBrbm93IGhvdyB0aGlzXG4gKiB3b3Jrcy5cbiAqL1xuY2xvbmUuY2xvbmVQcm90b3R5cGUgPSBmdW5jdGlvbiBjbG9uZVByb3RvdHlwZShwYXJlbnQpIHtcbiAgaWYgKHBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgYyA9IGZ1bmN0aW9uICgpIHt9O1xuICBjLnByb3RvdHlwZSA9IHBhcmVudDtcbiAgcmV0dXJuIG5ldyBjKCk7XG59O1xuXG4vLyBwcml2YXRlIHV0aWxpdHkgZnVuY3Rpb25zXG5cbmZ1bmN0aW9uIF9fb2JqVG9TdHIobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuY2xvbmUuX19vYmpUb1N0ciA9IF9fb2JqVG9TdHI7XG5cbmZ1bmN0aW9uIF9faXNEYXRlKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBfX29ialRvU3RyKG8pID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5jbG9uZS5fX2lzRGF0ZSA9IF9faXNEYXRlO1xuXG5mdW5jdGlvbiBfX2lzQXJyYXkobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIF9fb2JqVG9TdHIobykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5jbG9uZS5fX2lzQXJyYXkgPSBfX2lzQXJyYXk7XG5cbmZ1bmN0aW9uIF9faXNSZWdFeHAobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIF9fb2JqVG9TdHIobykgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuY2xvbmUuX19pc1JlZ0V4cCA9IF9faXNSZWdFeHA7XG5cbmZ1bmN0aW9uIF9fZ2V0UmVnRXhwRmxhZ3MocmUpIHtcbiAgdmFyIGZsYWdzID0gJyc7XG4gIGlmIChyZS5nbG9iYWwpIGZsYWdzICs9ICdnJztcbiAgaWYgKHJlLmlnbm9yZUNhc2UpIGZsYWdzICs9ICdpJztcbiAgaWYgKHJlLm11bHRpbGluZSkgZmxhZ3MgKz0gJ20nO1xuICByZXR1cm4gZmxhZ3M7XG59XG5jbG9uZS5fX2dldFJlZ0V4cEZsYWdzID0gX19nZXRSZWdFeHBGbGFncztcblxucmV0dXJuIGNsb25lO1xufSkoKTtcblxuaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY2xvbmUvY2xvbmUuanNcbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuZW50cmllcztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9lbnRyaWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgdG9JbmRleCAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoJHRoaXMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuICAgICAgLCB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKWlmKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pe1xuICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qc1xuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgSVNfV1JBUCAgID0gdHlwZSAmICRleHBvcnQuV1xuICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcbiAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXVxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXVxuICAgICwga2V5LCBvd24sIG91dDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmKG93biAmJiBrZXkgaW4gZXhwb3J0cyljb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uKEMpe1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgICAgaWYodGhpcyBpbnN0YW5jZW9mIEMpe1xuICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDO1xuICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG4gICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcbiAgICAgICAgICB9IHJldHVybiBuZXcgQyhhLCBiLCBjKTtcbiAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICAgIEZbUFJPVE9UWVBFXSA9IENbUFJPVE9UWVBFXTtcbiAgICAgIHJldHVybiBGO1xuICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuICAgIH0pKG91dCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcbiAgICBpZihJU19QUk9UTyl7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSloaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2V4cG9ydC5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qc1xuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qc1xuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXHJcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XHJcbiAqXHJcbiAqIEB2ZXJzaW9uIDAuNS43XHJcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXHJcbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDE2XHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4gKi9cclxuLypqc2xpbnQgYml0d2lzZTogdHJ1ZSAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgdmFyIHJvb3QgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyA/IHdpbmRvdyA6IHt9O1xyXG4gIHZhciBOT0RFX0pTID0gIXJvb3QuSlNfU0hBM19OT19OT0RFX0pTICYmIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcclxuICBpZiAoTk9ERV9KUykge1xyXG4gICAgcm9vdCA9IGdsb2JhbDtcclxuICB9XHJcbiAgdmFyIENPTU1PTl9KUyA9ICFyb290LkpTX1NIQTNfTk9fQ09NTU9OX0pTICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzO1xyXG4gIHZhciBIRVhfQ0hBUlMgPSAnMDEyMzQ1Njc4OWFiY2RlZicuc3BsaXQoJycpO1xyXG4gIHZhciBTSEFLRV9QQURESU5HID0gWzMxLCA3OTM2LCAyMDMxNjE2LCA1MjAwOTM2OTZdO1xyXG4gIHZhciBLRUNDQUtfUEFERElORyA9IFsxLCAyNTYsIDY1NTM2LCAxNjc3NzIxNl07XHJcbiAgdmFyIFBBRERJTkcgPSBbNiwgMTUzNiwgMzkzMjE2LCAxMDA2NjMyOTZdO1xyXG4gIHZhciBTSElGVCA9IFswLCA4LCAxNiwgMjRdO1xyXG4gIHZhciBSQyA9IFsxLCAwLCAzMjg5OCwgMCwgMzI5MDYsIDIxNDc0ODM2NDgsIDIxNDc1MTY0MTYsIDIxNDc0ODM2NDgsIDMyOTA3LCAwLCAyMTQ3NDgzNjQ5LFxyXG4gICAgICAgICAgICAwLCAyMTQ3NTE2NTQ1LCAyMTQ3NDgzNjQ4LCAzMjc3NywgMjE0NzQ4MzY0OCwgMTM4LCAwLCAxMzYsIDAsIDIxNDc1MTY0MjUsIDAsXHJcbiAgICAgICAgICAgIDIxNDc0ODM2NTgsIDAsIDIxNDc1MTY1NTUsIDAsIDEzOSwgMjE0NzQ4MzY0OCwgMzI5MDUsIDIxNDc0ODM2NDgsIDMyNzcxLFxyXG4gICAgICAgICAgICAyMTQ3NDgzNjQ4LCAzMjc3MCwgMjE0NzQ4MzY0OCwgMTI4LCAyMTQ3NDgzNjQ4LCAzMjc3OCwgMCwgMjE0NzQ4MzY1OCwgMjE0NzQ4MzY0OCxcclxuICAgICAgICAgICAgMjE0NzUxNjU0NSwgMjE0NzQ4MzY0OCwgMzI4OTYsIDIxNDc0ODM2NDgsIDIxNDc0ODM2NDksIDAsIDIxNDc1MTY0MjQsIDIxNDc0ODM2NDhdO1xyXG4gIHZhciBCSVRTID0gWzIyNCwgMjU2LCAzODQsIDUxMl07XHJcbiAgdmFyIFNIQUtFX0JJVFMgPSBbMTI4LCAyNTZdO1xyXG4gIHZhciBPVVRQVVRfVFlQRVMgPSBbJ2hleCcsICdidWZmZXInLCAnYXJyYXlCdWZmZXInLCAnYXJyYXknXTtcclxuXHJcbiAgdmFyIGNyZWF0ZU91dHB1dE1ldGhvZCA9IGZ1bmN0aW9uIChiaXRzLCBwYWRkaW5nLCBvdXRwdXRUeXBlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgICAgcmV0dXJuIG5ldyBLZWNjYWsoYml0cywgcGFkZGluZywgYml0cykudXBkYXRlKG1lc3NhZ2UpW291dHB1dFR5cGVdKCk7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHZhciBjcmVhdGVTaGFrZU91dHB1dE1ldGhvZCA9IGZ1bmN0aW9uIChiaXRzLCBwYWRkaW5nLCBvdXRwdXRUeXBlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIG91dHB1dEJpdHMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBLZWNjYWsoYml0cywgcGFkZGluZywgb3V0cHV0Qml0cykudXBkYXRlKG1lc3NhZ2UpW291dHB1dFR5cGVdKCk7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoYml0cywgcGFkZGluZykge1xyXG4gICAgdmFyIG1ldGhvZCA9IGNyZWF0ZU91dHB1dE1ldGhvZChiaXRzLCBwYWRkaW5nLCAnaGV4Jyk7XHJcbiAgICBtZXRob2QuY3JlYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gbmV3IEtlY2NhayhiaXRzLCBwYWRkaW5nLCBiaXRzKTtcclxuICAgIH07XHJcbiAgICBtZXRob2QudXBkYXRlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgICAgcmV0dXJuIG1ldGhvZC5jcmVhdGUoKS51cGRhdGUobWVzc2FnZSk7XHJcbiAgICB9O1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBPVVRQVVRfVFlQRVMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgdmFyIHR5cGUgPSBPVVRQVVRfVFlQRVNbaV07XHJcbiAgICAgIG1ldGhvZFt0eXBlXSA9IGNyZWF0ZU91dHB1dE1ldGhvZChiaXRzLCBwYWRkaW5nLCB0eXBlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZXRob2Q7XHJcbiAgfTtcclxuXHJcbiAgdmFyIGNyZWF0ZVNoYWtlTWV0aG9kID0gZnVuY3Rpb24gKGJpdHMsIHBhZGRpbmcpIHtcclxuICAgIHZhciBtZXRob2QgPSBjcmVhdGVTaGFrZU91dHB1dE1ldGhvZChiaXRzLCBwYWRkaW5nLCAnaGV4Jyk7XHJcbiAgICBtZXRob2QuY3JlYXRlID0gZnVuY3Rpb24gKG91dHB1dEJpdHMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBLZWNjYWsoYml0cywgcGFkZGluZywgb3V0cHV0Qml0cyk7XHJcbiAgICB9O1xyXG4gICAgbWV0aG9kLnVwZGF0ZSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBvdXRwdXRCaXRzKSB7XHJcbiAgICAgIHJldHVybiBtZXRob2QuY3JlYXRlKG91dHB1dEJpdHMpLnVwZGF0ZShtZXNzYWdlKTtcclxuICAgIH07XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE9VVFBVVF9UWVBFUy5sZW5ndGg7ICsraSkge1xyXG4gICAgICB2YXIgdHlwZSA9IE9VVFBVVF9UWVBFU1tpXTtcclxuICAgICAgbWV0aG9kW3R5cGVdID0gY3JlYXRlU2hha2VPdXRwdXRNZXRob2QoYml0cywgcGFkZGluZywgdHlwZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWV0aG9kO1xyXG4gIH07XHJcblxyXG4gIHZhciBhbGdvcml0aG1zID0gW1xyXG4gICAge25hbWU6ICdrZWNjYWsnLCBwYWRkaW5nOiBLRUNDQUtfUEFERElORywgYml0czogQklUUywgY3JlYXRlTWV0aG9kOiBjcmVhdGVNZXRob2R9LFxyXG4gICAge25hbWU6ICdzaGEzJywgcGFkZGluZzogUEFERElORywgYml0czogQklUUywgY3JlYXRlTWV0aG9kOiBjcmVhdGVNZXRob2R9LFxyXG4gICAge25hbWU6ICdzaGFrZScsIHBhZGRpbmc6IFNIQUtFX1BBRERJTkcsIGJpdHM6IFNIQUtFX0JJVFMsIGNyZWF0ZU1ldGhvZDogY3JlYXRlU2hha2VNZXRob2R9XHJcbiAgXTtcclxuXHJcbiAgdmFyIG1ldGhvZHMgPSB7fSwgbWV0aG9kTmFtZXMgPSBbXTtcclxuXHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGdvcml0aG1zLmxlbmd0aDsgKytpKSB7XHJcbiAgICB2YXIgYWxnb3JpdGhtID0gYWxnb3JpdGhtc1tpXTtcclxuICAgIHZhciBiaXRzICA9IGFsZ29yaXRobS5iaXRzO1xyXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBiaXRzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIHZhciBtZXRob2ROYW1lID0gYWxnb3JpdGhtLm5hbWUgKydfJyArIGJpdHNbal07XHJcbiAgICAgIG1ldGhvZE5hbWVzLnB1c2gobWV0aG9kTmFtZSk7XHJcbiAgICAgIG1ldGhvZHNbbWV0aG9kTmFtZV0gPSBhbGdvcml0aG0uY3JlYXRlTWV0aG9kKGJpdHNbal0sIGFsZ29yaXRobS5wYWRkaW5nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIEtlY2NhayhiaXRzLCBwYWRkaW5nLCBvdXRwdXRCaXRzKSB7XHJcbiAgICB0aGlzLmJsb2NrcyA9IFtdO1xyXG4gICAgdGhpcy5zID0gW107XHJcbiAgICB0aGlzLnBhZGRpbmcgPSBwYWRkaW5nO1xyXG4gICAgdGhpcy5vdXRwdXRCaXRzID0gb3V0cHV0Qml0cztcclxuICAgIHRoaXMucmVzZXQgPSB0cnVlO1xyXG4gICAgdGhpcy5ibG9jayA9IDA7XHJcbiAgICB0aGlzLnN0YXJ0ID0gMDtcclxuICAgIHRoaXMuYmxvY2tDb3VudCA9ICgxNjAwIC0gKGJpdHMgPDwgMSkpID4+IDU7XHJcbiAgICB0aGlzLmJ5dGVDb3VudCA9IHRoaXMuYmxvY2tDb3VudCA8PCAyO1xyXG4gICAgdGhpcy5vdXRwdXRCbG9ja3MgPSBvdXRwdXRCaXRzID4+IDU7XHJcbiAgICB0aGlzLmV4dHJhQnl0ZXMgPSAob3V0cHV0Qml0cyAmIDMxKSA+PiAzO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTA7ICsraSkge1xyXG4gICAgICB0aGlzLnNbaV0gPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgS2VjY2FrLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xyXG4gICAgdmFyIG5vdFN0cmluZyA9IHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJztcclxuICAgIGlmIChub3RTdHJpbmcgJiYgbWVzc2FnZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpIHtcclxuICAgICAgbWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gICAgdmFyIGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoLCBibG9ja3MgPSB0aGlzLmJsb2NrcywgYnl0ZUNvdW50ID0gdGhpcy5ieXRlQ291bnQsXHJcbiAgICAgIGJsb2NrQ291bnQgPSB0aGlzLmJsb2NrQ291bnQsIGluZGV4ID0gMCwgcyA9IHRoaXMucywgaSwgY29kZTtcclxuXHJcbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcclxuICAgICAgaWYgKHRoaXMucmVzZXQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0ID0gZmFsc2U7XHJcbiAgICAgICAgYmxvY2tzWzBdID0gdGhpcy5ibG9jaztcclxuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYmxvY2tDb3VudCArIDE7ICsraSkge1xyXG4gICAgICAgICAgYmxvY2tzW2ldID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vdFN0cmluZykge1xyXG4gICAgICAgIGZvciAoaSA9IHRoaXMuc3RhcnQ7IGluZGV4IDwgbGVuZ3RoICYmIGkgPCBieXRlQ291bnQ7ICsraW5kZXgpIHtcclxuICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9IG1lc3NhZ2VbaW5kZXhdIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGkgPSB0aGlzLnN0YXJ0OyBpbmRleCA8IGxlbmd0aCAmJiBpIDwgYnl0ZUNvdW50OyArK2luZGV4KSB7XHJcbiAgICAgICAgICBjb2RlID0gbWVzc2FnZS5jaGFyQ29kZUF0KGluZGV4KTtcclxuICAgICAgICAgIGlmIChjb2RlIDwgMHg4MCkge1xyXG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSBjb2RlIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjb2RlIDwgMHg4MDApIHtcclxuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4YzAgfCAoY29kZSA+PiA2KSkgPDwgU0hJRlRbaSsrICYgM107XHJcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9ICgweDgwIHwgKGNvZGUgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweGQ4MDAgfHwgY29kZSA+PSAweGUwMDApIHtcclxuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ZTAgfCAoY29kZSA+PiAxMikpIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8ICgoY29kZSA+PiA2KSAmIDB4M2YpKSA8PCBTSElGVFtpKysgJiAzXTtcclxuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ODAgfCAoY29kZSAmIDB4M2YpKSA8PCBTSElGVFtpKysgJiAzXTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvZGUgPSAweDEwMDAwICsgKCgoY29kZSAmIDB4M2ZmKSA8PCAxMCkgfCAobWVzc2FnZS5jaGFyQ29kZUF0KCsraW5kZXgpICYgMHgzZmYpKTtcclxuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ZjAgfCAoY29kZSA+PiAxOCkpIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8ICgoY29kZSA+PiAxMikgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XHJcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9ICgweDgwIHwgKChjb2RlID4+IDYpICYgMHgzZikpIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8IChjb2RlICYgMHgzZikpIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxhc3RCeXRlSW5kZXggPSBpO1xyXG4gICAgICBpZiAoaSA+PSBieXRlQ291bnQpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0ID0gaSAtIGJ5dGVDb3VudDtcclxuICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2tzW2Jsb2NrQ291bnRdO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja0NvdW50OyArK2kpIHtcclxuICAgICAgICAgIHNbaV0gXj0gYmxvY2tzW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmKHMpO1xyXG4gICAgICAgIHRoaXMucmVzZXQgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhcnQgPSBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9O1xyXG5cclxuICBLZWNjYWsucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGJsb2NrcyA9IHRoaXMuYmxvY2tzLCBpID0gdGhpcy5sYXN0Qnl0ZUluZGV4LCBibG9ja0NvdW50ID0gdGhpcy5ibG9ja0NvdW50LCBzID0gdGhpcy5zO1xyXG4gICAgYmxvY2tzW2kgPj4gMl0gfD0gdGhpcy5wYWRkaW5nW2kgJiAzXTtcclxuICAgIGlmICh0aGlzLmxhc3RCeXRlSW5kZXggPT09IHRoaXMuYnl0ZUNvdW50KSB7XHJcbiAgICAgIGJsb2Nrc1swXSA9IGJsb2Nrc1tibG9ja0NvdW50XTtcclxuICAgICAgZm9yIChpID0gMTsgaSA8IGJsb2NrQ291bnQgKyAxOyArK2kpIHtcclxuICAgICAgICBibG9ja3NbaV0gPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBibG9ja3NbYmxvY2tDb3VudCAtIDFdIHw9IDB4ODAwMDAwMDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tDb3VudDsgKytpKSB7XHJcbiAgICAgIHNbaV0gXj0gYmxvY2tzW2ldO1xyXG4gICAgfVxyXG4gICAgZihzKTtcclxuICB9O1xyXG5cclxuICBLZWNjYWsucHJvdG90eXBlLnRvU3RyaW5nID0gS2VjY2FrLnByb3RvdHlwZS5oZXggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmZpbmFsaXplKCk7XHJcblxyXG4gICAgdmFyIGJsb2NrQ291bnQgPSB0aGlzLmJsb2NrQ291bnQsIHMgPSB0aGlzLnMsIG91dHB1dEJsb2NrcyA9IHRoaXMub3V0cHV0QmxvY2tzLFxyXG4gICAgICAgIGV4dHJhQnl0ZXMgPSB0aGlzLmV4dHJhQnl0ZXMsIGkgPSAwLCBqID0gMDtcclxuICAgIHZhciBoZXggPSAnJywgYmxvY2s7XHJcbiAgICB3aGlsZSAoaiA8IG91dHB1dEJsb2Nrcykge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tDb3VudCAmJiBqIDwgb3V0cHV0QmxvY2tzOyArK2ksICsraikge1xyXG4gICAgICAgIGJsb2NrID0gc1tpXTtcclxuICAgICAgICBoZXggKz0gSEVYX0NIQVJTWyhibG9jayA+PiA0KSAmIDB4MEZdICsgSEVYX0NIQVJTW2Jsb2NrICYgMHgwRl0gK1xyXG4gICAgICAgICAgICAgICBIRVhfQ0hBUlNbKGJsb2NrID4+IDEyKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhibG9jayA+PiA4KSAmIDB4MEZdICtcclxuICAgICAgICAgICAgICAgSEVYX0NIQVJTWyhibG9jayA+PiAyMCkgJiAweDBGXSArIEhFWF9DSEFSU1soYmxvY2sgPj4gMTYpICYgMHgwRl0gK1xyXG4gICAgICAgICAgICAgICBIRVhfQ0hBUlNbKGJsb2NrID4+IDI4KSAmIDB4MEZdICsgSEVYX0NIQVJTWyhibG9jayA+PiAyNCkgJiAweDBGXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaiAlIGJsb2NrQ291bnQgPT09IDApIHtcclxuICAgICAgICBmKHMpO1xyXG4gICAgICAgIGkgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZXh0cmFCeXRlcykge1xyXG4gICAgICBibG9jayA9IHNbaV07XHJcbiAgICAgIGlmIChleHRyYUJ5dGVzID4gMCkge1xyXG4gICAgICAgIGhleCArPSBIRVhfQ0hBUlNbKGJsb2NrID4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbYmxvY2sgJiAweDBGXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0cmFCeXRlcyA+IDEpIHtcclxuICAgICAgICBoZXggKz0gSEVYX0NIQVJTWyhibG9jayA+PiAxMikgJiAweDBGXSArIEhFWF9DSEFSU1soYmxvY2sgPj4gOCkgJiAweDBGXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0cmFCeXRlcyA+IDIpIHtcclxuICAgICAgICBoZXggKz0gSEVYX0NIQVJTWyhibG9jayA+PiAyMCkgJiAweDBGXSArIEhFWF9DSEFSU1soYmxvY2sgPj4gMTYpICYgMHgwRl07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBoZXg7XHJcbiAgfTtcclxuXHJcbiAgS2VjY2FrLnByb3RvdHlwZS5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMuZmluYWxpemUoKTtcclxuXHJcbiAgICB2YXIgYmxvY2tDb3VudCA9IHRoaXMuYmxvY2tDb3VudCwgcyA9IHRoaXMucywgb3V0cHV0QmxvY2tzID0gdGhpcy5vdXRwdXRCbG9ja3MsXHJcbiAgICAgICAgZXh0cmFCeXRlcyA9IHRoaXMuZXh0cmFCeXRlcywgaSA9IDAsIGogPSAwO1xyXG4gICAgdmFyIGJ5dGVzID0gdGhpcy5vdXRwdXRCaXRzID4+IDM7XHJcbiAgICB2YXIgYnVmZmVyO1xyXG4gICAgaWYgKGV4dHJhQnl0ZXMpIHtcclxuICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKChvdXRwdXRCbG9ja3MgKyAxKSA8PCAyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcyk7XHJcbiAgICB9XHJcbiAgICB2YXIgYXJyYXkgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIHdoaWxlIChqIDwgb3V0cHV0QmxvY2tzKSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja0NvdW50ICYmIGogPCBvdXRwdXRCbG9ja3M7ICsraSwgKytqKSB7XHJcbiAgICAgICAgYXJyYXlbal0gPSBzW2ldO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChqICUgYmxvY2tDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIGYocyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChleHRyYUJ5dGVzKSB7XHJcbiAgICAgIGFycmF5W2ldID0gc1tpXTtcclxuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKDAsIGJ5dGVzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXI7XHJcbiAgfTtcclxuXHJcbiAgS2VjY2FrLnByb3RvdHlwZS5idWZmZXIgPSBLZWNjYWsucHJvdG90eXBlLmFycmF5QnVmZmVyO1xyXG5cclxuICBLZWNjYWsucHJvdG90eXBlLmRpZ2VzdCA9IEtlY2Nhay5wcm90b3R5cGUuYXJyYXkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmZpbmFsaXplKCk7XHJcblxyXG4gICAgdmFyIGJsb2NrQ291bnQgPSB0aGlzLmJsb2NrQ291bnQsIHMgPSB0aGlzLnMsIG91dHB1dEJsb2NrcyA9IHRoaXMub3V0cHV0QmxvY2tzLFxyXG4gICAgICAgIGV4dHJhQnl0ZXMgPSB0aGlzLmV4dHJhQnl0ZXMsIGkgPSAwLCBqID0gMDtcclxuICAgIHZhciBhcnJheSA9IFtdLCBvZmZzZXQsIGJsb2NrO1xyXG4gICAgd2hpbGUgKGogPCBvdXRwdXRCbG9ja3MpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrQ291bnQgJiYgaiA8IG91dHB1dEJsb2NrczsgKytpLCArK2opIHtcclxuICAgICAgICBvZmZzZXQgPSBqIDw8IDI7XHJcbiAgICAgICAgYmxvY2sgPSBzW2ldO1xyXG4gICAgICAgIGFycmF5W29mZnNldF0gPSBibG9jayAmIDB4RkY7XHJcbiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgMV0gPSAoYmxvY2sgPj4gOCkgJiAweEZGO1xyXG4gICAgICAgIGFycmF5W29mZnNldCArIDJdID0gKGJsb2NrID4+IDE2KSAmIDB4RkY7XHJcbiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgM10gPSAoYmxvY2sgPj4gMjQpICYgMHhGRjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaiAlIGJsb2NrQ291bnQgPT09IDApIHtcclxuICAgICAgICBmKHMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZXh0cmFCeXRlcykge1xyXG4gICAgICBvZmZzZXQgPSBqIDw8IDI7XHJcbiAgICAgIGJsb2NrID0gc1tpXTtcclxuICAgICAgaWYgKGV4dHJhQnl0ZXMgPiAwKSB7XHJcbiAgICAgICAgYXJyYXlbb2Zmc2V0XSA9IGJsb2NrICYgMHhGRjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0cmFCeXRlcyA+IDEpIHtcclxuICAgICAgICBhcnJheVtvZmZzZXQgKyAxXSA9IChibG9jayA+PiA4KSAmIDB4RkY7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV4dHJhQnl0ZXMgPiAyKSB7XHJcbiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgMl0gPSAoYmxvY2sgPj4gMTYpICYgMHhGRjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH07XHJcblxyXG4gIHZhciBmID0gZnVuY3Rpb24gKHMpIHtcclxuICAgIHZhciBoLCBsLCBuLCBjMCwgYzEsIGMyLCBjMywgYzQsIGM1LCBjNiwgYzcsIGM4LCBjOSxcclxuICAgICAgICBiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4LCBiOSwgYjEwLCBiMTEsIGIxMiwgYjEzLCBiMTQsIGIxNSwgYjE2LCBiMTcsXHJcbiAgICAgICAgYjE4LCBiMTksIGIyMCwgYjIxLCBiMjIsIGIyMywgYjI0LCBiMjUsIGIyNiwgYjI3LCBiMjgsIGIyOSwgYjMwLCBiMzEsIGIzMiwgYjMzLFxyXG4gICAgICAgIGIzNCwgYjM1LCBiMzYsIGIzNywgYjM4LCBiMzksIGI0MCwgYjQxLCBiNDIsIGI0MywgYjQ0LCBiNDUsIGI0NiwgYjQ3LCBiNDgsIGI0OTtcclxuICAgIGZvciAobiA9IDA7IG4gPCA0ODsgbiArPSAyKSB7XHJcbiAgICAgIGMwID0gc1swXSBeIHNbMTBdIF4gc1syMF0gXiBzWzMwXSBeIHNbNDBdO1xyXG4gICAgICBjMSA9IHNbMV0gXiBzWzExXSBeIHNbMjFdIF4gc1szMV0gXiBzWzQxXTtcclxuICAgICAgYzIgPSBzWzJdIF4gc1sxMl0gXiBzWzIyXSBeIHNbMzJdIF4gc1s0Ml07XHJcbiAgICAgIGMzID0gc1szXSBeIHNbMTNdIF4gc1syM10gXiBzWzMzXSBeIHNbNDNdO1xyXG4gICAgICBjNCA9IHNbNF0gXiBzWzE0XSBeIHNbMjRdIF4gc1szNF0gXiBzWzQ0XTtcclxuICAgICAgYzUgPSBzWzVdIF4gc1sxNV0gXiBzWzI1XSBeIHNbMzVdIF4gc1s0NV07XHJcbiAgICAgIGM2ID0gc1s2XSBeIHNbMTZdIF4gc1syNl0gXiBzWzM2XSBeIHNbNDZdO1xyXG4gICAgICBjNyA9IHNbN10gXiBzWzE3XSBeIHNbMjddIF4gc1szN10gXiBzWzQ3XTtcclxuICAgICAgYzggPSBzWzhdIF4gc1sxOF0gXiBzWzI4XSBeIHNbMzhdIF4gc1s0OF07XHJcbiAgICAgIGM5ID0gc1s5XSBeIHNbMTldIF4gc1syOV0gXiBzWzM5XSBeIHNbNDldO1xyXG5cclxuICAgICAgaCA9IGM4IF4gKChjMiA8PCAxKSB8IChjMyA+Pj4gMzEpKTtcclxuICAgICAgbCA9IGM5IF4gKChjMyA8PCAxKSB8IChjMiA+Pj4gMzEpKTtcclxuICAgICAgc1swXSBePSBoO1xyXG4gICAgICBzWzFdIF49IGw7XHJcbiAgICAgIHNbMTBdIF49IGg7XHJcbiAgICAgIHNbMTFdIF49IGw7XHJcbiAgICAgIHNbMjBdIF49IGg7XHJcbiAgICAgIHNbMjFdIF49IGw7XHJcbiAgICAgIHNbMzBdIF49IGg7XHJcbiAgICAgIHNbMzFdIF49IGw7XHJcbiAgICAgIHNbNDBdIF49IGg7XHJcbiAgICAgIHNbNDFdIF49IGw7XHJcbiAgICAgIGggPSBjMCBeICgoYzQgPDwgMSkgfCAoYzUgPj4+IDMxKSk7XHJcbiAgICAgIGwgPSBjMSBeICgoYzUgPDwgMSkgfCAoYzQgPj4+IDMxKSk7XHJcbiAgICAgIHNbMl0gXj0gaDtcclxuICAgICAgc1szXSBePSBsO1xyXG4gICAgICBzWzEyXSBePSBoO1xyXG4gICAgICBzWzEzXSBePSBsO1xyXG4gICAgICBzWzIyXSBePSBoO1xyXG4gICAgICBzWzIzXSBePSBsO1xyXG4gICAgICBzWzMyXSBePSBoO1xyXG4gICAgICBzWzMzXSBePSBsO1xyXG4gICAgICBzWzQyXSBePSBoO1xyXG4gICAgICBzWzQzXSBePSBsO1xyXG4gICAgICBoID0gYzIgXiAoKGM2IDw8IDEpIHwgKGM3ID4+PiAzMSkpO1xyXG4gICAgICBsID0gYzMgXiAoKGM3IDw8IDEpIHwgKGM2ID4+PiAzMSkpO1xyXG4gICAgICBzWzRdIF49IGg7XHJcbiAgICAgIHNbNV0gXj0gbDtcclxuICAgICAgc1sxNF0gXj0gaDtcclxuICAgICAgc1sxNV0gXj0gbDtcclxuICAgICAgc1syNF0gXj0gaDtcclxuICAgICAgc1syNV0gXj0gbDtcclxuICAgICAgc1szNF0gXj0gaDtcclxuICAgICAgc1szNV0gXj0gbDtcclxuICAgICAgc1s0NF0gXj0gaDtcclxuICAgICAgc1s0NV0gXj0gbDtcclxuICAgICAgaCA9IGM0IF4gKChjOCA8PCAxKSB8IChjOSA+Pj4gMzEpKTtcclxuICAgICAgbCA9IGM1IF4gKChjOSA8PCAxKSB8IChjOCA+Pj4gMzEpKTtcclxuICAgICAgc1s2XSBePSBoO1xyXG4gICAgICBzWzddIF49IGw7XHJcbiAgICAgIHNbMTZdIF49IGg7XHJcbiAgICAgIHNbMTddIF49IGw7XHJcbiAgICAgIHNbMjZdIF49IGg7XHJcbiAgICAgIHNbMjddIF49IGw7XHJcbiAgICAgIHNbMzZdIF49IGg7XHJcbiAgICAgIHNbMzddIF49IGw7XHJcbiAgICAgIHNbNDZdIF49IGg7XHJcbiAgICAgIHNbNDddIF49IGw7XHJcbiAgICAgIGggPSBjNiBeICgoYzAgPDwgMSkgfCAoYzEgPj4+IDMxKSk7XHJcbiAgICAgIGwgPSBjNyBeICgoYzEgPDwgMSkgfCAoYzAgPj4+IDMxKSk7XHJcbiAgICAgIHNbOF0gXj0gaDtcclxuICAgICAgc1s5XSBePSBsO1xyXG4gICAgICBzWzE4XSBePSBoO1xyXG4gICAgICBzWzE5XSBePSBsO1xyXG4gICAgICBzWzI4XSBePSBoO1xyXG4gICAgICBzWzI5XSBePSBsO1xyXG4gICAgICBzWzM4XSBePSBoO1xyXG4gICAgICBzWzM5XSBePSBsO1xyXG4gICAgICBzWzQ4XSBePSBoO1xyXG4gICAgICBzWzQ5XSBePSBsO1xyXG5cclxuICAgICAgYjAgPSBzWzBdO1xyXG4gICAgICBiMSA9IHNbMV07XHJcbiAgICAgIGIzMiA9IChzWzExXSA8PCA0KSB8IChzWzEwXSA+Pj4gMjgpO1xyXG4gICAgICBiMzMgPSAoc1sxMF0gPDwgNCkgfCAoc1sxMV0gPj4+IDI4KTtcclxuICAgICAgYjE0ID0gKHNbMjBdIDw8IDMpIHwgKHNbMjFdID4+PiAyOSk7XHJcbiAgICAgIGIxNSA9IChzWzIxXSA8PCAzKSB8IChzWzIwXSA+Pj4gMjkpO1xyXG4gICAgICBiNDYgPSAoc1szMV0gPDwgOSkgfCAoc1szMF0gPj4+IDIzKTtcclxuICAgICAgYjQ3ID0gKHNbMzBdIDw8IDkpIHwgKHNbMzFdID4+PiAyMyk7XHJcbiAgICAgIGIyOCA9IChzWzQwXSA8PCAxOCkgfCAoc1s0MV0gPj4+IDE0KTtcclxuICAgICAgYjI5ID0gKHNbNDFdIDw8IDE4KSB8IChzWzQwXSA+Pj4gMTQpO1xyXG4gICAgICBiMjAgPSAoc1syXSA8PCAxKSB8IChzWzNdID4+PiAzMSk7XHJcbiAgICAgIGIyMSA9IChzWzNdIDw8IDEpIHwgKHNbMl0gPj4+IDMxKTtcclxuICAgICAgYjIgPSAoc1sxM10gPDwgMTIpIHwgKHNbMTJdID4+PiAyMCk7XHJcbiAgICAgIGIzID0gKHNbMTJdIDw8IDEyKSB8IChzWzEzXSA+Pj4gMjApO1xyXG4gICAgICBiMzQgPSAoc1syMl0gPDwgMTApIHwgKHNbMjNdID4+PiAyMik7XHJcbiAgICAgIGIzNSA9IChzWzIzXSA8PCAxMCkgfCAoc1syMl0gPj4+IDIyKTtcclxuICAgICAgYjE2ID0gKHNbMzNdIDw8IDEzKSB8IChzWzMyXSA+Pj4gMTkpO1xyXG4gICAgICBiMTcgPSAoc1szMl0gPDwgMTMpIHwgKHNbMzNdID4+PiAxOSk7XHJcbiAgICAgIGI0OCA9IChzWzQyXSA8PCAyKSB8IChzWzQzXSA+Pj4gMzApO1xyXG4gICAgICBiNDkgPSAoc1s0M10gPDwgMikgfCAoc1s0Ml0gPj4+IDMwKTtcclxuICAgICAgYjQwID0gKHNbNV0gPDwgMzApIHwgKHNbNF0gPj4+IDIpO1xyXG4gICAgICBiNDEgPSAoc1s0XSA8PCAzMCkgfCAoc1s1XSA+Pj4gMik7XHJcbiAgICAgIGIyMiA9IChzWzE0XSA8PCA2KSB8IChzWzE1XSA+Pj4gMjYpO1xyXG4gICAgICBiMjMgPSAoc1sxNV0gPDwgNikgfCAoc1sxNF0gPj4+IDI2KTtcclxuICAgICAgYjQgPSAoc1syNV0gPDwgMTEpIHwgKHNbMjRdID4+PiAyMSk7XHJcbiAgICAgIGI1ID0gKHNbMjRdIDw8IDExKSB8IChzWzI1XSA+Pj4gMjEpO1xyXG4gICAgICBiMzYgPSAoc1szNF0gPDwgMTUpIHwgKHNbMzVdID4+PiAxNyk7XHJcbiAgICAgIGIzNyA9IChzWzM1XSA8PCAxNSkgfCAoc1szNF0gPj4+IDE3KTtcclxuICAgICAgYjE4ID0gKHNbNDVdIDw8IDI5KSB8IChzWzQ0XSA+Pj4gMyk7XHJcbiAgICAgIGIxOSA9IChzWzQ0XSA8PCAyOSkgfCAoc1s0NV0gPj4+IDMpO1xyXG4gICAgICBiMTAgPSAoc1s2XSA8PCAyOCkgfCAoc1s3XSA+Pj4gNCk7XHJcbiAgICAgIGIxMSA9IChzWzddIDw8IDI4KSB8IChzWzZdID4+PiA0KTtcclxuICAgICAgYjQyID0gKHNbMTddIDw8IDIzKSB8IChzWzE2XSA+Pj4gOSk7XHJcbiAgICAgIGI0MyA9IChzWzE2XSA8PCAyMykgfCAoc1sxN10gPj4+IDkpO1xyXG4gICAgICBiMjQgPSAoc1syNl0gPDwgMjUpIHwgKHNbMjddID4+PiA3KTtcclxuICAgICAgYjI1ID0gKHNbMjddIDw8IDI1KSB8IChzWzI2XSA+Pj4gNyk7XHJcbiAgICAgIGI2ID0gKHNbMzZdIDw8IDIxKSB8IChzWzM3XSA+Pj4gMTEpO1xyXG4gICAgICBiNyA9IChzWzM3XSA8PCAyMSkgfCAoc1szNl0gPj4+IDExKTtcclxuICAgICAgYjM4ID0gKHNbNDddIDw8IDI0KSB8IChzWzQ2XSA+Pj4gOCk7XHJcbiAgICAgIGIzOSA9IChzWzQ2XSA8PCAyNCkgfCAoc1s0N10gPj4+IDgpO1xyXG4gICAgICBiMzAgPSAoc1s4XSA8PCAyNykgfCAoc1s5XSA+Pj4gNSk7XHJcbiAgICAgIGIzMSA9IChzWzldIDw8IDI3KSB8IChzWzhdID4+PiA1KTtcclxuICAgICAgYjEyID0gKHNbMThdIDw8IDIwKSB8IChzWzE5XSA+Pj4gMTIpO1xyXG4gICAgICBiMTMgPSAoc1sxOV0gPDwgMjApIHwgKHNbMThdID4+PiAxMik7XHJcbiAgICAgIGI0NCA9IChzWzI5XSA8PCA3KSB8IChzWzI4XSA+Pj4gMjUpO1xyXG4gICAgICBiNDUgPSAoc1syOF0gPDwgNykgfCAoc1syOV0gPj4+IDI1KTtcclxuICAgICAgYjI2ID0gKHNbMzhdIDw8IDgpIHwgKHNbMzldID4+PiAyNCk7XHJcbiAgICAgIGIyNyA9IChzWzM5XSA8PCA4KSB8IChzWzM4XSA+Pj4gMjQpO1xyXG4gICAgICBiOCA9IChzWzQ4XSA8PCAxNCkgfCAoc1s0OV0gPj4+IDE4KTtcclxuICAgICAgYjkgPSAoc1s0OV0gPDwgMTQpIHwgKHNbNDhdID4+PiAxOCk7XHJcblxyXG4gICAgICBzWzBdID0gYjAgXiAofmIyICYgYjQpO1xyXG4gICAgICBzWzFdID0gYjEgXiAofmIzICYgYjUpO1xyXG4gICAgICBzWzEwXSA9IGIxMCBeICh+YjEyICYgYjE0KTtcclxuICAgICAgc1sxMV0gPSBiMTEgXiAofmIxMyAmIGIxNSk7XHJcbiAgICAgIHNbMjBdID0gYjIwIF4gKH5iMjIgJiBiMjQpO1xyXG4gICAgICBzWzIxXSA9IGIyMSBeICh+YjIzICYgYjI1KTtcclxuICAgICAgc1szMF0gPSBiMzAgXiAofmIzMiAmIGIzNCk7XHJcbiAgICAgIHNbMzFdID0gYjMxIF4gKH5iMzMgJiBiMzUpO1xyXG4gICAgICBzWzQwXSA9IGI0MCBeICh+YjQyICYgYjQ0KTtcclxuICAgICAgc1s0MV0gPSBiNDEgXiAofmI0MyAmIGI0NSk7XHJcbiAgICAgIHNbMl0gPSBiMiBeICh+YjQgJiBiNik7XHJcbiAgICAgIHNbM10gPSBiMyBeICh+YjUgJiBiNyk7XHJcbiAgICAgIHNbMTJdID0gYjEyIF4gKH5iMTQgJiBiMTYpO1xyXG4gICAgICBzWzEzXSA9IGIxMyBeICh+YjE1ICYgYjE3KTtcclxuICAgICAgc1syMl0gPSBiMjIgXiAofmIyNCAmIGIyNik7XHJcbiAgICAgIHNbMjNdID0gYjIzIF4gKH5iMjUgJiBiMjcpO1xyXG4gICAgICBzWzMyXSA9IGIzMiBeICh+YjM0ICYgYjM2KTtcclxuICAgICAgc1szM10gPSBiMzMgXiAofmIzNSAmIGIzNyk7XHJcbiAgICAgIHNbNDJdID0gYjQyIF4gKH5iNDQgJiBiNDYpO1xyXG4gICAgICBzWzQzXSA9IGI0MyBeICh+YjQ1ICYgYjQ3KTtcclxuICAgICAgc1s0XSA9IGI0IF4gKH5iNiAmIGI4KTtcclxuICAgICAgc1s1XSA9IGI1IF4gKH5iNyAmIGI5KTtcclxuICAgICAgc1sxNF0gPSBiMTQgXiAofmIxNiAmIGIxOCk7XHJcbiAgICAgIHNbMTVdID0gYjE1IF4gKH5iMTcgJiBiMTkpO1xyXG4gICAgICBzWzI0XSA9IGIyNCBeICh+YjI2ICYgYjI4KTtcclxuICAgICAgc1syNV0gPSBiMjUgXiAofmIyNyAmIGIyOSk7XHJcbiAgICAgIHNbMzRdID0gYjM0IF4gKH5iMzYgJiBiMzgpO1xyXG4gICAgICBzWzM1XSA9IGIzNSBeICh+YjM3ICYgYjM5KTtcclxuICAgICAgc1s0NF0gPSBiNDQgXiAofmI0NiAmIGI0OCk7XHJcbiAgICAgIHNbNDVdID0gYjQ1IF4gKH5iNDcgJiBiNDkpO1xyXG4gICAgICBzWzZdID0gYjYgXiAofmI4ICYgYjApO1xyXG4gICAgICBzWzddID0gYjcgXiAofmI5ICYgYjEpO1xyXG4gICAgICBzWzE2XSA9IGIxNiBeICh+YjE4ICYgYjEwKTtcclxuICAgICAgc1sxN10gPSBiMTcgXiAofmIxOSAmIGIxMSk7XHJcbiAgICAgIHNbMjZdID0gYjI2IF4gKH5iMjggJiBiMjApO1xyXG4gICAgICBzWzI3XSA9IGIyNyBeICh+YjI5ICYgYjIxKTtcclxuICAgICAgc1szNl0gPSBiMzYgXiAofmIzOCAmIGIzMCk7XHJcbiAgICAgIHNbMzddID0gYjM3IF4gKH5iMzkgJiBiMzEpO1xyXG4gICAgICBzWzQ2XSA9IGI0NiBeICh+YjQ4ICYgYjQwKTtcclxuICAgICAgc1s0N10gPSBiNDcgXiAofmI0OSAmIGI0MSk7XHJcbiAgICAgIHNbOF0gPSBiOCBeICh+YjAgJiBiMik7XHJcbiAgICAgIHNbOV0gPSBiOSBeICh+YjEgJiBiMyk7XHJcbiAgICAgIHNbMThdID0gYjE4IF4gKH5iMTAgJiBiMTIpO1xyXG4gICAgICBzWzE5XSA9IGIxOSBeICh+YjExICYgYjEzKTtcclxuICAgICAgc1syOF0gPSBiMjggXiAofmIyMCAmIGIyMik7XHJcbiAgICAgIHNbMjldID0gYjI5IF4gKH5iMjEgJiBiMjMpO1xyXG4gICAgICBzWzM4XSA9IGIzOCBeICh+YjMwICYgYjMyKTtcclxuICAgICAgc1szOV0gPSBiMzkgXiAofmIzMSAmIGIzMyk7XHJcbiAgICAgIHNbNDhdID0gYjQ4IF4gKH5iNDAgJiBiNDIpO1xyXG4gICAgICBzWzQ5XSA9IGI0OSBeICh+YjQxICYgYjQzKTtcclxuXHJcbiAgICAgIHNbMF0gXj0gUkNbbl07XHJcbiAgICAgIHNbMV0gXj0gUkNbbiArIDFdO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGlmIChDT01NT05fSlMpIHtcclxuICAgIG1vZHVsZS5leHBvcnRzID0gbWV0aG9kcztcclxuICB9IGVsc2Uge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRob2ROYW1lcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICByb290W21ldGhvZE5hbWVzW2ldXSA9IG1ldGhvZHNbbWV0aG9kTmFtZXNbaV1dO1xyXG4gICAgfVxyXG4gIH1cclxufSkoKTtcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pzLXNoYTMvc3JjL3NoYTMuanNcbi8vIG1vZHVsZSBpZCA9IDI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIGdsb2JhbHMgd2luZG93LCBleHBvcnRzLCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uKHdpbmRvdykge1xuICAgICd1c2Ugc3RyaWN0J1xuXG4gICAgdmFyIHJlID0ge1xuICAgICAgICBub3Rfc3RyaW5nOiAvW15zXS8sXG4gICAgICAgIG5vdF9ib29sOiAvW150XS8sXG4gICAgICAgIG5vdF90eXBlOiAvW15UXS8sXG4gICAgICAgIG5vdF9wcmltaXRpdmU6IC9bXnZdLyxcbiAgICAgICAgbnVtYmVyOiAvW2RpZWZnXS8sXG4gICAgICAgIG51bWVyaWNfYXJnOiAvW2JjZGllZmd1eFhdLyxcbiAgICAgICAganNvbjogL1tqXS8sXG4gICAgICAgIG5vdF9qc29uOiAvW15qXS8sXG4gICAgICAgIHRleHQ6IC9eW15cXHgyNV0rLyxcbiAgICAgICAgbW9kdWxvOiAvXlxceDI1ezJ9LyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IC9eXFx4MjUoPzooWzEtOV1cXGQqKVxcJHxcXCgoW15cXCldKylcXCkpPyhcXCspPygwfCdbXiRdKT8oLSk/KFxcZCspPyg/OlxcLihcXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLFxuICAgICAgICBrZXk6IC9eKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGtleV9hY2Nlc3M6IC9eXFwuKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGluZGV4X2FjY2VzczogL15cXFsoXFxkKylcXF0vLFxuICAgICAgICBzaWduOiAvXltcXCtcXC1dL1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNwcmludGYoKSB7XG4gICAgICAgIHZhciBrZXkgPSBhcmd1bWVudHNbMF0sIGNhY2hlID0gc3ByaW50Zi5jYWNoZVxuICAgICAgICBpZiAoIShjYWNoZVtrZXldKSkge1xuICAgICAgICAgICAgY2FjaGVba2V5XSA9IHNwcmludGYucGFyc2Uoa2V5KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcHJpbnRmLmZvcm1hdC5jYWxsKG51bGwsIGNhY2hlW2tleV0sIGFyZ3VtZW50cylcbiAgICB9XG5cbiAgICBzcHJpbnRmLmZvcm1hdCA9IGZ1bmN0aW9uKHBhcnNlX3RyZWUsIGFyZ3YpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IDEsIHRyZWVfbGVuZ3RoID0gcGFyc2VfdHJlZS5sZW5ndGgsIG5vZGVfdHlwZSA9ICcnLCBhcmcsIG91dHB1dCA9IFtdLCBpLCBrLCBtYXRjaCwgcGFkLCBwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoLCBpc19wb3NpdGl2ZSA9IHRydWUsIHNpZ24gPSAnJ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJlZV9sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbm9kZV90eXBlID0gZ2V0X3R5cGUocGFyc2VfdHJlZVtpXSlcbiAgICAgICAgICAgIGlmIChub2RlX3R5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W291dHB1dC5sZW5ndGhdID0gcGFyc2VfdHJlZVtpXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZV90eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBwYXJzZV90cmVlW2ldIC8vIGNvbnZlbmllbmNlIHB1cnBvc2VzIG9ubHlcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsgLy8ga2V5d29yZCBhcmd1bWVudFxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcl1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG1hdGNoWzJdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5oYXNPd25Qcm9wZXJ0eShtYXRjaFsyXVtrXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignW3NwcmludGZdIHByb3BlcnR5IFwiJXNcIiBkb2VzIG5vdCBleGlzdCcsIG1hdGNoWzJdW2tdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ1ttYXRjaFsyXVtrXV1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaFsxXSkgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChleHBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndlttYXRjaFsxXV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGltcGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcisrXVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5ub3RfdHlwZS50ZXN0KG1hdGNoWzhdKSAmJiByZS5ub3RfcHJpbWl0aXZlLnRlc3QobWF0Y2hbOF0pICYmIGdldF90eXBlKGFyZykgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1lcmljX2FyZy50ZXN0KG1hdGNoWzhdKSAmJiAoZ2V0X3R5cGUoYXJnKSAhPSAnbnVtYmVyJyAmJiBpc05hTihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNwcmludGYoXCJbc3ByaW50Zl0gZXhwZWN0aW5nIG51bWJlciBidXQgZm91bmQgJXNcIiwgZ2V0X3R5cGUoYXJnKSkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KG1hdGNoWzhdKSkge1xuICAgICAgICAgICAgICAgICAgICBpc19wb3NpdGl2ZSA9IGFyZyA+PSAwXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChtYXRjaFs4XSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApLnRvU3RyaW5nKDIpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChhcmcsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIG1hdGNoWzZdID8gcGFyc2VJbnQobWF0Y2hbNl0pIDogMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBtYXRjaFs3XSA/IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKG1hdGNoWzddKSA6IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBtYXRjaFs3XSA/IHBhcnNlRmxvYXQoYXJnKS50b0ZpeGVkKG1hdGNoWzddKSA6IHBhcnNlRmxvYXQoYXJnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IG1hdGNoWzddID8gcGFyc2VGbG9hdChhcmcpLnRvUHJlY2lzaW9uKG1hdGNoWzddKSA6IHBhcnNlRmxvYXQoYXJnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy50b1N0cmluZyg4KVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyhhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAobWF0Y2hbN10gPyBhcmcuc3Vic3RyaW5nKDAsIG1hdGNoWzddKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcoISFhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAobWF0Y2hbN10gPyBhcmcuc3Vic3RyaW5nKDAsIG1hdGNoWzddKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBnZXRfdHlwZShhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAobWF0Y2hbN10gPyBhcmcuc3Vic3RyaW5nKDAsIG1hdGNoWzddKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKSA+Pj4gMFxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy52YWx1ZU9mKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChtYXRjaFs3XSA/IGFyZy5zdWJzdHJpbmcoMCwgbWF0Y2hbN10pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdYJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZS5qc29uLnRlc3QobWF0Y2hbOF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtvdXRwdXQubGVuZ3RoXSA9IGFyZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KG1hdGNoWzhdKSAmJiAoIWlzX3Bvc2l0aXZlIHx8IG1hdGNoWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IGlzX3Bvc2l0aXZlID8gJysnIDogJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudG9TdHJpbmcoKS5yZXBsYWNlKHJlLnNpZ24sICcnKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFkX2NoYXJhY3RlciA9IG1hdGNoWzRdID8gbWF0Y2hbNF0gPT09ICcwJyA/ICcwJyA6IG1hdGNoWzRdLmNoYXJBdCgxKSA6ICcgJ1xuICAgICAgICAgICAgICAgICAgICBwYWRfbGVuZ3RoID0gbWF0Y2hbNl0gLSAoc2lnbiArIGFyZykubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIHBhZCA9IG1hdGNoWzZdID8gKHBhZF9sZW5ndGggPiAwID8gc3RyX3JlcGVhdChwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoKSA6ICcnKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtvdXRwdXQubGVuZ3RoXSA9IG1hdGNoWzVdID8gc2lnbiArIGFyZyArIHBhZCA6IChwYWRfY2hhcmFjdGVyID09PSAnMCcgPyBzaWduICsgcGFkICsgYXJnIDogcGFkICsgc2lnbiArIGFyZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxuICAgIH1cblxuICAgIHNwcmludGYuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgICBzcHJpbnRmLnBhcnNlID0gZnVuY3Rpb24oZm10KSB7XG4gICAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCA9IFtdLCBwYXJzZV90cmVlID0gW10sIGFyZ19uYW1lcyA9IDBcbiAgICAgICAgd2hpbGUgKF9mbXQpIHtcbiAgICAgICAgICAgIGlmICgobWF0Y2ggPSByZS50ZXh0LmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZVtwYXJzZV90cmVlLmxlbmd0aF0gPSBtYXRjaFswXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gcmUubW9kdWxvLmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZVtwYXJzZV90cmVlLmxlbmd0aF0gPSAnJSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLnBsYWNlaG9sZGVyLmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ19uYW1lcyB8PSAxXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZF9saXN0ID0gW10sIHJlcGxhY2VtZW50X2ZpZWxkID0gbWF0Y2hbMl0sIGZpZWxkX21hdGNoID0gW11cbiAgICAgICAgICAgICAgICAgICAgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmtleS5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpc3RbZmllbGRfbGlzdC5sZW5ndGhdID0gZmllbGRfbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocmVwbGFjZW1lbnRfZmllbGQgPSByZXBsYWNlbWVudF9maWVsZC5zdWJzdHJpbmcoZmllbGRfbWF0Y2hbMF0ubGVuZ3RoKSkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmtleV9hY2Nlc3MuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpc3RbZmllbGRfbGlzdC5sZW5ndGhdID0gZmllbGRfbWF0Y2hbMV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZpZWxkX21hdGNoID0gcmUuaW5kZXhfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0W2ZpZWxkX2xpc3QubGVuZ3RoXSA9IGZpZWxkX21hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIltzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5XCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIltzcHJpbnRmXSBtaXhpbmcgcG9zaXRpb25hbCBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWRcIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZVtwYXJzZV90cmVlLmxlbmd0aF0gPSBtYXRjaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXJcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9mbXQgPSBfZm10LnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlX3RyZWVcbiAgICB9XG5cbiAgICB2YXIgdnNwcmludGYgPSBmdW5jdGlvbihmbXQsIGFyZ3YsIF9hcmd2KSB7XG4gICAgICAgIF9hcmd2ID0gKGFyZ3YgfHwgW10pLnNsaWNlKDApXG4gICAgICAgIF9hcmd2LnNwbGljZSgwLCAwLCBmbXQpXG4gICAgICAgIHJldHVybiBzcHJpbnRmLmFwcGx5KG51bGwsIF9hcmd2KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGhlbHBlcnNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRfdHlwZSh2YXJpYWJsZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhcmlhYmxlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuICdudW1iZXInXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhcmlhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhcmlhYmxlKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZWZvcm1hdHRlZFBhZGRpbmcgPSB7XG4gICAgICAgICcwJzogWycnLCAnMCcsICcwMCcsICcwMDAnLCAnMDAwMCcsICcwMDAwMCcsICcwMDAwMDAnLCAnMDAwMDAwMCddLFxuICAgICAgICAnICc6IFsnJywgJyAnLCAnICAnLCAnICAgJywgJyAgICAnLCAnICAgICAnLCAnICAgICAgJywgJyAgICAgICAnXSxcbiAgICAgICAgJ18nOiBbJycsICdfJywgJ19fJywgJ19fXycsICdfX19fJywgJ19fX19fJywgJ19fX19fXycsICdfX19fX19fJ10sXG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cl9yZXBlYXQoaW5wdXQsIG11bHRpcGxpZXIpIHtcbiAgICAgICAgaWYgKG11bHRpcGxpZXIgPj0gMCAmJiBtdWx0aXBsaWVyIDw9IDcgJiYgcHJlZm9ybWF0dGVkUGFkZGluZ1tpbnB1dF0pIHtcbiAgICAgICAgICAgIHJldHVybiBwcmVmb3JtYXR0ZWRQYWRkaW5nW2lucHV0XVttdWx0aXBsaWVyXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBcnJheShtdWx0aXBsaWVyICsgMSkuam9pbihpbnB1dClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBleHBvcnQgdG8gZWl0aGVyIGJyb3dzZXIgb3Igbm9kZS5qc1xuICAgICAqL1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZXhwb3J0cy5zcHJpbnRmID0gc3ByaW50ZlxuICAgICAgICBleHBvcnRzLnZzcHJpbnRmID0gdnNwcmludGZcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdpbmRvdy5zcHJpbnRmID0gc3ByaW50ZlxuICAgICAgICB3aW5kb3cudnNwcmludGYgPSB2c3ByaW50ZlxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzcHJpbnRmOiBzcHJpbnRmLFxuICAgICAgICAgICAgICAgICAgICB2c3ByaW50ZjogdnNwcmludGZcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufSkodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzIDogd2luZG93KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zcHJpbnRmLWpzL3NyYy9zcHJpbnRmLmpzXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCBzaGEzIGZyb20gJ2pzLXNoYTMnO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBjbGFzcyBLZXlwYWlyIEVkMjU1MTkga2V5cGFpciBpbiBiYXNlNTggKGFzIEJpZ2NoYWluREIgZXhwZWN0cyBiYXNlNTgga2V5cylcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcGFyYW0ge251bWJlcn0gW3NlY3JldF0gQSBzZWVkIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEga2V5IGRlcml2YXRpb24gZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwdWJsaWNLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcml2YXRlS2V5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEVkMjU1MTlLZXlwYWlyKHNlY3JldCkge1xuICAgIGxldCBrZXlQYWlyO1xuICAgIGlmIChzZWNyZXQpIHtcbiAgICAgICAgLy8gUXVpY2sgYW5kIGRpcnR5OiB1c2Uga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaW5zdGVhZFxuICAgICAgICBjb25zdCBzZWNyZXRIYXNoID0gc2hhMy5zaGEzXzI1NlxuICAgICAgICAgICAgLmNyZWF0ZSgpXG4gICAgICAgICAgICAudXBkYXRlKHNlY3JldClcbiAgICAgICAgICAgIC5hcnJheSgpO1xuICAgICAgICBrZXlQYWlyID0gbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQobmV3IFVpbnQ4QXJyYXkoc2VjcmV0SGFzaCkpXG4gICAgfSBlbHNlIHtcbiAgICAgICAga2V5UGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyKCk7XG4gICAgfVxuICAgIHRoaXMucHVibGljS2V5ID0gYmFzZTU4LmVuY29kZShrZXlQYWlyLnB1YmxpY0tleSk7XG4gICAgLy8gdHdlZXRuYWNsJ3MgZ2VuZXJhdGVkIHNlY3JldCBrZXkgaXMgdGhlIHNlY3JldCBrZXkgKyBwdWJsaWMga2V5IChyZXN1bHRpbmcgaW4gYSA2NC1ieXRlIGJ1ZmZlcilcbiAgICB0aGlzLnByaXZhdGVLZXkgPSBiYXNlNTguZW5jb2RlKGtleVBhaXIuc2VjcmV0S2V5LnNsaWNlKDAsIDMyKSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvRWQyNTUxOUtleXBhaXIuanMiLCJpbXBvcnQgeyBQcm9taXNlIH0gZnJvbSAnZXM2LXByb21pc2UnO1xuaW1wb3J0IGZldGNoUG9ueWZpbGwgZnJvbSAnZmV0Y2gtcG9ueWZpbGwnO1xuaW1wb3J0IHsgdnNwcmludGYgfSBmcm9tICdzcHJpbnRmLWpzJztcblxuaW1wb3J0IGZvcm1hdFRleHQgZnJvbSAnLi9mb3JtYXRfdGV4dCc7XG5cbmltcG9ydCBzdHJpbmdpZnlBc1F1ZXJ5UGFyYW0gZnJvbSAnLi9zdHJpbmdpZnlfYXNfcXVlcnlfcGFyYW0nO1xuXG5cbmNvbnN0IGZldGNoID0gZmV0Y2hQb255ZmlsbChQcm9taXNlKTtcblxuXG4vKipcbiAqIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2JpZ2NoYWluZGIvanMtdXRpbGl0eS1iZWx0L1xuICpcbiAqIEdsb2JhbCBmZXRjaCB3cmFwcGVyIHRoYXQgYWRkcyBzb21lIGJhc2ljIGVycm9yIGhhbmRsaW5nIGFuZCBlYXNlIG9mIHVzZSBlbmhhbmNlbWVudHMuXG4gKiBDb25zaWRlcnMgYW55IG5vbi0yeHggcmVzcG9uc2UgYXMgYW4gZXJyb3IuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZmV0Y2gsIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2xvYmFsRmV0Y2gvZmV0Y2guXG4gKlxuICogRXhwZWN0cyBmZXRjaCB0byBhbHJlYWR5IGJlIGF2YWlsYWJsZSAoZWl0aGVyIGluIGEgRVM2IGVudmlyb25tZW50LCBidW5kbGVkIHRocm91Z2ggd2VicGFjaywgb3JcbiAqIGluamVjdGVkIHRocm91Z2ggYSBwb2x5ZmlsbCkuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgdXJsICAgIFVybCB0byByZXF1ZXN0LiBDYW4gYmUgc3BlY2lmaWVkIGFzIGEgc3ByaW50ZiBmb3JtYXQgc3RyaW5nIChzZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYWxleGVpL3NwcmludGYuanMpIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB1c2luZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIGBjb25maWcudXJsVGVtcGxhdGVTcGVjYC5cbiAqIEBwYXJhbSAge29iamVjdH0gIGNvbmZpZyBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24sIG1vc3RseSBwYXNzZWQgdG8gZmV0Y2ggYXMgaXRzICdpbml0JyBjb25maWdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HbG9iYWxGZXRjaC9mZXRjaCNQYXJhbWV0ZXJzKS5cbiAqIEBwYXJhbSAgeyp9ICAgICAgICAgICAgIGNvbmZpZy5qc29uQm9keSAgICAgICAgSnNvbiBwYXlsb2FkIHRvIHRoZSByZXF1ZXN0LiBXaWxsIGF1dG9tYXRpY2FsbHkgYmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoKS1lZCBhbmQgb3ZlcnJpZGUgYGNvbmZpZy5ib2R5YC5cbiAqIEBwYXJhbSAge3N0cmluZ3xvYmplY3R9IGNvbmZpZy5xdWVyeSAgICAgICAgICAgUXVlcnkgcGFyYW1ldGVyIHRvIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSB1cmwuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNwZWNpZmllZCBhcyBhbiBvYmplY3QsIGtleXMgd2lsbCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNhbWVsaXplZCBpbnRvIHNuYWtlIGNhc2UgZmlyc3QuXG4gKiBAcGFyYW0gIHsqW118b2JqZWN0fSAgICBjb25maWcudXJsVGVtcGxhdGVTcGVjIEZvcm1hdCBzcGVjIHRvIHVzZSB0byBleHBhbmQgdGhlIHVybCAoc2VlIHNwcmludGYpLlxuICogQHBhcmFtICB7Kn0gICAgICAgICAgICAgY29uZmlnLiogICAgICAgICAgICAgICBBbGwgb3RoZXIgb3B0aW9ucyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gZmV0Y2guXG4gKlxuICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgIFByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgd2l0aCB0aGUgcmVzcG9uc2UgaWYgaXRzIHN0YXR1cyB3YXMgMnh4O1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSByZWplY3RzIHdpdGggdGhlIHJlc3BvbnNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJhc2VSZXF1ZXN0KHVybCwgeyBqc29uQm9keSwgcXVlcnksIHVybFRlbXBsYXRlU3BlYywgLi4uZmV0Y2hDb25maWcgfSA9IHt9KSB7XG4gICAgbGV0IGV4cGFuZGVkVXJsID0gdXJsO1xuXG4gICAgaWYgKHVybFRlbXBsYXRlU3BlYyAhPSBudWxsKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybFRlbXBsYXRlU3BlYykgJiYgdXJsVGVtcGxhdGVTcGVjLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gVXNlIHZzcHJpbnRmIGZvciB0aGUgYXJyYXkgY2FsbCBzaWduYXR1cmVcbiAgICAgICAgICAgIGV4cGFuZGVkVXJsID0gdnNwcmludGYodXJsLCB1cmxUZW1wbGF0ZVNwZWMpO1xuICAgICAgICB9IGVsc2UgaWYgKHVybFRlbXBsYXRlU3BlYyAmJlxuICAgICAgICAgICAgICAgICAgIHR5cGVvZiB1cmxUZW1wbGF0ZVNwZWMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModXJsVGVtcGxhdGVTcGVjKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV4cGFuZGVkVXJsID0gZm9ybWF0VGV4dCh1cmwsIHVybFRlbXBsYXRlU3BlYyk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignU3VwcGxpZWQgdXJsVGVtcGxhdGVTcGVjIHdhcyBub3QgYW4gYXJyYXkgb3Igb2JqZWN0LiBJZ25vcmluZy4uLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGV4cGFuZGVkVXJsICs9IHF1ZXJ5O1xuICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5ICYmIHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGV4cGFuZGVkVXJsICs9IHN0cmluZ2lmeUFzUXVlcnlQYXJhbShxdWVyeSk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignU3VwcGxpZWQgcXVlcnkgd2FzIG5vdCBhIHN0cmluZyBvciBvYmplY3QuIElnbm9yaW5nLi4uJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoanNvbkJvZHkgIT0gbnVsbCkge1xuICAgICAgICBmZXRjaENvbmZpZy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoanNvbkJvZHkpO1xuICAgIH1cblxuICAgIHJldHVybiBmZXRjaC5mZXRjaChleHBhbmRlZFVybCwgZmV0Y2hDb25maWcpXG4gICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIC8vIElmIHN0YXR1cyBpcyBub3QgYSAyeHggKGJhc2VkIG9uIFJlc3BvbnNlLm9rKSwgYXNzdW1lIGl0J3MgYW4gZXJyb3JcbiAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2xvYmFsRmV0Y2gvZmV0Y2hcbiAgICAgICAgICAgIGlmICghKHJlcyAmJiByZXMub2spKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Jhc2VSZXF1ZXN0LmpzIiwiaW1wb3J0IGdldEFwaVVybHMgZnJvbSAnLi9nZXRBcGlVcmxzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSBibG9ja0lkXG4gKiBAcGFyYW0gQVBJX1BBVEhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QmxvY2soYmxvY2tJZCwgQVBJX1BBVEgpIHtcbiAgICByZXR1cm4gcmVxdWVzdChnZXRBcGlVcmxzKEFQSV9QQVRIKVsnYmxvY2tzX2RldGFpbCddLCB7XG4gICAgICAgICAgICB1cmxUZW1wbGF0ZVNwZWM6IHtcbiAgICAgICAgICAgICAgICBibG9ja0lkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xufVxuXG5cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb25uZWN0aW9uL2dldEJsb2NrLmpzIiwiaW1wb3J0IGdldEFwaVVybHMgZnJvbSAnLi9nZXRBcGlVcmxzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSB0eF9pZFxuICogQHBhcmFtIHN0YXR1c1xuICogQHBhcmFtIEFQSV9QQVRIXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RCbG9ja3Moe3R4X2lkLCBzdGF0dXN9LCBBUElfUEFUSCkge1xuICAgIHJldHVybiByZXF1ZXN0KGdldEFwaVVybHMoQVBJX1BBVEgpWydibG9ja3MnXSwge1xuICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICB0eF9pZCxcbiAgICAgICAgICAgICAgICBzdGF0dXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29ubmVjdGlvbi9saXN0QmxvY2tzLmpzIiwiaW1wb3J0IGdldEFwaVVybHMgZnJvbSAnLi9nZXRBcGlVcmxzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSBwdWJsaWNfa2V5XG4gKiBAcGFyYW0gdW5zcGVudFxuICogQHBhcmFtIEFQSV9QQVRIXG4gKiBAcGFyYW0gb25seUpzb25SZXNwb25zZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0T3V0cHV0cyh7IHB1YmxpY19rZXksIHVuc3BlbnQgfSwgQVBJX1BBVEgsIG9ubHlKc29uUmVzcG9uc2U9dHJ1ZSkge1xuICAgIHJldHVybiByZXF1ZXN0KGdldEFwaVVybHMoQVBJX1BBVEgpWydvdXRwdXRzJ10sIHtcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIHB1YmxpY19rZXksXG4gICAgICAgICAgICB1bnNwZW50XG4gICAgICAgIH1cbiAgICB9LCBvbmx5SnNvblJlc3BvbnNlKVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb25uZWN0aW9uL2xpc3RPdXRwdXRzLmpzIiwiaW1wb3J0IGdldEFwaVVybHMgZnJvbSAnLi9nZXRBcGlVcmxzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSBhc3NldF9pZFxuICogQHBhcmFtIG9wZXJhdGlvblxuICogQHBhcmFtIEFQSV9QQVRIXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RUcmFuc2FjdGlvbnMoeyBhc3NldF9pZCwgb3BlcmF0aW9uIH0sIEFQSV9QQVRIKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QoZ2V0QXBpVXJscyhBUElfUEFUSClbJ3RyYW5zYWN0aW9ucyddLCB7XG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICBhc3NldF9pZCxcbiAgICAgICAgICAgIG9wZXJhdGlvblxuICAgICAgICB9XG4gICAgfSlcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29ubmVjdGlvbi9saXN0VHJhbnNhY3Rpb25zLmpzIiwiaW1wb3J0IGdldEFwaVVybHMgZnJvbSAnLi9nZXRBcGlVcmxzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSBibG9ja19pZFxuICogQHBhcmFtIEFQSV9QQVRIXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RWb3RlcyhibG9ja19pZCwgQVBJX1BBVEgpIHtcbiAgICByZXR1cm4gcmVxdWVzdChnZXRBcGlVcmxzKEFQSV9QQVRIKVsndm90ZXMnXSwge1xuICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICBibG9ja19pZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbn1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Nvbm5lY3Rpb24vbGlzdFZvdGVzLmpzIiwiaW1wb3J0IGdldFRyYW5zYWN0aW9uIGZyb20gJy4vZ2V0VHJhbnNhY3Rpb24nO1xuaW1wb3J0IGdldFN0YXR1cyBmcm9tICcuL2dldFN0YXR1cyc7XG5cbi8qKlxuICogQHB1YmxpY1xuICogQHBhcmFtIHR4X2lkXG4gKiBAcGFyYW0gQVBJX1BBVEhcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICh0eF9pZCwgQVBJX1BBVEgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGdldFN0YXR1cyh0eF9pZCwgQVBJX1BBVEgpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmV0Y2hlZCB0cmFuc2FjdGlvbiBzdGF0dXM6JywgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09ICd2YWxpZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNhY3Rpb24odHhfaWQsIEFQSV9QQVRIKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZldGNoZWQgdHJhbnNhY3Rpb246JywgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDUwMClcbiAgICB9KVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Nvbm5lY3Rpb24vcG9sbFN0YXR1c0FuZEZldGNoVHJhbnNhY3Rpb24uanMiLCJpbXBvcnQgZ2V0QXBpVXJscyBmcm9tICcuL2dldEFwaVVybHMnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5cbi8qKlxuICogQHB1YmxpY1xuICpcbiAqIEBwYXJhbSB0cmFuc2FjdGlvblxuICogQHBhcmFtIEFQSV9QQVRIXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBvc3RUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgQVBJX1BBVEgpIHtcbiAgICByZXR1cm4gcmVxdWVzdChnZXRBcGlVcmxzKEFQSV9QQVRIKVsndHJhbnNhY3Rpb25zJ10sIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGpzb25Cb2R5OiB0cmFuc2FjdGlvblxuICAgIH0pXG59XG5cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb25uZWN0aW9uL3Bvc3RUcmFuc2FjdGlvbi5qcyIsImltcG9ydCB7IHNwcmludGYgfSBmcm9tICdzcHJpbnRmLWpzJztcblxuXG4vLyBSZWdleGVzIHRha2VuIGZyb20gb3IgaW5zcGlyZWQgYnkgc3ByaW50Zi1qc1xuY29uc3QgUmVnZXggPSB7XG4gICAgVEVNUExBVEVfTElURVJBTDogL1xcJHsoW15cXCldKz8pfS9nLFxuICAgIEtFWTogL14oW2Etel9dW2Etel9cXGRdKikvaSxcbiAgICBLRVlfQUNDRVNTOiAvXlxcLihbYS16X11bYS16X1xcZF0qKS9pLFxuICAgIElOREVYX0FDQ0VTUzogL15cXFsoXFxkKylcXF0vXG59O1xuXG4vKipcbiAqIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2JpZ2NoYWluZGIvanMtdXRpbGl0eS1iZWx0L1xuICpcbiAqIEZvcm1hdHMgc3RyaW5ncyBzaW1pbGFybHkgdG8gQydzIHNwcmludGYsIHdpdGggdGhlIGFkZGl0aW9uIG9mICckey4uLn0nIGZvcm1hdHMuXG4gKlxuICogTWFrZXMgYSBmaXJzdCBwYXNzIHJlcGxhY2luZyAnJHsuLi59JyBmb3JtYXRzIGJlZm9yZSBwYXNzaW5nIHRoZSBleHBhbmRlZCBzdHJpbmcgYW5kIG90aGVyXG4gKiBhcmd1bWVudHMgdG8gc3ByaW50Zi1qcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gd2hhdCBzcHJpbnRmIGNhbiBkbywgc2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYWxleGVpL3NwcmludGYuanMuXG4gKlxuICogRXhhbXBsZXM6XG4gKiAgIGZvcm1hdFRleHQoJ0hpIHRoZXJlICR7ZGltaX0hJywgeyBkaW1pOiAnRGltaScgfSlcbiAqICAgICAgID0+ICdIaSB0aGVyZSBEaW1pISdcbiAqXG4gKiAgIGZvcm1hdFRleHQoJyR7ZGF0YWJhc2V9IGlzICUoc3RhdHVzKXMnLCB7IGRhdGFiYXNlOiAnQmlnY2hhaW5EQicsIHN0YXR1czogJ2JpZycgfSlcbiAqICAgICAgID0+ICdCaWdjaGFpbkRCIGlzIGJpZydcbiAqXG4gKiBMaWtlIHNwcmludGYtanMsIHN0cmluZyBpbnRlcnBvbGF0aW9uIGZvciBrZXl3b3JkcyBhbmQgaW5kZXhlcyBpcyBzdXBwb3J0ZWQgdG9vOlxuICogICBmb3JtYXRUZXh0KCdCZXJsaW4gaXMgYmVzdCBrbm93biBmb3IgaXRzICR7YmVybGluLnRvcEtub3duRm9yWzBdLm5hbWV9Jywge1xuICogICAgICAgYmVybGluOiB7XG4gKiAgICAgICAgICAgdG9wS25vd25Gb3I6IFt7XG4gKiAgICAgICAgICAgICAgIG5hbWU6ICdDdXJyeXd1cnN0J1xuICogICAgICAgICAgIH0sIC4uLlxuICogICAgICAgICAgIF1cbiAqICAgICAgIH1cbiAqICAgfSlcbiAqICAgICAgID0+ICdCZXJsaW4gaXMgYmVzdCBrbm93biBmb3IgaXRzIEN1cnJ5d3Vyc3QnXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFRleHQocywgLi4uYXJndikge1xuICAgIGxldCBleHBhbmRlZEZvcm1hdFN0ciA9IHM7XG5cbiAgICAvLyBUcnkgdG8gcmVwbGFjZSBmb3JtYXRzIG9mIHRoZSBmb3JtICckey4uLn0nIGlmIG5hbWVkIHJlcGxhY2VtZW50IGZpZWxkcyBhcmUgdXNlZFxuICAgIGlmIChzICYmIGFyZ3YubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmd2WzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVNwZWNPYmogPSBhcmd2WzBdO1xuXG4gICAgICAgIGV4cGFuZGVkRm9ybWF0U3RyID0gcy5yZXBsYWNlKFJlZ2V4LlRFTVBMQVRFX0xJVEVSQUwsIChtYXRjaCwgcmVwbGFjZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGxldCBpbnRlcnBvbGF0aW9uTGVmdCA9IHJlcGxhY2VtZW50O1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEludGVycG9sYXRpb24gYWxnb3JpdGhtIGluc3BpcmVkIGJ5IHNwcmludGYtanMuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogR29lcyB0aHJvdWdoIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgZ2V0dGluZyB0aGUgbGVmdC1tb3N0IGtleSBvciBpbmRleCB0byBpbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICogb24gZWFjaCBwYXNzLiBgdmFsdWVgIGF0IGVhY2ggc3RlcCBob2xkcyB0aGUgbGFzdCBpbnRlcnBvbGF0aW9uIHJlc3VsdCwgYGN1ck1hdGNoYCBpc1xuICAgICAgICAgICAgICogdGhlIGN1cnJlbnQgcHJvcGVydHkgbWF0Y2gsIGFuZCBgaW50ZXJwb2xhdGlvbkxlZnRgIGlzIHRoZSBwb3J0aW9uIG9mIHRoZSByZXBsYWNlbWVudFxuICAgICAgICAgICAgICogc3RyaW5nIHN0aWxsIHRvIGJlIGludGVycG9sYXRlZC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBJdCdzIHVzZWZ1bCB0byBub3RlIHRoYXQgUmVnRXhwLmV4ZWMoKSByZXR1cm5zIHdpdGggYW4gYXJyYXkgaG9sZGluZzpcbiAgICAgICAgICAgICAqICAgWzBdOiAgRnVsbCBzdHJpbmcgbWF0Y2hlZFxuICAgICAgICAgICAgICogICBbMStdOiBNYXRjaGluZyBncm91cHNcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBBbmQgdGhhdCBpbiB0aGUgcmVnZXhlcyBkZWZpbmVkLCB0aGUgZmlyc3QgbWF0Y2hpbmcgZ3JvdXAgYWx3YXlzIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgICAgICAgICAgICogcHJvcGVydHkgbWF0Y2hlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgbGV0IGN1ck1hdGNoID0gUmVnZXguS0VZLmV4ZWMoaW50ZXJwb2xhdGlvbkxlZnQpO1xuICAgICAgICAgICAgaWYgKGN1ck1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wbGF0ZVNwZWNPYmpbY3VyTWF0Y2hbMV1dO1xuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduaW5nIGluIHRoZSBjb25kaXRpb25hbHMgaGVyZSBtYWtlcyB0aGUgY29kZSBsZXNzIGJsb2F0ZWRcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuICAgICAgICAgICAgICAgIHdoaWxlICgoaW50ZXJwb2xhdGlvbkxlZnQgPSBpbnRlcnBvbGF0aW9uTGVmdC5zdWJzdHJpbmcoY3VyTWF0Y2hbMF0ubGVuZ3RoKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGN1ck1hdGNoID0gUmVnZXguS0VZX0FDQ0VTUy5leGVjKGludGVycG9sYXRpb25MZWZ0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbY3VyTWF0Y2hbMV1dO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjdXJNYXRjaCA9IFJlZ2V4LklOREVYX0FDQ0VTUy5leGVjKGludGVycG9sYXRpb25MZWZ0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbY3VyTWF0Y2hbMV1dO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFueXRoaW5nIGxlZnQgdG8gaW50ZXJwb2xhdGUgYnkgdGhlIGVuZCB0aGVuIHdlJ3ZlIGZhaWxlZCB0byBpbnRlcnBvbGF0ZVxuICAgICAgICAgICAgLy8gdGhlIGVudGlyZSByZXBsYWNlbWVudCBzdHJpbmcuXG4gICAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbkxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgW2Zvcm1hdFRleHRdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXk6ICR7cmVwbGFjZW1lbnR9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwcmludGYoZXhwYW5kZWRGb3JtYXRTdHIsIC4uLmFyZ3YpO1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mb3JtYXRfdGV4dC5qcyIsImltcG9ydCBjb3JlSW5jbHVkZXMgZnJvbSAnY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2luY2x1ZGVzJztcbmltcG9ydCBjb3JlT2JqZWN0RW50cmllcyBmcm9tICdjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2VudHJpZXMnO1xuXG5cbi8qKlxuICogQWJzdHJhY3Rpb24gZm9yIHNlbGVjdEZyb21PYmplY3QgYW5kIG9taXRGcm9tT2JqZWN0IGZvciBEUlluZXNzLlxuICogU2V0IGlzSW5jbHVzaW9uIHRvIHRydWUgaWYgdGhlIGZpbHRlciBzaG91bGQgYmUgZm9yIGluY2x1ZGluZyB0aGUgZmlsdGVyZWQgaXRlbXMgKGllLiBzZWxlY3RpbmdcbiAqIG9ubHkgdGhlbSB2cyBvbWl0dGluZyBvbmx5IHRoZW0pLlxuICovXG5mdW5jdGlvbiBmaWx0ZXJGcm9tT2JqZWN0KG9iaiwgZmlsdGVyLCB7IGlzSW5jbHVzaW9uID0gdHJ1ZSB9ID0ge30pIHtcbiAgICBpZiAoZmlsdGVyICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICByZXR1cm4gYXBwbHlGaWx0ZXJPbk9iamVjdChvYmosIGlzSW5jbHVzaW9uID8gKChfLCBrZXkpID0+IGNvcmVJbmNsdWRlcyhmaWx0ZXIsIGtleSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKF8sIGtleSkgPT4gIWNvcmVJbmNsdWRlcyhmaWx0ZXIsIGtleSkpKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlciAmJiB0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZsaXAgdGhlIGZpbHRlciBmbidzIHJldHVybiBpZiBpdCdzIGZvciBpbmNsdXNpb25cbiAgICAgICAgcmV0dXJuIGFwcGx5RmlsdGVyT25PYmplY3Qob2JqLCBpc0luY2x1c2lvbiA/IGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKC4uLmFyZ3MpID0+ICFmaWx0ZXIoLi4uYXJncykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdpdmVuIGZpbHRlciBpcyBub3QgYW4gYXJyYXkgb3IgZnVuY3Rpb24uIEV4Y2x1ZGUgYWJvcnRlZCcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZmlsdGVyZWQgY29weSBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3Mgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyAobm8gaW5oZXJpdGVkXG4gKiBwcm9wZXJ0aWVzKSwga2VlcGluZyBhbnkga2V5cyB0aGF0IHBhc3MgdGhlIGdpdmVuIGZpbHRlciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXBwbHlGaWx0ZXJPbk9iamVjdChvYmosIGZpbHRlckZuKSB7XG4gICAgaWYgKGZpbHRlckZuID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iaik7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWRPYmogPSB7fTtcbiAgICBjb3JlT2JqZWN0RW50cmllcyhvYmopLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGZpbHRlckZuKHZhbCwga2V5KSkge1xuICAgICAgICAgICAgZmlsdGVyZWRPYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkT2JqO1xufVxuXG4vKipcbiAqIFNpbWlsYXIgdG8gbG9kYXNoJ3MgXy5waWNrKCksIHRoaXMgcmV0dXJucyBhIGNvcHkgb2YgdGhlIGdpdmVuIG9iamVjdCdzXG4gKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMsIHNlbGVjdGluZyBvbmx5IHRoZSBrZXlzIGluXG4gKiB0aGUgZ2l2ZW4gYXJyYXkgb3Igd2hvc2UgdmFsdWUgcGFzcyB0aGUgZ2l2ZW4gZmlsdGVyIGZ1bmN0aW9uLlxuICogQHBhcmFtICB7b2JqZWN0fSAgICAgICAgIG9iaiAgICBTb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0gIHthcnJheXxmdW5jdGlvbn0gZmlsdGVyIEFycmF5IG9mIGtleSBuYW1lcyB0byBzZWxlY3Qgb3IgZnVuY3Rpb24gdG8gaW52b2tlIHBlciBpdGVyYXRpb25cbiAqIEByZXR1cm4ge29iamVjdH0gICAgICAgICAgICAgICAgVGhlIG5ldyBvYmplY3RcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RnJvbU9iamVjdChvYmosIGZpbHRlcikge1xuICAgIHJldHVybiBmaWx0ZXJGcm9tT2JqZWN0KG9iaiwgZmlsdGVyKTtcbn1cblxuLyoqXG4gKiBHbG9yaWZpZWQgc2VsZWN0RnJvbU9iamVjdC4gVGFrZXMgYW4gb2JqZWN0IGFuZCByZXR1cm5zIGEgZmlsdGVyZWQgc2hhbGxvdyBjb3B5IHRoYXQgc3RyaXBzIG91dFxuICogYW55IHByb3BlcnRpZXMgdGhhdCBhcmUgZmFsc3kgKGluY2x1ZGluZyBjb2VyY2lvbnMsIGllLiB1bmRlZmluZWQsIG51bGwsICcnLCAwLCAuLi4pLlxuICogRG9lcyBub3QgbW9kaWZ5IHRoZSBwYXNzZWQgaW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gb2JqICAgICAgSmF2YXNjcmlwdCBvYmplY3RcbiAqIEByZXR1cm4ge29iamVjdH0gICAgICAgICAgU2FuaXRpemVkIEphdmFzY3JpcHQgb2JqZWN0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNhbml0aXplKG9iaikge1xuICAgIHJldHVybiBzZWxlY3RGcm9tT2JqZWN0KG9iaiwgKHZhbCkgPT4gISF2YWwpO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3Nhbml0aXplLmpzIiwiaW1wb3J0IHNoYTMgZnJvbSAnanMtc2hhMyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoYTI1Nkhhc2goZGF0YSkge1xuICAgIHJldHVybiBzaGEzLnNoYTNfMjU2XG4gICAgICAgIC5jcmVhdGUoKVxuICAgICAgICAudXBkYXRlKGRhdGEpXG4gICAgICAgIC5oZXgoKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zaGEyNTZIYXNoLmpzIiwiaW1wb3J0IGNvcmVPYmplY3RFbnRyaWVzIGZyb20gJ2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZW50cmllcyc7XG5pbXBvcnQgZGVjYW1lbGl6ZSBmcm9tICdkZWNhbWVsaXplJztcbmltcG9ydCBxdWVyeVN0cmluZyBmcm9tICdxdWVyeS1zdHJpbmcnO1xuXG5cbi8qKlxuICogaW1wb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYmlnY2hhaW5kYi9qcy11dGlsaXR5LWJlbHQvXG4gKlxuICogVGFrZXMgYSBrZXktdmFsdWUgZGljdGlvbmFyeSAoaWUuIG9iamVjdCkgYW5kIGNvbnZlcnRzIGl0IHRvIGEgcXVlcnktcGFyYW1ldGVyIHN0cmluZyB0aGF0IHlvdVxuICogY2FuIGRpcmVjdGx5IGFwcGVuZCBpbnRvIGEgVVJMLlxuICpcbiAqIEV4dGVuZHMgcXVlcnlTdHJpbmcuc3RyaW5naWZ5IGJ5IGFsbG93aW5nIHlvdSB0byBzcGVjaWZ5IGEgYHRyYW5zZm9ybWAgZnVuY3Rpb24gdGhhdCB3aWxsIGJlXG4gKiBpbnZva2VkIG9uIGVhY2ggb2YgdGhlIGRpY3Rpb25hcnkncyBrZXlzIGJlZm9yZSBiZWluZyBzdHJpbmdpZmllZCBpbnRvIHRoZSBxdWVyeS1wYXJhbWV0ZXJcbiAqIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0IGB0cmFuc2Zvcm1gIGlzIGBkZWNhbWVsaXplYCwgc28gYSBkaWN0aW9uYXJ5IG9mIHRoZSBmb3JtOlxuICpcbiAqICAge1xuICogICAgICBwYWdlOiAxLFxuICogICAgICBwYWdlU2l6ZTogMTBcbiAqICAgfVxuICpcbiAqIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RyaW5nIGxpa2U6XG4gKlxuICogICA/cGFnZT0xJnBhZ2Vfc2l6ZT0xMFxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmogICAgICAgICAgICAgICAgICAgIFF1ZXJ5IHBhcmFtcyBkaWN0aW9uYXJ5XG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gW3RyYW5zZm9ybT1kZWNhbWVsaXplXSBUcmFuc2Zvcm0gZnVuY3Rpb24gZm9yIGVhY2ggb2YgdGhlIHBhcmFtIGtleXNcbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5IHBhcmFtIHN0cmluZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHJpbmdpZnlBc1F1ZXJ5UGFyYW0ob2JqLCB0cmFuc2Zvcm0gPSBkZWNhbWVsaXplKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKG9iaikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZEtleXNPYmogPSBjb3JlT2JqZWN0RW50cmllcyhvYmopLnJlZHVjZSgocGFyYW1zT2JqLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcGFyYW1zT2JqW3RyYW5zZm9ybShrZXkpXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gcGFyYW1zT2JqO1xuICAgIH0sIHt9KTtcblxuICAgIHJldHVybiBgPyR7cXVlcnlTdHJpbmcuc3RyaW5naWZ5KHRyYW5zZm9ybWVkS2V5c09iail9YDtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3RyaW5naWZ5X2FzX3F1ZXJ5X3BhcmFtLmpzIiwiaW1wb3J0IHNlcmlhbGl6ZVRyYW5zYWN0aW9uSW50b0Nhbm9uaWNhbFN0cmluZyBmcm9tICcuL3NlcmlhbGl6ZVRyYW5zYWN0aW9uSW50b0Nhbm9uaWNhbFN0cmluZyc7XG5pbXBvcnQgc2hhMjU2SGFzaCBmcm9tICcuLi9zaGEyNTZIYXNoJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFzaFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgLy8gU2FmZWx5IHJlbW92ZSBhbnkgdHggaWQgZnJvbSB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gZm9yIGhhc2hpbmdcbiAgICBjb25zdCB0eCA9IHsgLi4udHJhbnNhY3Rpb24gfTtcbiAgICBkZWxldGUgdHguaWQ7XG5cbiAgICByZXR1cm4gc2hhMjU2SGFzaChzZXJpYWxpemVUcmFuc2FjdGlvbkludG9DYW5vbmljYWxTdHJpbmcodHgpKTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHJhbnNhY3Rpb24vaGFzaFRyYW5zYWN0aW9uLmpzIiwiaW1wb3J0IG1ha2VJbnB1dFRlbXBsYXRlIGZyb20gJy4vbWFrZUlucHV0VGVtcGxhdGUnO1xuaW1wb3J0IG1ha2VUcmFuc2FjdGlvbiBmcm9tICcuL21ha2VUcmFuc2FjdGlvbic7XG5cblxuLyoqXG4gKiBAcHVibGljXG4gKiBHZW5lcmF0ZSBhIGBDUkVBVEVgIHRyYW5zYWN0aW9uIGhvbGRpbmcgdGhlIGBhc3NldGAsIGBtZXRhZGF0YWAsIGFuZCBgb3V0cHV0c2AsIHRvIGJlIHNpZ25lZCBieVxuICogdGhlIGBpc3N1ZXJzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhc3NldCBDcmVhdGVkIGFzc2V0J3MgZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhIE1ldGFkYXRhIGZvciB0aGUgVHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0W119IG91dHB1dHMgQXJyYXkgb2YgT3V0cHV0IG9iamVjdHMgdG8gYWRkIHRvIHRoZSBUcmFuc2FjdGlvbi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpbmsgb2YgdGhlc2UgYXMgdGhlIHJlY2lwaWVudHMgb2YgdGhlIGFzc2V0IGFmdGVyIHRoZSB0cmFuc2FjdGlvbi5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGBDUkVBVEVgIFRyYW5zYWN0aW9ucywgdGhpcyBzaG91bGQgdXN1YWxseSBqdXN0IGJlIGEgbGlzdCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRzIHdyYXBwaW5nIEVkMjU1MTkgQ29uZGl0aW9ucyBnZW5lcmF0ZWQgZnJvbSB0aGUgaXNzdWVycycgcHVibGljXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgKHNvIHRoYXQgdGhlIGlzc3VlcnMgYXJlIHRoZSByZWNpcGllbnRzIG9mIHRoZSBjcmVhdGVkIGFzc2V0KS5cbiAqIEBwYXJhbSB7Li4uc3RyaW5nW119IGlzc3VlcnMgUHVibGljIGtleSBvZiBvbmUgb3IgbW9yZSBpc3N1ZXJzIHRvIHRoZSBhc3NldCBiZWluZyBjcmVhdGVkIGJ5IHRoaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEVhY2ggb2YgdGhlIHByaXZhdGUga2V5cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwdWJsaWNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyBNVVNUIGJlIHVzZWQgbGF0ZXIgKGFuZCBpbiB0aGUgc2FtZSBvcmRlcikgd2hlbiBzaWduaW5nIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbiAoYHNpZ25UcmFuc2FjdGlvbigpYCkuXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBVbnNpZ25lZCB0cmFuc2FjdGlvbiAtLSBtYWtlIHN1cmUgdG8gY2FsbCBzaWduVHJhbnNhY3Rpb24oKSBvbiBpdCBiZWZvcmVcbiAqICAgICAgICAgICAgICAgICAgIHNlbmRpbmcgaXQgb2ZmIVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlQ3JlYXRlVHJhbnNhY3Rpb24oYXNzZXQsIG1ldGFkYXRhLCBvdXRwdXRzLCAuLi5pc3N1ZXJzKSB7XG4gICAgY29uc3QgYXNzZXREZWZpbml0aW9uID0ge1xuICAgICAgICAnZGF0YSc6IGFzc2V0IHx8IG51bGwsXG4gICAgfTtcbiAgICBjb25zdCBpbnB1dHMgPSBpc3N1ZXJzLm1hcCgoaXNzdWVyKSA9PiBtYWtlSW5wdXRUZW1wbGF0ZShbaXNzdWVyXSkpO1xuXG4gICAgcmV0dXJuIG1ha2VUcmFuc2FjdGlvbignQ1JFQVRFJywgYXNzZXREZWZpbml0aW9uLCBtZXRhZGF0YSwgb3V0cHV0cywgaW5wdXRzKTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHJhbnNhY3Rpb24vbWFrZUNyZWF0ZVRyYW5zYWN0aW9uLmpzIiwiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcblxuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcbmltcG9ydCBjYyBmcm9tICdmaXZlLWJlbGxzLWNvbmRpdGlvbic7XG5cbmltcG9ydCBjY0pzb25pZnkgZnJvbSAnLi91dGlscy9jY0pzb25pZnknO1xuXG5cbi8qKlxuICogQHB1YmxpY1xuICogQ3JlYXRlIGFuIEVkMjU1MTkgQ3J5cHRvY29uZGl0aW9uIGZyb20gYW4gRWQyNTUxOSBwdWJsaWMga2V5IHRvIHB1dCBpbnRvIGFuIE91dHB1dCBvZiBhIFRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5IGJhc2U1OCBlbmNvZGVkIEVkMjU1MTkgcHVibGljIGtleSBmb3IgdGhlIHJlY2lwaWVudCBvZiB0aGUgVHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2pzb249dHJ1ZV0gSWYgdHJ1ZSByZXR1cm5zIGEganNvbiBvYmplY3Qgb3RoZXJ3aXNlIGEgY3J5cHRvLWNvbmRpdGlvbiB0eXBlXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBFZDI1NTE5IENvbmRpdGlvbiAodGhhdCB3aWxsIG5lZWQgdG8gd3JhcHBlZCBpbiBhbiBPdXRwdXQpXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VFZDI1NTE5Q29uZGl0aW9uKHB1YmxpY0tleSwganNvbj10cnVlKSB7XG4gICAgY29uc3QgcHVibGljS2V5QnVmZmVyID0gbmV3IEJ1ZmZlcihiYXNlNTguZGVjb2RlKHB1YmxpY0tleSkpO1xuXG4gICAgY29uc3QgZWQyNTUxOUZ1bGZpbGxtZW50ID0gbmV3IGNjLkVkMjU1MTkoKTtcbiAgICBlZDI1NTE5RnVsZmlsbG1lbnQuc2V0UHVibGljS2V5KHB1YmxpY0tleUJ1ZmZlcik7XG5cbiAgICBpZiAoanNvbikge1xuICAgICAgICByZXR1cm4gY2NKc29uaWZ5KGVkMjU1MTlGdWxmaWxsbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gZWQyNTUxOUZ1bGZpbGxtZW50O1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3RyYW5zYWN0aW9uL21ha2VFZDI1NTE5Q29uZGl0aW9uLmpzIiwiLyoqXG4gKiBAcHVibGljXG4gKiBDcmVhdGUgYW4gT3V0cHV0IGZyb20gYSBDb25kaXRpb24uXG4gKiBOb3RlOiBBc3N1bWVzIHRoZSBnaXZlbiBDb25kaXRpb24gd2FzIGdlbmVyYXRlZCBmcm9tIGEgc2luZ2xlIHB1YmxpYyBrZXkgKGUuZy4gYSBFZDI1NTE5IENvbmRpdGlvbilcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25kaXRpb24gQ29uZGl0aW9uIChlLmcuIGEgRWQyNTUxOSBDb25kaXRpb24gZnJvbSBgbWFrZUVkMjU1MTlDb25kaXRpb24oKWApXG4gKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IEFtb3VudCBvZiB0aGUgb3V0cHV0XG4gKiBAcmV0dXJucyB7b2JqZWN0fSBBbiBPdXRwdXQgdXNhYmxlIGluIGEgVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFrZU91dHB1dChjb25kaXRpb24sIGFtb3VudCA9IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IGFtb3VudCxcbiAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAncHVibGljX2tleXMnOiBjb25kaXRpb24uZGV0YWlscy5oYXNPd25Qcm9wZXJ0eSgncHVibGljX2tleScpID9cbiAgICAgICAgICAgIFtjb25kaXRpb24uZGV0YWlscy5wdWJsaWNfa2V5XSA6IFtdLFxuICAgIH07XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHJhbnNhY3Rpb24vbWFrZU91dHB1dC5qcyIsImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbmltcG9ydCBjYyBmcm9tICdmaXZlLWJlbGxzLWNvbmRpdGlvbic7XG5cbmltcG9ydCBjY0pzb25pZnkgZnJvbSAnLi91dGlscy9jY0pzb25pZnknO1xuXG5cbi8qKlxuICogQHB1YmxpY1xuICogQ3JlYXRlIGEgUHJlaW1hZ2UtU2hhMjU2IENyeXB0b2NvbmRpdGlvbiBmcm9tIGEgc2VjcmV0IHRvIHB1dCBpbnRvIGFuIE91dHB1dCBvZiBhIFRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlaW1hZ2UgUHJlaW1hZ2UgdG8gYmUgaGFzaGVkIGFuZCB3cmFwcGVkIGluIGEgY3J5cHRvLWNvbmRpdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbanNvbj10cnVlXSBJZiB0cnVlIHJldHVybnMgYSBqc29uIG9iamVjdCBvdGhlcndpc2UgYSBjcnlwdG8tY29uZGl0aW9uIHR5cGVcbiAqIEByZXR1cm5zIHtvYmplY3R9IFByZWltYWdlLVNoYTI1NiBDb25kaXRpb24gKHRoYXQgd2lsbCBuZWVkIHRvIHdyYXBwZWQgaW4gYW4gT3V0cHV0KVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlU2hhMjU2Q29uZGl0aW9uKHByZWltYWdlLCBqc29uPXRydWUpIHtcbiAgICBjb25zdCBzaGEyNTZGdWxmaWxsbWVudCA9IG5ldyBjYy5QcmVpbWFnZVNoYTI1NigpO1xuICAgIHNoYTI1NkZ1bGZpbGxtZW50LnByZWltYWdlID0gbmV3IEJ1ZmZlcihwcmVpbWFnZSk7XG5cbiAgICBpZiAoanNvbikge1xuICAgICAgICByZXR1cm4gY2NKc29uaWZ5KHNoYTI1NkZ1bGZpbGxtZW50KVxuICAgIH1cbiAgICByZXR1cm4gc2hhMjU2RnVsZmlsbG1lbnQ7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHJhbnNhY3Rpb24vbWFrZVNoYTI1NkNvbmRpdGlvbi5qcyIsImltcG9ydCBjYyBmcm9tICdmaXZlLWJlbGxzLWNvbmRpdGlvbic7XG5cbmltcG9ydCBjY0pzb25pZnkgZnJvbSAnLi91dGlscy9jY0pzb25pZnknO1xuXG5cbi8qKlxuICogQHB1YmxpY1xuICogQ3JlYXRlIGFuIFNoYTI1NiBUaHJlc2hvbGQgQ3J5cHRvY29uZGl0aW9uIGZyb20gdGhyZXNob2xkIHRvIHB1dCBpbnRvIGFuIE91dHB1dCBvZiBhIFRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdGhyZXNob2xkXG4gKiBAcGFyYW0ge0FycmF5fSBbc3ViY29uZGl0aW9ucz1bXV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2pzb249dHJ1ZV0gSWYgdHJ1ZSByZXR1cm5zIGEganNvbiBvYmplY3Qgb3RoZXJ3aXNlIGEgY3J5cHRvLWNvbmRpdGlvbiB0eXBlXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBTaGEyNTYgVGhyZXNob2xkIENvbmRpdGlvbiAodGhhdCB3aWxsIG5lZWQgdG8gd3JhcHBlZCBpbiBhbiBPdXRwdXQpXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VUaHJlc2hvbGRDb25kaXRpb24odGhyZXNob2xkLCBzdWJjb25kaXRpb25zPVtdLCBqc29uPXRydWUpIHtcbiAgICBjb25zdCB0aHJlc2hvbGRDb25kaXRpb24gPSBuZXcgY2MuVGhyZXNob2xkU2hhMjU2KCk7XG4gICAgdGhyZXNob2xkQ29uZGl0aW9uLnRocmVzaG9sZCA9IHRocmVzaG9sZDtcblxuICAgIHN1YmNvbmRpdGlvbnMuZm9yRWFjaCgoc3ViY29uZGl0aW9uKSA9PiB7XG4gICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBDb25kaXRpb24gYW5kIFVSSXNcbiAgICAgICAgdGhyZXNob2xkQ29uZGl0aW9uLmFkZFN1YmZ1bGZpbGxtZW50KHN1YmNvbmRpdGlvbik7XG4gICAgfSk7XG5cbiAgICBpZiAoanNvbikge1xuICAgICAgICByZXR1cm4gY2NKc29uaWZ5KHRocmVzaG9sZENvbmRpdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhyZXNob2xkQ29uZGl0aW9uXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHJhbnNhY3Rpb24vbWFrZVRocmVzaG9sZENvbmRpdGlvbi5qcyIsImltcG9ydCBtYWtlSW5wdXRUZW1wbGF0ZSBmcm9tICcuL21ha2VJbnB1dFRlbXBsYXRlJztcbmltcG9ydCBtYWtlVHJhbnNhY3Rpb24gZnJvbSAnLi9tYWtlVHJhbnNhY3Rpb24nO1xuXG5cbi8qKlxuICogQHB1YmxpY1xuICogR2VuZXJhdGUgYSBgVFJBTlNGRVJgIHRyYW5zYWN0aW9uIGhvbGRpbmcgdGhlIGBhc3NldGAsIGBtZXRhZGF0YWAsIGFuZCBgb3V0cHV0c2AsIHRoYXQgZnVsZmlsbHNcbiAqIHRoZSBgZnVsZmlsbGVkT3V0cHV0c2Agb2YgYHVuc3BlbnRUcmFuc2FjdGlvbmAuXG4gKiBAcGFyYW0ge29iamVjdH0gdW5zcGVudFRyYW5zYWN0aW9uIFByZXZpb3VzIFRyYW5zYWN0aW9uIHlvdSBoYXZlIGNvbnRyb2wgb3ZlciAoaS5lLiBjYW4gZnVsZmlsbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgT3V0cHV0IENvbmRpdGlvbilcbiAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhZGF0YSBNZXRhZGF0YSBmb3IgdGhlIFRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge29iamVjdFtdfSBvdXRwdXRzIEFycmF5IG9mIE91dHB1dCBvYmplY3RzIHRvIGFkZCB0byB0aGUgVHJhbnNhY3Rpb24uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaW5rIG9mIHRoZXNlIGFzIHRoZSByZWNpcGllbnRzIG9mIHRoZSBhc3NldCBhZnRlciB0aGUgdHJhbnNhY3Rpb24uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBgVFJBTlNGRVJgIFRyYW5zYWN0aW9ucywgdGhpcyBzaG91bGQgdXN1YWxseSBqdXN0IGJlIGEgbGlzdCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRzIHdyYXBwaW5nIEVkMjU1MTkgQ29uZGl0aW9ucyBnZW5lcmF0ZWQgZnJvbSB0aGUgcHVibGljIGtleXMgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlY2lwaWVudHMuXG4gKiBAcGFyYW0gey4uLm51bWJlcn0gZnVsZmlsbGVkT3V0cHV0cyBJbmRpY2VzIG9mIHRoZSBPdXRwdXRzIGluIGB1bnNwZW50VHJhbnNhY3Rpb25gIHRoYXQgdGhpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24gZnVsZmlsbHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHB1YmxpYyBrZXlzIGxpc3RlZCBpbiB0aGUgZnVsZmlsbGVkIE91dHB1dHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdXNlZCAoYW5kIGluIHRoZSBzYW1lIG9yZGVyKSB0byBzaWduIHRoZSBUcmFuc2FjdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGBzaWduVHJhbnNhY3Rpb24oKWApLlxuICogQHJldHVybnMge29iamVjdH0gVW5zaWduZWQgdHJhbnNhY3Rpb24gLS0gbWFrZSBzdXJlIHRvIGNhbGwgc2lnblRyYW5zYWN0aW9uKCkgb24gaXQgYmVmb3JlXG4gKiAgICAgICAgICAgICAgICAgICBzZW5kaW5nIGl0IG9mZiFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFrZVRyYW5zZmVyVHJhbnNhY3Rpb24odW5zcGVudFRyYW5zYWN0aW9uLCBtZXRhZGF0YSwgb3V0cHV0cywgLi4uZnVsZmlsbGVkT3V0cHV0cykge1xuICAgIGNvbnN0IGlucHV0cyA9IGZ1bGZpbGxlZE91dHB1dHMubWFwKChvdXRwdXRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBmdWxmaWxsZWRPdXRwdXQgPSB1bnNwZW50VHJhbnNhY3Rpb24ub3V0cHV0c1tvdXRwdXRJbmRleF07XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uTGluayA9IHtcbiAgICAgICAgICAgICdvdXRwdXQnOiBvdXRwdXRJbmRleCxcbiAgICAgICAgICAgICd0eGlkJzogdW5zcGVudFRyYW5zYWN0aW9uLmlkLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBtYWtlSW5wdXRUZW1wbGF0ZShmdWxmaWxsZWRPdXRwdXQucHVibGljX2tleXMsIHRyYW5zYWN0aW9uTGluayk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhc3NldExpbmsgPSB7XG4gICAgICAgICdpZCc6IHVuc3BlbnRUcmFuc2FjdGlvbi5vcGVyYXRpb24gPT09ICdDUkVBVEUnID8gdW5zcGVudFRyYW5zYWN0aW9uLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zcGVudFRyYW5zYWN0aW9uLmFzc2V0LmlkXG4gICAgfTtcblxuICAgIHJldHVybiBtYWtlVHJhbnNhY3Rpb24oJ1RSQU5TRkVSJywgYXNzZXRMaW5rLCBtZXRhZGF0YSwgb3V0cHV0cywgaW5wdXRzKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90cmFuc2FjdGlvbi9tYWtlVHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IGNjIGZyb20gJ2ZpdmUtYmVsbHMtY29uZGl0aW9uJztcbmltcG9ydCBjbG9uZSBmcm9tICdjbG9uZSc7XG5cbmltcG9ydCBzZXJpYWxpemVUcmFuc2FjdGlvbkludG9DYW5vbmljYWxTdHJpbmcgZnJvbSAnLi9zZXJpYWxpemVUcmFuc2FjdGlvbkludG9DYW5vbmljYWxTdHJpbmcnO1xuXG5cbi8qKlxuICogQHB1YmxpY1xuICogU2lnbiB0aGUgZ2l2ZW4gYHRyYW5zYWN0aW9uYCB3aXRoIHRoZSBnaXZlbiBgcHJpdmF0ZUtleWBzLCByZXR1cm5pbmcgYSBuZXcgY29weSBvZiBgdHJhbnNhY3Rpb25gXG4gKiB0aGF0J3MgYmVlbiBzaWduZWQuXG4gKiBOb3RlOiBPbmx5IGdlbmVyYXRlcyBFZDI1NTE5IEZ1bGZpbGxtZW50cy4gVGhyZXNob2xkcyBhbmQgb3RoZXIgdHlwZXMgb2YgRnVsZmlsbG1lbnRzIGFyZSBsZWZ0IGFzXG4gKiBhbiBleGVyY2lzZSBmb3IgdGhlIHVzZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gdHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gdG8gc2lnbi4gYHRyYW5zYWN0aW9uYCBpcyBub3QgbW9kaWZpZWQuXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcHJpdmF0ZUtleXMgUHJpdmF0ZSBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXNzdWVycyBvZiB0aGUgYHRyYW5zYWN0aW9uYC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZWQgdGhyb3VnaCB0byBpdGVyYXRpdmVseSBzaWduIGFueSBJbnB1dCBGdWxmaWxsbWVudHMgZm91bmQgaW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYHRyYW5zYWN0aW9uYC5cbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBzaWduZWQgdmVyc2lvbiBvZiBgdHJhbnNhY3Rpb25gLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIC4uLnByaXZhdGVLZXlzKSB7XG4gICAgY29uc3Qgc2lnbmVkVHggPSBjbG9uZSh0cmFuc2FjdGlvbik7XG4gICAgc2lnbmVkVHguaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBwcml2YXRlS2V5ID0gcHJpdmF0ZUtleXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBwcml2YXRlS2V5QnVmZmVyID0gbmV3IEJ1ZmZlcihiYXNlNTguZGVjb2RlKHByaXZhdGVLZXkpKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFRyYW5zYWN0aW9uID0gc2VyaWFsaXplVHJhbnNhY3Rpb25JbnRvQ2Fub25pY2FsU3RyaW5nKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgY29uc3QgZWQyNTUxOUZ1bGZpbGxtZW50ID0gbmV3IGNjLkVkMjU1MTkoKTtcbiAgICAgICAgZWQyNTUxOUZ1bGZpbGxtZW50LnNpZ24obmV3IEJ1ZmZlcihzZXJpYWxpemVkVHJhbnNhY3Rpb24pLCBwcml2YXRlS2V5QnVmZmVyKTtcbiAgICAgICAgY29uc3QgZnVsZmlsbG1lbnRVcmkgPSBlZDI1NTE5RnVsZmlsbG1lbnQuc2VyaWFsaXplVXJpKCk7XG5cbiAgICAgICAgaW5wdXQuZnVsZmlsbG1lbnQgPSBmdWxmaWxsbWVudFVyaTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduZWRUeDtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90cmFuc2FjdGlvbi9zaWduVHJhbnNhY3Rpb24uanMiLCJpbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IGNjIGZyb20gJ2ZpdmUtYmVsbHMtY29uZGl0aW9uJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbi8qKlxuICogQHB1YmxpY1xuICogTG9hZHMgYSBjcnlwdG8tY29uZGl0aW9uIGNsYXNzIChGdWxmaWxsbWVudCBvciBDb25kaXRpb24pIGZyb20gYSBCaWdjaGFpbkRCIEpTT04gb2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gY29uZGl0aW9uSnNvblxuICogQHJldHVybnMge2NjLkNvbmRpdGlvbn0gRWQyNTUxOSBDb25kaXRpb24gKHRoYXQgd2lsbCBuZWVkIHRvIHdyYXBwZWQgaW4gYW4gT3V0cHV0KVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjY0pzb25Mb2FkKGNvbmRpdGlvbkpzb24pIHtcblxuICAgIGlmICgnaGFzaCcgaW4gY29uZGl0aW9uSnNvbikge1xuICAgICAgICBsZXQgY29uZGl0aW9uID0gbmV3IGNjLkNvbmRpdGlvbigpO1xuICAgICAgICBjb25kaXRpb24udHlwZSA9IGNvbmRpdGlvbkpzb24udHlwZV9pZDtcbiAgICAgICAgY29uZGl0aW9uLmJpdG1hc2sgPSBjb25kaXRpb25Kc29uLmJpdG1hc2s7XG4gICAgICAgIGNvbmRpdGlvbi5oYXNoID0gbmV3IEJ1ZmZlcihiYXNlNTguZGVjb2RlKGNvbmRpdGlvbkpzb24uaGFzaCkpO1xuICAgICAgICBjb25kaXRpb24ubWF4RnVsZmlsbG1lbnRMZW5ndGggPSBwYXJzZUludChjb25kaXRpb25Kc29uLm1heF9mdWxmaWxsbWVudF9sZW5ndGgsIDEwKTtcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBmdWxmaWxsbWVudDtcblxuICAgICAgICBpZiAoY29uZGl0aW9uSnNvbi50eXBlX2lkID09PSAyKSB7XG4gICAgICAgICAgICBmdWxmaWxsbWVudCA9IG5ldyBjYy5UaHJlc2hvbGRTaGEyNTYoKTtcbiAgICAgICAgICAgIGZ1bGZpbGxtZW50LnRocmVzaG9sZCA9IGNvbmRpdGlvbkpzb24udGhyZXNob2xkO1xuICAgICAgICAgICAgY29uZGl0aW9uSnNvbi5zdWJmdWxmaWxsbWVudHMuZm9yRWFjaCgoc3ViZnVsZmlsbG1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzdWJmdWxmaWxsbWVudCA9IGNjSnNvbkxvYWQoc3ViZnVsZmlsbG1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICgnZ2V0Q29uZGl0aW9uVXJpJyBpbiBzdWJmdWxmaWxsbWVudClcbiAgICAgICAgICAgICAgICAgICAgZnVsZmlsbG1lbnQuYWRkU3ViZnVsZmlsbG1lbnQoc3ViZnVsZmlsbG1lbnQpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdzZXJpYWxpemVVcmknIGluIHN1YmZ1bGZpbGxtZW50KVxuICAgICAgICAgICAgICAgICAgICBmdWxmaWxsbWVudC5hZGRTdWJjb25kaXRpb24oc3ViZnVsZmlsbG1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbkpzb24udHlwZV9pZCA9PT0gMCkge1xuICAgICAgICAgICAgZnVsZmlsbG1lbnQgPSBuZXcgY2MuUHJlaW1hZ2VTaGEyNTYoKTtcbiAgICAgICAgICAgIGZ1bGZpbGxtZW50LnByZWltYWdlID0gbmV3IEJ1ZmZlcihjb25kaXRpb25Kc29uLnByZWltYWdlKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbkpzb24udHlwZV9pZCA9PT0gNCkge1xuICAgICAgICAgICAgZnVsZmlsbG1lbnQgPSBuZXcgY2MuRWQyNTUxOSgpO1xuICAgICAgICAgICAgZnVsZmlsbG1lbnQucHVibGljS2V5ID0gbmV3IEJ1ZmZlcihiYXNlNTguZGVjb2RlKGNvbmRpdGlvbkpzb24ucHVibGljX2tleSkpO1xuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbkpzb24uc2lnbmF0dXJlKVxuICAgICAgICAgICAgICAgIGZ1bGZpbGxtZW50LnNpZ25hdHVyZSA9IG5ldyBCdWZmZXIoYmFzZTU4LmRlY29kZShjb25kaXRpb25Kc29uLnNpZ25hdHVyZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxmaWxsbWVudDtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdHJhbnNhY3Rpb24vdXRpbHMvY2NKc29uTG9hZC5qcyIsIi8vIGJhc2UteCBlbmNvZGluZ1xuLy8gRm9ya2VkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2NyeXB0b2NvaW5qcy9iczU4XG4vLyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWlrZSBIZWFybiBmb3IgQml0Y29pbkpcbi8vIENvcHlyaWdodCAoYykgMjAxMSBHb29nbGUgSW5jXG4vLyBQb3J0ZWQgdG8gSmF2YVNjcmlwdCBieSBTdGVmYW4gVGhvbWFzXG4vLyBNZXJnZWQgQnVmZmVyIHJlZmFjdG9yaW5ncyBmcm9tIGJhc2U1OC1uYXRpdmUgYnkgU3RlcGhlbiBQYWlyXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTMgQml0UGF5IEluY1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2UgKEFMUEhBQkVUKSB7XG4gIHZhciBBTFBIQUJFVF9NQVAgPSB7fVxuICB2YXIgQkFTRSA9IEFMUEhBQkVULmxlbmd0aFxuICB2YXIgTEVBREVSID0gQUxQSEFCRVQuY2hhckF0KDApXG5cbiAgLy8gcHJlLWNvbXB1dGUgbG9va3VwIHRhYmxlXG4gIGZvciAodmFyIHogPSAwOyB6IDwgQUxQSEFCRVQubGVuZ3RoOyB6KyspIHtcbiAgICB2YXIgeCA9IEFMUEhBQkVULmNoYXJBdCh6KVxuXG4gICAgaWYgKEFMUEhBQkVUX01BUFt4XSAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIGFtYmlndW91cycpXG4gICAgQUxQSEFCRVRfTUFQW3hdID0gelxuICB9XG5cbiAgZnVuY3Rpb24gZW5jb2RlIChzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG5cbiAgICB2YXIgZGlnaXRzID0gWzBdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgIGZvciAodmFyIGogPSAwLCBjYXJyeSA9IHNvdXJjZVtpXTsgaiA8IGRpZ2l0cy5sZW5ndGg7ICsraikge1xuICAgICAgICBjYXJyeSArPSBkaWdpdHNbal0gPDwgOFxuICAgICAgICBkaWdpdHNbal0gPSBjYXJyeSAlIEJBU0VcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyBCQVNFKSB8IDBcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGNhcnJ5ID4gMCkge1xuICAgICAgICBkaWdpdHMucHVzaChjYXJyeSAlIEJBU0UpXG4gICAgICAgIGNhcnJ5ID0gKGNhcnJ5IC8gQkFTRSkgfCAwXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9ICcnXG5cbiAgICAvLyBkZWFsIHdpdGggbGVhZGluZyB6ZXJvc1xuICAgIGZvciAodmFyIGsgPSAwOyBzb3VyY2Vba10gPT09IDAgJiYgayA8IHNvdXJjZS5sZW5ndGggLSAxOyArK2spIHN0cmluZyArPSBBTFBIQUJFVFswXVxuICAgIC8vIGNvbnZlcnQgZGlnaXRzIHRvIGEgc3RyaW5nXG4gICAgZm9yICh2YXIgcSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBxID49IDA7IC0tcSkgc3RyaW5nICs9IEFMUEhBQkVUW2RpZ2l0c1txXV1cblxuICAgIHJldHVybiBzdHJpbmdcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZVVuc2FmZSAoc3RyaW5nKSB7XG4gICAgaWYgKHN0cmluZy5sZW5ndGggPT09IDApIHJldHVybiBuZXcgQnVmZmVyKDApXG5cbiAgICB2YXIgYnl0ZXMgPSBbMF1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbHVlID0gQUxQSEFCRVRfTUFQW3N0cmluZ1tpXV1cbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGNhcnJ5ID0gdmFsdWU7IGogPCBieXRlcy5sZW5ndGg7ICsraikge1xuICAgICAgICBjYXJyeSArPSBieXRlc1tqXSAqIEJBU0VcbiAgICAgICAgYnl0ZXNbal0gPSBjYXJyeSAmIDB4ZmZcbiAgICAgICAgY2FycnkgPj49IDhcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGNhcnJ5ID4gMCkge1xuICAgICAgICBieXRlcy5wdXNoKGNhcnJ5ICYgMHhmZilcbiAgICAgICAgY2FycnkgPj49IDhcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWFsIHdpdGggbGVhZGluZyB6ZXJvc1xuICAgIGZvciAodmFyIGsgPSAwOyBzdHJpbmdba10gPT09IExFQURFUiAmJiBrIDwgc3RyaW5nLmxlbmd0aCAtIDE7ICsraykge1xuICAgICAgYnl0ZXMucHVzaCgwKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVmZmVyKGJ5dGVzLnJldmVyc2UoKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZSAoc3RyaW5nKSB7XG4gICAgdmFyIGJ1ZmZlciA9IGRlY29kZVVuc2FmZShzdHJpbmcpXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGJ1ZmZlclxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb24tYmFzZScgKyBCQVNFICsgJyBjaGFyYWN0ZXInKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBkZWNvZGVVbnNhZmU6IGRlY29kZVVuc2FmZSxcbiAgICBkZWNvZGU6IGRlY29kZVxuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFzZS14L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiBiNjQubGVuZ3RoICogMyAvIDQgLSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcbiAgcGxhY2VIb2xkZXJzID0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxuXG4gIGFyciA9IG5ldyBBcnIobGVuICogMyAvIDQgLSBwbGFjZUhvbGRlcnMpXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICB2YXIgTCA9IDBcblxuICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBvdXRwdXQgPSAnJ1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPT0nXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArICh1aW50OFtsZW4gLSAxXSlcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9J1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpXG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFzZTY0LWpzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuQXJyYXkuaW5jbHVkZXM7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9mbi9hcnJheS9pbmNsdWRlcy5qc1xuLy8gbW9kdWxlIGlkID0gNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA1NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanNcbi8vIG1vZHVsZSBpZCA9IDU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSA1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpe1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuICBzd2l0Y2gobGVuZ3RoKXtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzXG4vLyBtb2R1bGUgaWQgPSA1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZWZpbmVkLmpzXG4vLyBtb2R1bGUgaWQgPSA1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnRcbiAgLy8gaW4gb2xkIElFIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnXG4gICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kb20tY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSA2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0tYnVnLWtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzXG4vLyBtb2R1bGUgaWQgPSA2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZFAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDY0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIGlmKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcyl0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qc1xuLy8gbW9kdWxlIGlkID0gNjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGhhcyAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSlcbiAgLCBJRV9QUk9UTyAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBuYW1lcyl7XG4gIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICwgaSAgICAgID0gMFxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGtleTtcbiAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanNcbi8vIG1vZHVsZSBpZCA9IDY3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanNcbi8vIG1vZHVsZSBpZCA9IDY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXBpZS5qc1xuLy8gbW9kdWxlIGlkID0gNjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdldEtleXMgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBpc0VudW0gICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNFbnRyaWVzKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKGl0KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KGl0KVxuICAgICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGkgICAgICA9IDBcbiAgICAgICwgcmVzdWx0ID0gW11cbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSl7XG4gICAgICByZXN1bHQucHVzaChpc0VudHJpZXMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSA3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzXG4vLyBtb2R1bGUgaWQgPSA3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC1rZXkuanNcbi8vIG1vZHVsZSBpZCA9IDcyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQuanNcbi8vIG1vZHVsZSBpZCA9IDczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpbmRleCwgbGVuZ3RoKXtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanNcbi8vIG1vZHVsZSBpZCA9IDc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpe1xuICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzXG4vLyBtb2R1bGUgaWQgPSA3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VpZC5qc1xuLy8gbW9kdWxlIGlkID0gNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkaW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyosIGZyb21JbmRleCA9IDAgKi8pe1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdpbmNsdWRlcycpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanNcbi8vIG1vZHVsZSBpZCA9IDc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkZW50cmllcyA9IHJlcXVpcmUoJy4vX29iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCl7XG4gICAgcmV0dXJuICRlbnRyaWVzKGl0KTtcbiAgfVxufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qc1xuLy8gbW9kdWxlIGlkID0gNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyLCBzZXApIHtcblx0aWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdHNlcCA9IHR5cGVvZiBzZXAgPT09ICd1bmRlZmluZWQnID8gJ18nIDogc2VwO1xuXG5cdHJldHVybiBzdHJcblx0XHQucmVwbGFjZSgvKFthLXpcXGRdKShbQS1aXSkvZywgJyQxJyArIHNlcCArICckMicpXG5cdFx0LnJlcGxhY2UoLyhbQS1aXSspKFtBLVpdW2EtelxcZF0rKS9nLCAnJDEnICsgc2VwICsgJyQyJylcblx0XHQudG9Mb3dlckNhc2UoKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZGVjYW1lbGl6ZS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gODBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3N0ZWZhbnBlbm5lci9lczYtcHJvbWlzZS9tYXN0ZXIvTElDRU5TRVxuICogQHZlcnNpb24gICA0LjEuMFxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgKGdsb2JhbC5FUzZQcm9taXNlID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBvYmplY3RPckZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xufVxuXG52YXIgX2lzQXJyYXkgPSB1bmRlZmluZWQ7XG5pZiAoIUFycmF5LmlzQXJyYXkpIHtcbiAgX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gIH07XG59IGVsc2Uge1xuICBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG59XG5cbnZhciBpc0FycmF5ID0gX2lzQXJyYXk7XG5cbnZhciBsZW4gPSAwO1xudmFyIHZlcnR4TmV4dCA9IHVuZGVmaW5lZDtcbnZhciBjdXN0b21TY2hlZHVsZXJGbiA9IHVuZGVmaW5lZDtcblxudmFyIGFzYXAgPSBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHtcbiAgcXVldWVbbGVuXSA9IGNhbGxiYWNrO1xuICBxdWV1ZVtsZW4gKyAxXSA9IGFyZztcbiAgbGVuICs9IDI7XG4gIGlmIChsZW4gPT09IDIpIHtcbiAgICAvLyBJZiBsZW4gaXMgMiwgdGhhdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gYXN5bmMgZmx1c2guXG4gICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGZsdXNoZWQsIHRoZXlcbiAgICAvLyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGlzIGZsdXNoIHRoYXQgd2UgYXJlIHNjaGVkdWxpbmcuXG4gICAgaWYgKGN1c3RvbVNjaGVkdWxlckZuKSB7XG4gICAgICBjdXN0b21TY2hlZHVsZXJGbihmbHVzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlRmx1c2goKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldFNjaGVkdWxlcihzY2hlZHVsZUZuKSB7XG4gIGN1c3RvbVNjaGVkdWxlckZuID0gc2NoZWR1bGVGbjtcbn1cblxuZnVuY3Rpb24gc2V0QXNhcChhc2FwRm4pIHtcbiAgYXNhcCA9IGFzYXBGbjtcbn1cblxudmFyIGJyb3dzZXJXaW5kb3cgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbnZhciBicm93c2VyR2xvYmFsID0gYnJvd3NlcldpbmRvdyB8fCB7fTtcbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBicm93c2VyR2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgaXNOb2RlID0gdHlwZW9mIHNlbGYgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAoe30pLnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcblxuLy8gdGVzdCBmb3Igd2ViIHdvcmtlciBidXQgbm90IGluIElFMTBcbnZhciBpc1dvcmtlciA9IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8vIG5vZGVcbmZ1bmN0aW9uIHVzZU5leHRUaWNrKCkge1xuICAvLyBub2RlIHZlcnNpb24gMC4xMC54IGRpc3BsYXlzIGEgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIG5leHRUaWNrIGlzIHVzZWQgcmVjdXJzaXZlbHlcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jdWpvanMvd2hlbi9pc3N1ZXMvNDEwIGZvciBkZXRhaWxzXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICB9O1xufVxuXG4vLyB2ZXJ0eFxuZnVuY3Rpb24gdXNlVmVydHhUaW1lcigpIHtcbiAgaWYgKHR5cGVvZiB2ZXJ0eE5leHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZlcnR4TmV4dChmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1c2VTZXRUaW1lb3V0KCk7XG59XG5cbmZ1bmN0aW9uIHVzZU11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgdmFyIG9ic2VydmVyID0gbmV3IEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGZsdXNoKTtcbiAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgbm9kZS5kYXRhID0gaXRlcmF0aW9ucyA9ICsraXRlcmF0aW9ucyAlIDI7XG4gIH07XG59XG5cbi8vIHdlYiB3b3JrZXJcbmZ1bmN0aW9uIHVzZU1lc3NhZ2VDaGFubmVsKCkge1xuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VTZXRUaW1lb3V0KCkge1xuICAvLyBTdG9yZSBzZXRUaW1lb3V0IHJlZmVyZW5jZSBzbyBlczYtcHJvbWlzZSB3aWxsIGJlIHVuYWZmZWN0ZWQgYnlcbiAgLy8gb3RoZXIgY29kZSBtb2RpZnlpbmcgc2V0VGltZW91dCAobGlrZSBzaW5vbi51c2VGYWtlVGltZXJzKCkpXG4gIHZhciBnbG9iYWxTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2xvYmFsU2V0VGltZW91dChmbHVzaCwgMSk7XG4gIH07XG59XG5cbnZhciBxdWV1ZSA9IG5ldyBBcnJheSgxMDAwKTtcbmZ1bmN0aW9uIGZsdXNoKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG4gICAgdmFyIGFyZyA9IHF1ZXVlW2kgKyAxXTtcblxuICAgIGNhbGxiYWNrKGFyZyk7XG5cbiAgICBxdWV1ZVtpXSA9IHVuZGVmaW5lZDtcbiAgICBxdWV1ZVtpICsgMV0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0VmVydHgoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHIgPSByZXF1aXJlO1xuICAgIHZhciB2ZXJ0eCA9IHIoJ3ZlcnR4Jyk7XG4gICAgdmVydHhOZXh0ID0gdmVydHgucnVuT25Mb29wIHx8IHZlcnR4LnJ1bk9uQ29udGV4dDtcbiAgICByZXR1cm4gdXNlVmVydHhUaW1lcigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHVzZVNldFRpbWVvdXQoKTtcbiAgfVxufVxuXG52YXIgc2NoZWR1bGVGbHVzaCA9IHVuZGVmaW5lZDtcbi8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG5pZiAoaXNOb2RlKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VOZXh0VGljaygpO1xufSBlbHNlIGlmIChCcm93c2VyTXV0YXRpb25PYnNlcnZlcikge1xuICBzY2hlZHVsZUZsdXNoID0gdXNlTXV0YXRpb25PYnNlcnZlcigpO1xufSBlbHNlIGlmIChpc1dvcmtlcikge1xuICBzY2hlZHVsZUZsdXNoID0gdXNlTWVzc2FnZUNoYW5uZWwoKTtcbn0gZWxzZSBpZiAoYnJvd3NlcldpbmRvdyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSBhdHRlbXB0VmVydHgoKTtcbn0gZWxzZSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VTZXRUaW1lb3V0KCk7XG59XG5cbmZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgdmFyIF9hcmd1bWVudHMgPSBhcmd1bWVudHM7XG5cbiAgdmFyIHBhcmVudCA9IHRoaXM7XG5cbiAgdmFyIGNoaWxkID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7XG5cbiAgaWYgKGNoaWxkW1BST01JU0VfSURdID09PSB1bmRlZmluZWQpIHtcbiAgICBtYWtlUHJvbWlzZShjaGlsZCk7XG4gIH1cblxuICB2YXIgX3N0YXRlID0gcGFyZW50Ll9zdGF0ZTtcblxuICBpZiAoX3N0YXRlKSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjYWxsYmFjayA9IF9hcmd1bWVudHNbX3N0YXRlIC0gMV07XG4gICAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGludm9rZUNhbGxiYWNrKF9zdGF0ZSwgY2hpbGQsIGNhbGxiYWNrLCBwYXJlbnQuX3Jlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9KSgpO1xuICB9IGVsc2Uge1xuICAgIHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gIH1cblxuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICBgUHJvbWlzZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIHJlc29sdmVkIHdpdGggdGhlXG4gIHBhc3NlZCBgdmFsdWVgLiBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgcmVzb2x2ZSgxKTtcbiAgfSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyB2YWx1ZSA9PT0gMVxuICB9KTtcbiAgYGBgXG5cbiAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoMSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyB2YWx1ZSA9PT0gMVxuICB9KTtcbiAgYGBgXG5cbiAgQG1ldGhvZCByZXNvbHZlXG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBbnl9IHZhbHVlIHZhbHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZXNvbHZlZCB3aXRoXG4gIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuXG4gIGB2YWx1ZWBcbiovXG5mdW5jdGlvbiByZXNvbHZlKG9iamVjdCkge1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcbiAgX3Jlc29sdmUocHJvbWlzZSwgb2JqZWN0KTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbnZhciBQUk9NSVNFX0lEID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDE2KTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBQRU5ESU5HID0gdm9pZCAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xuXG52YXIgR0VUX1RIRU5fRVJST1IgPSBuZXcgRXJyb3JPYmplY3QoKTtcblxuZnVuY3Rpb24gc2VsZkZ1bGZpbGxtZW50KCkge1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG59XG5cbmZ1bmN0aW9uIGNhbm5vdFJldHVybk93bigpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGhlbihwcm9taXNlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb21pc2UudGhlbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBHRVRfVEhFTl9FUlJPUi5lcnJvciA9IGVycm9yO1xuICAgIHJldHVybiBHRVRfVEhFTl9FUlJPUjtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlUaGVuKHRoZW4sIHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgdHJ5IHtcbiAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUsIHRoZW4pIHtcbiAgYXNhcChmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgIHZhciBzZWFsZWQgPSBmYWxzZTtcbiAgICB2YXIgZXJyb3IgPSB0cnlUaGVuKHRoZW4sIHRoZW5hYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChzZWFsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgX3Jlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaWYgKHNlYWxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICBfcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSwgJ1NldHRsZTogJyArIChwcm9taXNlLl9sYWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTtcblxuICAgIGlmICghc2VhbGVkICYmIGVycm9yKSB7XG4gICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgX3JlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgfVxuICB9LCBwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUpIHtcbiAgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gRlVMRklMTEVEKSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgfSBlbHNlIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IFJFSkVDVEVEKSB7XG4gICAgX3JlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gX3Jlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHJldHVybiBfcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuJCQpIHtcbiAgaWYgKG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IgPT09IHByb21pc2UuY29uc3RydWN0b3IgJiYgdGhlbiQkID09PSB0aGVuICYmIG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IucmVzb2x2ZSA9PT0gcmVzb2x2ZSkge1xuICAgIGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICB9IGVsc2Uge1xuICAgIGlmICh0aGVuJCQgPT09IEdFVF9USEVOX0VSUk9SKSB7XG4gICAgICBfcmVqZWN0KHByb21pc2UsIEdFVF9USEVOX0VSUk9SLmVycm9yKTtcbiAgICAgIEdFVF9USEVOX0VSUk9SLmVycm9yID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoZW4kJCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih0aGVuJCQpKSB7XG4gICAgICBoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbiQkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX3Jlc29sdmUocHJvbWlzZSwgdmFsdWUpIHtcbiAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgX3JlamVjdChwcm9taXNlLCBzZWxmRnVsZmlsbG1lbnQoKSk7XG4gIH0gZWxzZSBpZiAob2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlLCBnZXRUaGVuKHZhbHVlKSk7XG4gIH0gZWxzZSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVibGlzaFJlamVjdGlvbihwcm9taXNlKSB7XG4gIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgcHJvbWlzZS5fb25lcnJvcihwcm9taXNlLl9yZXN1bHQpO1xuICB9XG5cbiAgcHVibGlzaChwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gZnVsZmlsbChwcm9taXNlLCB2YWx1ZSkge1xuICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm9taXNlLl9yZXN1bHQgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fc3RhdGUgPSBGVUxGSUxMRUQ7XG5cbiAgaWYgKHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzYXAocHVibGlzaCwgcHJvbWlzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlamVjdChwcm9taXNlLCByZWFzb24pIHtcbiAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBQRU5ESU5HKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHByb21pc2UuX3N0YXRlID0gUkVKRUNURUQ7XG4gIHByb21pc2UuX3Jlc3VsdCA9IHJlYXNvbjtcblxuICBhc2FwKHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2UpO1xufVxuXG5mdW5jdGlvbiBzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgdmFyIF9zdWJzY3JpYmVycyA9IHBhcmVudC5fc3Vic2NyaWJlcnM7XG4gIHZhciBsZW5ndGggPSBfc3Vic2NyaWJlcnMubGVuZ3RoO1xuXG4gIHBhcmVudC5fb25lcnJvciA9IG51bGw7XG5cbiAgX3N1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDtcbiAgX3N1YnNjcmliZXJzW2xlbmd0aCArIEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50O1xuICBfc3Vic2NyaWJlcnNbbGVuZ3RoICsgUkVKRUNURURdID0gb25SZWplY3Rpb247XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCAmJiBwYXJlbnQuX3N0YXRlKSB7XG4gICAgYXNhcChwdWJsaXNoLCBwYXJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSkge1xuICB2YXIgc3Vic2NyaWJlcnMgPSBwcm9taXNlLl9zdWJzY3JpYmVycztcbiAgdmFyIHNldHRsZWQgPSBwcm9taXNlLl9zdGF0ZTtcblxuICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gdW5kZWZpbmVkLFxuICAgICAgY2FsbGJhY2sgPSB1bmRlZmluZWQsXG4gICAgICBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7IGkgKz0gMykge1xuICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07XG4gICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soZGV0YWlsKTtcbiAgICB9XG4gIH1cblxuICBwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPSAwO1xufVxuXG5mdW5jdGlvbiBFcnJvck9iamVjdCgpIHtcbiAgdGhpcy5lcnJvciA9IG51bGw7XG59XG5cbnZhciBUUllfQ0FUQ0hfRVJST1IgPSBuZXcgRXJyb3JPYmplY3QoKTtcblxuZnVuY3Rpb24gdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCkge1xuICB0cnkge1xuICAgIHJldHVybiBjYWxsYmFjayhkZXRhaWwpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgVFJZX0NBVENIX0VSUk9SLmVycm9yID0gZTtcbiAgICByZXR1cm4gVFJZX0NBVENIX0VSUk9SO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgdmFyIGhhc0NhbGxiYWNrID0gaXNGdW5jdGlvbihjYWxsYmFjayksXG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yID0gdW5kZWZpbmVkLFxuICAgICAgc3VjY2VlZGVkID0gdW5kZWZpbmVkLFxuICAgICAgZmFpbGVkID0gdW5kZWZpbmVkO1xuXG4gIGlmIChoYXNDYWxsYmFjaykge1xuICAgIHZhbHVlID0gdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCk7XG5cbiAgICBpZiAodmFsdWUgPT09IFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgIGVycm9yID0gdmFsdWUuZXJyb3I7XG4gICAgICB2YWx1ZS5lcnJvciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICBfcmVqZWN0KHByb21pc2UsIGNhbm5vdFJldHVybk93bigpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBkZXRhaWw7XG4gICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gUEVORElORykge1xuICAgIC8vIG5vb3BcbiAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHtcbiAgICAgIF9yZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgICAgX3JlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBGVUxGSUxMRUQpIHtcbiAgICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gUkVKRUNURUQpIHtcbiAgICAgIF9yZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgdHJ5IHtcbiAgICByZXNvbHZlcihmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSkge1xuICAgICAgX3Jlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7XG4gICAgICBfcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBfcmVqZWN0KHByb21pc2UsIGUpO1xuICB9XG59XG5cbnZhciBpZCA9IDA7XG5mdW5jdGlvbiBuZXh0SWQoKSB7XG4gIHJldHVybiBpZCsrO1xufVxuXG5mdW5jdGlvbiBtYWtlUHJvbWlzZShwcm9taXNlKSB7XG4gIHByb21pc2VbUFJPTUlTRV9JRF0gPSBpZCsrO1xuICBwcm9taXNlLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgcHJvbWlzZS5fcmVzdWx0ID0gdW5kZWZpbmVkO1xuICBwcm9taXNlLl9zdWJzY3JpYmVycyA9IFtdO1xufVxuXG5mdW5jdGlvbiBFbnVtZXJhdG9yKENvbnN0cnVjdG9yLCBpbnB1dCkge1xuICB0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcblxuICBpZiAoIXRoaXMucHJvbWlzZVtQUk9NSVNFX0lEXSkge1xuICAgIG1ha2VQcm9taXNlKHRoaXMucHJvbWlzZSk7XG4gIH1cblxuICBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgIHRoaXMuX3JlbWFpbmluZyA9IGlucHV0Lmxlbmd0aDtcblxuICAgIHRoaXMuX3Jlc3VsdCA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZ1bGZpbGwodGhpcy5wcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDA7XG4gICAgICB0aGlzLl9lbnVtZXJhdGUoKTtcbiAgICAgIGlmICh0aGlzLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgZnVsZmlsbCh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIF9yZWplY3QodGhpcy5wcm9taXNlLCB2YWxpZGF0aW9uRXJyb3IoKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGlvbkVycm9yKCkge1xuICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTtcbn07XG5cbkVudW1lcmF0b3IucHJvdG90eXBlLl9lbnVtZXJhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgdmFyIF9pbnB1dCA9IHRoaXMuX2lucHV0O1xuXG4gIGZvciAodmFyIGkgPSAwOyB0aGlzLl9zdGF0ZSA9PT0gUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLl9lYWNoRW50cnkoX2lucHV0W2ldLCBpKTtcbiAgfVxufTtcblxuRW51bWVyYXRvci5wcm90b3R5cGUuX2VhY2hFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSwgaSkge1xuICB2YXIgYyA9IHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3I7XG4gIHZhciByZXNvbHZlJCQgPSBjLnJlc29sdmU7XG5cbiAgaWYgKHJlc29sdmUkJCA9PT0gcmVzb2x2ZSkge1xuICAgIHZhciBfdGhlbiA9IGdldFRoZW4oZW50cnkpO1xuXG4gICAgaWYgKF90aGVuID09PSB0aGVuICYmIGVudHJ5Ll9zdGF0ZSAhPT0gUEVORElORykge1xuICAgICAgdGhpcy5fc2V0dGxlZEF0KGVudHJ5Ll9zdGF0ZSwgaSwgZW50cnkuX3Jlc3VsdCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgX3RoZW4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuICAgICAgdGhpcy5fcmVzdWx0W2ldID0gZW50cnk7XG4gICAgfSBlbHNlIGlmIChjID09PSBQcm9taXNlKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBjKG5vb3ApO1xuICAgICAgaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCBlbnRyeSwgX3RoZW4pO1xuICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KHByb21pc2UsIGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl93aWxsU2V0dGxlQXQobmV3IGMoZnVuY3Rpb24gKHJlc29sdmUkJCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSQkKGVudHJ5KTtcbiAgICAgIH0pLCBpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fd2lsbFNldHRsZUF0KHJlc29sdmUkJChlbnRyeSksIGkpO1xuICB9XG59O1xuXG5FbnVtZXJhdG9yLnByb3RvdHlwZS5fc2V0dGxlZEF0ID0gZnVuY3Rpb24gKHN0YXRlLCBpLCB2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXMucHJvbWlzZTtcblxuICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IFBFTkRJTkcpIHtcbiAgICB0aGlzLl9yZW1haW5pbmctLTtcblxuICAgIGlmIChzdGF0ZSA9PT0gUkVKRUNURUQpIHtcbiAgICAgIF9yZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICB9XG59O1xuXG5FbnVtZXJhdG9yLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0ID0gZnVuY3Rpb24gKHByb21pc2UsIGkpIHtcbiAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gIHN1YnNjcmliZShwcm9taXNlLCB1bmRlZmluZWQsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICByZXR1cm4gZW51bWVyYXRvci5fc2V0dGxlZEF0KFJFSkVDVEVELCBpLCByZWFzb24pO1xuICB9KTtcbn07XG5cbi8qKlxuICBgUHJvbWlzZS5hbGxgIGFjY2VwdHMgYW4gYXJyYXkgb2YgcHJvbWlzZXMsIGFuZCByZXR1cm5zIGEgbmV3IHByb21pc2Ugd2hpY2hcbiAgaXMgZnVsZmlsbGVkIHdpdGggYW4gYXJyYXkgb2YgZnVsZmlsbG1lbnQgdmFsdWVzIGZvciB0aGUgcGFzc2VkIHByb21pc2VzLCBvclxuICByZWplY3RlZCB3aXRoIHRoZSByZWFzb24gb2YgdGhlIGZpcnN0IHBhc3NlZCBwcm9taXNlIHRvIGJlIHJlamVjdGVkLiBJdCBjYXN0cyBhbGxcbiAgZWxlbWVudHMgb2YgdGhlIHBhc3NlZCBpdGVyYWJsZSB0byBwcm9taXNlcyBhcyBpdCBydW5zIHRoaXMgYWxnb3JpdGhtLlxuXG4gIEV4YW1wbGU6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZTEgPSByZXNvbHZlKDEpO1xuICBsZXQgcHJvbWlzZTIgPSByZXNvbHZlKDIpO1xuICBsZXQgcHJvbWlzZTMgPSByZXNvbHZlKDMpO1xuICBsZXQgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTtcblxuICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbihhcnJheSl7XG4gICAgLy8gVGhlIGFycmF5IGhlcmUgd291bGQgYmUgWyAxLCAyLCAzIF07XG4gIH0pO1xuICBgYGBcblxuICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYGFsbGAgYXJlIHJlamVjdGVkLCB0aGUgZmlyc3QgcHJvbWlzZVxuICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIHJldHVybmVkIHByb21pc2VzJ3NcbiAgcmVqZWN0aW9uIGhhbmRsZXIuIEZvciBleGFtcGxlOlxuXG4gIEV4YW1wbGU6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZTEgPSByZXNvbHZlKDEpO1xuICBsZXQgcHJvbWlzZTIgPSByZWplY3QobmV3IEVycm9yKFwiMlwiKSk7XG4gIGxldCBwcm9taXNlMyA9IHJlamVjdChuZXcgRXJyb3IoXCIzXCIpKTtcbiAgbGV0IHByb21pc2VzID0gWyBwcm9taXNlMSwgcHJvbWlzZTIsIHByb21pc2UzIF07XG5cbiAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpe1xuICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJlamVjdGVkIHByb21pc2VzIVxuICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgIC8vIGVycm9yLm1lc3NhZ2UgPT09IFwiMlwiXG4gIH0pO1xuICBgYGBcblxuICBAbWV0aG9kIGFsbFxuICBAc3RhdGljXG4gIEBwYXJhbSB7QXJyYXl9IGVudHJpZXMgYXJyYXkgb2YgcHJvbWlzZXNcbiAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxpbmcgdGhlIHByb21pc2UuXG4gIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIGFsbCBgcHJvbWlzZXNgIGhhdmUgYmVlblxuICBmdWxmaWxsZWQsIG9yIHJlamVjdGVkIGlmIGFueSBvZiB0aGVtIGJlY29tZSByZWplY3RlZC5cbiAgQHN0YXRpY1xuKi9cbmZ1bmN0aW9uIGFsbChlbnRyaWVzKSB7XG4gIHJldHVybiBuZXcgRW51bWVyYXRvcih0aGlzLCBlbnRyaWVzKS5wcm9taXNlO1xufVxuXG4vKipcbiAgYFByb21pc2UucmFjZWAgcmV0dXJucyBhIG5ldyBwcm9taXNlIHdoaWNoIGlzIHNldHRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZVxuICBmaXJzdCBwYXNzZWQgcHJvbWlzZSB0byBzZXR0bGUuXG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgcmVzb2x2ZSgncHJvbWlzZSAxJyk7XG4gICAgfSwgMjAwKTtcbiAgfSk7XG5cbiAgbGV0IHByb21pc2UyID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDInKTtcbiAgICB9LCAxMDApO1xuICB9KTtcblxuICBQcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9taXNlMl0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAvLyByZXN1bHQgPT09ICdwcm9taXNlIDInIGJlY2F1c2UgaXQgd2FzIHJlc29sdmVkIGJlZm9yZSBwcm9taXNlMVxuICAgIC8vIHdhcyByZXNvbHZlZC5cbiAgfSk7XG4gIGBgYFxuXG4gIGBQcm9taXNlLnJhY2VgIGlzIGRldGVybWluaXN0aWMgaW4gdGhhdCBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAgc2V0dGxlZCBwcm9taXNlIG1hdHRlcnMuIEZvciBleGFtcGxlLCBldmVuIGlmIG90aGVyIHByb21pc2VzIGdpdmVuIHRvIHRoZVxuICBgcHJvbWlzZXNgIGFycmF5IGFyZ3VtZW50IGFyZSByZXNvbHZlZCwgYnV0IHRoZSBmaXJzdCBzZXR0bGVkIHByb21pc2UgaGFzXG4gIGJlY29tZSByZWplY3RlZCBiZWZvcmUgdGhlIG90aGVyIHByb21pc2VzIGJlY2FtZSBmdWxmaWxsZWQsIHRoZSByZXR1cm5lZFxuICBwcm9taXNlIHdpbGwgYmVjb21lIHJlamVjdGVkOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UxID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDEnKTtcbiAgICB9LCAyMDApO1xuICB9KTtcblxuICBsZXQgcHJvbWlzZTIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3Byb21pc2UgMicpKTtcbiAgICB9LCAxMDApO1xuICB9KTtcblxuICBQcm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9taXNlMl0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAvLyBDb2RlIGhlcmUgbmV2ZXIgcnVuc1xuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAncHJvbWlzZSAyJyBiZWNhdXNlIHByb21pc2UgMiBiZWNhbWUgcmVqZWN0ZWQgYmVmb3JlXG4gICAgLy8gcHJvbWlzZSAxIGJlY2FtZSBmdWxmaWxsZWRcbiAgfSk7XG4gIGBgYFxuXG4gIEFuIGV4YW1wbGUgcmVhbC13b3JsZCB1c2UgY2FzZSBpcyBpbXBsZW1lbnRpbmcgdGltZW91dHM6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBQcm9taXNlLnJhY2UoW2FqYXgoJ2Zvby5qc29uJyksIHRpbWVvdXQoNTAwMCldKVxuICBgYGBcblxuICBAbWV0aG9kIHJhY2VcbiAgQHN0YXRpY1xuICBAcGFyYW0ge0FycmF5fSBwcm9taXNlcyBhcnJheSBvZiBwcm9taXNlcyB0byBvYnNlcnZlXG4gIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHdoaWNoIHNldHRsZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBmaXJzdCBwYXNzZWRcbiAgcHJvbWlzZSB0byBzZXR0bGUuXG4qL1xuZnVuY3Rpb24gcmFjZShlbnRyaWVzKSB7XG4gIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgaWYgKCFpc0FycmF5KGVudHJpZXMpKSB7XG4gICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbiAoXywgcmVqZWN0KSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4nKSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnJlc29sdmUoZW50cmllc1tpXSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICBgUHJvbWlzZS5yZWplY3RgIHJldHVybnMgYSBwcm9taXNlIHJlamVjdGVkIHdpdGggdGhlIHBhc3NlZCBgcmVhc29uYC5cbiAgSXQgaXMgc2hvcnRoYW5kIGZvciB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHJlamVjdChuZXcgRXJyb3IoJ1dIT09QUycpKTtcbiAgfSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCFcbiAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ1dIT09QUydcbiAgfSk7XG4gIGBgYFxuXG4gIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5IGJlY29tZXMgdGhlIGZvbGxvd2luZzpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdXSE9PUFMnKSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVjYXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCFcbiAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ1dIT09QUydcbiAgfSk7XG4gIGBgYFxuXG4gIEBtZXRob2QgcmVqZWN0XG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBbnl9IHJlYXNvbiB2YWx1ZSB0aGF0IHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aC5cbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCB0aGUgZ2l2ZW4gYHJlYXNvbmAuXG4qL1xuZnVuY3Rpb24gcmVqZWN0KHJlYXNvbikge1xuICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcbiAgX3JlamVjdChwcm9taXNlLCByZWFzb24pO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNSZXNvbHZlcigpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xufVxuXG5mdW5jdGlvbiBuZWVkc05ldygpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbn1cblxuLyoqXG4gIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gIFRlcm1pbm9sb2d5XG4gIC0tLS0tLS0tLS0tXG5cbiAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgQmFzaWMgVXNhZ2U6XG4gIC0tLS0tLS0tLS0tLVxuXG4gIGBgYGpzXG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgLy8gb24gc3VjY2Vzc1xuICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgLy8gb24gZmFpbHVyZVxuICAgIHJlamVjdChyZWFzb24pO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyBvbiBmdWxmaWxsbWVudFxuICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAvLyBvbiByZWplY3Rpb25cbiAgfSk7XG4gIGBgYFxuXG4gIEFkdmFuY2VkIFVzYWdlOlxuICAtLS0tLS0tLS0tLS0tLS1cblxuICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIC8vIG9uIHJlamVjdGlvblxuICB9KTtcbiAgYGBgXG5cbiAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICBgYGBqc1xuICBQcm9taXNlLmFsbChbXG4gICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9KTtcbiAgYGBgXG5cbiAgQGNsYXNzIFByb21pc2VcbiAgQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXJcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAY29uc3RydWN0b3JcbiovXG5mdW5jdGlvbiBQcm9taXNlKHJlc29sdmVyKSB7XG4gIHRoaXNbUFJPTUlTRV9JRF0gPSBuZXh0SWQoKTtcbiAgdGhpcy5fcmVzdWx0ID0gdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gIHRoaXMuX3N1YnNjcmliZXJzID0gW107XG5cbiAgaWYgKG5vb3AgIT09IHJlc29sdmVyKSB7XG4gICAgdHlwZW9mIHJlc29sdmVyICE9PSAnZnVuY3Rpb24nICYmIG5lZWRzUmVzb2x2ZXIoKTtcbiAgICB0aGlzIGluc3RhbmNlb2YgUHJvbWlzZSA/IGluaXRpYWxpemVQcm9taXNlKHRoaXMsIHJlc29sdmVyKSA6IG5lZWRzTmV3KCk7XG4gIH1cbn1cblxuUHJvbWlzZS5hbGwgPSBhbGw7XG5Qcm9taXNlLnJhY2UgPSByYWNlO1xuUHJvbWlzZS5yZXNvbHZlID0gcmVzb2x2ZTtcblByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuUHJvbWlzZS5fc2V0U2NoZWR1bGVyID0gc2V0U2NoZWR1bGVyO1xuUHJvbWlzZS5fc2V0QXNhcCA9IHNldEFzYXA7XG5Qcm9taXNlLl9hc2FwID0gYXNhcDtcblxuUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBQcm9taXNlLFxuXG4gIC8qKlxuICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLFxuICAgIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gICAgcmVhc29uIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuICBcbiAgICBgYGBqc1xuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAgIC8vIHVzZXIgaXMgYXZhaWxhYmxlXG4gICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIENoYWluaW5nXG4gICAgLS0tLS0tLS1cbiAgXG4gICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRoaXMgc2Vjb25kLCAnZG93bnN0cmVhbSdcbiAgICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gICAgb3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24uXG4gIFxuICAgIGBgYGpzXG4gICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICByZXR1cm4gdXNlci5uYW1lO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgICB9KS50aGVuKGZ1bmN0aW9uICh1c2VyTmFtZSkge1xuICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGB1c2VyTmFtZWAgd2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdFxuICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gICAgfSk7XG4gIFxuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAgIC8vIElmIGBmaW5kVXNlcmAgcmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknLlxuICAgIH0pO1xuICAgIGBgYFxuICAgIElmIHRoZSBkb3duc3RyZWFtIHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24gcmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLlxuICBcbiAgICBgYGBqc1xuICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgdGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAvLyBUaGUgYFBlZGdhZ29jaWFsRXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBBc3NpbWlsYXRpb25cbiAgICAtLS0tLS0tLS0tLS1cbiAgXG4gICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlXG4gICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmdcbiAgICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cbiAgXG4gICAgYGBganNcbiAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBJZiB0aGUgYXNzaW1saWF0ZWQgcHJvbWlzZSByZWplY3RzLCB0aGVuIHRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCBhbHNvIHJlamVjdC5cbiAgXG4gICAgYGBganNcbiAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZVxuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgICB9KTtcbiAgICBgYGBcbiAgXG4gICAgU2ltcGxlIEV4YW1wbGVcbiAgICAtLS0tLS0tLS0tLS0tLVxuICBcbiAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBsZXQgcmVzdWx0O1xuICBcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAvLyBmYWlsdXJlXG4gICAgfVxuICAgIGBgYFxuICBcbiAgICBFcnJiYWNrIEV4YW1wbGVcbiAgXG4gICAgYGBganNcbiAgICBmaW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfVxuICAgIH0pO1xuICAgIGBgYFxuICBcbiAgICBQcm9taXNlIEV4YW1wbGU7XG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAvLyBmYWlsdXJlXG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgICAtLS0tLS0tLS0tLS0tLVxuICBcbiAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG4gIFxuICAgIGBgYGphdmFzY3JpcHRcbiAgICBsZXQgYXV0aG9yLCBib29rcztcbiAgXG4gICAgdHJ5IHtcbiAgICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7XG4gICAgICAvLyBzdWNjZXNzXG4gICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgIC8vIGZhaWx1cmVcbiAgICB9XG4gICAgYGBgXG4gIFxuICAgIEVycmJhY2sgRXhhbXBsZVxuICBcbiAgICBgYGBqc1xuICBcbiAgICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG4gIFxuICAgIH1cbiAgXG4gICAgZnVuY3Rpb24gZmFpbHVyZShyZWFzb24pIHtcbiAgXG4gICAgfVxuICBcbiAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhvciwgZXJyKXtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIFByb21pc2UgRXhhbXBsZTtcbiAgXG4gICAgYGBgamF2YXNjcmlwdFxuICAgIGZpbmRBdXRob3IoKS5cbiAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLlxuICAgICAgdGhlbihmdW5jdGlvbihib29rcyl7XG4gICAgICAgIC8vIGZvdW5kIGJvb2tzXG4gICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEBtZXRob2QgdGhlblxuICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3RlZFxuICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuICB0aGVuOiB0aGVuLFxuXG4gIC8qKlxuICAgIGBjYXRjaGAgaXMgc2ltcGx5IHN1Z2FyIGZvciBgdGhlbih1bmRlZmluZWQsIG9uUmVqZWN0aW9uKWAgd2hpY2ggbWFrZXMgaXQgdGhlIHNhbWVcbiAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2YgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LlxuICBcbiAgICBgYGBqc1xuICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGRuJ3QgZmluZCB0aGF0IGF1dGhvcicpO1xuICAgIH1cbiAgXG4gICAgLy8gc3luY2hyb25vdXNcbiAgICB0cnkge1xuICAgICAgZmluZEF1dGhvcigpO1xuICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIH1cbiAgXG4gICAgLy8gYXN5bmMgd2l0aCBwcm9taXNlc1xuICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICB9KTtcbiAgICBgYGBcbiAgXG4gICAgQG1ldGhvZCBjYXRjaFxuICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uXG4gICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICovXG4gICdjYXRjaCc6IGZ1bmN0aW9uIF9jYXRjaChvblJlamVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgICB2YXIgbG9jYWwgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbG9jYWwgPSBnbG9iYWw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbG9jYWwgPSBzZWxmO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgUCA9IGxvY2FsLlByb21pc2U7XG5cbiAgICBpZiAoUCkge1xuICAgICAgICB2YXIgcHJvbWlzZVRvU3RyaW5nID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb21pc2VUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQLnJlc29sdmUoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlVG9TdHJpbmcgPT09ICdbb2JqZWN0IFByb21pc2VdJyAmJiAhUC5jYXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2NhbC5Qcm9taXNlID0gUHJvbWlzZTtcbn1cblxuLy8gU3RyYW5nZSBjb21wYXQuLlxuUHJvbWlzZS5wb2x5ZmlsbCA9IHBvbHlmaWxsO1xuUHJvbWlzZS5Qcm9taXNlID0gUHJvbWlzZTtcblxucmV0dXJuIFByb21pc2U7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lczYtcHJvbWlzZS5tYXBcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzXG4vLyBtb2R1bGUgaWQgPSA4MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIoZnVuY3Rpb24gKHNlbGYpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIGZldGNoUG9ueWZpbGwob3B0aW9ucykge1xuICAgIHZhciBQcm9taXNlID0gb3B0aW9ucyAmJiBvcHRpb25zLlByb21pc2UgfHwgc2VsZi5Qcm9taXNlO1xuICAgIHZhciBYTUxIdHRwUmVxdWVzdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5YTUxIdHRwUmVxdWVzdCB8fCBzZWxmLlhNTEh0dHBSZXF1ZXN0O1xuICAgIHZhciBnbG9iYWwgPSBzZWxmO1xuXG4gICAgcmV0dXJuIChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IE9iamVjdC5jcmVhdGUoZ2xvYmFsLCB7XG4gICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgKGZ1bmN0aW9uKHNlbGYpIHtcbiAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgICAgIGlmIChzZWxmLmZldGNoKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3VwcG9ydCA9IHtcbiAgICAgICAgICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIHNlbGYsXG4gICAgICAgICAgaXRlcmFibGU6ICdTeW1ib2wnIGluIHNlbGYgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gICAgICAgICAgYmxvYjogJ0ZpbGVSZWFkZXInIGluIHNlbGYgJiYgJ0Jsb2InIGluIHNlbGYgJiYgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgbmV3IEJsb2IoKVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgICAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gc2VsZixcbiAgICAgICAgICBhcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyBpbiBzZWxmXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAgICAgICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgICAgICAgJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgICAgICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgICAgICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgICAgICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICAgICAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICAgICAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICAgICAgICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICAgICAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICAgICAgICAgIF1cblxuICAgICAgICAgIHZhciBpc0RhdGFWaWV3ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPSBBcnJheUJ1ZmZlci5pc1ZpZXcgfHwgZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIHZpZXdDbGFzc2VzLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikpID4gLTFcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgvW15hLXowLTlcXC0jJCUmJyorLlxcXl9gfH5dL2kudGVzdChuYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUnKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuICAgICAgICBmdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpXG4gICAgICAgICAgICAgIHJldHVybiB7ZG9uZTogdmFsdWUgPT09IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgICAgICAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpdGVyYXRvclxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgICAgICAgdGhpcy5tYXAgPSB7fVxuXG4gICAgICAgICAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICAgICAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICAgICAgICAgIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV1cbiAgICAgICAgICB0aGlzLm1hcFtuYW1lXSA9IG9sZFZhbHVlID8gb2xkVmFsdWUrJywnK3ZhbHVlIDogdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIEhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV1cbiAgICAgICAgfVxuXG4gICAgICAgIEhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICAgICAgICAgIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB9XG5cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLm1hcCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBpdGVtcyA9IFtdXG4gICAgICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7IGl0ZW1zLnB1c2gobmFtZSkgfSlcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG4gICAgICAgIH1cblxuICAgICAgICBIZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgaXRlbXMgPSBbXVxuICAgICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBpdGVtcy5wdXNoKHZhbHVlKSB9KVxuICAgICAgICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgICAgICAgfVxuXG4gICAgICAgIEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgaXRlbXMgPSBbXVxuICAgICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkgeyBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pIH0pXG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICAgICAgICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY29uc3VtZWQoYm9keSkge1xuICAgICAgICAgIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJvZHkuYm9keVVzZWQgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gICAgICAgICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgICAgICAgICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYilcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICAgICAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICAgICAgICAgIHZhciBjaGFycyA9IG5ldyBBcnJheSh2aWV3Lmxlbmd0aClcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGFycy5qb2luKCcnKVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7XG4gICAgICAgICAgaWYgKGJ1Zi5zbGljZSkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICAgICAgICAgIHJldHVybiB2aWV3LmJ1ZmZlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIEJvZHkoKSB7XG4gICAgICAgICAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgICAgICAgICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICAgICAgICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keVxuICAgICAgICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gJydcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IgJiYgQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICAgICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICAgICAgICB0aGlzLl9ib2R5Rm9ybURhdGEgPSBib2R5XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIHN1cHBvcnQuYmxvYiAmJiBpc0RhdGFWaWV3KGJvZHkpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgICAgICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgICAgICAgICB0aGlzLl9ib2R5SW5pdCA9IG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgQm9keUluaXQgdHlwZScpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgICAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgICAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lZCh0aGlzKSB8fCBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgICAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZWFkQmxvYkFzVGV4dCh0aGlzLl9ib2R5QmxvYilcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVhZEFycmF5QnVmZmVyQXNUZXh0KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxuICAgICAgICB2YXIgbWV0aG9kcyA9IFsnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUE9TVCcsICdQVVQnXVxuXG4gICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgICAgICAgICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgcmV0dXJuIChtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSkgPyB1cGNhc2VkIDogbWV0aG9kXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICAgICAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LmJvZHlVc2VkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVybCA9IGlucHV0LnVybFxuICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2RcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGVcbiAgICAgICAgICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICAgICAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdvbWl0J1xuICAgICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJylcbiAgICAgICAgICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgICAgICAgICB0aGlzLnJlZmVycmVyID0gbnVsbFxuXG4gICAgICAgICAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9pbml0Qm9keShib2R5KVxuICAgICAgICB9XG5cbiAgICAgICAgUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywgeyBib2R5OiB0aGlzLl9ib2R5SW5pdCB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgICAgICAgICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgICAgYm9keS50cmltKCkuc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKVxuICAgICAgICAgICAgICB2YXIgbmFtZSA9IHNwbGl0LnNoaWZ0KCkucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgICAgICAgIGZvcm0uYXBwZW5kKGRlY29kZVVSSUNvbXBvbmVudChuYW1lKSwgZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiBmb3JtXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwYXJzZUhlYWRlcnMocmF3SGVhZGVycykge1xuICAgICAgICAgIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAgICAgICAgIHJhd0hlYWRlcnMuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKVxuICAgICAgICAgICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpXG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKClcbiAgICAgICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiBoZWFkZXJzXG4gICAgICAgIH1cblxuICAgICAgICBCb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpXG5cbiAgICAgICAgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ3N0YXR1cycgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc3RhdHVzIDogMjAwXG4gICAgICAgICAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMFxuICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dCA9ICdzdGF0dXNUZXh0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5zdGF0dXNUZXh0IDogJ09LJ1xuICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgICAgICAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnXG4gICAgICAgICAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG4gICAgICAgIH1cblxuICAgICAgICBCb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKVxuXG4gICAgICAgIFJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBSZXNwb25zZS5lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAwLCBzdGF0dXNUZXh0OiAnJ30pXG4gICAgICAgICAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcidcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG4gICAgICAgIFJlc3BvbnNlLnJlZGlyZWN0ID0gZnVuY3Rpb24odXJsLCBzdGF0dXMpIHtcbiAgICAgICAgICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBzdGF0dXMgY29kZScpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLkhlYWRlcnMgPSBIZWFkZXJzXG4gICAgICAgIHNlbGYuUmVxdWVzdCA9IFJlcXVlc3RcbiAgICAgICAgc2VsZi5SZXNwb25zZSA9IFJlc3BvbnNlXG5cbiAgICAgICAgc2VsZi5mZXRjaCA9IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcbiAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJylcbiAgICAgICAgICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeGhyLm9wZW4ocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QudXJsLCB0cnVlKVxuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICAgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIgJiYgc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB4aHIuc2VuZCh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHJlcXVlc3QuX2JvZHlJbml0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5mZXRjaC5wb2x5ZmlsbCA9IHRydWVcbiAgICAgIH0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzKTtcblxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmZXRjaDogc2VsZi5mZXRjaCxcbiAgICAgICAgSGVhZGVyczogc2VsZi5IZWFkZXJzLFxuICAgICAgICBSZXF1ZXN0OiBzZWxmLlJlcXVlc3QsXG4gICAgICAgIFJlc3BvbnNlOiBzZWxmLlJlc3BvbnNlXG4gICAgICB9O1xuICAgIH0oKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmZXRjaFBvbnlmaWxsO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmV0Y2hQb255ZmlsbDtcbiAgfSBlbHNlIHtcbiAgICBzZWxmLmZldGNoUG9ueWZpbGwgPSBmZXRjaFBvbnlmaWxsO1xuICB9XG59KHR5cGVvZiBzZWxmID09PSAndW5kZWZpbmVkJyA/IHRoaXMgOiBzZWxmKSk7XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9mZXRjaC1wb255ZmlsbC9idWlsZC9mZXRjaC1icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9pZWVlNzU0L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9pc2FycmF5L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIganNvbiA9IHR5cGVvZiBKU09OICE9PSAndW5kZWZpbmVkJyA/IEpTT04gOiByZXF1aXJlKCdqc29uaWZ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuICAgIGlmICghb3B0cykgb3B0cyA9IHt9O1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgb3B0cyA9IHsgY21wOiBvcHRzIH07XG4gICAgdmFyIHNwYWNlID0gb3B0cy5zcGFjZSB8fCAnJztcbiAgICBpZiAodHlwZW9mIHNwYWNlID09PSAnbnVtYmVyJykgc3BhY2UgPSBBcnJheShzcGFjZSsxKS5qb2luKCcgJyk7XG4gICAgdmFyIGN5Y2xlcyA9ICh0eXBlb2Ygb3B0cy5jeWNsZXMgPT09ICdib29sZWFuJykgPyBvcHRzLmN5Y2xlcyA6IGZhbHNlO1xuICAgIHZhciByZXBsYWNlciA9IG9wdHMucmVwbGFjZXIgfHwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiAgICB2YXIgY21wID0gb3B0cy5jbXAgJiYgKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFvYmogPSB7IGtleTogYSwgdmFsdWU6IG5vZGVbYV0gfTtcbiAgICAgICAgICAgICAgICB2YXIgYm9iaiA9IHsga2V5OiBiLCB2YWx1ZTogbm9kZVtiXSB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBmKGFvYmosIGJvYmopO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9KShvcHRzLmNtcCk7XG5cbiAgICB2YXIgc2VlbiA9IFtdO1xuICAgIHJldHVybiAoZnVuY3Rpb24gc3RyaW5naWZ5IChwYXJlbnQsIGtleSwgbm9kZSwgbGV2ZWwpIHtcbiAgICAgICAgdmFyIGluZGVudCA9IHNwYWNlID8gKCdcXG4nICsgbmV3IEFycmF5KGxldmVsICsgMSkuam9pbihzcGFjZSkpIDogJyc7XG4gICAgICAgIHZhciBjb2xvblNlcGFyYXRvciA9IHNwYWNlID8gJzogJyA6ICc6JztcblxuICAgICAgICBpZiAobm9kZSAmJiBub2RlLnRvSlNPTiAmJiB0eXBlb2Ygbm9kZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnRvSlNPTigpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IHJlcGxhY2VyLmNhbGwocGFyZW50LCBrZXksIG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8IG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBqc29uLnN0cmluZ2lmeShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBzdHJpbmdpZnkobm9kZSwgaSwgbm9kZVtpXSwgbGV2ZWwrMSkgfHwganNvbi5zdHJpbmdpZnkobnVsbCk7XG4gICAgICAgICAgICAgICAgb3V0LnB1c2goaW5kZW50ICsgc3BhY2UgKyBpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnWycgKyBvdXQuam9pbignLCcpICsgaW5kZW50ICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlZW4uaW5kZXhPZihub2RlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3ljbGVzKSByZXR1cm4ganNvbi5zdHJpbmdpZnkoJ19fY3ljbGVfXycpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Ugc2Vlbi5wdXNoKG5vZGUpO1xuXG4gICAgICAgICAgICB2YXIga2V5cyA9IG9iamVjdEtleXMobm9kZSkuc29ydChjbXAgJiYgY21wKG5vZGUpKTtcbiAgICAgICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN0cmluZ2lmeShub2RlLCBrZXksIG5vZGVba2V5XSwgbGV2ZWwrMSk7XG5cbiAgICAgICAgICAgICAgICBpZighdmFsdWUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgdmFyIGtleVZhbHVlID0ganNvbi5zdHJpbmdpZnkoa2V5KVxuICAgICAgICAgICAgICAgICAgICArIGNvbG9uU2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIG91dC5wdXNoKGluZGVudCArIHNwYWNlICsga2V5VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2Vlbi5zcGxpY2Uoc2Vlbi5pbmRleE9mKG5vZGUpLCAxKTtcbiAgICAgICAgICAgIHJldHVybiAneycgKyBvdXQuam9pbignLCcpICsgaW5kZW50ICsgJ30nO1xuICAgICAgICB9XG4gICAgfSkoeyAnJzogb2JqIH0sICcnLCBvYmosIDApO1xufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIHt9LnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlIH07XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChoYXMuY2FsbChvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanNvbi1zdGFibGUtc3RyaW5naWZ5L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9saWIvcGFyc2UnKTtcbmV4cG9ydHMuc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9saWIvc3RyaW5naWZ5Jyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanNvbmlmeS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gODZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGF0LCAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyXG4gICAgY2gsIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlclxuICAgIGVzY2FwZWUgPSB7XG4gICAgICAgICdcIic6ICAnXCInLFxuICAgICAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICAgICAgJy8nOiAgJy8nLFxuICAgICAgICBiOiAgICAnXFxiJyxcbiAgICAgICAgZjogICAgJ1xcZicsXG4gICAgICAgIG46ICAgICdcXG4nLFxuICAgICAgICByOiAgICAnXFxyJyxcbiAgICAgICAgdDogICAgJ1xcdCdcbiAgICB9LFxuICAgIHRleHQsXG5cbiAgICBlcnJvciA9IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIC8vIENhbGwgZXJyb3Igd2hlbiBzb21ldGhpbmcgaXMgd3JvbmcuXG4gICAgICAgIHRocm93IHtcbiAgICAgICAgICAgIG5hbWU6ICAgICdTeW50YXhFcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiBtLFxuICAgICAgICAgICAgYXQ6ICAgICAgYXQsXG4gICAgICAgICAgICB0ZXh0OiAgICB0ZXh0XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBcbiAgICBuZXh0ID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgLy8gSWYgYSBjIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgdmVyaWZ5IHRoYXQgaXQgbWF0Y2hlcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIuXG4gICAgICAgIGlmIChjICYmIGMgIT09IGNoKSB7XG4gICAgICAgICAgICBlcnJvcihcIkV4cGVjdGVkICdcIiArIGMgKyBcIicgaW5zdGVhZCBvZiAnXCIgKyBjaCArIFwiJ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3Rlci4gV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjaGFyYWN0ZXJzLFxuICAgICAgICAvLyByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgICAgXG4gICAgICAgIGNoID0gdGV4dC5jaGFyQXQoYXQpO1xuICAgICAgICBhdCArPSAxO1xuICAgICAgICByZXR1cm4gY2g7XG4gICAgfSxcbiAgICBcbiAgICBudW1iZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFBhcnNlIGEgbnVtYmVyIHZhbHVlLlxuICAgICAgICB2YXIgbnVtYmVyLFxuICAgICAgICAgICAgc3RyaW5nID0gJyc7XG4gICAgICAgIFxuICAgICAgICBpZiAoY2ggPT09ICctJykge1xuICAgICAgICAgICAgc3RyaW5nID0gJy0nO1xuICAgICAgICAgICAgbmV4dCgnLScpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7XG4gICAgICAgICAgICBzdHJpbmcgKz0gY2g7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIHN0cmluZyArPSAnLic7XG4gICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHtcbiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoID09PSAnZScgfHwgY2ggPT09ICdFJykge1xuICAgICAgICAgICAgc3RyaW5nICs9IGNoO1xuICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDtcbiAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykge1xuICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDtcbiAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbnVtYmVyID0gK3N0cmluZztcbiAgICAgICAgaWYgKCFpc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgICAgICBlcnJvcihcIkJhZCBudW1iZXJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBcbiAgICBzdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFBhcnNlIGEgc3RyaW5nIHZhbHVlLlxuICAgICAgICB2YXIgaGV4LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHN0cmluZyA9ICcnLFxuICAgICAgICAgICAgdWZmZmY7XG4gICAgICAgIFxuICAgICAgICAvLyBXaGVuIHBhcnNpbmcgZm9yIHN0cmluZyB2YWx1ZXMsIHdlIG11c3QgbG9vayBmb3IgXCIgYW5kIFxcIGNoYXJhY3RlcnMuXG4gICAgICAgIGlmIChjaCA9PT0gJ1wiJykge1xuICAgICAgICAgICAgd2hpbGUgKG5leHQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAndScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSBwYXJzZUludChuZXh0KCksIDE2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGhleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gdWZmZmYgKiAxNiArIGhleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVmZmZmKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXNjYXBlZVtjaF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gZXNjYXBlZVtjaF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IoXCJCYWQgc3RyaW5nXCIpO1xuICAgIH0sXG5cbiAgICB3aGl0ZSA9IGZ1bmN0aW9uICgpIHtcblxuLy8gU2tpcCB3aGl0ZXNwYWNlLlxuXG4gICAgICAgIHdoaWxlIChjaCAmJiBjaCA8PSAnICcpIHtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB3b3JkID0gZnVuY3Rpb24gKCkge1xuXG4vLyB0cnVlLCBmYWxzZSwgb3IgbnVsbC5cblxuICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgbmV4dCgndCcpO1xuICAgICAgICAgICAgbmV4dCgncicpO1xuICAgICAgICAgICAgbmV4dCgndScpO1xuICAgICAgICAgICAgbmV4dCgnZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2YnOlxuICAgICAgICAgICAgbmV4dCgnZicpO1xuICAgICAgICAgICAgbmV4dCgnYScpO1xuICAgICAgICAgICAgbmV4dCgnbCcpO1xuICAgICAgICAgICAgbmV4dCgncycpO1xuICAgICAgICAgICAgbmV4dCgnZScpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjYXNlICduJzpcbiAgICAgICAgICAgIG5leHQoJ24nKTtcbiAgICAgICAgICAgIG5leHQoJ3UnKTtcbiAgICAgICAgICAgIG5leHQoJ2wnKTtcbiAgICAgICAgICAgIG5leHQoJ2wnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yKFwiVW5leHBlY3RlZCAnXCIgKyBjaCArIFwiJ1wiKTtcbiAgICB9LFxuXG4gICAgdmFsdWUsICAvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSB2YWx1ZSBmdW5jdGlvbi5cblxuICAgIGFycmF5ID0gZnVuY3Rpb24gKCkge1xuXG4vLyBQYXJzZSBhbiBhcnJheSB2YWx1ZS5cblxuICAgICAgICB2YXIgYXJyYXkgPSBbXTtcblxuICAgICAgICBpZiAoY2ggPT09ICdbJykge1xuICAgICAgICAgICAgbmV4dCgnWycpO1xuICAgICAgICAgICAgd2hpdGUoKTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgbmV4dCgnXScpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsgICAvLyBlbXB0eSBhcnJheVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNoKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB3aGl0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0KCcsJyk7XG4gICAgICAgICAgICAgICAgd2hpdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlcnJvcihcIkJhZCBhcnJheVwiKTtcbiAgICB9LFxuXG4gICAgb2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuXG4vLyBQYXJzZSBhbiBvYmplY3QgdmFsdWUuXG5cbiAgICAgICAgdmFyIGtleSxcbiAgICAgICAgICAgIG9iamVjdCA9IHt9O1xuXG4gICAgICAgIGlmIChjaCA9PT0gJ3snKSB7XG4gICAgICAgICAgICBuZXh0KCd7Jyk7XG4gICAgICAgICAgICB3aGl0ZSgpO1xuICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHtcbiAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsgICAvLyBlbXB0eSBvYmplY3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjaCkge1xuICAgICAgICAgICAgICAgIGtleSA9IHN0cmluZygpO1xuICAgICAgICAgICAgICAgIHdoaXRlKCk7XG4gICAgICAgICAgICAgICAgbmV4dCgnOicpO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgXCInICsga2V5ICsgJ1wiJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUoKTtcbiAgICAgICAgICAgICAgICB3aGl0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoJ30nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV4dCgnLCcpO1xuICAgICAgICAgICAgICAgIHdoaXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IoXCJCYWQgb2JqZWN0XCIpO1xuICAgIH07XG5cbnZhbHVlID0gZnVuY3Rpb24gKCkge1xuXG4vLyBQYXJzZSBhIEpTT04gdmFsdWUuIEl0IGNvdWxkIGJlIGFuIG9iamVjdCwgYW4gYXJyYXksIGEgc3RyaW5nLCBhIG51bWJlcixcbi8vIG9yIGEgd29yZC5cblxuICAgIHdoaXRlKCk7XG4gICAgc3dpdGNoIChjaCkge1xuICAgIGNhc2UgJ3snOlxuICAgICAgICByZXR1cm4gb2JqZWN0KCk7XG4gICAgY2FzZSAnWyc6XG4gICAgICAgIHJldHVybiBhcnJheSgpO1xuICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgcmV0dXJuIHN0cmluZygpO1xuICAgIGNhc2UgJy0nOlxuICAgICAgICByZXR1cm4gbnVtYmVyKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOScgPyBudW1iZXIoKSA6IHdvcmQoKTtcbiAgICB9XG59O1xuXG4vLyBSZXR1cm4gdGhlIGpzb25fcGFyc2UgZnVuY3Rpb24uIEl0IHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBhYm92ZVxuLy8gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNvdXJjZSwgcmV2aXZlcikge1xuICAgIHZhciByZXN1bHQ7XG4gICAgXG4gICAgdGV4dCA9IHNvdXJjZTtcbiAgICBhdCA9IDA7XG4gICAgY2ggPSAnICc7XG4gICAgcmVzdWx0ID0gdmFsdWUoKTtcbiAgICB3aGl0ZSgpO1xuICAgIGlmIChjaCkge1xuICAgICAgICBlcnJvcihcIlN5bnRheCBlcnJvclwiKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHJldml2ZXIgZnVuY3Rpb24sIHdlIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlIG5ldyBzdHJ1Y3R1cmUsXG4gICAgLy8gcGFzc2luZyBlYWNoIG5hbWUvdmFsdWUgcGFpciB0byB0aGUgcmV2aXZlciBmdW5jdGlvbiBmb3IgcG9zc2libGVcbiAgICAvLyB0cmFuc2Zvcm1hdGlvbiwgc3RhcnRpbmcgd2l0aCBhIHRlbXBvcmFyeSByb290IG9iamVjdCB0aGF0IGhvbGRzIHRoZSByZXN1bHRcbiAgICAvLyBpbiBhbiBlbXB0eSBrZXkuIElmIHRoZXJlIGlzIG5vdCBhIHJldml2ZXIgZnVuY3Rpb24sIHdlIHNpbXBseSByZXR1cm4gdGhlXG4gICAgLy8gcmVzdWx0LlxuXG4gICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nID8gKGZ1bmN0aW9uIHdhbGsoaG9sZGVyLCBrZXkpIHtcbiAgICAgICAgdmFyIGssIHYsIHZhbHVlID0gaG9sZGVyW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGsgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gd2Fsayh2YWx1ZSwgayk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW2tdID0gdjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtrXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV2aXZlci5jYWxsKGhvbGRlciwga2V5LCB2YWx1ZSk7XG4gICAgfSh7Jyc6IHJlc3VsdH0sICcnKSkgOiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pzb25pZnkvbGliL3BhcnNlLmpzXG4vLyBtb2R1bGUgaWQgPSA4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY3ggPSAvW1xcdTAwMDBcXHUwMGFkXFx1MDYwMC1cXHUwNjA0XFx1MDcwZlxcdTE3YjRcXHUxN2I1XFx1MjAwYy1cXHUyMDBmXFx1MjAyOC1cXHUyMDJmXFx1MjA2MC1cXHUyMDZmXFx1ZmVmZlxcdWZmZjAtXFx1ZmZmZl0vZyxcbiAgICBlc2NhcGFibGUgPSAvW1xcXFxcXFwiXFx4MDAtXFx4MWZcXHg3Zi1cXHg5ZlxcdTAwYWRcXHUwNjAwLVxcdTA2MDRcXHUwNzBmXFx1MTdiNFxcdTE3YjVcXHUyMDBjLVxcdTIwMGZcXHUyMDI4LVxcdTIwMmZcXHUyMDYwLVxcdTIwNmZcXHVmZWZmXFx1ZmZmMC1cXHVmZmZmXS9nLFxuICAgIGdhcCxcbiAgICBpbmRlbnQsXG4gICAgbWV0YSA9IHsgICAgLy8gdGFibGUgb2YgY2hhcmFjdGVyIHN1YnN0aXR1dGlvbnNcbiAgICAgICAgJ1xcYic6ICdcXFxcYicsXG4gICAgICAgICdcXHQnOiAnXFxcXHQnLFxuICAgICAgICAnXFxuJzogJ1xcXFxuJyxcbiAgICAgICAgJ1xcZic6ICdcXFxcZicsXG4gICAgICAgICdcXHInOiAnXFxcXHInLFxuICAgICAgICAnXCInIDogJ1xcXFxcIicsXG4gICAgICAgICdcXFxcJzogJ1xcXFxcXFxcJ1xuICAgIH0sXG4gICAgcmVwO1xuXG5mdW5jdGlvbiBxdW90ZShzdHJpbmcpIHtcbiAgICAvLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbnRyb2wgY2hhcmFjdGVycywgbm8gcXVvdGUgY2hhcmFjdGVycywgYW5kIG5vXG4gICAgLy8gYmFja3NsYXNoIGNoYXJhY3RlcnMsIHRoZW4gd2UgY2FuIHNhZmVseSBzbGFwIHNvbWUgcXVvdGVzIGFyb3VuZCBpdC5cbiAgICAvLyBPdGhlcndpc2Ugd2UgbXVzdCBhbHNvIHJlcGxhY2UgdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXJzIHdpdGggc2FmZSBlc2NhcGVcbiAgICAvLyBzZXF1ZW5jZXMuXG4gICAgXG4gICAgZXNjYXBhYmxlLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIGVzY2FwYWJsZS50ZXN0KHN0cmluZykgPyAnXCInICsgc3RyaW5nLnJlcGxhY2UoZXNjYXBhYmxlLCBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgYyA9IG1ldGFbYV07XG4gICAgICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDpcbiAgICAgICAgICAgICdcXFxcdScgKyAoJzAwMDAnICsgYS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpO1xuICAgIH0pICsgJ1wiJyA6ICdcIicgKyBzdHJpbmcgKyAnXCInO1xufVxuXG5mdW5jdGlvbiBzdHIoa2V5LCBob2xkZXIpIHtcbiAgICAvLyBQcm9kdWNlIGEgc3RyaW5nIGZyb20gaG9sZGVyW2tleV0uXG4gICAgdmFyIGksICAgICAgICAgIC8vIFRoZSBsb29wIGNvdW50ZXIuXG4gICAgICAgIGssICAgICAgICAgIC8vIFRoZSBtZW1iZXIga2V5LlxuICAgICAgICB2LCAgICAgICAgICAvLyBUaGUgbWVtYmVyIHZhbHVlLlxuICAgICAgICBsZW5ndGgsXG4gICAgICAgIG1pbmQgPSBnYXAsXG4gICAgICAgIHBhcnRpYWwsXG4gICAgICAgIHZhbHVlID0gaG9sZGVyW2tleV07XG4gICAgXG4gICAgLy8gSWYgdGhlIHZhbHVlIGhhcyBhIHRvSlNPTiBtZXRob2QsIGNhbGwgaXQgdG8gb2J0YWluIGEgcmVwbGFjZW1lbnQgdmFsdWUuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0pTT04oa2V5KTtcbiAgICB9XG4gICAgXG4gICAgLy8gSWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBhIHJlcGxhY2VyIGZ1bmN0aW9uLCB0aGVuIGNhbGwgdGhlIHJlcGxhY2VyIHRvXG4gICAgLy8gb2J0YWluIGEgcmVwbGFjZW1lbnQgdmFsdWUuXG4gICAgaWYgKHR5cGVvZiByZXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSByZXAuY2FsbChob2xkZXIsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBXaGF0IGhhcHBlbnMgbmV4dCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSdzIHR5cGUuXG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBxdW90ZSh2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgLy8gSlNPTiBudW1iZXJzIG11c3QgYmUgZmluaXRlLiBFbmNvZGUgbm9uLWZpbml0ZSBudW1iZXJzIGFzIG51bGwuXG4gICAgICAgICAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6ICdudWxsJztcbiAgICAgICAgXG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICBjYXNlICdudWxsJzpcbiAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBhIGJvb2xlYW4gb3IgbnVsbCwgY29udmVydCBpdCB0byBhIHN0cmluZy4gTm90ZTpcbiAgICAgICAgICAgIC8vIHR5cGVvZiBudWxsIGRvZXMgbm90IHByb2R1Y2UgJ251bGwnLiBUaGUgY2FzZSBpcyBpbmNsdWRlZCBoZXJlIGluXG4gICAgICAgICAgICAvLyB0aGUgcmVtb3RlIGNoYW5jZSB0aGF0IHRoaXMgZ2V0cyBmaXhlZCBzb21lZGF5LlxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgICBnYXAgKz0gaW5kZW50O1xuICAgICAgICAgICAgcGFydGlhbCA9IFtdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgICAgICAgICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxbaV0gPSBzdHIoaSwgdmFsdWUpIHx8ICdudWxsJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSm9pbiBhbGwgb2YgdGhlIGVsZW1lbnRzIHRvZ2V0aGVyLCBzZXBhcmF0ZWQgd2l0aCBjb21tYXMsIGFuZFxuICAgICAgICAgICAgICAgIC8vIHdyYXAgdGhlbSBpbiBicmFja2V0cy5cbiAgICAgICAgICAgICAgICB2ID0gcGFydGlhbC5sZW5ndGggPT09IDAgPyAnW10nIDogZ2FwID9cbiAgICAgICAgICAgICAgICAgICAgJ1tcXG4nICsgZ2FwICsgcGFydGlhbC5qb2luKCcsXFxuJyArIGdhcCkgKyAnXFxuJyArIG1pbmQgKyAnXScgOlxuICAgICAgICAgICAgICAgICAgICAnWycgKyBwYXJ0aWFsLmpvaW4oJywnKSArICddJztcbiAgICAgICAgICAgICAgICBnYXAgPSBtaW5kO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVwbGFjZXIgaXMgYW4gYXJyYXksIHVzZSBpdCB0byBzZWxlY3QgdGhlIG1lbWJlcnMgdG8gYmVcbiAgICAgICAgICAgIC8vIHN0cmluZ2lmaWVkLlxuICAgICAgICAgICAgaWYgKHJlcCAmJiB0eXBlb2YgcmVwID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJlcC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGsgPSByZXBbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBzdHIoaywgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsLnB1c2gocXVvdGUoaykgKyAoZ2FwID8gJzogJyA6ICc6JykgKyB2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUga2V5cyBpbiB0aGUgb2JqZWN0LlxuICAgICAgICAgICAgICAgIGZvciAoayBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHN0cihrLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWwucHVzaChxdW90ZShrKSArIChnYXAgPyAnOiAnIDogJzonKSArIHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIC8vIEpvaW4gYWxsIG9mIHRoZSBtZW1iZXIgdGV4dHMgdG9nZXRoZXIsIHNlcGFyYXRlZCB3aXRoIGNvbW1hcyxcbiAgICAgICAgLy8gYW5kIHdyYXAgdGhlbSBpbiBicmFjZXMuXG5cbiAgICAgICAgdiA9IHBhcnRpYWwubGVuZ3RoID09PSAwID8gJ3t9JyA6IGdhcCA/XG4gICAgICAgICAgICAne1xcbicgKyBnYXAgKyBwYXJ0aWFsLmpvaW4oJyxcXG4nICsgZ2FwKSArICdcXG4nICsgbWluZCArICd9JyA6XG4gICAgICAgICAgICAneycgKyBwYXJ0aWFsLmpvaW4oJywnKSArICd9JztcbiAgICAgICAgZ2FwID0gbWluZDtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlKSB7XG4gICAgdmFyIGk7XG4gICAgZ2FwID0gJyc7XG4gICAgaW5kZW50ID0gJyc7XG4gICAgXG4gICAgLy8gSWYgdGhlIHNwYWNlIHBhcmFtZXRlciBpcyBhIG51bWJlciwgbWFrZSBhbiBpbmRlbnQgc3RyaW5nIGNvbnRhaW5pbmcgdGhhdFxuICAgIC8vIG1hbnkgc3BhY2VzLlxuICAgIGlmICh0eXBlb2Ygc3BhY2UgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGFjZTsgaSArPSAxKSB7XG4gICAgICAgICAgICBpbmRlbnQgKz0gJyAnO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRoZSBzcGFjZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5kZW50IHN0cmluZy5cbiAgICBlbHNlIGlmICh0eXBlb2Ygc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGluZGVudCA9IHNwYWNlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIGEgcmVwbGFjZXIsIGl0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBhcnJheS5cbiAgICAvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yLlxuICAgIHJlcCA9IHJlcGxhY2VyO1xuICAgIGlmIChyZXBsYWNlciAmJiB0eXBlb2YgcmVwbGFjZXIgIT09ICdmdW5jdGlvbidcbiAgICAmJiAodHlwZW9mIHJlcGxhY2VyICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgcmVwbGFjZXIubGVuZ3RoICE9PSAnbnVtYmVyJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdKU09OLnN0cmluZ2lmeScpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNYWtlIGEgZmFrZSByb290IG9iamVjdCBjb250YWluaW5nIG91ciB2YWx1ZSB1bmRlciB0aGUga2V5IG9mICcnLlxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHN0cmluZ2lmeWluZyB0aGUgdmFsdWUuXG4gICAgcmV0dXJuIHN0cignJywgeycnOiB2YWx1ZX0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9qc29uaWZ5L2xpYi9zdHJpbmdpZnkuanNcbi8vIG1vZHVsZSBpZCA9IDg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vb2JqZWN0LWFzc2lnbi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cmljdFVyaUVuY29kZSA9IHJlcXVpcmUoJ3N0cmljdC11cmktZW5jb2RlJyk7XG52YXIgb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG5mdW5jdGlvbiBlbmNvZGVyRm9yQXJyYXlGb3JtYXQob3B0cykge1xuXHRzd2l0Y2ggKG9wdHMuYXJyYXlGb3JtYXQpIHtcblx0XHRjYXNlICdpbmRleCc6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGluZGV4KSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IFtcblx0XHRcdFx0XHRlbmNvZGUoa2V5LCBvcHRzKSxcblx0XHRcdFx0XHQnWycsXG5cdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0J10nXG5cdFx0XHRcdF0uam9pbignJykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0J1snLFxuXHRcdFx0XHRcdGVuY29kZShpbmRleCwgb3B0cyksXG5cdFx0XHRcdFx0J109Jyxcblx0XHRcdFx0XHRlbmNvZGUodmFsdWUsIG9wdHMpXG5cdFx0XHRcdF0uam9pbignJyk7XG5cdFx0XHR9O1xuXG5cdFx0Y2FzZSAnYnJhY2tldCc6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSBudWxsID8gZW5jb2RlKGtleSwgb3B0cykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0J1tdPScsXG5cdFx0XHRcdFx0ZW5jb2RlKHZhbHVlLCBvcHRzKVxuXHRcdFx0XHRdLmpvaW4oJycpO1xuXHRcdFx0fTtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSBudWxsID8gZW5jb2RlKGtleSwgb3B0cykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0Jz0nLFxuXHRcdFx0XHRcdGVuY29kZSh2YWx1ZSwgb3B0cylcblx0XHRcdFx0XS5qb2luKCcnKTtcblx0XHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gcGFyc2VyRm9yQXJyYXlGb3JtYXQob3B0cykge1xuXHR2YXIgcmVzdWx0O1xuXG5cdHN3aXRjaCAob3B0cy5hcnJheUZvcm1hdCkge1xuXHRcdGNhc2UgJ2luZGV4Jzpcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcblx0XHRcdFx0cmVzdWx0ID0gL1xcWyhcXGQqKVxcXSQvLmV4ZWMoa2V5KTtcblxuXHRcdFx0XHRrZXkgPSBrZXkucmVwbGFjZSgvXFxbXFxkKlxcXSQvLCAnJyk7XG5cblx0XHRcdFx0aWYgKCFyZXN1bHQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gdmFsdWU7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGFjY3VtdWxhdG9yW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjY3VtdWxhdG9yW2tleV1bcmVzdWx0WzFdXSA9IHZhbHVlO1xuXHRcdFx0fTtcblxuXHRcdGNhc2UgJ2JyYWNrZXQnOlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikge1xuXHRcdFx0XHRyZXN1bHQgPSAvKFxcW1xcXSkkLy5leGVjKGtleSk7XG5cdFx0XHRcdGtleSA9IGtleS5yZXBsYWNlKC9cXFtcXF0kLywgJycpO1xuXG5cdFx0XHRcdGlmICghcmVzdWx0KSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gW3ZhbHVlXTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gW10uY29uY2F0KGFjY3VtdWxhdG9yW2tleV0sIHZhbHVlKTtcblx0XHRcdH07XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikge1xuXHRcdFx0XHRpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSBbXS5jb25jYXQoYWNjdW11bGF0b3Jba2V5XSwgdmFsdWUpO1xuXHRcdFx0fTtcblx0fVxufVxuXG5mdW5jdGlvbiBlbmNvZGUodmFsdWUsIG9wdHMpIHtcblx0aWYgKG9wdHMuZW5jb2RlKSB7XG5cdFx0cmV0dXJuIG9wdHMuc3RyaWN0ID8gc3RyaWN0VXJpRW5jb2RlKHZhbHVlKSA6IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGtleXNTb3J0ZXIoaW5wdXQpIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG5cdFx0cmV0dXJuIGlucHV0LnNvcnQoKTtcblx0fSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGtleXNTb3J0ZXIoT2JqZWN0LmtleXMoaW5wdXQpKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKGEpIC0gTnVtYmVyKGIpO1xuXHRcdH0pLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gaW5wdXRba2V5XTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBpbnB1dDtcbn1cblxuZXhwb3J0cy5leHRyYWN0ID0gZnVuY3Rpb24gKHN0cikge1xuXHRyZXR1cm4gc3RyLnNwbGl0KCc/JylbMV0gfHwgJyc7XG59O1xuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuXHRvcHRzID0gb2JqZWN0QXNzaWduKHthcnJheUZvcm1hdDogJ25vbmUnfSwgb3B0cyk7XG5cblx0dmFyIGZvcm1hdHRlciA9IHBhcnNlckZvckFycmF5Rm9ybWF0KG9wdHMpO1xuXG5cdC8vIENyZWF0ZSBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGVcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmcvaXNzdWVzLzQ3XG5cdHZhciByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5cdGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiByZXQ7XG5cdH1cblxuXHRzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoL14oXFw/fCN8JikvLCAnJyk7XG5cblx0aWYgKCFzdHIpIHtcblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0c3RyLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcblx0XHR2YXIgcGFydHMgPSBwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKS5zcGxpdCgnPScpO1xuXHRcdC8vIEZpcmVmb3ggKHByZSA0MCkgZGVjb2RlcyBgJTNEYCB0byBgPWBcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZy9wdWxsLzM3XG5cdFx0dmFyIGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0dmFyIHZhbCA9IHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0cy5qb2luKCc9JykgOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBtaXNzaW5nIGA9YCBzaG91bGQgYmUgYG51bGxgOlxuXHRcdC8vIGh0dHA6Ly93My5vcmcvVFIvMjAxMi9XRC11cmwtMjAxMjA1MjQvI2NvbGxlY3QtdXJsLXBhcmFtZXRlcnNcblx0XHR2YWwgPSB2YWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQodmFsKTtcblxuXHRcdGZvcm1hdHRlcihkZWNvZGVVUklDb21wb25lbnQoa2V5KSwgdmFsLCByZXQpO1xuXHR9KTtcblxuXHRyZXR1cm4gT2JqZWN0LmtleXMocmV0KS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGtleSkge1xuXHRcdHZhciB2YWwgPSByZXRba2V5XTtcblx0XHRpZiAoQm9vbGVhbih2YWwpICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRcdC8vIFNvcnQgb2JqZWN0IGtleXMsIG5vdCB2YWx1ZXNcblx0XHRcdHJlc3VsdFtrZXldID0ga2V5c1NvcnRlcih2YWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHRba2V5XSA9IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn07XG5cbmV4cG9ydHMuc3RyaW5naWZ5ID0gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuXHR2YXIgZGVmYXVsdHMgPSB7XG5cdFx0ZW5jb2RlOiB0cnVlLFxuXHRcdHN0cmljdDogdHJ1ZSxcblx0XHRhcnJheUZvcm1hdDogJ25vbmUnXG5cdH07XG5cblx0b3B0cyA9IG9iamVjdEFzc2lnbihkZWZhdWx0cywgb3B0cyk7XG5cblx0dmFyIGZvcm1hdHRlciA9IGVuY29kZXJGb3JBcnJheUZvcm1hdChvcHRzKTtcblxuXHRyZXR1cm4gb2JqID8gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0XHR2YXIgdmFsID0gb2JqW2tleV07XG5cblx0XHRpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHRpZiAodmFsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZW5jb2RlKGtleSwgb3B0cyk7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IFtdO1xuXG5cdFx0XHR2YWwuc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwyKSB7XG5cdFx0XHRcdGlmICh2YWwyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQucHVzaChmb3JtYXR0ZXIoa2V5LCB2YWwyLCByZXN1bHQubGVuZ3RoKSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5qb2luKCcmJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVuY29kZShrZXksIG9wdHMpICsgJz0nICsgZW5jb2RlKHZhbCwgb3B0cyk7XG5cdH0pLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuXHRcdHJldHVybiB4Lmxlbmd0aCA+IDA7XG5cdH0pLmpvaW4oJyYnKSA6ICcnO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9xdWVyeS1zdHJpbmcvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0cikge1xuXHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCkqXS9nLCBmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAnJScgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zdHJpY3QtdXJpLWVuY29kZS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gOTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiKGZ1bmN0aW9uKG5hY2wpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gUG9ydGVkIGluIDIwMTQgYnkgRG1pdHJ5IENoZXN0bnlraCBhbmQgRGV2aSBNYW5kaXJpLlxuLy8gUHVibGljIGRvbWFpbi5cbi8vXG4vLyBJbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGZyb20gVHdlZXROYUNsIHZlcnNpb24gMjAxNDA0MjcuXG4vLyBTZWUgZm9yIGRldGFpbHM6IGh0dHA6Ly90d2VldG5hY2wuY3IueXAudG8vXG5cbnZhciBnZiA9IGZ1bmN0aW9uKGluaXQpIHtcbiAgdmFyIGksIHIgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgaWYgKGluaXQpIGZvciAoaSA9IDA7IGkgPCBpbml0Lmxlbmd0aDsgaSsrKSByW2ldID0gaW5pdFtpXTtcbiAgcmV0dXJuIHI7XG59O1xuXG4vLyAgUGx1Z2dhYmxlLCBpbml0aWFsaXplZCBpbiBoaWdoLWxldmVsIEFQSSBiZWxvdy5cbnZhciByYW5kb21ieXRlcyA9IGZ1bmN0aW9uKC8qIHgsIG4gKi8pIHsgdGhyb3cgbmV3IEVycm9yKCdubyBQUk5HJyk7IH07XG5cbnZhciBfMCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbnZhciBfOSA9IG5ldyBVaW50OEFycmF5KDMyKTsgXzlbMF0gPSA5O1xuXG52YXIgZ2YwID0gZ2YoKSxcbiAgICBnZjEgPSBnZihbMV0pLFxuICAgIF8xMjE2NjUgPSBnZihbMHhkYjQxLCAxXSksXG4gICAgRCA9IGdmKFsweDc4YTMsIDB4MTM1OSwgMHg0ZGNhLCAweDc1ZWIsIDB4ZDhhYiwgMHg0MTQxLCAweDBhNGQsIDB4MDA3MCwgMHhlODk4LCAweDc3NzksIDB4NDA3OSwgMHg4Y2M3LCAweGZlNzMsIDB4MmI2ZiwgMHg2Y2VlLCAweDUyMDNdKSxcbiAgICBEMiA9IGdmKFsweGYxNTksIDB4MjZiMiwgMHg5Yjk0LCAweGViZDYsIDB4YjE1NiwgMHg4MjgzLCAweDE0OWEsIDB4MDBlMCwgMHhkMTMwLCAweGVlZjMsIDB4ODBmMiwgMHgxOThlLCAweGZjZTcsIDB4NTZkZiwgMHhkOWRjLCAweDI0MDZdKSxcbiAgICBYID0gZ2YoWzB4ZDUxYSwgMHg4ZjI1LCAweDJkNjAsIDB4Yzk1NiwgMHhhN2IyLCAweDk1MjUsIDB4Yzc2MCwgMHg2OTJjLCAweGRjNWMsIDB4ZmRkNiwgMHhlMjMxLCAweGMwYTQsIDB4NTNmZSwgMHhjZDZlLCAweDM2ZDMsIDB4MjE2OV0pLFxuICAgIFkgPSBnZihbMHg2NjU4LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2XSksXG4gICAgSSA9IGdmKFsweGEwYjAsIDB4NGEwZSwgMHgxYjI3LCAweGM0ZWUsIDB4ZTQ3OCwgMHhhZDJmLCAweDE4MDYsIDB4MmY0MywgMHhkN2E3LCAweDNkZmIsIDB4MDA5OSwgMHgyYjRkLCAweGRmMGIsIDB4NGZjMSwgMHgyNDgwLCAweDJiODNdKTtcblxuZnVuY3Rpb24gdHM2NCh4LCBpLCBoLCBsKSB7XG4gIHhbaV0gICA9IChoID4+IDI0KSAmIDB4ZmY7XG4gIHhbaSsxXSA9IChoID4+IDE2KSAmIDB4ZmY7XG4gIHhbaSsyXSA9IChoID4+ICA4KSAmIDB4ZmY7XG4gIHhbaSszXSA9IGggJiAweGZmO1xuICB4W2krNF0gPSAobCA+PiAyNCkgICYgMHhmZjtcbiAgeFtpKzVdID0gKGwgPj4gMTYpICAmIDB4ZmY7XG4gIHhbaSs2XSA9IChsID4+ICA4KSAgJiAweGZmO1xuICB4W2krN10gPSBsICYgMHhmZjtcbn1cblxuZnVuY3Rpb24gdm4oeCwgeGksIHksIHlpLCBuKSB7XG4gIHZhciBpLGQgPSAwO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBkIHw9IHhbeGkraV1eeVt5aStpXTtcbiAgcmV0dXJuICgxICYgKChkIC0gMSkgPj4+IDgpKSAtIDE7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b192ZXJpZnlfMTYoeCwgeGksIHksIHlpKSB7XG4gIHJldHVybiB2bih4LHhpLHkseWksMTYpO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fdmVyaWZ5XzMyKHgsIHhpLCB5LCB5aSkge1xuICByZXR1cm4gdm4oeCx4aSx5LHlpLDMyKTtcbn1cblxuZnVuY3Rpb24gY29yZV9zYWxzYTIwKG8sIHAsIGssIGMpIHtcbiAgdmFyIGowICA9IGNbIDBdICYgMHhmZiB8IChjWyAxXSAmIDB4ZmYpPDw4IHwgKGNbIDJdICYgMHhmZik8PDE2IHwgKGNbIDNdICYgMHhmZik8PDI0LFxuICAgICAgajEgID0ga1sgMF0gJiAweGZmIHwgKGtbIDFdICYgMHhmZik8PDggfCAoa1sgMl0gJiAweGZmKTw8MTYgfCAoa1sgM10gJiAweGZmKTw8MjQsXG4gICAgICBqMiAgPSBrWyA0XSAmIDB4ZmYgfCAoa1sgNV0gJiAweGZmKTw8OCB8IChrWyA2XSAmIDB4ZmYpPDwxNiB8IChrWyA3XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGozICA9IGtbIDhdICYgMHhmZiB8IChrWyA5XSAmIDB4ZmYpPDw4IHwgKGtbMTBdICYgMHhmZik8PDE2IHwgKGtbMTFdICYgMHhmZik8PDI0LFxuICAgICAgajQgID0ga1sxMl0gJiAweGZmIHwgKGtbMTNdICYgMHhmZik8PDggfCAoa1sxNF0gJiAweGZmKTw8MTYgfCAoa1sxNV0gJiAweGZmKTw8MjQsXG4gICAgICBqNSAgPSBjWyA0XSAmIDB4ZmYgfCAoY1sgNV0gJiAweGZmKTw8OCB8IChjWyA2XSAmIDB4ZmYpPDwxNiB8IChjWyA3XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo2ICA9IHBbIDBdICYgMHhmZiB8IChwWyAxXSAmIDB4ZmYpPDw4IHwgKHBbIDJdICYgMHhmZik8PDE2IHwgKHBbIDNdICYgMHhmZik8PDI0LFxuICAgICAgajcgID0gcFsgNF0gJiAweGZmIHwgKHBbIDVdICYgMHhmZik8PDggfCAocFsgNl0gJiAweGZmKTw8MTYgfCAocFsgN10gJiAweGZmKTw8MjQsXG4gICAgICBqOCAgPSBwWyA4XSAmIDB4ZmYgfCAocFsgOV0gJiAweGZmKTw8OCB8IChwWzEwXSAmIDB4ZmYpPDwxNiB8IChwWzExXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo5ICA9IHBbMTJdICYgMHhmZiB8IChwWzEzXSAmIDB4ZmYpPDw4IHwgKHBbMTRdICYgMHhmZik8PDE2IHwgKHBbMTVdICYgMHhmZik8PDI0LFxuICAgICAgajEwID0gY1sgOF0gJiAweGZmIHwgKGNbIDldICYgMHhmZik8PDggfCAoY1sxMF0gJiAweGZmKTw8MTYgfCAoY1sxMV0gJiAweGZmKTw8MjQsXG4gICAgICBqMTEgPSBrWzE2XSAmIDB4ZmYgfCAoa1sxN10gJiAweGZmKTw8OCB8IChrWzE4XSAmIDB4ZmYpPDwxNiB8IChrWzE5XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxMiA9IGtbMjBdICYgMHhmZiB8IChrWzIxXSAmIDB4ZmYpPDw4IHwgKGtbMjJdICYgMHhmZik8PDE2IHwgKGtbMjNdICYgMHhmZik8PDI0LFxuICAgICAgajEzID0ga1syNF0gJiAweGZmIHwgKGtbMjVdICYgMHhmZik8PDggfCAoa1syNl0gJiAweGZmKTw8MTYgfCAoa1syN10gJiAweGZmKTw8MjQsXG4gICAgICBqMTQgPSBrWzI4XSAmIDB4ZmYgfCAoa1syOV0gJiAweGZmKTw8OCB8IChrWzMwXSAmIDB4ZmYpPDwxNiB8IChrWzMxXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxNSA9IGNbMTJdICYgMHhmZiB8IChjWzEzXSAmIDB4ZmYpPDw4IHwgKGNbMTRdICYgMHhmZik8PDE2IHwgKGNbMTVdICYgMHhmZik8PDI0O1xuXG4gIHZhciB4MCA9IGowLCB4MSA9IGoxLCB4MiA9IGoyLCB4MyA9IGozLCB4NCA9IGo0LCB4NSA9IGo1LCB4NiA9IGo2LCB4NyA9IGo3LFxuICAgICAgeDggPSBqOCwgeDkgPSBqOSwgeDEwID0gajEwLCB4MTEgPSBqMTEsIHgxMiA9IGoxMiwgeDEzID0gajEzLCB4MTQgPSBqMTQsXG4gICAgICB4MTUgPSBqMTUsIHU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMDsgaSArPSAyKSB7XG4gICAgdSA9IHgwICsgeDEyIHwgMDtcbiAgICB4NCBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDQgKyB4MCB8IDA7XG4gICAgeDggXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg4ICsgeDQgfCAwO1xuICAgIHgxMiBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MTIgKyB4OCB8IDA7XG4gICAgeDAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4NSArIHgxIHwgMDtcbiAgICB4OSBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDkgKyB4NSB8IDA7XG4gICAgeDEzIF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4MTMgKyB4OSB8IDA7XG4gICAgeDEgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDEgKyB4MTMgfCAwO1xuICAgIHg1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDEwICsgeDYgfCAwO1xuICAgIHgxNCBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDE0ICsgeDEwIHwgMDtcbiAgICB4MiBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDIgKyB4MTQgfCAwO1xuICAgIHg2IF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHg2ICsgeDIgfCAwO1xuICAgIHgxMCBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxNSArIHgxMSB8IDA7XG4gICAgeDMgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgzICsgeDE1IHwgMDtcbiAgICB4NyBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDcgKyB4MyB8IDA7XG4gICAgeDExIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxMSArIHg3IHwgMDtcbiAgICB4MTUgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MCArIHgzIHwgMDtcbiAgICB4MSBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDEgKyB4MCB8IDA7XG4gICAgeDIgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgyICsgeDEgfCAwO1xuICAgIHgzIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgzICsgeDIgfCAwO1xuICAgIHgwIF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDUgKyB4NCB8IDA7XG4gICAgeDYgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHg2ICsgeDUgfCAwO1xuICAgIHg3IF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4NyArIHg2IHwgMDtcbiAgICB4NCBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4NCArIHg3IHwgMDtcbiAgICB4NSBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxMCArIHg5IHwgMDtcbiAgICB4MTEgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxMSArIHgxMCB8IDA7XG4gICAgeDggXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg4ICsgeDExIHwgMDtcbiAgICB4OSBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4OSArIHg4IHwgMDtcbiAgICB4MTAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MTUgKyB4MTQgfCAwO1xuICAgIHgxMiBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDEyICsgeDE1IHwgMDtcbiAgICB4MTMgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgxMyArIHgxMiB8IDA7XG4gICAgeDE0IF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxNCArIHgxMyB8IDA7XG4gICAgeDE1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG4gIH1cbiAgIHgwID0gIHgwICsgIGowIHwgMDtcbiAgIHgxID0gIHgxICsgIGoxIHwgMDtcbiAgIHgyID0gIHgyICsgIGoyIHwgMDtcbiAgIHgzID0gIHgzICsgIGozIHwgMDtcbiAgIHg0ID0gIHg0ICsgIGo0IHwgMDtcbiAgIHg1ID0gIHg1ICsgIGo1IHwgMDtcbiAgIHg2ID0gIHg2ICsgIGo2IHwgMDtcbiAgIHg3ID0gIHg3ICsgIGo3IHwgMDtcbiAgIHg4ID0gIHg4ICsgIGo4IHwgMDtcbiAgIHg5ID0gIHg5ICsgIGo5IHwgMDtcbiAgeDEwID0geDEwICsgajEwIHwgMDtcbiAgeDExID0geDExICsgajExIHwgMDtcbiAgeDEyID0geDEyICsgajEyIHwgMDtcbiAgeDEzID0geDEzICsgajEzIHwgMDtcbiAgeDE0ID0geDE0ICsgajE0IHwgMDtcbiAgeDE1ID0geDE1ICsgajE1IHwgMDtcblxuICBvWyAwXSA9IHgwID4+PiAgMCAmIDB4ZmY7XG4gIG9bIDFdID0geDAgPj4+ICA4ICYgMHhmZjtcbiAgb1sgMl0gPSB4MCA+Pj4gMTYgJiAweGZmO1xuICBvWyAzXSA9IHgwID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sgNF0gPSB4MSA+Pj4gIDAgJiAweGZmO1xuICBvWyA1XSA9IHgxID4+PiAgOCAmIDB4ZmY7XG4gIG9bIDZdID0geDEgPj4+IDE2ICYgMHhmZjtcbiAgb1sgN10gPSB4MSA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bIDhdID0geDIgPj4+ICAwICYgMHhmZjtcbiAgb1sgOV0gPSB4MiA+Pj4gIDggJiAweGZmO1xuICBvWzEwXSA9IHgyID4+PiAxNiAmIDB4ZmY7XG4gIG9bMTFdID0geDIgPj4+IDI0ICYgMHhmZjtcblxuICBvWzEyXSA9IHgzID4+PiAgMCAmIDB4ZmY7XG4gIG9bMTNdID0geDMgPj4+ICA4ICYgMHhmZjtcbiAgb1sxNF0gPSB4MyA+Pj4gMTYgJiAweGZmO1xuICBvWzE1XSA9IHgzID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sxNl0gPSB4NCA+Pj4gIDAgJiAweGZmO1xuICBvWzE3XSA9IHg0ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMThdID0geDQgPj4+IDE2ICYgMHhmZjtcbiAgb1sxOV0gPSB4NCA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMjBdID0geDUgPj4+ICAwICYgMHhmZjtcbiAgb1syMV0gPSB4NSA+Pj4gIDggJiAweGZmO1xuICBvWzIyXSA9IHg1ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMjNdID0geDUgPj4+IDI0ICYgMHhmZjtcblxuICBvWzI0XSA9IHg2ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMjVdID0geDYgPj4+ICA4ICYgMHhmZjtcbiAgb1syNl0gPSB4NiA+Pj4gMTYgJiAweGZmO1xuICBvWzI3XSA9IHg2ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1syOF0gPSB4NyA+Pj4gIDAgJiAweGZmO1xuICBvWzI5XSA9IHg3ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMzBdID0geDcgPj4+IDE2ICYgMHhmZjtcbiAgb1szMV0gPSB4NyA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMzJdID0geDggPj4+ICAwICYgMHhmZjtcbiAgb1szM10gPSB4OCA+Pj4gIDggJiAweGZmO1xuICBvWzM0XSA9IHg4ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMzVdID0geDggPj4+IDI0ICYgMHhmZjtcblxuICBvWzM2XSA9IHg5ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMzddID0geDkgPj4+ICA4ICYgMHhmZjtcbiAgb1szOF0gPSB4OSA+Pj4gMTYgJiAweGZmO1xuICBvWzM5XSA9IHg5ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1s0MF0gPSB4MTAgPj4+ICAwICYgMHhmZjtcbiAgb1s0MV0gPSB4MTAgPj4+ICA4ICYgMHhmZjtcbiAgb1s0Ml0gPSB4MTAgPj4+IDE2ICYgMHhmZjtcbiAgb1s0M10gPSB4MTAgPj4+IDI0ICYgMHhmZjtcblxuICBvWzQ0XSA9IHgxMSA+Pj4gIDAgJiAweGZmO1xuICBvWzQ1XSA9IHgxMSA+Pj4gIDggJiAweGZmO1xuICBvWzQ2XSA9IHgxMSA+Pj4gMTYgJiAweGZmO1xuICBvWzQ3XSA9IHgxMSA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bNDhdID0geDEyID4+PiAgMCAmIDB4ZmY7XG4gIG9bNDldID0geDEyID4+PiAgOCAmIDB4ZmY7XG4gIG9bNTBdID0geDEyID4+PiAxNiAmIDB4ZmY7XG4gIG9bNTFdID0geDEyID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1s1Ml0gPSB4MTMgPj4+ICAwICYgMHhmZjtcbiAgb1s1M10gPSB4MTMgPj4+ICA4ICYgMHhmZjtcbiAgb1s1NF0gPSB4MTMgPj4+IDE2ICYgMHhmZjtcbiAgb1s1NV0gPSB4MTMgPj4+IDI0ICYgMHhmZjtcblxuICBvWzU2XSA9IHgxNCA+Pj4gIDAgJiAweGZmO1xuICBvWzU3XSA9IHgxNCA+Pj4gIDggJiAweGZmO1xuICBvWzU4XSA9IHgxNCA+Pj4gMTYgJiAweGZmO1xuICBvWzU5XSA9IHgxNCA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bNjBdID0geDE1ID4+PiAgMCAmIDB4ZmY7XG4gIG9bNjFdID0geDE1ID4+PiAgOCAmIDB4ZmY7XG4gIG9bNjJdID0geDE1ID4+PiAxNiAmIDB4ZmY7XG4gIG9bNjNdID0geDE1ID4+PiAyNCAmIDB4ZmY7XG59XG5cbmZ1bmN0aW9uIGNvcmVfaHNhbHNhMjAobyxwLGssYykge1xuICB2YXIgajAgID0gY1sgMF0gJiAweGZmIHwgKGNbIDFdICYgMHhmZik8PDggfCAoY1sgMl0gJiAweGZmKTw8MTYgfCAoY1sgM10gJiAweGZmKTw8MjQsXG4gICAgICBqMSAgPSBrWyAwXSAmIDB4ZmYgfCAoa1sgMV0gJiAweGZmKTw8OCB8IChrWyAyXSAmIDB4ZmYpPDwxNiB8IChrWyAzXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoyICA9IGtbIDRdICYgMHhmZiB8IChrWyA1XSAmIDB4ZmYpPDw4IHwgKGtbIDZdICYgMHhmZik8PDE2IHwgKGtbIDddICYgMHhmZik8PDI0LFxuICAgICAgajMgID0ga1sgOF0gJiAweGZmIHwgKGtbIDldICYgMHhmZik8PDggfCAoa1sxMF0gJiAweGZmKTw8MTYgfCAoa1sxMV0gJiAweGZmKTw8MjQsXG4gICAgICBqNCAgPSBrWzEyXSAmIDB4ZmYgfCAoa1sxM10gJiAweGZmKTw8OCB8IChrWzE0XSAmIDB4ZmYpPDwxNiB8IChrWzE1XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo1ICA9IGNbIDRdICYgMHhmZiB8IChjWyA1XSAmIDB4ZmYpPDw4IHwgKGNbIDZdICYgMHhmZik8PDE2IHwgKGNbIDddICYgMHhmZik8PDI0LFxuICAgICAgajYgID0gcFsgMF0gJiAweGZmIHwgKHBbIDFdICYgMHhmZik8PDggfCAocFsgMl0gJiAweGZmKTw8MTYgfCAocFsgM10gJiAweGZmKTw8MjQsXG4gICAgICBqNyAgPSBwWyA0XSAmIDB4ZmYgfCAocFsgNV0gJiAweGZmKTw8OCB8IChwWyA2XSAmIDB4ZmYpPDwxNiB8IChwWyA3XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo4ICA9IHBbIDhdICYgMHhmZiB8IChwWyA5XSAmIDB4ZmYpPDw4IHwgKHBbMTBdICYgMHhmZik8PDE2IHwgKHBbMTFdICYgMHhmZik8PDI0LFxuICAgICAgajkgID0gcFsxMl0gJiAweGZmIHwgKHBbMTNdICYgMHhmZik8PDggfCAocFsxNF0gJiAweGZmKTw8MTYgfCAocFsxNV0gJiAweGZmKTw8MjQsXG4gICAgICBqMTAgPSBjWyA4XSAmIDB4ZmYgfCAoY1sgOV0gJiAweGZmKTw8OCB8IChjWzEwXSAmIDB4ZmYpPDwxNiB8IChjWzExXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxMSA9IGtbMTZdICYgMHhmZiB8IChrWzE3XSAmIDB4ZmYpPDw4IHwgKGtbMThdICYgMHhmZik8PDE2IHwgKGtbMTldICYgMHhmZik8PDI0LFxuICAgICAgajEyID0ga1syMF0gJiAweGZmIHwgKGtbMjFdICYgMHhmZik8PDggfCAoa1syMl0gJiAweGZmKTw8MTYgfCAoa1syM10gJiAweGZmKTw8MjQsXG4gICAgICBqMTMgPSBrWzI0XSAmIDB4ZmYgfCAoa1syNV0gJiAweGZmKTw8OCB8IChrWzI2XSAmIDB4ZmYpPDwxNiB8IChrWzI3XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxNCA9IGtbMjhdICYgMHhmZiB8IChrWzI5XSAmIDB4ZmYpPDw4IHwgKGtbMzBdICYgMHhmZik8PDE2IHwgKGtbMzFdICYgMHhmZik8PDI0LFxuICAgICAgajE1ID0gY1sxMl0gJiAweGZmIHwgKGNbMTNdICYgMHhmZik8PDggfCAoY1sxNF0gJiAweGZmKTw8MTYgfCAoY1sxNV0gJiAweGZmKTw8MjQ7XG5cbiAgdmFyIHgwID0gajAsIHgxID0gajEsIHgyID0gajIsIHgzID0gajMsIHg0ID0gajQsIHg1ID0gajUsIHg2ID0gajYsIHg3ID0gajcsXG4gICAgICB4OCA9IGo4LCB4OSA9IGo5LCB4MTAgPSBqMTAsIHgxMSA9IGoxMSwgeDEyID0gajEyLCB4MTMgPSBqMTMsIHgxNCA9IGoxNCxcbiAgICAgIHgxNSA9IGoxNSwgdTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyBpICs9IDIpIHtcbiAgICB1ID0geDAgKyB4MTIgfCAwO1xuICAgIHg0IF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4NCArIHgwIHwgMDtcbiAgICB4OCBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDggKyB4NCB8IDA7XG4gICAgeDEyIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxMiArIHg4IHwgMDtcbiAgICB4MCBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHg1ICsgeDEgfCAwO1xuICAgIHg5IF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4OSArIHg1IHwgMDtcbiAgICB4MTMgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgxMyArIHg5IHwgMDtcbiAgICB4MSBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MSArIHgxMyB8IDA7XG4gICAgeDUgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MTAgKyB4NiB8IDA7XG4gICAgeDE0IF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4MTQgKyB4MTAgfCAwO1xuICAgIHgyIF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4MiArIHgxNCB8IDA7XG4gICAgeDYgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDYgKyB4MiB8IDA7XG4gICAgeDEwIF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDE1ICsgeDExIHwgMDtcbiAgICB4MyBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDMgKyB4MTUgfCAwO1xuICAgIHg3IF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4NyArIHgzIHwgMDtcbiAgICB4MTEgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDExICsgeDcgfCAwO1xuICAgIHgxNSBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgwICsgeDMgfCAwO1xuICAgIHgxIF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4MSArIHgwIHwgMDtcbiAgICB4MiBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDIgKyB4MSB8IDA7XG4gICAgeDMgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDMgKyB4MiB8IDA7XG4gICAgeDAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4NSArIHg0IHwgMDtcbiAgICB4NiBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDYgKyB4NSB8IDA7XG4gICAgeDcgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg3ICsgeDYgfCAwO1xuICAgIHg0IF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHg0ICsgeDcgfCAwO1xuICAgIHg1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDEwICsgeDkgfCAwO1xuICAgIHgxMSBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDExICsgeDEwIHwgMDtcbiAgICB4OCBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDggKyB4MTEgfCAwO1xuICAgIHg5IF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHg5ICsgeDggfCAwO1xuICAgIHgxMCBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxNSArIHgxNCB8IDA7XG4gICAgeDEyIF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4MTIgKyB4MTUgfCAwO1xuICAgIHgxMyBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDEzICsgeDEyIHwgMDtcbiAgICB4MTQgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDE0ICsgeDEzIHwgMDtcbiAgICB4MTUgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcbiAgfVxuXG4gIG9bIDBdID0geDAgPj4+ICAwICYgMHhmZjtcbiAgb1sgMV0gPSB4MCA+Pj4gIDggJiAweGZmO1xuICBvWyAyXSA9IHgwID4+PiAxNiAmIDB4ZmY7XG4gIG9bIDNdID0geDAgPj4+IDI0ICYgMHhmZjtcblxuICBvWyA0XSA9IHg1ID4+PiAgMCAmIDB4ZmY7XG4gIG9bIDVdID0geDUgPj4+ICA4ICYgMHhmZjtcbiAgb1sgNl0gPSB4NSA+Pj4gMTYgJiAweGZmO1xuICBvWyA3XSA9IHg1ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sgOF0gPSB4MTAgPj4+ICAwICYgMHhmZjtcbiAgb1sgOV0gPSB4MTAgPj4+ICA4ICYgMHhmZjtcbiAgb1sxMF0gPSB4MTAgPj4+IDE2ICYgMHhmZjtcbiAgb1sxMV0gPSB4MTAgPj4+IDI0ICYgMHhmZjtcblxuICBvWzEyXSA9IHgxNSA+Pj4gIDAgJiAweGZmO1xuICBvWzEzXSA9IHgxNSA+Pj4gIDggJiAweGZmO1xuICBvWzE0XSA9IHgxNSA+Pj4gMTYgJiAweGZmO1xuICBvWzE1XSA9IHgxNSA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMTZdID0geDYgPj4+ICAwICYgMHhmZjtcbiAgb1sxN10gPSB4NiA+Pj4gIDggJiAweGZmO1xuICBvWzE4XSA9IHg2ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMTldID0geDYgPj4+IDI0ICYgMHhmZjtcblxuICBvWzIwXSA9IHg3ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMjFdID0geDcgPj4+ICA4ICYgMHhmZjtcbiAgb1syMl0gPSB4NyA+Pj4gMTYgJiAweGZmO1xuICBvWzIzXSA9IHg3ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1syNF0gPSB4OCA+Pj4gIDAgJiAweGZmO1xuICBvWzI1XSA9IHg4ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMjZdID0geDggPj4+IDE2ICYgMHhmZjtcbiAgb1syN10gPSB4OCA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMjhdID0geDkgPj4+ICAwICYgMHhmZjtcbiAgb1syOV0gPSB4OSA+Pj4gIDggJiAweGZmO1xuICBvWzMwXSA9IHg5ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMzFdID0geDkgPj4+IDI0ICYgMHhmZjtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX2NvcmVfc2Fsc2EyMChvdXQsaW5wLGssYykge1xuICBjb3JlX3NhbHNhMjAob3V0LGlucCxrLGMpO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fY29yZV9oc2Fsc2EyMChvdXQsaW5wLGssYykge1xuICBjb3JlX2hzYWxzYTIwKG91dCxpbnAsayxjKTtcbn1cblxudmFyIHNpZ21hID0gbmV3IFVpbnQ4QXJyYXkoWzEwMSwgMTIwLCAxMTIsIDk3LCAxMTAsIDEwMCwgMzIsIDUxLCA1MCwgNDUsIDk4LCAxMjEsIDExNiwgMTAxLCAzMiwgMTA3XSk7XG4gICAgICAgICAgICAvLyBcImV4cGFuZCAzMi1ieXRlIGtcIlxuXG5mdW5jdGlvbiBjcnlwdG9fc3RyZWFtX3NhbHNhMjBfeG9yKGMsY3BvcyxtLG1wb3MsYixuLGspIHtcbiAgdmFyIHogPSBuZXcgVWludDhBcnJheSgxNiksIHggPSBuZXcgVWludDhBcnJheSg2NCk7XG4gIHZhciB1LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeltpXSA9IDA7XG4gIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHpbaV0gPSBuW2ldO1xuICB3aGlsZSAoYiA+PSA2NCkge1xuICAgIGNyeXB0b19jb3JlX3NhbHNhMjAoeCx6LGssc2lnbWEpO1xuICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSBjW2Nwb3MraV0gPSBtW21wb3MraV0gXiB4W2ldO1xuICAgIHUgPSAxO1xuICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgaSsrKSB7XG4gICAgICB1ID0gdSArICh6W2ldICYgMHhmZikgfCAwO1xuICAgICAgeltpXSA9IHUgJiAweGZmO1xuICAgICAgdSA+Pj49IDg7XG4gICAgfVxuICAgIGIgLT0gNjQ7XG4gICAgY3BvcyArPSA2NDtcbiAgICBtcG9zICs9IDY0O1xuICB9XG4gIGlmIChiID4gMCkge1xuICAgIGNyeXB0b19jb3JlX3NhbHNhMjAoeCx6LGssc2lnbWEpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBiOyBpKyspIGNbY3BvcytpXSA9IG1bbXBvcytpXSBeIHhbaV07XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zdHJlYW1fc2Fsc2EyMChjLGNwb3MsYixuLGspIHtcbiAgdmFyIHogPSBuZXcgVWludDhBcnJheSgxNiksIHggPSBuZXcgVWludDhBcnJheSg2NCk7XG4gIHZhciB1LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeltpXSA9IDA7XG4gIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHpbaV0gPSBuW2ldO1xuICB3aGlsZSAoYiA+PSA2NCkge1xuICAgIGNyeXB0b19jb3JlX3NhbHNhMjAoeCx6LGssc2lnbWEpO1xuICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSBjW2Nwb3MraV0gPSB4W2ldO1xuICAgIHUgPSAxO1xuICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgaSsrKSB7XG4gICAgICB1ID0gdSArICh6W2ldICYgMHhmZikgfCAwO1xuICAgICAgeltpXSA9IHUgJiAweGZmO1xuICAgICAgdSA+Pj49IDg7XG4gICAgfVxuICAgIGIgLT0gNjQ7XG4gICAgY3BvcyArPSA2NDtcbiAgfVxuICBpZiAoYiA+IDApIHtcbiAgICBjcnlwdG9fY29yZV9zYWxzYTIwKHgseixrLHNpZ21hKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYjsgaSsrKSBjW2Nwb3MraV0gPSB4W2ldO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fc3RyZWFtKGMsY3BvcyxkLG4saykge1xuICB2YXIgcyA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgY3J5cHRvX2NvcmVfaHNhbHNhMjAocyxuLGssc2lnbWEpO1xuICB2YXIgc24gPSBuZXcgVWludDhBcnJheSg4KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHNuW2ldID0gbltpKzE2XTtcbiAgcmV0dXJuIGNyeXB0b19zdHJlYW1fc2Fsc2EyMChjLGNwb3MsZCxzbixzKTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3N0cmVhbV94b3IoYyxjcG9zLG0sbXBvcyxkLG4saykge1xuICB2YXIgcyA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgY3J5cHRvX2NvcmVfaHNhbHNhMjAocyxuLGssc2lnbWEpO1xuICB2YXIgc24gPSBuZXcgVWludDhBcnJheSg4KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHNuW2ldID0gbltpKzE2XTtcbiAgcmV0dXJuIGNyeXB0b19zdHJlYW1fc2Fsc2EyMF94b3IoYyxjcG9zLG0sbXBvcyxkLHNuLHMpO1xufVxuXG4vKlxuKiBQb3J0IG9mIEFuZHJldyBNb29uJ3MgUG9seTEzMDUtZG9ubmEtMTYuIFB1YmxpYyBkb21haW4uXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9vZHliZXJyeS9wb2x5MTMwNS1kb25uYVxuKi9cblxudmFyIHBvbHkxMzA1ID0gZnVuY3Rpb24oa2V5KSB7XG4gIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICB0aGlzLnIgPSBuZXcgVWludDE2QXJyYXkoMTApO1xuICB0aGlzLmggPSBuZXcgVWludDE2QXJyYXkoMTApO1xuICB0aGlzLnBhZCA9IG5ldyBVaW50MTZBcnJheSg4KTtcbiAgdGhpcy5sZWZ0b3ZlciA9IDA7XG4gIHRoaXMuZmluID0gMDtcblxuICB2YXIgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3O1xuXG4gIHQwID0ga2V5WyAwXSAmIDB4ZmYgfCAoa2V5WyAxXSAmIDB4ZmYpIDw8IDg7IHRoaXMuclswXSA9ICggdDAgICAgICAgICAgICAgICAgICAgICApICYgMHgxZmZmO1xuICB0MSA9IGtleVsgMl0gJiAweGZmIHwgKGtleVsgM10gJiAweGZmKSA8PCA4OyB0aGlzLnJbMV0gPSAoKHQwID4+PiAxMykgfCAodDEgPDwgIDMpKSAmIDB4MWZmZjtcbiAgdDIgPSBrZXlbIDRdICYgMHhmZiB8IChrZXlbIDVdICYgMHhmZikgPDwgODsgdGhpcy5yWzJdID0gKCh0MSA+Pj4gMTApIHwgKHQyIDw8ICA2KSkgJiAweDFmMDM7XG4gIHQzID0ga2V5WyA2XSAmIDB4ZmYgfCAoa2V5WyA3XSAmIDB4ZmYpIDw8IDg7IHRoaXMuclszXSA9ICgodDIgPj4+ICA3KSB8ICh0MyA8PCAgOSkpICYgMHgxZmZmO1xuICB0NCA9IGtleVsgOF0gJiAweGZmIHwgKGtleVsgOV0gJiAweGZmKSA8PCA4OyB0aGlzLnJbNF0gPSAoKHQzID4+PiAgNCkgfCAodDQgPDwgMTIpKSAmIDB4MDBmZjtcbiAgdGhpcy5yWzVdID0gKCh0NCA+Pj4gIDEpKSAmIDB4MWZmZTtcbiAgdDUgPSBrZXlbMTBdICYgMHhmZiB8IChrZXlbMTFdICYgMHhmZikgPDwgODsgdGhpcy5yWzZdID0gKCh0NCA+Pj4gMTQpIHwgKHQ1IDw8ICAyKSkgJiAweDFmZmY7XG4gIHQ2ID0ga2V5WzEyXSAmIDB4ZmYgfCAoa2V5WzEzXSAmIDB4ZmYpIDw8IDg7IHRoaXMucls3XSA9ICgodDUgPj4+IDExKSB8ICh0NiA8PCAgNSkpICYgMHgxZjgxO1xuICB0NyA9IGtleVsxNF0gJiAweGZmIHwgKGtleVsxNV0gJiAweGZmKSA8PCA4OyB0aGlzLnJbOF0gPSAoKHQ2ID4+PiAgOCkgfCAodDcgPDwgIDgpKSAmIDB4MWZmZjtcbiAgdGhpcy5yWzldID0gKCh0NyA+Pj4gIDUpKSAmIDB4MDA3ZjtcblxuICB0aGlzLnBhZFswXSA9IGtleVsxNl0gJiAweGZmIHwgKGtleVsxN10gJiAweGZmKSA8PCA4O1xuICB0aGlzLnBhZFsxXSA9IGtleVsxOF0gJiAweGZmIHwgKGtleVsxOV0gJiAweGZmKSA8PCA4O1xuICB0aGlzLnBhZFsyXSA9IGtleVsyMF0gJiAweGZmIHwgKGtleVsyMV0gJiAweGZmKSA8PCA4O1xuICB0aGlzLnBhZFszXSA9IGtleVsyMl0gJiAweGZmIHwgKGtleVsyM10gJiAweGZmKSA8PCA4O1xuICB0aGlzLnBhZFs0XSA9IGtleVsyNF0gJiAweGZmIHwgKGtleVsyNV0gJiAweGZmKSA8PCA4O1xuICB0aGlzLnBhZFs1XSA9IGtleVsyNl0gJiAweGZmIHwgKGtleVsyN10gJiAweGZmKSA8PCA4O1xuICB0aGlzLnBhZFs2XSA9IGtleVsyOF0gJiAweGZmIHwgKGtleVsyOV0gJiAweGZmKSA8PCA4O1xuICB0aGlzLnBhZFs3XSA9IGtleVszMF0gJiAweGZmIHwgKGtleVszMV0gJiAweGZmKSA8PCA4O1xufTtcblxucG9seTEzMDUucHJvdG90eXBlLmJsb2NrcyA9IGZ1bmN0aW9uKG0sIG1wb3MsIGJ5dGVzKSB7XG4gIHZhciBoaWJpdCA9IHRoaXMuZmluID8gMCA6ICgxIDw8IDExKTtcbiAgdmFyIHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgYztcbiAgdmFyIGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5O1xuXG4gIHZhciBoMCA9IHRoaXMuaFswXSxcbiAgICAgIGgxID0gdGhpcy5oWzFdLFxuICAgICAgaDIgPSB0aGlzLmhbMl0sXG4gICAgICBoMyA9IHRoaXMuaFszXSxcbiAgICAgIGg0ID0gdGhpcy5oWzRdLFxuICAgICAgaDUgPSB0aGlzLmhbNV0sXG4gICAgICBoNiA9IHRoaXMuaFs2XSxcbiAgICAgIGg3ID0gdGhpcy5oWzddLFxuICAgICAgaDggPSB0aGlzLmhbOF0sXG4gICAgICBoOSA9IHRoaXMuaFs5XTtcblxuICB2YXIgcjAgPSB0aGlzLnJbMF0sXG4gICAgICByMSA9IHRoaXMuclsxXSxcbiAgICAgIHIyID0gdGhpcy5yWzJdLFxuICAgICAgcjMgPSB0aGlzLnJbM10sXG4gICAgICByNCA9IHRoaXMucls0XSxcbiAgICAgIHI1ID0gdGhpcy5yWzVdLFxuICAgICAgcjYgPSB0aGlzLnJbNl0sXG4gICAgICByNyA9IHRoaXMucls3XSxcbiAgICAgIHI4ID0gdGhpcy5yWzhdLFxuICAgICAgcjkgPSB0aGlzLnJbOV07XG5cbiAgd2hpbGUgKGJ5dGVzID49IDE2KSB7XG4gICAgdDAgPSBtW21wb3MrIDBdICYgMHhmZiB8IChtW21wb3MrIDFdICYgMHhmZikgPDwgODsgaDAgKz0gKCB0MCAgICAgICAgICAgICAgICAgICAgICkgJiAweDFmZmY7XG4gICAgdDEgPSBtW21wb3MrIDJdICYgMHhmZiB8IChtW21wb3MrIDNdICYgMHhmZikgPDwgODsgaDEgKz0gKCh0MCA+Pj4gMTMpIHwgKHQxIDw8ICAzKSkgJiAweDFmZmY7XG4gICAgdDIgPSBtW21wb3MrIDRdICYgMHhmZiB8IChtW21wb3MrIDVdICYgMHhmZikgPDwgODsgaDIgKz0gKCh0MSA+Pj4gMTApIHwgKHQyIDw8ICA2KSkgJiAweDFmZmY7XG4gICAgdDMgPSBtW21wb3MrIDZdICYgMHhmZiB8IChtW21wb3MrIDddICYgMHhmZikgPDwgODsgaDMgKz0gKCh0MiA+Pj4gIDcpIHwgKHQzIDw8ICA5KSkgJiAweDFmZmY7XG4gICAgdDQgPSBtW21wb3MrIDhdICYgMHhmZiB8IChtW21wb3MrIDldICYgMHhmZikgPDwgODsgaDQgKz0gKCh0MyA+Pj4gIDQpIHwgKHQ0IDw8IDEyKSkgJiAweDFmZmY7XG4gICAgaDUgKz0gKCh0NCA+Pj4gIDEpKSAmIDB4MWZmZjtcbiAgICB0NSA9IG1bbXBvcysxMF0gJiAweGZmIHwgKG1bbXBvcysxMV0gJiAweGZmKSA8PCA4OyBoNiArPSAoKHQ0ID4+PiAxNCkgfCAodDUgPDwgIDIpKSAmIDB4MWZmZjtcbiAgICB0NiA9IG1bbXBvcysxMl0gJiAweGZmIHwgKG1bbXBvcysxM10gJiAweGZmKSA8PCA4OyBoNyArPSAoKHQ1ID4+PiAxMSkgfCAodDYgPDwgIDUpKSAmIDB4MWZmZjtcbiAgICB0NyA9IG1bbXBvcysxNF0gJiAweGZmIHwgKG1bbXBvcysxNV0gJiAweGZmKSA8PCA4OyBoOCArPSAoKHQ2ID4+PiAgOCkgfCAodDcgPDwgIDgpKSAmIDB4MWZmZjtcbiAgICBoOSArPSAoKHQ3ID4+PiA1KSkgfCBoaWJpdDtcblxuICAgIGMgPSAwO1xuXG4gICAgZDAgPSBjO1xuICAgIGQwICs9IGgwICogcjA7XG4gICAgZDAgKz0gaDEgKiAoNSAqIHI5KTtcbiAgICBkMCArPSBoMiAqICg1ICogcjgpO1xuICAgIGQwICs9IGgzICogKDUgKiByNyk7XG4gICAgZDAgKz0gaDQgKiAoNSAqIHI2KTtcbiAgICBjID0gKGQwID4+PiAxMyk7IGQwICY9IDB4MWZmZjtcbiAgICBkMCArPSBoNSAqICg1ICogcjUpO1xuICAgIGQwICs9IGg2ICogKDUgKiByNCk7XG4gICAgZDAgKz0gaDcgKiAoNSAqIHIzKTtcbiAgICBkMCArPSBoOCAqICg1ICogcjIpO1xuICAgIGQwICs9IGg5ICogKDUgKiByMSk7XG4gICAgYyArPSAoZDAgPj4+IDEzKTsgZDAgJj0gMHgxZmZmO1xuXG4gICAgZDEgPSBjO1xuICAgIGQxICs9IGgwICogcjE7XG4gICAgZDEgKz0gaDEgKiByMDtcbiAgICBkMSArPSBoMiAqICg1ICogcjkpO1xuICAgIGQxICs9IGgzICogKDUgKiByOCk7XG4gICAgZDEgKz0gaDQgKiAoNSAqIHI3KTtcbiAgICBjID0gKGQxID4+PiAxMyk7IGQxICY9IDB4MWZmZjtcbiAgICBkMSArPSBoNSAqICg1ICogcjYpO1xuICAgIGQxICs9IGg2ICogKDUgKiByNSk7XG4gICAgZDEgKz0gaDcgKiAoNSAqIHI0KTtcbiAgICBkMSArPSBoOCAqICg1ICogcjMpO1xuICAgIGQxICs9IGg5ICogKDUgKiByMik7XG4gICAgYyArPSAoZDEgPj4+IDEzKTsgZDEgJj0gMHgxZmZmO1xuXG4gICAgZDIgPSBjO1xuICAgIGQyICs9IGgwICogcjI7XG4gICAgZDIgKz0gaDEgKiByMTtcbiAgICBkMiArPSBoMiAqIHIwO1xuICAgIGQyICs9IGgzICogKDUgKiByOSk7XG4gICAgZDIgKz0gaDQgKiAoNSAqIHI4KTtcbiAgICBjID0gKGQyID4+PiAxMyk7IGQyICY9IDB4MWZmZjtcbiAgICBkMiArPSBoNSAqICg1ICogcjcpO1xuICAgIGQyICs9IGg2ICogKDUgKiByNik7XG4gICAgZDIgKz0gaDcgKiAoNSAqIHI1KTtcbiAgICBkMiArPSBoOCAqICg1ICogcjQpO1xuICAgIGQyICs9IGg5ICogKDUgKiByMyk7XG4gICAgYyArPSAoZDIgPj4+IDEzKTsgZDIgJj0gMHgxZmZmO1xuXG4gICAgZDMgPSBjO1xuICAgIGQzICs9IGgwICogcjM7XG4gICAgZDMgKz0gaDEgKiByMjtcbiAgICBkMyArPSBoMiAqIHIxO1xuICAgIGQzICs9IGgzICogcjA7XG4gICAgZDMgKz0gaDQgKiAoNSAqIHI5KTtcbiAgICBjID0gKGQzID4+PiAxMyk7IGQzICY9IDB4MWZmZjtcbiAgICBkMyArPSBoNSAqICg1ICogcjgpO1xuICAgIGQzICs9IGg2ICogKDUgKiByNyk7XG4gICAgZDMgKz0gaDcgKiAoNSAqIHI2KTtcbiAgICBkMyArPSBoOCAqICg1ICogcjUpO1xuICAgIGQzICs9IGg5ICogKDUgKiByNCk7XG4gICAgYyArPSAoZDMgPj4+IDEzKTsgZDMgJj0gMHgxZmZmO1xuXG4gICAgZDQgPSBjO1xuICAgIGQ0ICs9IGgwICogcjQ7XG4gICAgZDQgKz0gaDEgKiByMztcbiAgICBkNCArPSBoMiAqIHIyO1xuICAgIGQ0ICs9IGgzICogcjE7XG4gICAgZDQgKz0gaDQgKiByMDtcbiAgICBjID0gKGQ0ID4+PiAxMyk7IGQ0ICY9IDB4MWZmZjtcbiAgICBkNCArPSBoNSAqICg1ICogcjkpO1xuICAgIGQ0ICs9IGg2ICogKDUgKiByOCk7XG4gICAgZDQgKz0gaDcgKiAoNSAqIHI3KTtcbiAgICBkNCArPSBoOCAqICg1ICogcjYpO1xuICAgIGQ0ICs9IGg5ICogKDUgKiByNSk7XG4gICAgYyArPSAoZDQgPj4+IDEzKTsgZDQgJj0gMHgxZmZmO1xuXG4gICAgZDUgPSBjO1xuICAgIGQ1ICs9IGgwICogcjU7XG4gICAgZDUgKz0gaDEgKiByNDtcbiAgICBkNSArPSBoMiAqIHIzO1xuICAgIGQ1ICs9IGgzICogcjI7XG4gICAgZDUgKz0gaDQgKiByMTtcbiAgICBjID0gKGQ1ID4+PiAxMyk7IGQ1ICY9IDB4MWZmZjtcbiAgICBkNSArPSBoNSAqIHIwO1xuICAgIGQ1ICs9IGg2ICogKDUgKiByOSk7XG4gICAgZDUgKz0gaDcgKiAoNSAqIHI4KTtcbiAgICBkNSArPSBoOCAqICg1ICogcjcpO1xuICAgIGQ1ICs9IGg5ICogKDUgKiByNik7XG4gICAgYyArPSAoZDUgPj4+IDEzKTsgZDUgJj0gMHgxZmZmO1xuXG4gICAgZDYgPSBjO1xuICAgIGQ2ICs9IGgwICogcjY7XG4gICAgZDYgKz0gaDEgKiByNTtcbiAgICBkNiArPSBoMiAqIHI0O1xuICAgIGQ2ICs9IGgzICogcjM7XG4gICAgZDYgKz0gaDQgKiByMjtcbiAgICBjID0gKGQ2ID4+PiAxMyk7IGQ2ICY9IDB4MWZmZjtcbiAgICBkNiArPSBoNSAqIHIxO1xuICAgIGQ2ICs9IGg2ICogcjA7XG4gICAgZDYgKz0gaDcgKiAoNSAqIHI5KTtcbiAgICBkNiArPSBoOCAqICg1ICogcjgpO1xuICAgIGQ2ICs9IGg5ICogKDUgKiByNyk7XG4gICAgYyArPSAoZDYgPj4+IDEzKTsgZDYgJj0gMHgxZmZmO1xuXG4gICAgZDcgPSBjO1xuICAgIGQ3ICs9IGgwICogcjc7XG4gICAgZDcgKz0gaDEgKiByNjtcbiAgICBkNyArPSBoMiAqIHI1O1xuICAgIGQ3ICs9IGgzICogcjQ7XG4gICAgZDcgKz0gaDQgKiByMztcbiAgICBjID0gKGQ3ID4+PiAxMyk7IGQ3ICY9IDB4MWZmZjtcbiAgICBkNyArPSBoNSAqIHIyO1xuICAgIGQ3ICs9IGg2ICogcjE7XG4gICAgZDcgKz0gaDcgKiByMDtcbiAgICBkNyArPSBoOCAqICg1ICogcjkpO1xuICAgIGQ3ICs9IGg5ICogKDUgKiByOCk7XG4gICAgYyArPSAoZDcgPj4+IDEzKTsgZDcgJj0gMHgxZmZmO1xuXG4gICAgZDggPSBjO1xuICAgIGQ4ICs9IGgwICogcjg7XG4gICAgZDggKz0gaDEgKiByNztcbiAgICBkOCArPSBoMiAqIHI2O1xuICAgIGQ4ICs9IGgzICogcjU7XG4gICAgZDggKz0gaDQgKiByNDtcbiAgICBjID0gKGQ4ID4+PiAxMyk7IGQ4ICY9IDB4MWZmZjtcbiAgICBkOCArPSBoNSAqIHIzO1xuICAgIGQ4ICs9IGg2ICogcjI7XG4gICAgZDggKz0gaDcgKiByMTtcbiAgICBkOCArPSBoOCAqIHIwO1xuICAgIGQ4ICs9IGg5ICogKDUgKiByOSk7XG4gICAgYyArPSAoZDggPj4+IDEzKTsgZDggJj0gMHgxZmZmO1xuXG4gICAgZDkgPSBjO1xuICAgIGQ5ICs9IGgwICogcjk7XG4gICAgZDkgKz0gaDEgKiByODtcbiAgICBkOSArPSBoMiAqIHI3O1xuICAgIGQ5ICs9IGgzICogcjY7XG4gICAgZDkgKz0gaDQgKiByNTtcbiAgICBjID0gKGQ5ID4+PiAxMyk7IGQ5ICY9IDB4MWZmZjtcbiAgICBkOSArPSBoNSAqIHI0O1xuICAgIGQ5ICs9IGg2ICogcjM7XG4gICAgZDkgKz0gaDcgKiByMjtcbiAgICBkOSArPSBoOCAqIHIxO1xuICAgIGQ5ICs9IGg5ICogcjA7XG4gICAgYyArPSAoZDkgPj4+IDEzKTsgZDkgJj0gMHgxZmZmO1xuXG4gICAgYyA9ICgoKGMgPDwgMikgKyBjKSkgfCAwO1xuICAgIGMgPSAoYyArIGQwKSB8IDA7XG4gICAgZDAgPSBjICYgMHgxZmZmO1xuICAgIGMgPSAoYyA+Pj4gMTMpO1xuICAgIGQxICs9IGM7XG5cbiAgICBoMCA9IGQwO1xuICAgIGgxID0gZDE7XG4gICAgaDIgPSBkMjtcbiAgICBoMyA9IGQzO1xuICAgIGg0ID0gZDQ7XG4gICAgaDUgPSBkNTtcbiAgICBoNiA9IGQ2O1xuICAgIGg3ID0gZDc7XG4gICAgaDggPSBkODtcbiAgICBoOSA9IGQ5O1xuXG4gICAgbXBvcyArPSAxNjtcbiAgICBieXRlcyAtPSAxNjtcbiAgfVxuICB0aGlzLmhbMF0gPSBoMDtcbiAgdGhpcy5oWzFdID0gaDE7XG4gIHRoaXMuaFsyXSA9IGgyO1xuICB0aGlzLmhbM10gPSBoMztcbiAgdGhpcy5oWzRdID0gaDQ7XG4gIHRoaXMuaFs1XSA9IGg1O1xuICB0aGlzLmhbNl0gPSBoNjtcbiAgdGhpcy5oWzddID0gaDc7XG4gIHRoaXMuaFs4XSA9IGg4O1xuICB0aGlzLmhbOV0gPSBoOTtcbn07XG5cbnBvbHkxMzA1LnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbihtYWMsIG1hY3Bvcykge1xuICB2YXIgZyA9IG5ldyBVaW50MTZBcnJheSgxMCk7XG4gIHZhciBjLCBtYXNrLCBmLCBpO1xuXG4gIGlmICh0aGlzLmxlZnRvdmVyKSB7XG4gICAgaSA9IHRoaXMubGVmdG92ZXI7XG4gICAgdGhpcy5idWZmZXJbaSsrXSA9IDE7XG4gICAgZm9yICg7IGkgPCAxNjsgaSsrKSB0aGlzLmJ1ZmZlcltpXSA9IDA7XG4gICAgdGhpcy5maW4gPSAxO1xuICAgIHRoaXMuYmxvY2tzKHRoaXMuYnVmZmVyLCAwLCAxNik7XG4gIH1cblxuICBjID0gdGhpcy5oWzFdID4+PiAxMztcbiAgdGhpcy5oWzFdICY9IDB4MWZmZjtcbiAgZm9yIChpID0gMjsgaSA8IDEwOyBpKyspIHtcbiAgICB0aGlzLmhbaV0gKz0gYztcbiAgICBjID0gdGhpcy5oW2ldID4+PiAxMztcbiAgICB0aGlzLmhbaV0gJj0gMHgxZmZmO1xuICB9XG4gIHRoaXMuaFswXSArPSAoYyAqIDUpO1xuICBjID0gdGhpcy5oWzBdID4+PiAxMztcbiAgdGhpcy5oWzBdICY9IDB4MWZmZjtcbiAgdGhpcy5oWzFdICs9IGM7XG4gIGMgPSB0aGlzLmhbMV0gPj4+IDEzO1xuICB0aGlzLmhbMV0gJj0gMHgxZmZmO1xuICB0aGlzLmhbMl0gKz0gYztcblxuICBnWzBdID0gdGhpcy5oWzBdICsgNTtcbiAgYyA9IGdbMF0gPj4+IDEzO1xuICBnWzBdICY9IDB4MWZmZjtcbiAgZm9yIChpID0gMTsgaSA8IDEwOyBpKyspIHtcbiAgICBnW2ldID0gdGhpcy5oW2ldICsgYztcbiAgICBjID0gZ1tpXSA+Pj4gMTM7XG4gICAgZ1tpXSAmPSAweDFmZmY7XG4gIH1cbiAgZ1s5XSAtPSAoMSA8PCAxMyk7XG5cbiAgbWFzayA9IChjIF4gMSkgLSAxO1xuICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgZ1tpXSAmPSBtYXNrO1xuICBtYXNrID0gfm1hc2s7XG4gIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB0aGlzLmhbaV0gPSAodGhpcy5oW2ldICYgbWFzaykgfCBnW2ldO1xuXG4gIHRoaXMuaFswXSA9ICgodGhpcy5oWzBdICAgICAgICkgfCAodGhpcy5oWzFdIDw8IDEzKSAgICAgICAgICAgICAgICAgICAgKSAmIDB4ZmZmZjtcbiAgdGhpcy5oWzFdID0gKCh0aGlzLmhbMV0gPj4+ICAzKSB8ICh0aGlzLmhbMl0gPDwgMTApICAgICAgICAgICAgICAgICAgICApICYgMHhmZmZmO1xuICB0aGlzLmhbMl0gPSAoKHRoaXMuaFsyXSA+Pj4gIDYpIHwgKHRoaXMuaFszXSA8PCAgNykgICAgICAgICAgICAgICAgICAgICkgJiAweGZmZmY7XG4gIHRoaXMuaFszXSA9ICgodGhpcy5oWzNdID4+PiAgOSkgfCAodGhpcy5oWzRdIDw8ICA0KSAgICAgICAgICAgICAgICAgICAgKSAmIDB4ZmZmZjtcbiAgdGhpcy5oWzRdID0gKCh0aGlzLmhbNF0gPj4+IDEyKSB8ICh0aGlzLmhbNV0gPDwgIDEpIHwgKHRoaXMuaFs2XSA8PCAxNCkpICYgMHhmZmZmO1xuICB0aGlzLmhbNV0gPSAoKHRoaXMuaFs2XSA+Pj4gIDIpIHwgKHRoaXMuaFs3XSA8PCAxMSkgICAgICAgICAgICAgICAgICAgICkgJiAweGZmZmY7XG4gIHRoaXMuaFs2XSA9ICgodGhpcy5oWzddID4+PiAgNSkgfCAodGhpcy5oWzhdIDw8ICA4KSAgICAgICAgICAgICAgICAgICAgKSAmIDB4ZmZmZjtcbiAgdGhpcy5oWzddID0gKCh0aGlzLmhbOF0gPj4+ICA4KSB8ICh0aGlzLmhbOV0gPDwgIDUpICAgICAgICAgICAgICAgICAgICApICYgMHhmZmZmO1xuXG4gIGYgPSB0aGlzLmhbMF0gKyB0aGlzLnBhZFswXTtcbiAgdGhpcy5oWzBdID0gZiAmIDB4ZmZmZjtcbiAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykge1xuICAgIGYgPSAoKCh0aGlzLmhbaV0gKyB0aGlzLnBhZFtpXSkgfCAwKSArIChmID4+PiAxNikpIHwgMDtcbiAgICB0aGlzLmhbaV0gPSBmICYgMHhmZmZmO1xuICB9XG5cbiAgbWFjW21hY3BvcysgMF0gPSAodGhpcy5oWzBdID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDFdID0gKHRoaXMuaFswXSA+Pj4gOCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyAyXSA9ICh0aGlzLmhbMV0gPj4+IDApICYgMHhmZjtcbiAgbWFjW21hY3BvcysgM10gPSAodGhpcy5oWzFdID4+PiA4KSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDRdID0gKHRoaXMuaFsyXSA+Pj4gMCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyA1XSA9ICh0aGlzLmhbMl0gPj4+IDgpICYgMHhmZjtcbiAgbWFjW21hY3BvcysgNl0gPSAodGhpcy5oWzNdID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDddID0gKHRoaXMuaFszXSA+Pj4gOCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyA4XSA9ICh0aGlzLmhbNF0gPj4+IDApICYgMHhmZjtcbiAgbWFjW21hY3BvcysgOV0gPSAodGhpcy5oWzRdID4+PiA4KSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrMTBdID0gKHRoaXMuaFs1XSA+Pj4gMCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKzExXSA9ICh0aGlzLmhbNV0gPj4+IDgpICYgMHhmZjtcbiAgbWFjW21hY3BvcysxMl0gPSAodGhpcy5oWzZdID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrMTNdID0gKHRoaXMuaFs2XSA+Pj4gOCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKzE0XSA9ICh0aGlzLmhbN10gPj4+IDApICYgMHhmZjtcbiAgbWFjW21hY3BvcysxNV0gPSAodGhpcy5oWzddID4+PiA4KSAmIDB4ZmY7XG59O1xuXG5wb2x5MTMwNS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24obSwgbXBvcywgYnl0ZXMpIHtcbiAgdmFyIGksIHdhbnQ7XG5cbiAgaWYgKHRoaXMubGVmdG92ZXIpIHtcbiAgICB3YW50ID0gKDE2IC0gdGhpcy5sZWZ0b3Zlcik7XG4gICAgaWYgKHdhbnQgPiBieXRlcylcbiAgICAgIHdhbnQgPSBieXRlcztcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2FudDsgaSsrKVxuICAgICAgdGhpcy5idWZmZXJbdGhpcy5sZWZ0b3ZlciArIGldID0gbVttcG9zK2ldO1xuICAgIGJ5dGVzIC09IHdhbnQ7XG4gICAgbXBvcyArPSB3YW50O1xuICAgIHRoaXMubGVmdG92ZXIgKz0gd2FudDtcbiAgICBpZiAodGhpcy5sZWZ0b3ZlciA8IDE2KVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuYmxvY2tzKHRoaXMuYnVmZmVyLCAwLCAxNik7XG4gICAgdGhpcy5sZWZ0b3ZlciA9IDA7XG4gIH1cblxuICBpZiAoYnl0ZXMgPj0gMTYpIHtcbiAgICB3YW50ID0gYnl0ZXMgLSAoYnl0ZXMgJSAxNik7XG4gICAgdGhpcy5ibG9ja3MobSwgbXBvcywgd2FudCk7XG4gICAgbXBvcyArPSB3YW50O1xuICAgIGJ5dGVzIC09IHdhbnQ7XG4gIH1cblxuICBpZiAoYnl0ZXMpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkrKylcbiAgICAgIHRoaXMuYnVmZmVyW3RoaXMubGVmdG92ZXIgKyBpXSA9IG1bbXBvcytpXTtcbiAgICB0aGlzLmxlZnRvdmVyICs9IGJ5dGVzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcnlwdG9fb25ldGltZWF1dGgob3V0LCBvdXRwb3MsIG0sIG1wb3MsIG4sIGspIHtcbiAgdmFyIHMgPSBuZXcgcG9seTEzMDUoayk7XG4gIHMudXBkYXRlKG0sIG1wb3MsIG4pO1xuICBzLmZpbmlzaChvdXQsIG91dHBvcyk7XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5KGgsIGhwb3MsIG0sIG1wb3MsIG4sIGspIHtcbiAgdmFyIHggPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGNyeXB0b19vbmV0aW1lYXV0aCh4LDAsbSxtcG9zLG4sayk7XG4gIHJldHVybiBjcnlwdG9fdmVyaWZ5XzE2KGgsaHBvcyx4LDApO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fc2VjcmV0Ym94KGMsbSxkLG4saykge1xuICB2YXIgaTtcbiAgaWYgKGQgPCAzMikgcmV0dXJuIC0xO1xuICBjcnlwdG9fc3RyZWFtX3hvcihjLDAsbSwwLGQsbixrKTtcbiAgY3J5cHRvX29uZXRpbWVhdXRoKGMsIDE2LCBjLCAzMiwgZCAtIDMyLCBjKTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIGNbaV0gPSAwO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3NlY3JldGJveF9vcGVuKG0sYyxkLG4saykge1xuICB2YXIgaTtcbiAgdmFyIHggPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGlmIChkIDwgMzIpIHJldHVybiAtMTtcbiAgY3J5cHRvX3N0cmVhbSh4LDAsMzIsbixrKTtcbiAgaWYgKGNyeXB0b19vbmV0aW1lYXV0aF92ZXJpZnkoYywgMTYsYywgMzIsZCAtIDMyLHgpICE9PSAwKSByZXR1cm4gLTE7XG4gIGNyeXB0b19zdHJlYW1feG9yKG0sMCxjLDAsZCxuLGspO1xuICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgbVtpXSA9IDA7XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBzZXQyNTUxOShyLCBhKSB7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgcltpXSA9IGFbaV18MDtcbn1cblxuZnVuY3Rpb24gY2FyMjU1MTkobykge1xuICB2YXIgaSwgdiwgYyA9IDE7XG4gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgdiA9IG9baV0gKyBjICsgNjU1MzU7XG4gICAgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTtcbiAgICBvW2ldID0gdiAtIGMgKiA2NTUzNjtcbiAgfVxuICBvWzBdICs9IGMtMSArIDM3ICogKGMtMSk7XG59XG5cbmZ1bmN0aW9uIHNlbDI1NTE5KHAsIHEsIGIpIHtcbiAgdmFyIHQsIGMgPSB+KGItMSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIHQgPSBjICYgKHBbaV0gXiBxW2ldKTtcbiAgICBwW2ldIF49IHQ7XG4gICAgcVtpXSBePSB0O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhY2syNTUxOShvLCBuKSB7XG4gIHZhciBpLCBqLCBiO1xuICB2YXIgbSA9IGdmKCksIHQgPSBnZigpO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgdFtpXSA9IG5baV07XG4gIGNhcjI1NTE5KHQpO1xuICBjYXIyNTUxOSh0KTtcbiAgY2FyMjU1MTkodCk7XG4gIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHtcbiAgICBtWzBdID0gdFswXSAtIDB4ZmZlZDtcbiAgICBmb3IgKGkgPSAxOyBpIDwgMTU7IGkrKykge1xuICAgICAgbVtpXSA9IHRbaV0gLSAweGZmZmYgLSAoKG1baS0xXT4+MTYpICYgMSk7XG4gICAgICBtW2ktMV0gJj0gMHhmZmZmO1xuICAgIH1cbiAgICBtWzE1XSA9IHRbMTVdIC0gMHg3ZmZmIC0gKChtWzE0XT4+MTYpICYgMSk7XG4gICAgYiA9IChtWzE1XT4+MTYpICYgMTtcbiAgICBtWzE0XSAmPSAweGZmZmY7XG4gICAgc2VsMjU1MTkodCwgbSwgMS1iKTtcbiAgfVxuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIG9bMippXSA9IHRbaV0gJiAweGZmO1xuICAgIG9bMippKzFdID0gdFtpXT4+ODtcbiAgfVxufVxuXG5mdW5jdGlvbiBuZXEyNTUxOShhLCBiKSB7XG4gIHZhciBjID0gbmV3IFVpbnQ4QXJyYXkoMzIpLCBkID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBwYWNrMjU1MTkoYywgYSk7XG4gIHBhY2syNTUxOShkLCBiKTtcbiAgcmV0dXJuIGNyeXB0b192ZXJpZnlfMzIoYywgMCwgZCwgMCk7XG59XG5cbmZ1bmN0aW9uIHBhcjI1NTE5KGEpIHtcbiAgdmFyIGQgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIHBhY2syNTUxOShkLCBhKTtcbiAgcmV0dXJuIGRbMF0gJiAxO1xufVxuXG5mdW5jdGlvbiB1bnBhY2syNTUxOShvLCBuKSB7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgb1tpXSA9IG5bMippXSArIChuWzIqaSsxXSA8PCA4KTtcbiAgb1sxNV0gJj0gMHg3ZmZmO1xufVxuXG5mdW5jdGlvbiBBKG8sIGEsIGIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSBvW2ldID0gYVtpXSArIGJbaV07XG59XG5cbmZ1bmN0aW9uIFoobywgYSwgYikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIG9baV0gPSBhW2ldIC0gYltpXTtcbn1cblxuZnVuY3Rpb24gTShvLCBhLCBiKSB7XG4gIHZhciB2LCBjLFxuICAgICB0MCA9IDAsICB0MSA9IDAsICB0MiA9IDAsICB0MyA9IDAsICB0NCA9IDAsICB0NSA9IDAsICB0NiA9IDAsICB0NyA9IDAsXG4gICAgIHQ4ID0gMCwgIHQ5ID0gMCwgdDEwID0gMCwgdDExID0gMCwgdDEyID0gMCwgdDEzID0gMCwgdDE0ID0gMCwgdDE1ID0gMCxcbiAgICB0MTYgPSAwLCB0MTcgPSAwLCB0MTggPSAwLCB0MTkgPSAwLCB0MjAgPSAwLCB0MjEgPSAwLCB0MjIgPSAwLCB0MjMgPSAwLFxuICAgIHQyNCA9IDAsIHQyNSA9IDAsIHQyNiA9IDAsIHQyNyA9IDAsIHQyOCA9IDAsIHQyOSA9IDAsIHQzMCA9IDAsXG4gICAgYjAgPSBiWzBdLFxuICAgIGIxID0gYlsxXSxcbiAgICBiMiA9IGJbMl0sXG4gICAgYjMgPSBiWzNdLFxuICAgIGI0ID0gYls0XSxcbiAgICBiNSA9IGJbNV0sXG4gICAgYjYgPSBiWzZdLFxuICAgIGI3ID0gYls3XSxcbiAgICBiOCA9IGJbOF0sXG4gICAgYjkgPSBiWzldLFxuICAgIGIxMCA9IGJbMTBdLFxuICAgIGIxMSA9IGJbMTFdLFxuICAgIGIxMiA9IGJbMTJdLFxuICAgIGIxMyA9IGJbMTNdLFxuICAgIGIxNCA9IGJbMTRdLFxuICAgIGIxNSA9IGJbMTVdO1xuXG4gIHYgPSBhWzBdO1xuICB0MCArPSB2ICogYjA7XG4gIHQxICs9IHYgKiBiMTtcbiAgdDIgKz0gdiAqIGIyO1xuICB0MyArPSB2ICogYjM7XG4gIHQ0ICs9IHYgKiBiNDtcbiAgdDUgKz0gdiAqIGI1O1xuICB0NiArPSB2ICogYjY7XG4gIHQ3ICs9IHYgKiBiNztcbiAgdDggKz0gdiAqIGI4O1xuICB0OSArPSB2ICogYjk7XG4gIHQxMCArPSB2ICogYjEwO1xuICB0MTEgKz0gdiAqIGIxMTtcbiAgdDEyICs9IHYgKiBiMTI7XG4gIHQxMyArPSB2ICogYjEzO1xuICB0MTQgKz0gdiAqIGIxNDtcbiAgdDE1ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzFdO1xuICB0MSArPSB2ICogYjA7XG4gIHQyICs9IHYgKiBiMTtcbiAgdDMgKz0gdiAqIGIyO1xuICB0NCArPSB2ICogYjM7XG4gIHQ1ICs9IHYgKiBiNDtcbiAgdDYgKz0gdiAqIGI1O1xuICB0NyArPSB2ICogYjY7XG4gIHQ4ICs9IHYgKiBiNztcbiAgdDkgKz0gdiAqIGI4O1xuICB0MTAgKz0gdiAqIGI5O1xuICB0MTEgKz0gdiAqIGIxMDtcbiAgdDEyICs9IHYgKiBiMTE7XG4gIHQxMyArPSB2ICogYjEyO1xuICB0MTQgKz0gdiAqIGIxMztcbiAgdDE1ICs9IHYgKiBiMTQ7XG4gIHQxNiArPSB2ICogYjE1O1xuICB2ID0gYVsyXTtcbiAgdDIgKz0gdiAqIGIwO1xuICB0MyArPSB2ICogYjE7XG4gIHQ0ICs9IHYgKiBiMjtcbiAgdDUgKz0gdiAqIGIzO1xuICB0NiArPSB2ICogYjQ7XG4gIHQ3ICs9IHYgKiBiNTtcbiAgdDggKz0gdiAqIGI2O1xuICB0OSArPSB2ICogYjc7XG4gIHQxMCArPSB2ICogYjg7XG4gIHQxMSArPSB2ICogYjk7XG4gIHQxMiArPSB2ICogYjEwO1xuICB0MTMgKz0gdiAqIGIxMTtcbiAgdDE0ICs9IHYgKiBiMTI7XG4gIHQxNSArPSB2ICogYjEzO1xuICB0MTYgKz0gdiAqIGIxNDtcbiAgdDE3ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzNdO1xuICB0MyArPSB2ICogYjA7XG4gIHQ0ICs9IHYgKiBiMTtcbiAgdDUgKz0gdiAqIGIyO1xuICB0NiArPSB2ICogYjM7XG4gIHQ3ICs9IHYgKiBiNDtcbiAgdDggKz0gdiAqIGI1O1xuICB0OSArPSB2ICogYjY7XG4gIHQxMCArPSB2ICogYjc7XG4gIHQxMSArPSB2ICogYjg7XG4gIHQxMiArPSB2ICogYjk7XG4gIHQxMyArPSB2ICogYjEwO1xuICB0MTQgKz0gdiAqIGIxMTtcbiAgdDE1ICs9IHYgKiBiMTI7XG4gIHQxNiArPSB2ICogYjEzO1xuICB0MTcgKz0gdiAqIGIxNDtcbiAgdDE4ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzRdO1xuICB0NCArPSB2ICogYjA7XG4gIHQ1ICs9IHYgKiBiMTtcbiAgdDYgKz0gdiAqIGIyO1xuICB0NyArPSB2ICogYjM7XG4gIHQ4ICs9IHYgKiBiNDtcbiAgdDkgKz0gdiAqIGI1O1xuICB0MTAgKz0gdiAqIGI2O1xuICB0MTEgKz0gdiAqIGI3O1xuICB0MTIgKz0gdiAqIGI4O1xuICB0MTMgKz0gdiAqIGI5O1xuICB0MTQgKz0gdiAqIGIxMDtcbiAgdDE1ICs9IHYgKiBiMTE7XG4gIHQxNiArPSB2ICogYjEyO1xuICB0MTcgKz0gdiAqIGIxMztcbiAgdDE4ICs9IHYgKiBiMTQ7XG4gIHQxOSArPSB2ICogYjE1O1xuICB2ID0gYVs1XTtcbiAgdDUgKz0gdiAqIGIwO1xuICB0NiArPSB2ICogYjE7XG4gIHQ3ICs9IHYgKiBiMjtcbiAgdDggKz0gdiAqIGIzO1xuICB0OSArPSB2ICogYjQ7XG4gIHQxMCArPSB2ICogYjU7XG4gIHQxMSArPSB2ICogYjY7XG4gIHQxMiArPSB2ICogYjc7XG4gIHQxMyArPSB2ICogYjg7XG4gIHQxNCArPSB2ICogYjk7XG4gIHQxNSArPSB2ICogYjEwO1xuICB0MTYgKz0gdiAqIGIxMTtcbiAgdDE3ICs9IHYgKiBiMTI7XG4gIHQxOCArPSB2ICogYjEzO1xuICB0MTkgKz0gdiAqIGIxNDtcbiAgdDIwICs9IHYgKiBiMTU7XG4gIHYgPSBhWzZdO1xuICB0NiArPSB2ICogYjA7XG4gIHQ3ICs9IHYgKiBiMTtcbiAgdDggKz0gdiAqIGIyO1xuICB0OSArPSB2ICogYjM7XG4gIHQxMCArPSB2ICogYjQ7XG4gIHQxMSArPSB2ICogYjU7XG4gIHQxMiArPSB2ICogYjY7XG4gIHQxMyArPSB2ICogYjc7XG4gIHQxNCArPSB2ICogYjg7XG4gIHQxNSArPSB2ICogYjk7XG4gIHQxNiArPSB2ICogYjEwO1xuICB0MTcgKz0gdiAqIGIxMTtcbiAgdDE4ICs9IHYgKiBiMTI7XG4gIHQxOSArPSB2ICogYjEzO1xuICB0MjAgKz0gdiAqIGIxNDtcbiAgdDIxICs9IHYgKiBiMTU7XG4gIHYgPSBhWzddO1xuICB0NyArPSB2ICogYjA7XG4gIHQ4ICs9IHYgKiBiMTtcbiAgdDkgKz0gdiAqIGIyO1xuICB0MTAgKz0gdiAqIGIzO1xuICB0MTEgKz0gdiAqIGI0O1xuICB0MTIgKz0gdiAqIGI1O1xuICB0MTMgKz0gdiAqIGI2O1xuICB0MTQgKz0gdiAqIGI3O1xuICB0MTUgKz0gdiAqIGI4O1xuICB0MTYgKz0gdiAqIGI5O1xuICB0MTcgKz0gdiAqIGIxMDtcbiAgdDE4ICs9IHYgKiBiMTE7XG4gIHQxOSArPSB2ICogYjEyO1xuICB0MjAgKz0gdiAqIGIxMztcbiAgdDIxICs9IHYgKiBiMTQ7XG4gIHQyMiArPSB2ICogYjE1O1xuICB2ID0gYVs4XTtcbiAgdDggKz0gdiAqIGIwO1xuICB0OSArPSB2ICogYjE7XG4gIHQxMCArPSB2ICogYjI7XG4gIHQxMSArPSB2ICogYjM7XG4gIHQxMiArPSB2ICogYjQ7XG4gIHQxMyArPSB2ICogYjU7XG4gIHQxNCArPSB2ICogYjY7XG4gIHQxNSArPSB2ICogYjc7XG4gIHQxNiArPSB2ICogYjg7XG4gIHQxNyArPSB2ICogYjk7XG4gIHQxOCArPSB2ICogYjEwO1xuICB0MTkgKz0gdiAqIGIxMTtcbiAgdDIwICs9IHYgKiBiMTI7XG4gIHQyMSArPSB2ICogYjEzO1xuICB0MjIgKz0gdiAqIGIxNDtcbiAgdDIzICs9IHYgKiBiMTU7XG4gIHYgPSBhWzldO1xuICB0OSArPSB2ICogYjA7XG4gIHQxMCArPSB2ICogYjE7XG4gIHQxMSArPSB2ICogYjI7XG4gIHQxMiArPSB2ICogYjM7XG4gIHQxMyArPSB2ICogYjQ7XG4gIHQxNCArPSB2ICogYjU7XG4gIHQxNSArPSB2ICogYjY7XG4gIHQxNiArPSB2ICogYjc7XG4gIHQxNyArPSB2ICogYjg7XG4gIHQxOCArPSB2ICogYjk7XG4gIHQxOSArPSB2ICogYjEwO1xuICB0MjAgKz0gdiAqIGIxMTtcbiAgdDIxICs9IHYgKiBiMTI7XG4gIHQyMiArPSB2ICogYjEzO1xuICB0MjMgKz0gdiAqIGIxNDtcbiAgdDI0ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzEwXTtcbiAgdDEwICs9IHYgKiBiMDtcbiAgdDExICs9IHYgKiBiMTtcbiAgdDEyICs9IHYgKiBiMjtcbiAgdDEzICs9IHYgKiBiMztcbiAgdDE0ICs9IHYgKiBiNDtcbiAgdDE1ICs9IHYgKiBiNTtcbiAgdDE2ICs9IHYgKiBiNjtcbiAgdDE3ICs9IHYgKiBiNztcbiAgdDE4ICs9IHYgKiBiODtcbiAgdDE5ICs9IHYgKiBiOTtcbiAgdDIwICs9IHYgKiBiMTA7XG4gIHQyMSArPSB2ICogYjExO1xuICB0MjIgKz0gdiAqIGIxMjtcbiAgdDIzICs9IHYgKiBiMTM7XG4gIHQyNCArPSB2ICogYjE0O1xuICB0MjUgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMTFdO1xuICB0MTEgKz0gdiAqIGIwO1xuICB0MTIgKz0gdiAqIGIxO1xuICB0MTMgKz0gdiAqIGIyO1xuICB0MTQgKz0gdiAqIGIzO1xuICB0MTUgKz0gdiAqIGI0O1xuICB0MTYgKz0gdiAqIGI1O1xuICB0MTcgKz0gdiAqIGI2O1xuICB0MTggKz0gdiAqIGI3O1xuICB0MTkgKz0gdiAqIGI4O1xuICB0MjAgKz0gdiAqIGI5O1xuICB0MjEgKz0gdiAqIGIxMDtcbiAgdDIyICs9IHYgKiBiMTE7XG4gIHQyMyArPSB2ICogYjEyO1xuICB0MjQgKz0gdiAqIGIxMztcbiAgdDI1ICs9IHYgKiBiMTQ7XG4gIHQyNiArPSB2ICogYjE1O1xuICB2ID0gYVsxMl07XG4gIHQxMiArPSB2ICogYjA7XG4gIHQxMyArPSB2ICogYjE7XG4gIHQxNCArPSB2ICogYjI7XG4gIHQxNSArPSB2ICogYjM7XG4gIHQxNiArPSB2ICogYjQ7XG4gIHQxNyArPSB2ICogYjU7XG4gIHQxOCArPSB2ICogYjY7XG4gIHQxOSArPSB2ICogYjc7XG4gIHQyMCArPSB2ICogYjg7XG4gIHQyMSArPSB2ICogYjk7XG4gIHQyMiArPSB2ICogYjEwO1xuICB0MjMgKz0gdiAqIGIxMTtcbiAgdDI0ICs9IHYgKiBiMTI7XG4gIHQyNSArPSB2ICogYjEzO1xuICB0MjYgKz0gdiAqIGIxNDtcbiAgdDI3ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzEzXTtcbiAgdDEzICs9IHYgKiBiMDtcbiAgdDE0ICs9IHYgKiBiMTtcbiAgdDE1ICs9IHYgKiBiMjtcbiAgdDE2ICs9IHYgKiBiMztcbiAgdDE3ICs9IHYgKiBiNDtcbiAgdDE4ICs9IHYgKiBiNTtcbiAgdDE5ICs9IHYgKiBiNjtcbiAgdDIwICs9IHYgKiBiNztcbiAgdDIxICs9IHYgKiBiODtcbiAgdDIyICs9IHYgKiBiOTtcbiAgdDIzICs9IHYgKiBiMTA7XG4gIHQyNCArPSB2ICogYjExO1xuICB0MjUgKz0gdiAqIGIxMjtcbiAgdDI2ICs9IHYgKiBiMTM7XG4gIHQyNyArPSB2ICogYjE0O1xuICB0MjggKz0gdiAqIGIxNTtcbiAgdiA9IGFbMTRdO1xuICB0MTQgKz0gdiAqIGIwO1xuICB0MTUgKz0gdiAqIGIxO1xuICB0MTYgKz0gdiAqIGIyO1xuICB0MTcgKz0gdiAqIGIzO1xuICB0MTggKz0gdiAqIGI0O1xuICB0MTkgKz0gdiAqIGI1O1xuICB0MjAgKz0gdiAqIGI2O1xuICB0MjEgKz0gdiAqIGI3O1xuICB0MjIgKz0gdiAqIGI4O1xuICB0MjMgKz0gdiAqIGI5O1xuICB0MjQgKz0gdiAqIGIxMDtcbiAgdDI1ICs9IHYgKiBiMTE7XG4gIHQyNiArPSB2ICogYjEyO1xuICB0MjcgKz0gdiAqIGIxMztcbiAgdDI4ICs9IHYgKiBiMTQ7XG4gIHQyOSArPSB2ICogYjE1O1xuICB2ID0gYVsxNV07XG4gIHQxNSArPSB2ICogYjA7XG4gIHQxNiArPSB2ICogYjE7XG4gIHQxNyArPSB2ICogYjI7XG4gIHQxOCArPSB2ICogYjM7XG4gIHQxOSArPSB2ICogYjQ7XG4gIHQyMCArPSB2ICogYjU7XG4gIHQyMSArPSB2ICogYjY7XG4gIHQyMiArPSB2ICogYjc7XG4gIHQyMyArPSB2ICogYjg7XG4gIHQyNCArPSB2ICogYjk7XG4gIHQyNSArPSB2ICogYjEwO1xuICB0MjYgKz0gdiAqIGIxMTtcbiAgdDI3ICs9IHYgKiBiMTI7XG4gIHQyOCArPSB2ICogYjEzO1xuICB0MjkgKz0gdiAqIGIxNDtcbiAgdDMwICs9IHYgKiBiMTU7XG5cbiAgdDAgICs9IDM4ICogdDE2O1xuICB0MSAgKz0gMzggKiB0MTc7XG4gIHQyICArPSAzOCAqIHQxODtcbiAgdDMgICs9IDM4ICogdDE5O1xuICB0NCAgKz0gMzggKiB0MjA7XG4gIHQ1ICArPSAzOCAqIHQyMTtcbiAgdDYgICs9IDM4ICogdDIyO1xuICB0NyAgKz0gMzggKiB0MjM7XG4gIHQ4ICArPSAzOCAqIHQyNDtcbiAgdDkgICs9IDM4ICogdDI1O1xuICB0MTAgKz0gMzggKiB0MjY7XG4gIHQxMSArPSAzOCAqIHQyNztcbiAgdDEyICs9IDM4ICogdDI4O1xuICB0MTMgKz0gMzggKiB0Mjk7XG4gIHQxNCArPSAzOCAqIHQzMDtcbiAgLy8gdDE1IGxlZnQgYXMgaXNcblxuICAvLyBmaXJzdCBjYXJcbiAgYyA9IDE7XG4gIHYgPSAgdDAgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDEgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDIgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDMgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDQgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDUgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDYgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDcgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDggKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0OCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDkgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0OSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTAgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTEgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTIgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTMgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTQgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxNCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTUgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxNSA9IHYgLSBjICogNjU1MzY7XG4gIHQwICs9IGMtMSArIDM3ICogKGMtMSk7XG5cbiAgLy8gc2Vjb25kIGNhclxuICBjID0gMTtcbiAgdiA9ICB0MCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQwID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0MSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQxID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0MiArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQyID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0MyArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQzID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0NCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ0ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0NSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ1ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0NiArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ2ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0NyArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ3ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0OCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ4ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0OSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ5ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxMCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDEwID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxMSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDExID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxMiArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDEyID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxMyArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDEzID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxNCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDE0ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxNSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDE1ID0gdiAtIGMgKiA2NTUzNjtcbiAgdDAgKz0gYy0xICsgMzcgKiAoYy0xKTtcblxuICBvWyAwXSA9IHQwO1xuICBvWyAxXSA9IHQxO1xuICBvWyAyXSA9IHQyO1xuICBvWyAzXSA9IHQzO1xuICBvWyA0XSA9IHQ0O1xuICBvWyA1XSA9IHQ1O1xuICBvWyA2XSA9IHQ2O1xuICBvWyA3XSA9IHQ3O1xuICBvWyA4XSA9IHQ4O1xuICBvWyA5XSA9IHQ5O1xuICBvWzEwXSA9IHQxMDtcbiAgb1sxMV0gPSB0MTE7XG4gIG9bMTJdID0gdDEyO1xuICBvWzEzXSA9IHQxMztcbiAgb1sxNF0gPSB0MTQ7XG4gIG9bMTVdID0gdDE1O1xufVxuXG5mdW5jdGlvbiBTKG8sIGEpIHtcbiAgTShvLCBhLCBhKTtcbn1cblxuZnVuY3Rpb24gaW52MjU1MTkobywgaSkge1xuICB2YXIgYyA9IGdmKCk7XG4gIHZhciBhO1xuICBmb3IgKGEgPSAwOyBhIDwgMTY7IGErKykgY1thXSA9IGlbYV07XG4gIGZvciAoYSA9IDI1MzsgYSA+PSAwOyBhLS0pIHtcbiAgICBTKGMsIGMpO1xuICAgIGlmKGEgIT09IDIgJiYgYSAhPT0gNCkgTShjLCBjLCBpKTtcbiAgfVxuICBmb3IgKGEgPSAwOyBhIDwgMTY7IGErKykgb1thXSA9IGNbYV07XG59XG5cbmZ1bmN0aW9uIHBvdzI1MjMobywgaSkge1xuICB2YXIgYyA9IGdmKCk7XG4gIHZhciBhO1xuICBmb3IgKGEgPSAwOyBhIDwgMTY7IGErKykgY1thXSA9IGlbYV07XG4gIGZvciAoYSA9IDI1MDsgYSA+PSAwOyBhLS0pIHtcbiAgICAgIFMoYywgYyk7XG4gICAgICBpZihhICE9PSAxKSBNKGMsIGMsIGkpO1xuICB9XG4gIGZvciAoYSA9IDA7IGEgPCAxNjsgYSsrKSBvW2FdID0gY1thXTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3NjYWxhcm11bHQocSwgbiwgcCkge1xuICB2YXIgeiA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgdmFyIHggPSBuZXcgRmxvYXQ2NEFycmF5KDgwKSwgciwgaTtcbiAgdmFyIGEgPSBnZigpLCBiID0gZ2YoKSwgYyA9IGdmKCksXG4gICAgICBkID0gZ2YoKSwgZSA9IGdmKCksIGYgPSBnZigpO1xuICBmb3IgKGkgPSAwOyBpIDwgMzE7IGkrKykgeltpXSA9IG5baV07XG4gIHpbMzFdPShuWzMxXSYxMjcpfDY0O1xuICB6WzBdJj0yNDg7XG4gIHVucGFjazI1NTE5KHgscCk7XG4gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgYltpXT14W2ldO1xuICAgIGRbaV09YVtpXT1jW2ldPTA7XG4gIH1cbiAgYVswXT1kWzBdPTE7XG4gIGZvciAoaT0yNTQ7IGk+PTA7IC0taSkge1xuICAgIHI9KHpbaT4+PjNdPj4+KGkmNykpJjE7XG4gICAgc2VsMjU1MTkoYSxiLHIpO1xuICAgIHNlbDI1NTE5KGMsZCxyKTtcbiAgICBBKGUsYSxjKTtcbiAgICBaKGEsYSxjKTtcbiAgICBBKGMsYixkKTtcbiAgICBaKGIsYixkKTtcbiAgICBTKGQsZSk7XG4gICAgUyhmLGEpO1xuICAgIE0oYSxjLGEpO1xuICAgIE0oYyxiLGUpO1xuICAgIEEoZSxhLGMpO1xuICAgIFooYSxhLGMpO1xuICAgIFMoYixhKTtcbiAgICBaKGMsZCxmKTtcbiAgICBNKGEsYyxfMTIxNjY1KTtcbiAgICBBKGEsYSxkKTtcbiAgICBNKGMsYyxhKTtcbiAgICBNKGEsZCxmKTtcbiAgICBNKGQsYix4KTtcbiAgICBTKGIsZSk7XG4gICAgc2VsMjU1MTkoYSxiLHIpO1xuICAgIHNlbDI1NTE5KGMsZCxyKTtcbiAgfVxuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIHhbaSsxNl09YVtpXTtcbiAgICB4W2krMzJdPWNbaV07XG4gICAgeFtpKzQ4XT1iW2ldO1xuICAgIHhbaSs2NF09ZFtpXTtcbiAgfVxuICB2YXIgeDMyID0geC5zdWJhcnJheSgzMik7XG4gIHZhciB4MTYgPSB4LnN1YmFycmF5KDE2KTtcbiAgaW52MjU1MTkoeDMyLHgzMik7XG4gIE0oeDE2LHgxNix4MzIpO1xuICBwYWNrMjU1MTkocSx4MTYpO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3NjYWxhcm11bHRfYmFzZShxLCBuKSB7XG4gIHJldHVybiBjcnlwdG9fc2NhbGFybXVsdChxLCBuLCBfOSk7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19ib3hfa2V5cGFpcih5LCB4KSB7XG4gIHJhbmRvbWJ5dGVzKHgsIDMyKTtcbiAgcmV0dXJuIGNyeXB0b19zY2FsYXJtdWx0X2Jhc2UoeSwgeCk7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19ib3hfYmVmb3Jlbm0oaywgeSwgeCkge1xuICB2YXIgcyA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgY3J5cHRvX3NjYWxhcm11bHQocywgeCwgeSk7XG4gIHJldHVybiBjcnlwdG9fY29yZV9oc2Fsc2EyMChrLCBfMCwgcywgc2lnbWEpO1xufVxuXG52YXIgY3J5cHRvX2JveF9hZnRlcm5tID0gY3J5cHRvX3NlY3JldGJveDtcbnZhciBjcnlwdG9fYm94X29wZW5fYWZ0ZXJubSA9IGNyeXB0b19zZWNyZXRib3hfb3BlbjtcblxuZnVuY3Rpb24gY3J5cHRvX2JveChjLCBtLCBkLCBuLCB5LCB4KSB7XG4gIHZhciBrID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBjcnlwdG9fYm94X2JlZm9yZW5tKGssIHksIHgpO1xuICByZXR1cm4gY3J5cHRvX2JveF9hZnRlcm5tKGMsIG0sIGQsIG4sIGspO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fYm94X29wZW4obSwgYywgZCwgbiwgeSwgeCkge1xuICB2YXIgayA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgY3J5cHRvX2JveF9iZWZvcmVubShrLCB5LCB4KTtcbiAgcmV0dXJuIGNyeXB0b19ib3hfb3Blbl9hZnRlcm5tKG0sIGMsIGQsIG4sIGspO1xufVxuXG52YXIgSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXTtcblxuZnVuY3Rpb24gY3J5cHRvX2hhc2hibG9ja3NfaGwoaGgsIGhsLCBtLCBuKSB7XG4gIHZhciB3aCA9IG5ldyBJbnQzMkFycmF5KDE2KSwgd2wgPSBuZXcgSW50MzJBcnJheSgxNiksXG4gICAgICBiaDAsIGJoMSwgYmgyLCBiaDMsIGJoNCwgYmg1LCBiaDYsIGJoNyxcbiAgICAgIGJsMCwgYmwxLCBibDIsIGJsMywgYmw0LCBibDUsIGJsNiwgYmw3LFxuICAgICAgdGgsIHRsLCBpLCBqLCBoLCBsLCBhLCBiLCBjLCBkO1xuXG4gIHZhciBhaDAgPSBoaFswXSxcbiAgICAgIGFoMSA9IGhoWzFdLFxuICAgICAgYWgyID0gaGhbMl0sXG4gICAgICBhaDMgPSBoaFszXSxcbiAgICAgIGFoNCA9IGhoWzRdLFxuICAgICAgYWg1ID0gaGhbNV0sXG4gICAgICBhaDYgPSBoaFs2XSxcbiAgICAgIGFoNyA9IGhoWzddLFxuXG4gICAgICBhbDAgPSBobFswXSxcbiAgICAgIGFsMSA9IGhsWzFdLFxuICAgICAgYWwyID0gaGxbMl0sXG4gICAgICBhbDMgPSBobFszXSxcbiAgICAgIGFsNCA9IGhsWzRdLFxuICAgICAgYWw1ID0gaGxbNV0sXG4gICAgICBhbDYgPSBobFs2XSxcbiAgICAgIGFsNyA9IGhsWzddO1xuXG4gIHZhciBwb3MgPSAwO1xuICB3aGlsZSAobiA+PSAxMjgpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgaiA9IDggKiBpICsgcG9zO1xuICAgICAgd2hbaV0gPSAobVtqKzBdIDw8IDI0KSB8IChtW2orMV0gPDwgMTYpIHwgKG1baisyXSA8PCA4KSB8IG1baiszXTtcbiAgICAgIHdsW2ldID0gKG1bais0XSA8PCAyNCkgfCAobVtqKzVdIDw8IDE2KSB8IChtW2orNl0gPDwgOCkgfCBtW2orN107XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG4gICAgICBiaDAgPSBhaDA7XG4gICAgICBiaDEgPSBhaDE7XG4gICAgICBiaDIgPSBhaDI7XG4gICAgICBiaDMgPSBhaDM7XG4gICAgICBiaDQgPSBhaDQ7XG4gICAgICBiaDUgPSBhaDU7XG4gICAgICBiaDYgPSBhaDY7XG4gICAgICBiaDcgPSBhaDc7XG5cbiAgICAgIGJsMCA9IGFsMDtcbiAgICAgIGJsMSA9IGFsMTtcbiAgICAgIGJsMiA9IGFsMjtcbiAgICAgIGJsMyA9IGFsMztcbiAgICAgIGJsNCA9IGFsNDtcbiAgICAgIGJsNSA9IGFsNTtcbiAgICAgIGJsNiA9IGFsNjtcbiAgICAgIGJsNyA9IGFsNztcblxuICAgICAgLy8gYWRkXG4gICAgICBoID0gYWg3O1xuICAgICAgbCA9IGFsNztcblxuICAgICAgYSA9IGwgJiAweGZmZmY7IGIgPSBsID4+PiAxNjtcbiAgICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICAgIC8vIFNpZ21hMVxuICAgICAgaCA9ICgoYWg0ID4+PiAxNCkgfCAoYWw0IDw8ICgzMi0xNCkpKSBeICgoYWg0ID4+PiAxOCkgfCAoYWw0IDw8ICgzMi0xOCkpKSBeICgoYWw0ID4+PiAoNDEtMzIpKSB8IChhaDQgPDwgKDMyLSg0MS0zMikpKSk7XG4gICAgICBsID0gKChhbDQgPj4+IDE0KSB8IChhaDQgPDwgKDMyLTE0KSkpIF4gKChhbDQgPj4+IDE4KSB8IChhaDQgPDwgKDMyLTE4KSkpIF4gKChhaDQgPj4+ICg0MS0zMikpIHwgKGFsNCA8PCAoMzItKDQxLTMyKSkpKTtcblxuICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICAvLyBDaFxuICAgICAgaCA9IChhaDQgJiBhaDUpIF4gKH5haDQgJiBhaDYpO1xuICAgICAgbCA9IChhbDQgJiBhbDUpIF4gKH5hbDQgJiBhbDYpO1xuXG4gICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICBjICs9IGggJiAweGZmZmY7IGQgKz0gaCA+Pj4gMTY7XG5cbiAgICAgIC8vIEtcbiAgICAgIGggPSBLW2kqMl07XG4gICAgICBsID0gS1tpKjIrMV07XG5cbiAgICAgIGEgKz0gbCAmIDB4ZmZmZjsgYiArPSBsID4+PiAxNjtcbiAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgLy8gd1xuICAgICAgaCA9IHdoW2klMTZdO1xuICAgICAgbCA9IHdsW2klMTZdO1xuXG4gICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICBjICs9IGggJiAweGZmZmY7IGQgKz0gaCA+Pj4gMTY7XG5cbiAgICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgICBjICs9IGIgPj4+IDE2O1xuICAgICAgZCArPSBjID4+PiAxNjtcblxuICAgICAgdGggPSBjICYgMHhmZmZmIHwgZCA8PCAxNjtcbiAgICAgIHRsID0gYSAmIDB4ZmZmZiB8IGIgPDwgMTY7XG5cbiAgICAgIC8vIGFkZFxuICAgICAgaCA9IHRoO1xuICAgICAgbCA9IHRsO1xuXG4gICAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgICAgLy8gU2lnbWEwXG4gICAgICBoID0gKChhaDAgPj4+IDI4KSB8IChhbDAgPDwgKDMyLTI4KSkpIF4gKChhbDAgPj4+ICgzNC0zMikpIHwgKGFoMCA8PCAoMzItKDM0LTMyKSkpKSBeICgoYWwwID4+PiAoMzktMzIpKSB8IChhaDAgPDwgKDMyLSgzOS0zMikpKSk7XG4gICAgICBsID0gKChhbDAgPj4+IDI4KSB8IChhaDAgPDwgKDMyLTI4KSkpIF4gKChhaDAgPj4+ICgzNC0zMikpIHwgKGFsMCA8PCAoMzItKDM0LTMyKSkpKSBeICgoYWgwID4+PiAoMzktMzIpKSB8IChhbDAgPDwgKDMyLSgzOS0zMikpKSk7XG5cbiAgICAgIGEgKz0gbCAmIDB4ZmZmZjsgYiArPSBsID4+PiAxNjtcbiAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgLy8gTWFqXG4gICAgICBoID0gKGFoMCAmIGFoMSkgXiAoYWgwICYgYWgyKSBeIChhaDEgJiBhaDIpO1xuICAgICAgbCA9IChhbDAgJiBhbDEpIF4gKGFsMCAmIGFsMikgXiAoYWwxICYgYWwyKTtcblxuICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICBiICs9IGEgPj4+IDE2O1xuICAgICAgYyArPSBiID4+PiAxNjtcbiAgICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICAgIGJoNyA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICAgIGJsNyA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgICAgLy8gYWRkXG4gICAgICBoID0gYmgzO1xuICAgICAgbCA9IGJsMztcblxuICAgICAgYSA9IGwgJiAweGZmZmY7IGIgPSBsID4+PiAxNjtcbiAgICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICAgIGggPSB0aDtcbiAgICAgIGwgPSB0bDtcblxuICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICBiICs9IGEgPj4+IDE2O1xuICAgICAgYyArPSBiID4+PiAxNjtcbiAgICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICAgIGJoMyA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICAgIGJsMyA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgICAgYWgxID0gYmgwO1xuICAgICAgYWgyID0gYmgxO1xuICAgICAgYWgzID0gYmgyO1xuICAgICAgYWg0ID0gYmgzO1xuICAgICAgYWg1ID0gYmg0O1xuICAgICAgYWg2ID0gYmg1O1xuICAgICAgYWg3ID0gYmg2O1xuICAgICAgYWgwID0gYmg3O1xuXG4gICAgICBhbDEgPSBibDA7XG4gICAgICBhbDIgPSBibDE7XG4gICAgICBhbDMgPSBibDI7XG4gICAgICBhbDQgPSBibDM7XG4gICAgICBhbDUgPSBibDQ7XG4gICAgICBhbDYgPSBibDU7XG4gICAgICBhbDcgPSBibDY7XG4gICAgICBhbDAgPSBibDc7XG5cbiAgICAgIGlmIChpJTE2ID09PSAxNSkge1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykge1xuICAgICAgICAgIC8vIGFkZFxuICAgICAgICAgIGggPSB3aFtqXTtcbiAgICAgICAgICBsID0gd2xbal07XG5cbiAgICAgICAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgICAgICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICAgICAgICBoID0gd2hbKGorOSklMTZdO1xuICAgICAgICAgIGwgPSB3bFsoais5KSUxNl07XG5cbiAgICAgICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICAgICAgLy8gc2lnbWEwXG4gICAgICAgICAgdGggPSB3aFsoaisxKSUxNl07XG4gICAgICAgICAgdGwgPSB3bFsoaisxKSUxNl07XG4gICAgICAgICAgaCA9ICgodGggPj4+IDEpIHwgKHRsIDw8ICgzMi0xKSkpIF4gKCh0aCA+Pj4gOCkgfCAodGwgPDwgKDMyLTgpKSkgXiAodGggPj4+IDcpO1xuICAgICAgICAgIGwgPSAoKHRsID4+PiAxKSB8ICh0aCA8PCAoMzItMSkpKSBeICgodGwgPj4+IDgpIHwgKHRoIDw8ICgzMi04KSkpIF4gKCh0bCA+Pj4gNykgfCAodGggPDwgKDMyLTcpKSk7XG5cbiAgICAgICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICAgICAgLy8gc2lnbWExXG4gICAgICAgICAgdGggPSB3aFsoaisxNCklMTZdO1xuICAgICAgICAgIHRsID0gd2xbKGorMTQpJTE2XTtcbiAgICAgICAgICBoID0gKCh0aCA+Pj4gMTkpIHwgKHRsIDw8ICgzMi0xOSkpKSBeICgodGwgPj4+ICg2MS0zMikpIHwgKHRoIDw8ICgzMi0oNjEtMzIpKSkpIF4gKHRoID4+PiA2KTtcbiAgICAgICAgICBsID0gKCh0bCA+Pj4gMTkpIHwgKHRoIDw8ICgzMi0xOSkpKSBeICgodGggPj4+ICg2MS0zMikpIHwgKHRsIDw8ICgzMi0oNjEtMzIpKSkpIF4gKCh0bCA+Pj4gNikgfCAodGggPDwgKDMyLTYpKSk7XG5cbiAgICAgICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICAgICAgYiArPSBhID4+PiAxNjtcbiAgICAgICAgICBjICs9IGIgPj4+IDE2O1xuICAgICAgICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICAgICAgICB3aFtqXSA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICAgICAgICB3bFtqXSA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZFxuICAgIGggPSBhaDA7XG4gICAgbCA9IGFsMDtcblxuICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgIGggPSBoaFswXTtcbiAgICBsID0gaGxbMF07XG5cbiAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgYiArPSBhID4+PiAxNjtcbiAgICBjICs9IGIgPj4+IDE2O1xuICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICBoaFswXSA9IGFoMCA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICBobFswXSA9IGFsMCA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgIGggPSBhaDE7XG4gICAgbCA9IGFsMTtcblxuICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgIGggPSBoaFsxXTtcbiAgICBsID0gaGxbMV07XG5cbiAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgYiArPSBhID4+PiAxNjtcbiAgICBjICs9IGIgPj4+IDE2O1xuICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICBoaFsxXSA9IGFoMSA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICBobFsxXSA9IGFsMSA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgIGggPSBhaDI7XG4gICAgbCA9IGFsMjtcblxuICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgIGggPSBoaFsyXTtcbiAgICBsID0gaGxbMl07XG5cbiAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgYiArPSBhID4+PiAxNjtcbiAgICBjICs9IGIgPj4+IDE2O1xuICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICBoaFsyXSA9IGFoMiA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICBobFsyXSA9IGFsMiA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgIGggPSBhaDM7XG4gICAgbCA9IGFsMztcblxuICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgIGggPSBoaFszXTtcbiAgICBsID0gaGxbM107XG5cbiAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgYiArPSBhID4+PiAxNjtcbiAgICBjICs9IGIgPj4+IDE2O1xuICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICBoaFszXSA9IGFoMyA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICBobFszXSA9IGFsMyA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgIGggPSBhaDQ7XG4gICAgbCA9IGFsNDtcblxuICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgIGggPSBoaFs0XTtcbiAgICBsID0gaGxbNF07XG5cbiAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgYiArPSBhID4+PiAxNjtcbiAgICBjICs9IGIgPj4+IDE2O1xuICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICBoaFs0XSA9IGFoNCA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICBobFs0XSA9IGFsNCA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgIGggPSBhaDU7XG4gICAgbCA9IGFsNTtcblxuICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgIGggPSBoaFs1XTtcbiAgICBsID0gaGxbNV07XG5cbiAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgYiArPSBhID4+PiAxNjtcbiAgICBjICs9IGIgPj4+IDE2O1xuICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICBoaFs1XSA9IGFoNSA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICBobFs1XSA9IGFsNSA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgIGggPSBhaDY7XG4gICAgbCA9IGFsNjtcblxuICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgIGggPSBoaFs2XTtcbiAgICBsID0gaGxbNl07XG5cbiAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgYiArPSBhID4+PiAxNjtcbiAgICBjICs9IGIgPj4+IDE2O1xuICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICBoaFs2XSA9IGFoNiA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICBobFs2XSA9IGFsNiA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgIGggPSBhaDc7XG4gICAgbCA9IGFsNztcblxuICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgYyA9IGggJiAweGZmZmY7IGQgPSBoID4+PiAxNjtcblxuICAgIGggPSBoaFs3XTtcbiAgICBsID0gaGxbN107XG5cbiAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgYiArPSBhID4+PiAxNjtcbiAgICBjICs9IGIgPj4+IDE2O1xuICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICBoaFs3XSA9IGFoNyA9IChjICYgMHhmZmZmKSB8IChkIDw8IDE2KTtcbiAgICBobFs3XSA9IGFsNyA9IChhICYgMHhmZmZmKSB8IChiIDw8IDE2KTtcblxuICAgIHBvcyArPSAxMjg7XG4gICAgbiAtPSAxMjg7XG4gIH1cblxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX2hhc2gob3V0LCBtLCBuKSB7XG4gIHZhciBoaCA9IG5ldyBJbnQzMkFycmF5KDgpLFxuICAgICAgaGwgPSBuZXcgSW50MzJBcnJheSg4KSxcbiAgICAgIHggPSBuZXcgVWludDhBcnJheSgyNTYpLFxuICAgICAgaSwgYiA9IG47XG5cbiAgaGhbMF0gPSAweDZhMDllNjY3O1xuICBoaFsxXSA9IDB4YmI2N2FlODU7XG4gIGhoWzJdID0gMHgzYzZlZjM3MjtcbiAgaGhbM10gPSAweGE1NGZmNTNhO1xuICBoaFs0XSA9IDB4NTEwZTUyN2Y7XG4gIGhoWzVdID0gMHg5YjA1Njg4YztcbiAgaGhbNl0gPSAweDFmODNkOWFiO1xuICBoaFs3XSA9IDB4NWJlMGNkMTk7XG5cbiAgaGxbMF0gPSAweGYzYmNjOTA4O1xuICBobFsxXSA9IDB4ODRjYWE3M2I7XG4gIGhsWzJdID0gMHhmZTk0ZjgyYjtcbiAgaGxbM10gPSAweDVmMWQzNmYxO1xuICBobFs0XSA9IDB4YWRlNjgyZDE7XG4gIGhsWzVdID0gMHgyYjNlNmMxZjtcbiAgaGxbNl0gPSAweGZiNDFiZDZiO1xuICBobFs3XSA9IDB4MTM3ZTIxNzk7XG5cbiAgY3J5cHRvX2hhc2hibG9ja3NfaGwoaGgsIGhsLCBtLCBuKTtcbiAgbiAlPSAxMjg7XG5cbiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeFtpXSA9IG1bYi1uK2ldO1xuICB4W25dID0gMTI4O1xuXG4gIG4gPSAyNTYtMTI4KihuPDExMj8xOjApO1xuICB4W24tOV0gPSAwO1xuICB0czY0KHgsIG4tOCwgIChiIC8gMHgyMDAwMDAwMCkgfCAwLCBiIDw8IDMpO1xuICBjcnlwdG9faGFzaGJsb2Nrc19obChoaCwgaGwsIHgsIG4pO1xuXG4gIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHRzNjQob3V0LCA4KmksIGhoW2ldLCBobFtpXSk7XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGFkZChwLCBxKSB7XG4gIHZhciBhID0gZ2YoKSwgYiA9IGdmKCksIGMgPSBnZigpLFxuICAgICAgZCA9IGdmKCksIGUgPSBnZigpLCBmID0gZ2YoKSxcbiAgICAgIGcgPSBnZigpLCBoID0gZ2YoKSwgdCA9IGdmKCk7XG5cbiAgWihhLCBwWzFdLCBwWzBdKTtcbiAgWih0LCBxWzFdLCBxWzBdKTtcbiAgTShhLCBhLCB0KTtcbiAgQShiLCBwWzBdLCBwWzFdKTtcbiAgQSh0LCBxWzBdLCBxWzFdKTtcbiAgTShiLCBiLCB0KTtcbiAgTShjLCBwWzNdLCBxWzNdKTtcbiAgTShjLCBjLCBEMik7XG4gIE0oZCwgcFsyXSwgcVsyXSk7XG4gIEEoZCwgZCwgZCk7XG4gIFooZSwgYiwgYSk7XG4gIFooZiwgZCwgYyk7XG4gIEEoZywgZCwgYyk7XG4gIEEoaCwgYiwgYSk7XG5cbiAgTShwWzBdLCBlLCBmKTtcbiAgTShwWzFdLCBoLCBnKTtcbiAgTShwWzJdLCBnLCBmKTtcbiAgTShwWzNdLCBlLCBoKTtcbn1cblxuZnVuY3Rpb24gY3N3YXAocCwgcSwgYikge1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHNlbDI1NTE5KHBbaV0sIHFbaV0sIGIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhY2sociwgcCkge1xuICB2YXIgdHggPSBnZigpLCB0eSA9IGdmKCksIHppID0gZ2YoKTtcbiAgaW52MjU1MTkoemksIHBbMl0pO1xuICBNKHR4LCBwWzBdLCB6aSk7XG4gIE0odHksIHBbMV0sIHppKTtcbiAgcGFjazI1NTE5KHIsIHR5KTtcbiAgclszMV0gXj0gcGFyMjU1MTkodHgpIDw8IDc7XG59XG5cbmZ1bmN0aW9uIHNjYWxhcm11bHQocCwgcSwgcykge1xuICB2YXIgYiwgaTtcbiAgc2V0MjU1MTkocFswXSwgZ2YwKTtcbiAgc2V0MjU1MTkocFsxXSwgZ2YxKTtcbiAgc2V0MjU1MTkocFsyXSwgZ2YxKTtcbiAgc2V0MjU1MTkocFszXSwgZ2YwKTtcbiAgZm9yIChpID0gMjU1OyBpID49IDA7IC0taSkge1xuICAgIGIgPSAoc1soaS84KXwwXSA+PiAoaSY3KSkgJiAxO1xuICAgIGNzd2FwKHAsIHEsIGIpO1xuICAgIGFkZChxLCBwKTtcbiAgICBhZGQocCwgcCk7XG4gICAgY3N3YXAocCwgcSwgYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NhbGFyYmFzZShwLCBzKSB7XG4gIHZhciBxID0gW2dmKCksIGdmKCksIGdmKCksIGdmKCldO1xuICBzZXQyNTUxOShxWzBdLCBYKTtcbiAgc2V0MjU1MTkocVsxXSwgWSk7XG4gIHNldDI1NTE5KHFbMl0sIGdmMSk7XG4gIE0ocVszXSwgWCwgWSk7XG4gIHNjYWxhcm11bHQocCwgcSwgcyk7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zaWduX2tleXBhaXIocGssIHNrLCBzZWVkZWQpIHtcbiAgdmFyIGQgPSBuZXcgVWludDhBcnJheSg2NCk7XG4gIHZhciBwID0gW2dmKCksIGdmKCksIGdmKCksIGdmKCldO1xuICB2YXIgaTtcblxuICBpZiAoIXNlZWRlZCkgcmFuZG9tYnl0ZXMoc2ssIDMyKTtcbiAgY3J5cHRvX2hhc2goZCwgc2ssIDMyKTtcbiAgZFswXSAmPSAyNDg7XG4gIGRbMzFdICY9IDEyNztcbiAgZFszMV0gfD0gNjQ7XG5cbiAgc2NhbGFyYmFzZShwLCBkKTtcbiAgcGFjayhwaywgcCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHNrW2krMzJdID0gcGtbaV07XG4gIHJldHVybiAwO1xufVxuXG52YXIgTCA9IG5ldyBGbG9hdDY0QXJyYXkoWzB4ZWQsIDB4ZDMsIDB4ZjUsIDB4NWMsIDB4MWEsIDB4NjMsIDB4MTIsIDB4NTgsIDB4ZDYsIDB4OWMsIDB4ZjcsIDB4YTIsIDB4ZGUsIDB4ZjksIDB4ZGUsIDB4MTQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MTBdKTtcblxuZnVuY3Rpb24gbW9kTChyLCB4KSB7XG4gIHZhciBjYXJyeSwgaSwgaiwgaztcbiAgZm9yIChpID0gNjM7IGkgPj0gMzI7IC0taSkge1xuICAgIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGogPSBpIC0gMzIsIGsgPSBpIC0gMTI7IGogPCBrOyArK2opIHtcbiAgICAgIHhbal0gKz0gY2FycnkgLSAxNiAqIHhbaV0gKiBMW2ogLSAoaSAtIDMyKV07XG4gICAgICBjYXJyeSA9ICh4W2pdICsgMTI4KSA+PiA4O1xuICAgICAgeFtqXSAtPSBjYXJyeSAqIDI1NjtcbiAgICB9XG4gICAgeFtqXSArPSBjYXJyeTtcbiAgICB4W2ldID0gMDtcbiAgfVxuICBjYXJyeSA9IDA7XG4gIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7XG4gICAgeFtqXSArPSBjYXJyeSAtICh4WzMxXSA+PiA0KSAqIExbal07XG4gICAgY2FycnkgPSB4W2pdID4+IDg7XG4gICAgeFtqXSAmPSAyNTU7XG4gIH1cbiAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHhbal0gLT0gY2FycnkgKiBMW2pdO1xuICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykge1xuICAgIHhbaSsxXSArPSB4W2ldID4+IDg7XG4gICAgcltpXSA9IHhbaV0gJiAyNTU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlKHIpIHtcbiAgdmFyIHggPSBuZXcgRmxvYXQ2NEFycmF5KDY0KSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHhbaV0gPSByW2ldO1xuICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgcltpXSA9IDA7XG4gIG1vZEwociwgeCk7XG59XG5cbi8vIE5vdGU6IGRpZmZlcmVuY2UgZnJvbSBDIC0gc21sZW4gcmV0dXJuZWQsIG5vdCBwYXNzZWQgYXMgYXJndW1lbnQuXG5mdW5jdGlvbiBjcnlwdG9fc2lnbihzbSwgbSwgbiwgc2spIHtcbiAgdmFyIGQgPSBuZXcgVWludDhBcnJheSg2NCksIGggPSBuZXcgVWludDhBcnJheSg2NCksIHIgPSBuZXcgVWludDhBcnJheSg2NCk7XG4gIHZhciBpLCBqLCB4ID0gbmV3IEZsb2F0NjRBcnJheSg2NCk7XG4gIHZhciBwID0gW2dmKCksIGdmKCksIGdmKCksIGdmKCldO1xuXG4gIGNyeXB0b19oYXNoKGQsIHNrLCAzMik7XG4gIGRbMF0gJj0gMjQ4O1xuICBkWzMxXSAmPSAxMjc7XG4gIGRbMzFdIHw9IDY0O1xuXG4gIHZhciBzbWxlbiA9IG4gKyA2NDtcbiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgc21bNjQgKyBpXSA9IG1baV07XG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSBzbVszMiArIGldID0gZFszMiArIGldO1xuXG4gIGNyeXB0b19oYXNoKHIsIHNtLnN1YmFycmF5KDMyKSwgbiszMik7XG4gIHJlZHVjZShyKTtcbiAgc2NhbGFyYmFzZShwLCByKTtcbiAgcGFjayhzbSwgcCk7XG5cbiAgZm9yIChpID0gMzI7IGkgPCA2NDsgaSsrKSBzbVtpXSA9IHNrW2ldO1xuICBjcnlwdG9faGFzaChoLCBzbSwgbiArIDY0KTtcbiAgcmVkdWNlKGgpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB4W2ldID0gMDtcbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHhbaV0gPSByW2ldO1xuICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykge1xuICAgIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7XG4gICAgICB4W2kral0gKz0gaFtpXSAqIGRbal07XG4gICAgfVxuICB9XG5cbiAgbW9kTChzbS5zdWJhcnJheSgzMiksIHgpO1xuICByZXR1cm4gc21sZW47XG59XG5cbmZ1bmN0aW9uIHVucGFja25lZyhyLCBwKSB7XG4gIHZhciB0ID0gZ2YoKSwgY2hrID0gZ2YoKSwgbnVtID0gZ2YoKSxcbiAgICAgIGRlbiA9IGdmKCksIGRlbjIgPSBnZigpLCBkZW40ID0gZ2YoKSxcbiAgICAgIGRlbjYgPSBnZigpO1xuXG4gIHNldDI1NTE5KHJbMl0sIGdmMSk7XG4gIHVucGFjazI1NTE5KHJbMV0sIHApO1xuICBTKG51bSwgclsxXSk7XG4gIE0oZGVuLCBudW0sIEQpO1xuICBaKG51bSwgbnVtLCByWzJdKTtcbiAgQShkZW4sIHJbMl0sIGRlbik7XG5cbiAgUyhkZW4yLCBkZW4pO1xuICBTKGRlbjQsIGRlbjIpO1xuICBNKGRlbjYsIGRlbjQsIGRlbjIpO1xuICBNKHQsIGRlbjYsIG51bSk7XG4gIE0odCwgdCwgZGVuKTtcblxuICBwb3cyNTIzKHQsIHQpO1xuICBNKHQsIHQsIG51bSk7XG4gIE0odCwgdCwgZGVuKTtcbiAgTSh0LCB0LCBkZW4pO1xuICBNKHJbMF0sIHQsIGRlbik7XG5cbiAgUyhjaGssIHJbMF0pO1xuICBNKGNoaywgY2hrLCBkZW4pO1xuICBpZiAobmVxMjU1MTkoY2hrLCBudW0pKSBNKHJbMF0sIHJbMF0sIEkpO1xuXG4gIFMoY2hrLCByWzBdKTtcbiAgTShjaGssIGNoaywgZGVuKTtcbiAgaWYgKG5lcTI1NTE5KGNoaywgbnVtKSkgcmV0dXJuIC0xO1xuXG4gIGlmIChwYXIyNTUxOShyWzBdKSA9PT0gKHBbMzFdPj43KSkgWihyWzBdLCBnZjAsIHJbMF0pO1xuXG4gIE0oclszXSwgclswXSwgclsxXSk7XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fc2lnbl9vcGVuKG0sIHNtLCBuLCBwaykge1xuICB2YXIgaSwgbWxlbjtcbiAgdmFyIHQgPSBuZXcgVWludDhBcnJheSgzMiksIGggPSBuZXcgVWludDhBcnJheSg2NCk7XG4gIHZhciBwID0gW2dmKCksIGdmKCksIGdmKCksIGdmKCldLFxuICAgICAgcSA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXTtcblxuICBtbGVuID0gLTE7XG4gIGlmIChuIDwgNjQpIHJldHVybiAtMTtcblxuICBpZiAodW5wYWNrbmVnKHEsIHBrKSkgcmV0dXJuIC0xO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIG1baV0gPSBzbVtpXTtcbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIG1baSszMl0gPSBwa1tpXTtcbiAgY3J5cHRvX2hhc2goaCwgbSwgbik7XG4gIHJlZHVjZShoKTtcbiAgc2NhbGFybXVsdChwLCBxLCBoKTtcblxuICBzY2FsYXJiYXNlKHEsIHNtLnN1YmFycmF5KDMyKSk7XG4gIGFkZChwLCBxKTtcbiAgcGFjayh0LCBwKTtcblxuICBuIC09IDY0O1xuICBpZiAoY3J5cHRvX3ZlcmlmeV8zMihzbSwgMCwgdCwgMCkpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBtW2ldID0gMDtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBtW2ldID0gc21baSArIDY0XTtcbiAgbWxlbiA9IG47XG4gIHJldHVybiBtbGVuO1xufVxuXG52YXIgY3J5cHRvX3NlY3JldGJveF9LRVlCWVRFUyA9IDMyLFxuICAgIGNyeXB0b19zZWNyZXRib3hfTk9OQ0VCWVRFUyA9IDI0LFxuICAgIGNyeXB0b19zZWNyZXRib3hfWkVST0JZVEVTID0gMzIsXG4gICAgY3J5cHRvX3NlY3JldGJveF9CT1haRVJPQllURVMgPSAxNixcbiAgICBjcnlwdG9fc2NhbGFybXVsdF9CWVRFUyA9IDMyLFxuICAgIGNyeXB0b19zY2FsYXJtdWx0X1NDQUxBUkJZVEVTID0gMzIsXG4gICAgY3J5cHRvX2JveF9QVUJMSUNLRVlCWVRFUyA9IDMyLFxuICAgIGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVMgPSAzMixcbiAgICBjcnlwdG9fYm94X0JFRk9SRU5NQllURVMgPSAzMixcbiAgICBjcnlwdG9fYm94X05PTkNFQllURVMgPSBjcnlwdG9fc2VjcmV0Ym94X05PTkNFQllURVMsXG4gICAgY3J5cHRvX2JveF9aRVJPQllURVMgPSBjcnlwdG9fc2VjcmV0Ym94X1pFUk9CWVRFUyxcbiAgICBjcnlwdG9fYm94X0JPWFpFUk9CWVRFUyA9IGNyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTLFxuICAgIGNyeXB0b19zaWduX0JZVEVTID0gNjQsXG4gICAgY3J5cHRvX3NpZ25fUFVCTElDS0VZQllURVMgPSAzMixcbiAgICBjcnlwdG9fc2lnbl9TRUNSRVRLRVlCWVRFUyA9IDY0LFxuICAgIGNyeXB0b19zaWduX1NFRURCWVRFUyA9IDMyLFxuICAgIGNyeXB0b19oYXNoX0JZVEVTID0gNjQ7XG5cbm5hY2wubG93bGV2ZWwgPSB7XG4gIGNyeXB0b19jb3JlX2hzYWxzYTIwOiBjcnlwdG9fY29yZV9oc2Fsc2EyMCxcbiAgY3J5cHRvX3N0cmVhbV94b3I6IGNyeXB0b19zdHJlYW1feG9yLFxuICBjcnlwdG9fc3RyZWFtOiBjcnlwdG9fc3RyZWFtLFxuICBjcnlwdG9fc3RyZWFtX3NhbHNhMjBfeG9yOiBjcnlwdG9fc3RyZWFtX3NhbHNhMjBfeG9yLFxuICBjcnlwdG9fc3RyZWFtX3NhbHNhMjA6IGNyeXB0b19zdHJlYW1fc2Fsc2EyMCxcbiAgY3J5cHRvX29uZXRpbWVhdXRoOiBjcnlwdG9fb25ldGltZWF1dGgsXG4gIGNyeXB0b19vbmV0aW1lYXV0aF92ZXJpZnk6IGNyeXB0b19vbmV0aW1lYXV0aF92ZXJpZnksXG4gIGNyeXB0b192ZXJpZnlfMTY6IGNyeXB0b192ZXJpZnlfMTYsXG4gIGNyeXB0b192ZXJpZnlfMzI6IGNyeXB0b192ZXJpZnlfMzIsXG4gIGNyeXB0b19zZWNyZXRib3g6IGNyeXB0b19zZWNyZXRib3gsXG4gIGNyeXB0b19zZWNyZXRib3hfb3BlbjogY3J5cHRvX3NlY3JldGJveF9vcGVuLFxuICBjcnlwdG9fc2NhbGFybXVsdDogY3J5cHRvX3NjYWxhcm11bHQsXG4gIGNyeXB0b19zY2FsYXJtdWx0X2Jhc2U6IGNyeXB0b19zY2FsYXJtdWx0X2Jhc2UsXG4gIGNyeXB0b19ib3hfYmVmb3Jlbm06IGNyeXB0b19ib3hfYmVmb3Jlbm0sXG4gIGNyeXB0b19ib3hfYWZ0ZXJubTogY3J5cHRvX2JveF9hZnRlcm5tLFxuICBjcnlwdG9fYm94OiBjcnlwdG9fYm94LFxuICBjcnlwdG9fYm94X29wZW46IGNyeXB0b19ib3hfb3BlbixcbiAgY3J5cHRvX2JveF9rZXlwYWlyOiBjcnlwdG9fYm94X2tleXBhaXIsXG4gIGNyeXB0b19oYXNoOiBjcnlwdG9faGFzaCxcbiAgY3J5cHRvX3NpZ246IGNyeXB0b19zaWduLFxuICBjcnlwdG9fc2lnbl9rZXlwYWlyOiBjcnlwdG9fc2lnbl9rZXlwYWlyLFxuICBjcnlwdG9fc2lnbl9vcGVuOiBjcnlwdG9fc2lnbl9vcGVuLFxuXG4gIGNyeXB0b19zZWNyZXRib3hfS0VZQllURVM6IGNyeXB0b19zZWNyZXRib3hfS0VZQllURVMsXG4gIGNyeXB0b19zZWNyZXRib3hfTk9OQ0VCWVRFUzogY3J5cHRvX3NlY3JldGJveF9OT05DRUJZVEVTLFxuICBjcnlwdG9fc2VjcmV0Ym94X1pFUk9CWVRFUzogY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVMsXG4gIGNyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTOiBjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUyxcbiAgY3J5cHRvX3NjYWxhcm11bHRfQllURVM6IGNyeXB0b19zY2FsYXJtdWx0X0JZVEVTLFxuICBjcnlwdG9fc2NhbGFybXVsdF9TQ0FMQVJCWVRFUzogY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVMsXG4gIGNyeXB0b19ib3hfUFVCTElDS0VZQllURVM6IGNyeXB0b19ib3hfUFVCTElDS0VZQllURVMsXG4gIGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVM6IGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVMsXG4gIGNyeXB0b19ib3hfQkVGT1JFTk1CWVRFUzogY3J5cHRvX2JveF9CRUZPUkVOTUJZVEVTLFxuICBjcnlwdG9fYm94X05PTkNFQllURVM6IGNyeXB0b19ib3hfTk9OQ0VCWVRFUyxcbiAgY3J5cHRvX2JveF9aRVJPQllURVM6IGNyeXB0b19ib3hfWkVST0JZVEVTLFxuICBjcnlwdG9fYm94X0JPWFpFUk9CWVRFUzogY3J5cHRvX2JveF9CT1haRVJPQllURVMsXG4gIGNyeXB0b19zaWduX0JZVEVTOiBjcnlwdG9fc2lnbl9CWVRFUyxcbiAgY3J5cHRvX3NpZ25fUFVCTElDS0VZQllURVM6IGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTLFxuICBjcnlwdG9fc2lnbl9TRUNSRVRLRVlCWVRFUzogY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMsXG4gIGNyeXB0b19zaWduX1NFRURCWVRFUzogY3J5cHRvX3NpZ25fU0VFREJZVEVTLFxuICBjcnlwdG9faGFzaF9CWVRFUzogY3J5cHRvX2hhc2hfQllURVNcbn07XG5cbi8qIEhpZ2gtbGV2ZWwgQVBJICovXG5cbmZ1bmN0aW9uIGNoZWNrTGVuZ3RocyhrLCBuKSB7XG4gIGlmIChrLmxlbmd0aCAhPT0gY3J5cHRvX3NlY3JldGJveF9LRVlCWVRFUykgdGhyb3cgbmV3IEVycm9yKCdiYWQga2V5IHNpemUnKTtcbiAgaWYgKG4ubGVuZ3RoICE9PSBjcnlwdG9fc2VjcmV0Ym94X05PTkNFQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIG5vbmNlIHNpemUnKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tCb3hMZW5ndGhzKHBrLCBzaykge1xuICBpZiAocGsubGVuZ3RoICE9PSBjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwdWJsaWMga2V5IHNpemUnKTtcbiAgaWYgKHNrLmxlbmd0aCAhPT0gY3J5cHRvX2JveF9TRUNSRVRLRVlCWVRFUykgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2VjcmV0IGtleSBzaXplJyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQXJyYXlUeXBlcygpIHtcbiAgdmFyIHQsIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgaWYgKCh0ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50c1tpXSkpICE9PSAnW29iamVjdCBVaW50OEFycmF5XScpXG4gICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5leHBlY3RlZCB0eXBlICcgKyB0ICsgJywgdXNlIFVpbnQ4QXJyYXknKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhbnVwKGFycikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgYXJyW2ldID0gMDtcbn1cblxuLy8gVE9ETzogQ29tcGxldGVseSByZW1vdmUgdGhpcyBpbiB2MC4xNS5cbmlmICghbmFjbC51dGlsKSB7XG4gIG5hY2wudXRpbCA9IHt9O1xuICBuYWNsLnV0aWwuZGVjb2RlVVRGOCA9IG5hY2wudXRpbC5lbmNvZGVVVEY4ID0gbmFjbC51dGlsLmVuY29kZUJhc2U2NCA9IG5hY2wudXRpbC5kZWNvZGVCYXNlNjQgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25hY2wudXRpbCBtb3ZlZCBpbnRvIHNlcGFyYXRlIHBhY2thZ2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9kY2hlc3QvdHdlZXRuYWNsLXV0aWwtanMnKTtcbiAgfTtcbn1cblxubmFjbC5yYW5kb21CeXRlcyA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIGIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgcmFuZG9tYnl0ZXMoYiwgbik7XG4gIHJldHVybiBiO1xufTtcblxubmFjbC5zZWNyZXRib3ggPSBmdW5jdGlvbihtc2csIG5vbmNlLCBrZXkpIHtcbiAgY2hlY2tBcnJheVR5cGVzKG1zZywgbm9uY2UsIGtleSk7XG4gIGNoZWNrTGVuZ3RocyhrZXksIG5vbmNlKTtcbiAgdmFyIG0gPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2VjcmV0Ym94X1pFUk9CWVRFUyArIG1zZy5sZW5ndGgpO1xuICB2YXIgYyA9IG5ldyBVaW50OEFycmF5KG0ubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIG1baStjcnlwdG9fc2VjcmV0Ym94X1pFUk9CWVRFU10gPSBtc2dbaV07XG4gIGNyeXB0b19zZWNyZXRib3goYywgbSwgbS5sZW5ndGgsIG5vbmNlLCBrZXkpO1xuICByZXR1cm4gYy5zdWJhcnJheShjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUyk7XG59O1xuXG5uYWNsLnNlY3JldGJveC5vcGVuID0gZnVuY3Rpb24oYm94LCBub25jZSwga2V5KSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhib3gsIG5vbmNlLCBrZXkpO1xuICBjaGVja0xlbmd0aHMoa2V5LCBub25jZSk7XG4gIHZhciBjID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NlY3JldGJveF9CT1haRVJPQllURVMgKyBib3gubGVuZ3RoKTtcbiAgdmFyIG0gPSBuZXcgVWludDhBcnJheShjLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYm94Lmxlbmd0aDsgaSsrKSBjW2krY3J5cHRvX3NlY3JldGJveF9CT1haRVJPQllURVNdID0gYm94W2ldO1xuICBpZiAoYy5sZW5ndGggPCAzMikgcmV0dXJuIGZhbHNlO1xuICBpZiAoY3J5cHRvX3NlY3JldGJveF9vcGVuKG0sIGMsIGMubGVuZ3RoLCBub25jZSwga2V5KSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbS5zdWJhcnJheShjcnlwdG9fc2VjcmV0Ym94X1pFUk9CWVRFUyk7XG59O1xuXG5uYWNsLnNlY3JldGJveC5rZXlMZW5ndGggPSBjcnlwdG9fc2VjcmV0Ym94X0tFWUJZVEVTO1xubmFjbC5zZWNyZXRib3gubm9uY2VMZW5ndGggPSBjcnlwdG9fc2VjcmV0Ym94X05PTkNFQllURVM7XG5uYWNsLnNlY3JldGJveC5vdmVyaGVhZExlbmd0aCA9IGNyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTO1xuXG5uYWNsLnNjYWxhck11bHQgPSBmdW5jdGlvbihuLCBwKSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhuLCBwKTtcbiAgaWYgKG4ubGVuZ3RoICE9PSBjcnlwdG9fc2NhbGFybXVsdF9TQ0FMQVJCWVRFUykgdGhyb3cgbmV3IEVycm9yKCdiYWQgbiBzaXplJyk7XG4gIGlmIChwLmxlbmd0aCAhPT0gY3J5cHRvX3NjYWxhcm11bHRfQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIHAgc2l6ZScpO1xuICB2YXIgcSA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zY2FsYXJtdWx0X0JZVEVTKTtcbiAgY3J5cHRvX3NjYWxhcm11bHQocSwgbiwgcCk7XG4gIHJldHVybiBxO1xufTtcblxubmFjbC5zY2FsYXJNdWx0LmJhc2UgPSBmdW5jdGlvbihuKSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhuKTtcbiAgaWYgKG4ubGVuZ3RoICE9PSBjcnlwdG9fc2NhbGFybXVsdF9TQ0FMQVJCWVRFUykgdGhyb3cgbmV3IEVycm9yKCdiYWQgbiBzaXplJyk7XG4gIHZhciBxID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NjYWxhcm11bHRfQllURVMpO1xuICBjcnlwdG9fc2NhbGFybXVsdF9iYXNlKHEsIG4pO1xuICByZXR1cm4gcTtcbn07XG5cbm5hY2wuc2NhbGFyTXVsdC5zY2FsYXJMZW5ndGggPSBjcnlwdG9fc2NhbGFybXVsdF9TQ0FMQVJCWVRFUztcbm5hY2wuc2NhbGFyTXVsdC5ncm91cEVsZW1lbnRMZW5ndGggPSBjcnlwdG9fc2NhbGFybXVsdF9CWVRFUztcblxubmFjbC5ib3ggPSBmdW5jdGlvbihtc2csIG5vbmNlLCBwdWJsaWNLZXksIHNlY3JldEtleSkge1xuICB2YXIgayA9IG5hY2wuYm94LmJlZm9yZShwdWJsaWNLZXksIHNlY3JldEtleSk7XG4gIHJldHVybiBuYWNsLnNlY3JldGJveChtc2csIG5vbmNlLCBrKTtcbn07XG5cbm5hY2wuYm94LmJlZm9yZSA9IGZ1bmN0aW9uKHB1YmxpY0tleSwgc2VjcmV0S2V5KSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhwdWJsaWNLZXksIHNlY3JldEtleSk7XG4gIGNoZWNrQm94TGVuZ3RocyhwdWJsaWNLZXksIHNlY3JldEtleSk7XG4gIHZhciBrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX2JveF9CRUZPUkVOTUJZVEVTKTtcbiAgY3J5cHRvX2JveF9iZWZvcmVubShrLCBwdWJsaWNLZXksIHNlY3JldEtleSk7XG4gIHJldHVybiBrO1xufTtcblxubmFjbC5ib3guYWZ0ZXIgPSBuYWNsLnNlY3JldGJveDtcblxubmFjbC5ib3gub3BlbiA9IGZ1bmN0aW9uKG1zZywgbm9uY2UsIHB1YmxpY0tleSwgc2VjcmV0S2V5KSB7XG4gIHZhciBrID0gbmFjbC5ib3guYmVmb3JlKHB1YmxpY0tleSwgc2VjcmV0S2V5KTtcbiAgcmV0dXJuIG5hY2wuc2VjcmV0Ym94Lm9wZW4obXNnLCBub25jZSwgayk7XG59O1xuXG5uYWNsLmJveC5vcGVuLmFmdGVyID0gbmFjbC5zZWNyZXRib3gub3BlbjtcblxubmFjbC5ib3gua2V5UGFpciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGsgPSBuZXcgVWludDhBcnJheShjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTKTtcbiAgdmFyIHNrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX2JveF9TRUNSRVRLRVlCWVRFUyk7XG4gIGNyeXB0b19ib3hfa2V5cGFpcihwaywgc2spO1xuICByZXR1cm4ge3B1YmxpY0tleTogcGssIHNlY3JldEtleTogc2t9O1xufTtcblxubmFjbC5ib3gua2V5UGFpci5mcm9tU2VjcmV0S2V5ID0gZnVuY3Rpb24oc2VjcmV0S2V5KSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhzZWNyZXRLZXkpO1xuICBpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gY3J5cHRvX2JveF9TRUNSRVRLRVlCWVRFUylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBzZWNyZXQga2V5IHNpemUnKTtcbiAgdmFyIHBrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX2JveF9QVUJMSUNLRVlCWVRFUyk7XG4gIGNyeXB0b19zY2FsYXJtdWx0X2Jhc2UocGssIHNlY3JldEtleSk7XG4gIHJldHVybiB7cHVibGljS2V5OiBwaywgc2VjcmV0S2V5OiBuZXcgVWludDhBcnJheShzZWNyZXRLZXkpfTtcbn07XG5cbm5hY2wuYm94LnB1YmxpY0tleUxlbmd0aCA9IGNyeXB0b19ib3hfUFVCTElDS0VZQllURVM7XG5uYWNsLmJveC5zZWNyZXRLZXlMZW5ndGggPSBjcnlwdG9fYm94X1NFQ1JFVEtFWUJZVEVTO1xubmFjbC5ib3guc2hhcmVkS2V5TGVuZ3RoID0gY3J5cHRvX2JveF9CRUZPUkVOTUJZVEVTO1xubmFjbC5ib3gubm9uY2VMZW5ndGggPSBjcnlwdG9fYm94X05PTkNFQllURVM7XG5uYWNsLmJveC5vdmVyaGVhZExlbmd0aCA9IG5hY2wuc2VjcmV0Ym94Lm92ZXJoZWFkTGVuZ3RoO1xuXG5uYWNsLnNpZ24gPSBmdW5jdGlvbihtc2csIHNlY3JldEtleSkge1xuICBjaGVja0FycmF5VHlwZXMobXNnLCBzZWNyZXRLZXkpO1xuICBpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2VjcmV0IGtleSBzaXplJyk7XG4gIHZhciBzaWduZWRNc2cgPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2lnbl9CWVRFUyttc2cubGVuZ3RoKTtcbiAgY3J5cHRvX3NpZ24oc2lnbmVkTXNnLCBtc2csIG1zZy5sZW5ndGgsIHNlY3JldEtleSk7XG4gIHJldHVybiBzaWduZWRNc2c7XG59O1xuXG5uYWNsLnNpZ24ub3BlbiA9IGZ1bmN0aW9uKHNpZ25lZE1zZywgcHVibGljS2V5KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAyKVxuICAgIHRocm93IG5ldyBFcnJvcignbmFjbC5zaWduLm9wZW4gYWNjZXB0cyAyIGFyZ3VtZW50czsgZGlkIHlvdSBtZWFuIHRvIHVzZSBuYWNsLnNpZ24uZGV0YWNoZWQudmVyaWZ5PycpO1xuICBjaGVja0FycmF5VHlwZXMoc2lnbmVkTXNnLCBwdWJsaWNLZXkpO1xuICBpZiAocHVibGljS2V5Lmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fUFVCTElDS0VZQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcHVibGljIGtleSBzaXplJyk7XG4gIHZhciB0bXAgPSBuZXcgVWludDhBcnJheShzaWduZWRNc2cubGVuZ3RoKTtcbiAgdmFyIG1sZW4gPSBjcnlwdG9fc2lnbl9vcGVuKHRtcCwgc2lnbmVkTXNnLCBzaWduZWRNc2cubGVuZ3RoLCBwdWJsaWNLZXkpO1xuICBpZiAobWxlbiA8IDApIHJldHVybiBudWxsO1xuICB2YXIgbSA9IG5ldyBVaW50OEFycmF5KG1sZW4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG0ubGVuZ3RoOyBpKyspIG1baV0gPSB0bXBbaV07XG4gIHJldHVybiBtO1xufTtcblxubmFjbC5zaWduLmRldGFjaGVkID0gZnVuY3Rpb24obXNnLCBzZWNyZXRLZXkpIHtcbiAgdmFyIHNpZ25lZE1zZyA9IG5hY2wuc2lnbihtc2csIHNlY3JldEtleSk7XG4gIHZhciBzaWcgPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2lnbl9CWVRFUyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnLmxlbmd0aDsgaSsrKSBzaWdbaV0gPSBzaWduZWRNc2dbaV07XG4gIHJldHVybiBzaWc7XG59O1xuXG5uYWNsLnNpZ24uZGV0YWNoZWQudmVyaWZ5ID0gZnVuY3Rpb24obXNnLCBzaWcsIHB1YmxpY0tleSkge1xuICBjaGVja0FycmF5VHlwZXMobXNnLCBzaWcsIHB1YmxpY0tleSk7XG4gIGlmIChzaWcubGVuZ3RoICE9PSBjcnlwdG9fc2lnbl9CWVRFUylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBzaWduYXR1cmUgc2l6ZScpO1xuICBpZiAocHVibGljS2V5Lmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fUFVCTElDS0VZQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcHVibGljIGtleSBzaXplJyk7XG4gIHZhciBzbSA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX0JZVEVTICsgbXNnLmxlbmd0aCk7XG4gIHZhciBtID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fQllURVMgKyBtc2cubGVuZ3RoKTtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBjcnlwdG9fc2lnbl9CWVRFUzsgaSsrKSBzbVtpXSA9IHNpZ1tpXTtcbiAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykgc21baStjcnlwdG9fc2lnbl9CWVRFU10gPSBtc2dbaV07XG4gIHJldHVybiAoY3J5cHRvX3NpZ25fb3BlbihtLCBzbSwgc20ubGVuZ3RoLCBwdWJsaWNLZXkpID49IDApO1xufTtcblxubmFjbC5zaWduLmtleVBhaXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fUFVCTElDS0VZQllURVMpO1xuICB2YXIgc2sgPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2lnbl9TRUNSRVRLRVlCWVRFUyk7XG4gIGNyeXB0b19zaWduX2tleXBhaXIocGssIHNrKTtcbiAgcmV0dXJuIHtwdWJsaWNLZXk6IHBrLCBzZWNyZXRLZXk6IHNrfTtcbn07XG5cbm5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWNyZXRLZXkgPSBmdW5jdGlvbihzZWNyZXRLZXkpIHtcbiAgY2hlY2tBcnJheVR5cGVzKHNlY3JldEtleSk7XG4gIGlmIChzZWNyZXRLZXkubGVuZ3RoICE9PSBjcnlwdG9fc2lnbl9TRUNSRVRLRVlCWVRFUylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBzZWNyZXQga2V5IHNpemUnKTtcbiAgdmFyIHBrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fUFVCTElDS0VZQllURVMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBrLmxlbmd0aDsgaSsrKSBwa1tpXSA9IHNlY3JldEtleVszMitpXTtcbiAgcmV0dXJuIHtwdWJsaWNLZXk6IHBrLCBzZWNyZXRLZXk6IG5ldyBVaW50OEFycmF5KHNlY3JldEtleSl9O1xufTtcblxubmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQgPSBmdW5jdGlvbihzZWVkKSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhzZWVkKTtcbiAgaWYgKHNlZWQubGVuZ3RoICE9PSBjcnlwdG9fc2lnbl9TRUVEQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2VlZCBzaXplJyk7XG4gIHZhciBwayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKTtcbiAgdmFyIHNrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspIHNrW2ldID0gc2VlZFtpXTtcbiAgY3J5cHRvX3NpZ25fa2V5cGFpcihwaywgc2ssIHRydWUpO1xuICByZXR1cm4ge3B1YmxpY0tleTogcGssIHNlY3JldEtleTogc2t9O1xufTtcblxubmFjbC5zaWduLnB1YmxpY0tleUxlbmd0aCA9IGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTO1xubmFjbC5zaWduLnNlY3JldEtleUxlbmd0aCA9IGNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTO1xubmFjbC5zaWduLnNlZWRMZW5ndGggPSBjcnlwdG9fc2lnbl9TRUVEQllURVM7XG5uYWNsLnNpZ24uc2lnbmF0dXJlTGVuZ3RoID0gY3J5cHRvX3NpZ25fQllURVM7XG5cbm5hY2wuaGFzaCA9IGZ1bmN0aW9uKG1zZykge1xuICBjaGVja0FycmF5VHlwZXMobXNnKTtcbiAgdmFyIGggPSBuZXcgVWludDhBcnJheShjcnlwdG9faGFzaF9CWVRFUyk7XG4gIGNyeXB0b19oYXNoKGgsIG1zZywgbXNnLmxlbmd0aCk7XG4gIHJldHVybiBoO1xufTtcblxubmFjbC5oYXNoLmhhc2hMZW5ndGggPSBjcnlwdG9faGFzaF9CWVRFUztcblxubmFjbC52ZXJpZnkgPSBmdW5jdGlvbih4LCB5KSB7XG4gIGNoZWNrQXJyYXlUeXBlcyh4LCB5KTtcbiAgLy8gWmVybyBsZW5ndGggYXJndW1lbnRzIGFyZSBjb25zaWRlcmVkIG5vdCBlcXVhbC5cbiAgaWYgKHgubGVuZ3RoID09PSAwIHx8IHkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmICh4Lmxlbmd0aCAhPT0geS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICh2bih4LCAwLCB5LCAwLCB4Lmxlbmd0aCkgPT09IDApID8gdHJ1ZSA6IGZhbHNlO1xufTtcblxubmFjbC5zZXRQUk5HID0gZnVuY3Rpb24oZm4pIHtcbiAgcmFuZG9tYnl0ZXMgPSBmbjtcbn07XG5cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5pdGlhbGl6ZSBQUk5HIGlmIGVudmlyb25tZW50IHByb3ZpZGVzIENTUFJORy5cbiAgLy8gSWYgbm90LCBtZXRob2RzIGNhbGxpbmcgcmFuZG9tYnl0ZXMgd2lsbCB0aHJvdy5cbiAgdmFyIGNyeXB0byA9IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IChzZWxmLmNyeXB0byB8fCBzZWxmLm1zQ3J5cHRvKSA6IG51bGw7XG4gIGlmIChjcnlwdG8gJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIEJyb3dzZXJzLlxuICAgIHZhciBRVU9UQSA9IDY1NTM2O1xuICAgIG5hY2wuc2V0UFJORyhmdW5jdGlvbih4LCBuKSB7XG4gICAgICB2YXIgaSwgdiA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkgKz0gUVVPVEEpIHtcbiAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh2LnN1YmFycmF5KGksIGkgKyBNYXRoLm1pbihuIC0gaSwgUVVPVEEpKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB4W2ldID0gdltpXTtcbiAgICAgIGNsZWFudXAodik7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm9kZS5qcy5cbiAgICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbiAgICBpZiAoY3J5cHRvICYmIGNyeXB0by5yYW5kb21CeXRlcykge1xuICAgICAgbmFjbC5zZXRQUk5HKGZ1bmN0aW9uKHgsIG4pIHtcbiAgICAgICAgdmFyIGksIHYgPSBjcnlwdG8ucmFuZG9tQnl0ZXMobik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHhbaV0gPSB2W2ldO1xuICAgICAgICBjbGVhbnVwKHYpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59KSgpO1xuXG59KSh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cyA/IG1vZHVsZS5leHBvcnRzIDogKHNlbGYubmFjbCA9IHNlbGYubmFjbCB8fCB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3R3ZWV0bmFjbC9uYWNsLWZhc3QuanNcbi8vIG1vZHVsZSBpZCA9IDkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIChpZ25vcmVkKSAqL1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIHZlcnR4IChpZ25vcmVkKVxuLy8gbW9kdWxlIGlkID0gOTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogKGlnbm9yZWQpICovXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gY3J5cHRvIChpZ25vcmVkKVxuLy8gbW9kdWxlIGlkID0gOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==