setTimeout(function(){ ;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0 var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // Split a filename into [root, dir, basename, ext], unix version // 'root' is just a slash, or nothing. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; var splitPath = function(filename) { return splitPathRe.exec(filename).slice(1); }; // path.resolve([from ...], to) // posix version exports.resolve = function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function(path) { var isAbsolute = exports.isAbsolute(path), trailingSlash = substr(path, -1) === '/'; // Normalize the path path = normalizeArray(filter(path.split('/'), function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.isAbsolute = function(path) { return path.charAt(0) === '/'; }; // posix version exports.join = function() { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(filter(paths, function(p, index) { if (typeof p !== 'string') { throw new TypeError('Arguments to path.join must be strings'); } return p; }).join('/')); }; // path.relative(from, to) // posix version exports.relative = function(from, to) { from = exports.resolve(from).substr(1); to = exports.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }; exports.sep = '/'; exports.delimiter = ':'; exports.dirname = function(path) { var result = splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { // No dirname whatsoever return '.'; } if (dir) { // It has a dirname, strip trailing slash dir = dir.substr(0, dir.length - 1); } return root + dir; }; exports.basename = function(path, ext) { var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows? if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function(path) { return splitPath(path)[3]; }; function filter (xs, f) { if (xs.filter) return xs.filter(f); var res = []; for (var i = 0; i < xs.length; i++) { if (f(xs[i], i, xs)) res.push(xs[i]); } return res; } // String.prototype.substr - negative index don't work in IE8 var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { return str.substr(start, len) } : function (str, start, len) { if (start < 0) start = str.length + start; return str.substr(start, len); } ; }).call(this,require('_process')) },{"_process":2}],2:[function(require,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.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; }; },{}],3:[function(require,module,exports){ 'use strict'; module.exports = bail; function bail(err) { if (err) { throw err; } } },{}],4:[function(require,module,exports){ 'use strict'; var hasOwn = Object.prototype.hasOwnProperty; var toStr = Object.prototype.toString; var isArray = function isArray(arr) { if (typeof Array.isArray === 'function') { return Array.isArray(arr); } return toStr.call(arr) === '[object Array]'; }; var isPlainObject = function isPlainObject(obj) { if (!obj || toStr.call(obj) !== '[object Object]') { return false; } var hasOwnConstructor = hasOwn.call(obj, 'constructor'); var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); // Not own constructor property must be Object if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for (key in obj) { /**/ } return typeof key === 'undefined' || hasOwn.call(obj, key); }; module.exports = function extend() { var options, name, src, copy, copyIsArray, clone; var target = arguments[0]; var i = 1; var length = arguments.length; var deep = false; // Handle a deep copy situation if (typeof target === 'boolean') { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { target = {}; } for (; i < length; ++i) { options = arguments[i]; // Only deal with non-null/undefined values if (options != null) { // Extend the base object for (name in options) { src = target[name]; copy = options[name]; // Prevent never-ending loop if (target !== copy) { // Recurse if we're merging plain objects or arrays if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { if (copyIsArray) { copyIsArray = false; clone = src && isArray(src) ? src : []; } else { clone = src && isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[name] = extend(deep, clone, copy); // Don't bring in undefined values } else if (typeof copy !== 'undefined') { target[name] = copy; } } } } } // Return the modified object return target; }; },{}],5:[function(require,module,exports){ 'use strict'; var toString = Object.prototype.toString; module.exports = function (x) { var prototype; return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); }; },{}],6:[function(require,module,exports){ 'use strict'; /* Expose. */ module.exports = trough; /* Methods. */ var slice = [].slice; /* Create new middleware. */ function trough() { var fns = []; var middleware = {}; middleware.run = run; middleware.use = use; return middleware; /* Run `fns`. Last argument must be * a completion handler. */ function run() { var index = -1; var input = slice.call(arguments, 0, -1); var done = arguments[arguments.length - 1]; if (typeof done !== 'function') { throw new Error('Expected function as last argument, not ' + done); } next.apply(null, [null].concat(input)); /* Run the next `fn`, if any. */ function next(err) { var fn = fns[++index]; var params = slice.call(arguments, 0); var values = params.slice(1); var length = input.length; var pos = -1; if (err) { done(err); return; } /* Copy non-nully input into values. */ while (++pos < length) { if (values[pos] === null || values[pos] === undefined) { values[pos] = input[pos]; } } input = values; /* Next or done. */ if (fn) { wrap(fn, next).apply(null, input); } else { done.apply(null, [null].concat(input)); } } } /* Add `fn` to the list. */ function use(fn) { if (typeof fn !== 'function') { throw new Error('Expected `fn` to be a function, not ' + fn); } fns.push(fn); return middleware; } } /* Wrap `fn`. Can be sync or async; return a promise, * receive a completion handler, return new values and * errors. */ function wrap(fn, next) { var invoked; return wrapped; function wrapped() { var params = slice.call(arguments, 0); var callback = fn.length > params.length; var result; if (callback) { params.push(done); } try { result = fn.apply(null, params); } catch (err) { /* Well, this is quite the pickle. `fn` received * a callback and invoked it (thus continuing the * pipeline), but later also threw an error. * We’re not about to restart the pipeline again, * so the only thing left to do is to throw the * thing instea. */ if (callback && invoked) { throw err; } return done(err); } if (!callback) { if (result && typeof result.then === 'function') { result.then(then, done); } else if (result instanceof Error) { done(result); } else { then(result); } } } /* Invoke `next`, only once. */ function done() { if (!invoked) { invoked = true; next.apply(null, arguments); } } /* Invoke `done` with one value. * Tracks if an error is passed, too. */ function then(value) { done(null, value); } } },{}],7:[function(require,module,exports){ (function (process){ 'use strict'; var path = require('path'); var replace = require('replace-ext'); var stringify = require('unist-util-stringify-position'); var buffer = require('is-buffer'); module.exports = VFile; var own = {}.hasOwnProperty; var proto = VFile.prototype; proto.toString = toString; proto.message = message; proto.info = info; proto.fail = fail; /* Slight backwards compatibility. Remove in the future. */ proto.warn = message; /* Order of setting (least specific to most), we need this because * otherwise `{stem: 'a', path: '~/b.js'}` would throw, as a path * is needed before a stem can be set. */ var order = [ 'history', 'path', 'basename', 'stem', 'extname', 'dirname' ]; /* Construct a new file. */ function VFile(options) { var prop; var index; var length; if (!options) { options = {}; } else if (typeof options === 'string' || buffer(options)) { options = {contents: options}; } else if ('message' in options && 'messages' in options) { return options; } if (!(this instanceof VFile)) { return new VFile(options); } this.data = {}; this.messages = []; this.history = []; this.cwd = process.cwd(); /* Set path related properties in the correct order. */ index = -1; length = order.length; while (++index < length) { prop = order[index]; if (own.call(options, prop)) { this[prop] = options[prop]; } } /* Set non-path related properties. */ for (prop in options) { if (order.indexOf(prop) === -1) { this[prop] = options[prop]; } } } /* Access full path (`~/index.min.js`). */ Object.defineProperty(proto, 'path', { get: function () { return this.history[this.history.length - 1]; }, set: function (path) { assertNonEmpty(path, 'path'); if (path !== this.path) { this.history.push(path); } } }); /* Access parent path (`~`). */ Object.defineProperty(proto, 'dirname', { get: function () { return typeof this.path === 'string' ? path.dirname(this.path) : undefined; }, set: function (dirname) { assertPath(this.path, 'dirname'); this.path = path.join(dirname || '', this.basename); } }); /* Access basename (`index.min.js`). */ Object.defineProperty(proto, 'basename', { get: function () { return typeof this.path === 'string' ? path.basename(this.path) : undefined; }, set: function (basename) { assertNonEmpty(basename, 'basename'); assertPart(basename, 'basename'); this.path = path.join(this.dirname || '', basename); } }); /* Access extname (`.js`). */ Object.defineProperty(proto, 'extname', { get: function () { return typeof this.path === 'string' ? path.extname(this.path) : undefined; }, set: function (extname) { var ext = extname || ''; assertPart(ext, 'extname'); assertPath(this.path, 'extname'); if (ext) { if (ext.charAt(0) !== '.') { throw new Error('`extname` must start with `.`'); } if (ext.indexOf('.', 1) !== -1) { throw new Error('`extname` cannot contain multiple dots'); } } this.path = replace(this.path, ext); } }); /* Access stem (`index.min`). */ Object.defineProperty(proto, 'stem', { get: function () { return typeof this.path === 'string' ? path.basename(this.path, this.extname) : undefined; }, set: function (stem) { assertNonEmpty(stem, 'stem'); assertPart(stem, 'stem'); this.path = path.join(this.dirname || '', stem + (this.extname || '')); } }); /* Get the value of the file. */ function toString(encoding) { var value = this.contents || ''; return buffer(value) ? value.toString(encoding) : String(value); } /* Create a message with `reason` at `position`. * When an error is passed in as `reason`, copies the stack. */ function message(reason, position, ruleId) { var filePath = this.path; var range = stringify(position) || '1:1'; var location; var err; location = { start: {line: null, column: null}, end: {line: null, column: null} }; if (position && position.position) { position = position.position; } if (position) { /* Location. */ if (position.start) { location = position; position = position.start; } else { /* Position. */ location.start = position; } } err = new VMessage(reason.message || reason); err.name = (filePath ? filePath + ':' : '') + range; err.file = filePath || ''; err.reason = reason.message || reason; err.line = position ? position.line : null; err.column = position ? position.column : null; err.location = location; err.ruleId = ruleId || null; err.source = null; err.fatal = false; if (reason.stack) { err.stack = reason.stack; } this.messages.push(err); return err; } /* Fail. Creates a vmessage, associates it with the file, * and throws it. */ function fail() { var message = this.message.apply(this, arguments); message.fatal = true; throw message; } /* Info. Creates a vmessage, associates it with the file, * and marks the fatality as null. */ function info() { var message = this.message.apply(this, arguments); message.fatal = null; return message; } /* Inherit from `Error#`. */ function VMessagePrototype() {} VMessagePrototype.prototype = Error.prototype; VMessage.prototype = new VMessagePrototype(); /* Message properties. */ proto = VMessage.prototype; proto.file = ''; proto.name = ''; proto.reason = ''; proto.message = ''; proto.stack = ''; proto.fatal = null; proto.column = null; proto.line = null; /* Construct a new file message. * * Note: We cannot invoke `Error` on the created context, * as that adds readonly `line` and `column` attributes on * Safari 9, thus throwing and failing the data. */ function VMessage(reason) { this.message = reason; } /* Assert that `part` is not a path (i.e., does * not contain `path.sep`). */ function assertPart(part, name) { if (part.indexOf(path.sep) !== -1) { throw new Error('`' + name + '` cannot be a path: did not expect `' + path.sep + '`'); } } /* Assert that `part` is not empty. */ function assertNonEmpty(part, name) { if (!part) { throw new Error('`' + name + '` cannot be empty'); } } /* Assert `path` exists. */ function assertPath(path, name) { if (!path) { throw new Error('Setting `' + name + '` requires `path` to be set too'); } } }).call(this,require('_process')) },{"_process":2,"is-buffer":8,"path":1,"replace-ext":9,"unist-util-stringify-position":10}],8:[function(require,module,exports){ /*! * Determine if an object is a Buffer * * @author Feross Aboukhadijeh * @license MIT */ // The _isBuffer check is for Safari 5-7 support, because it's missing // Object.prototype.constructor. Remove this eventually module.exports = function (obj) { return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) } function isBuffer (obj) { return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) } // For Node v0.10 support. Remove this eventually. function isSlowBuffer (obj) { return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) } },{}],9:[function(require,module,exports){ 'use strict'; var path = require('path'); function replaceExt(npath, ext) { if (typeof npath !== 'string') { return npath; } if (npath.length === 0) { return npath; } var nFileName = path.basename(npath, path.extname(npath)) + ext; return path.join(path.dirname(npath), nFileName); } module.exports = replaceExt; },{"path":1}],10:[function(require,module,exports){ 'use strict'; var own = {}.hasOwnProperty; module.exports = stringify; function stringify(value) { /* Nothing. */ if (!value || typeof value !== 'object') { return null; } /* Node. */ if (own.call(value, 'position') || own.call(value, 'type')) { return location(value.position); } /* Location. */ if (own.call(value, 'start') || own.call(value, 'end')) { return location(value); } /* Position. */ if (own.call(value, 'line') || own.call(value, 'column')) { return position(value); } /* ? */ return null; } function position(pos) { if (!pos || typeof pos !== 'object') { pos = {}; } return index(pos.line) + ':' + index(pos.column); } function location(loc) { if (!loc || typeof loc !== 'object') { loc = {}; } return position(loc.start) + '-' + position(loc.end); } function index(value) { return value && typeof value === 'number' ? value : 1; } },{}],11:[function(require,module,exports){ module.exports = function isFunction (fn) { return Object.prototype.toString.call(fn) === '[object Function]' } },{}],12:[function(require,module,exports){ var toString = Object.prototype.toString module.exports = isString function isString(obj) { return toString.call(obj) === "[object String]" } },{}],"unified":[function(require,module,exports){ 'use strict'; /* Dependencies. */ var extend = require('extend'); var bail = require('bail'); var vfile = require('vfile'); var trough = require('trough'); var string = require('x-is-string'); var func = require('x-is-function'); var plain = require('is-plain-obj'); /* Expose a frozen processor. */ module.exports = unified().freeze(); var slice = [].slice; var own = {}.hasOwnProperty; /* Process pipeline. */ var pipeline = trough().use(pipelineParse).use(pipelineRun).use(pipelineStringify); function pipelineParse(p, ctx) { ctx.tree = p.parse(ctx.file); } function pipelineRun(p, ctx, next) { p.run(ctx.tree, ctx.file, done); function done(err, tree, file) { if (err) { next(err); } else { ctx.tree = tree; ctx.file = file; next(); } } } function pipelineStringify(p, ctx) { ctx.file.contents = p.stringify(ctx.tree, ctx.file); } /* Function to create the first processor. */ function unified() { var attachers = []; var transformers = trough(); var namespace = {}; var frozen = false; var freezeIndex = -1; /* Data management. */ processor.data = data; /* Lock. */ processor.freeze = freeze; /* Plug-ins. */ processor.attachers = attachers; processor.use = use; /* API. */ processor.parse = parse; processor.stringify = stringify; processor.run = run; processor.runSync = runSync; processor.process = process; processor.processSync = processSync; /* Expose. */ return processor; /* Create a new processor based on the processor * in the current scope. */ function processor() { var destination = unified(); var length = attachers.length; var index = -1; while (++index < length) { destination.use.apply(null, attachers[index]); } destination.data(extend(true, {}, namespace)); return destination; } /* Freeze: used to signal a processor that has finished * configuration. * * For example, take unified itself. It’s frozen. * Plug-ins should not be added to it. Rather, it should * be extended, by invoking it, before modifying it. * * In essence, always invoke this when exporting a * processor. */ function freeze() { var values; var plugin; var options; var transformer; if (frozen) { return processor; } while (++freezeIndex < attachers.length) { values = attachers[freezeIndex]; plugin = values[0]; options = values[1]; transformer = null; if (options === false) { continue; } if (options === true) { values[1] = undefined; } transformer = plugin.apply(processor, values.slice(1)); if (func(transformer)) { transformers.use(transformer); } } frozen = true; freezeIndex = Infinity; return processor; } /* Data management. * Getter / setter for processor-specific informtion. */ function data(key, value) { if (string(key)) { /* Set `key`. */ if (arguments.length === 2) { assertUnfrozen('data', frozen); namespace[key] = value; return processor; } /* Get `key`. */ return (own.call(namespace, key) && namespace[key]) || null; } /* Set space. */ if (key) { assertUnfrozen('data', frozen); namespace = key; return processor; } /* Get space. */ return namespace; } /* Plug-in management. * * Pass it: * * an attacher and options, * * a preset, * * a list of presets, attachers, and arguments (list * of attachers and options). */ function use(value) { var settings; assertUnfrozen('use', frozen); if (value === null || value === undefined) { /* Empty */ } else if (func(value)) { addPlugin.apply(null, arguments); } else if (typeof value === 'object') { if ('length' in value) { addList(value); } else { addPreset(value); } } else { throw new Error('Expected usable value, not `' + value + '`'); } if (settings) { namespace.settings = extend(namespace.settings || {}, settings); } return processor; function addPreset(result) { addList(result.plugins); if (result.settings) { settings = extend(settings || {}, result.settings); } } function add(value) { if (func(value)) { addPlugin(value); } else if (typeof value === 'object') { if ('length' in value) { addPlugin.apply(null, value); } else { addPreset(value); } } else { throw new Error('Expected usable value, not `' + value + '`'); } } function addList(plugins) { var length; var index; if (plugins === null || plugins === undefined) { /* Empty */ } else if (typeof plugins === 'object' && 'length' in plugins) { length = plugins.length; index = -1; while (++index < length) { add(plugins[index]); } } else { throw new Error('Expected a list of plugins, not `' + plugins + '`'); } } function addPlugin(plugin, value) { var entry = find(plugin); if (entry) { if (plain(entry[1]) && plain(value)) { value = extend(entry[1], value); } entry[1] = value; } else { attachers.push(slice.call(arguments)); } } } function find(plugin) { var length = attachers.length; var index = -1; var entry; while (++index < length) { entry = attachers[index]; if (entry[0] === plugin) { return entry; } } } /* Parse a file (in string or VFile representation) * into a Unist node using the `Parser` on the * processor. */ function parse(doc) { var file = vfile(doc); var Parser; freeze(); Parser = processor.Parser; assertParser('parse', Parser); if (newable(Parser)) { return new Parser(String(file), file).parse(); } return Parser(String(file), file); // eslint-disable-line new-cap } /* Run transforms on a Unist node representation of a file * (in string or VFile representation), async. */ function run(node, file, cb) { assertNode(node); freeze(); if (!cb && func(file)) { cb = file; file = null; } if (!cb) { return new Promise(executor); } executor(null, cb); function executor(resolve, reject) { transformers.run(node, vfile(file), done); function done(err, tree, file) { tree = tree || node; if (err) { reject(err); } else if (resolve) { resolve(tree); } else { cb(null, tree, file); } } } } /* Run transforms on a Unist node representation of a file * (in string or VFile representation), sync. */ function runSync(node, file) { var complete = false; var result; run(node, file, done); assertDone('runSync', 'run', complete); return result; function done(err, tree) { complete = true; bail(err); result = tree; } } /* Stringify a Unist node representation of a file * (in string or VFile representation) into a string * using the `Compiler` on the processor. */ function stringify(node, doc) { var file = vfile(doc); var Compiler; freeze(); Compiler = processor.Compiler; assertCompiler('stringify', Compiler); assertNode(node); if (newable(Compiler)) { return new Compiler(node, file).compile(); } return Compiler(node, file); // eslint-disable-line new-cap } /* Parse a file (in string or VFile representation) * into a Unist node using the `Parser` on the processor, * then run transforms on that node, and compile the * resulting node using the `Compiler` on the processor, * and store that result on the VFile. */ function process(doc, cb) { freeze(); assertParser('process', processor.Parser); assertCompiler('process', processor.Compiler); if (!cb) { return new Promise(executor); } executor(null, cb); function executor(resolve, reject) { var file = vfile(doc); pipeline.run(processor, {file: file}, done); function done(err) { if (err) { reject(err); } else if (resolve) { resolve(file); } else { cb(null, file); } } } } /* Process the given document (in string or VFile * representation), sync. */ function processSync(doc) { var complete = false; var file; freeze(); assertParser('processSync', processor.Parser); assertCompiler('processSync', processor.Compiler); file = vfile(doc); process(file, done); assertDone('processSync', 'process', complete); return file; function done(err) { complete = true; bail(err); } } } /* Check if `func` is a constructor. */ function newable(value) { return func(value) && keys(value.prototype); } /* Check if `value` is an object with keys. */ function keys(value) { var key; for (key in value) { return true; } return false; } /* Assert a parser is available. */ function assertParser(name, Parser) { if (!func(Parser)) { throw new Error('Cannot `' + name + '` without `Parser`'); } } /* Assert a compiler is available. */ function assertCompiler(name, Compiler) { if (!func(Compiler)) { throw new Error('Cannot `' + name + '` without `Compiler`'); } } /* Assert the processor is not frozen. */ function assertUnfrozen(name, frozen) { if (frozen) { throw new Error( 'Cannot invoke `' + name + '` on a frozen processor.\n' + 'Create a new processor first, by invoking it: ' + 'use `processor()` instead of `processor`.' ); } } /* Assert `node` is a Unist node. */ function assertNode(node) { if (!node || !string(node.type)) { throw new Error('Expected node, got `' + node + '`'); } } /* Assert that `complete` is `true`. */ function assertDone(name, asyncName, complete) { if (!complete) { throw new Error('`' + name + '` finished async. Use `' + asyncName + '` instead'); } } },{"bail":3,"extend":4,"is-plain-obj":5,"trough":6,"vfile":7,"x-is-function":11,"x-is-string":12}]},{},[]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9iYWlsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V4dGVuZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHJvdWdoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmZpbGUvbm9kZV9tb2R1bGVzL3JlcGxhY2UtZXh0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94LWlzLWZ1bmN0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3gtaXMtc3RyaW5nL2luZGV4LmpzIiwidW5pZmllZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNySUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9RQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBzcGxpdFBhdGggPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59O1xuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBzcGxpdFBhdGgocGF0aCksXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59O1xuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gc3BsaXRQYXRoKHBhdGgpWzNdO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBiYWlsO1xuXG5mdW5jdGlvbiBiYWlsKGVycikge1xuICBpZiAoZXJyKSB7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KGFycikge1xuXHRpZiAodHlwZW9mIEFycmF5LmlzQXJyYXkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpO1xuXHR9XG5cblx0cmV0dXJuIHRvU3RyLmNhbGwoYXJyKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbnZhciBpc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcblx0aWYgKCFvYmogfHwgdG9TdHIuY2FsbChvYmopICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgJ2NvbnN0cnVjdG9yJyk7XG5cdHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ2lzUHJvdG90eXBlT2YnKTtcblx0Ly8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdFxuXHRpZiAob2JqLmNvbnN0cnVjdG9yICYmICFoYXNPd25Db25zdHJ1Y3RvciAmJiAhaGFzSXNQcm90b3R5cGVPZikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLFxuXHQvLyBpZiBsYXN0IG9uZSBpcyBvd24sIHRoZW4gYWxsIHByb3BlcnRpZXMgYXJlIG93bi5cblx0dmFyIGtleTtcblx0Zm9yIChrZXkgaW4gb2JqKSB7IC8qKi8gfVxuXG5cdHJldHVybiB0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJyB8fCBoYXNPd24uY2FsbChvYmosIGtleSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZCgpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lO1xuXHR2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdO1xuXHR2YXIgaSA9IDE7XG5cdHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuXHR2YXIgZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKHR5cGVvZiB0YXJnZXQgPT09ICdib29sZWFuJykge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuXHRcdC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHRpID0gMjtcblx0fVxuXHRpZiAodGFyZ2V0ID09IG51bGwgfHwgKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHRmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1tpXTtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yIChuYW1lIGluIG9wdGlvbnMpIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0W25hbWVdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1tuYW1lXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICh0YXJnZXQgIT09IGNvcHkpIHtcblx0XHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0XHRpZiAoZGVlcCAmJiBjb3B5ICYmIChpc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGlzQXJyYXkoY29weSkpKSkge1xuXHRcdFx0XHRcdFx0aWYgKGNvcHlJc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KTtcblxuXHRcdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb3B5ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gY29weTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHgpIHtcblx0dmFyIHByb3RvdHlwZTtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IE9iamVjdF0nICYmIChwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCksIHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih7fSkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB0cm91Z2g7XG5cbi8qIE1ldGhvZHMuICovXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcblxuLyogQ3JlYXRlIG5ldyBtaWRkbGV3YXJlLiAqL1xuZnVuY3Rpb24gdHJvdWdoKCkge1xuICB2YXIgZm5zID0gW107XG4gIHZhciBtaWRkbGV3YXJlID0ge307XG5cbiAgbWlkZGxld2FyZS5ydW4gPSBydW47XG4gIG1pZGRsZXdhcmUudXNlID0gdXNlO1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xuXG4gIC8qIFJ1biBgZm5zYC4gIExhc3QgYXJndW1lbnQgbXVzdCBiZVxuICAgKiBhIGNvbXBsZXRpb24gaGFuZGxlci4gKi9cbiAgZnVuY3Rpb24gcnVuKCkge1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBpbnB1dCA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7XG4gICAgdmFyIGRvbmUgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKHR5cGVvZiBkb25lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGZ1bmN0aW9uIGFzIGxhc3QgYXJndW1lbnQsIG5vdCAnICsgZG9uZSk7XG4gICAgfVxuXG4gICAgbmV4dC5hcHBseShudWxsLCBbbnVsbF0uY29uY2F0KGlucHV0KSk7XG5cbiAgICAvKiBSdW4gdGhlIG5leHQgYGZuYCwgaWYgYW55LiAqL1xuICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7XG4gICAgICB2YXIgZm4gPSBmbnNbKytpbmRleF07XG4gICAgICB2YXIgcGFyYW1zID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgdmFyIHZhbHVlcyA9IHBhcmFtcy5zbGljZSgxKTtcbiAgICAgIHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICB2YXIgcG9zID0gLTE7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZG9uZShlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIENvcHkgbm9uLW51bGx5IGlucHV0IGludG8gdmFsdWVzLiAqL1xuICAgICAgd2hpbGUgKCsrcG9zIDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbcG9zXSA9PT0gbnVsbCB8fCB2YWx1ZXNbcG9zXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWVzW3Bvc10gPSBpbnB1dFtwb3NdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlucHV0ID0gdmFsdWVzO1xuXG4gICAgICAvKiBOZXh0IG9yIGRvbmUuICovXG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgd3JhcChmbiwgbmV4dCkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZS5hcHBseShudWxsLCBbbnVsbF0uY29uY2F0KGlucHV0KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogQWRkIGBmbmAgdG8gdGhlIGxpc3QuICovXG4gIGZ1bmN0aW9uIHVzZShmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYGZuYCB0byBiZSBhIGZ1bmN0aW9uLCBub3QgJyArIGZuKTtcbiAgICB9XG5cbiAgICBmbnMucHVzaChmbik7XG5cbiAgICByZXR1cm4gbWlkZGxld2FyZTtcbiAgfVxufVxuXG4vKiBXcmFwIGBmbmAuICBDYW4gYmUgc3luYyBvciBhc3luYzsgcmV0dXJuIGEgcHJvbWlzZSxcbiAqIHJlY2VpdmUgYSBjb21wbGV0aW9uIGhhbmRsZXIsIHJldHVybiBuZXcgdmFsdWVzIGFuZFxuICogZXJyb3JzLiAqL1xuZnVuY3Rpb24gd3JhcChmbiwgbmV4dCkge1xuICB2YXIgaW52b2tlZDtcblxuICByZXR1cm4gd3JhcHBlZDtcblxuICBmdW5jdGlvbiB3cmFwcGVkKCkge1xuICAgIHZhciBwYXJhbXMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgdmFyIGNhbGxiYWNrID0gZm4ubGVuZ3RoID4gcGFyYW1zLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBwYXJhbXMucHVzaChkb25lKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZm4uYXBwbHkobnVsbCwgcGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIFdlbGwsIHRoaXMgaXMgcXVpdGUgdGhlIHBpY2tsZS4gIGBmbmAgcmVjZWl2ZWRcbiAgICAgICAqIGEgY2FsbGJhY2sgYW5kIGludm9rZWQgaXQgKHRodXMgY29udGludWluZyB0aGVcbiAgICAgICAqIHBpcGVsaW5lKSwgYnV0IGxhdGVyIGFsc28gdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgKiBXZeKAmXJlIG5vdCBhYm91dCB0byByZXN0YXJ0IHRoZSBwaXBlbGluZSBhZ2FpbixcbiAgICAgICAqIHNvIHRoZSBvbmx5IHRoaW5nIGxlZnQgdG8gZG8gaXMgdG8gdGhyb3cgdGhlXG4gICAgICAgKiB0aGluZyBpbnN0ZWEuICovXG4gICAgICBpZiAoY2FsbGJhY2sgJiYgaW52b2tlZCkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgfVxuXG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0LnRoZW4odGhlbiwgZG9uZSk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGRvbmUocmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoZW4ocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiBJbnZva2UgYG5leHRgLCBvbmx5IG9uY2UuICovXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgaWYgKCFpbnZva2VkKSB7XG4gICAgICBpbnZva2VkID0gdHJ1ZTtcblxuICAgICAgbmV4dC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEludm9rZSBgZG9uZWAgd2l0aCBvbmUgdmFsdWUuXG4gICAqIFRyYWNrcyBpZiBhbiBlcnJvciBpcyBwYXNzZWQsIHRvby4gKi9cbiAgZnVuY3Rpb24gdGhlbih2YWx1ZSkge1xuICAgIGRvbmUobnVsbCwgdmFsdWUpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHJlcGxhY2UgPSByZXF1aXJlKCdyZXBsYWNlLWV4dCcpO1xudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uJyk7XG52YXIgYnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVkZpbGU7XG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm90byA9IFZGaWxlLnByb3RvdHlwZTtcblxucHJvdG8udG9TdHJpbmcgPSB0b1N0cmluZztcbnByb3RvLm1lc3NhZ2UgPSBtZXNzYWdlO1xucHJvdG8uaW5mbyA9IGluZm87XG5wcm90by5mYWlsID0gZmFpbDtcblxuLyogU2xpZ2h0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgUmVtb3ZlIGluIHRoZSBmdXR1cmUuICovXG5wcm90by53YXJuID0gbWVzc2FnZTtcblxuLyogT3JkZXIgb2Ygc2V0dGluZyAobGVhc3Qgc3BlY2lmaWMgdG8gbW9zdCksIHdlIG5lZWQgdGhpcyBiZWNhdXNlXG4gKiBvdGhlcndpc2UgYHtzdGVtOiAnYScsIHBhdGg6ICd+L2IuanMnfWAgd291bGQgdGhyb3csIGFzIGEgcGF0aFxuICogaXMgbmVlZGVkIGJlZm9yZSBhIHN0ZW0gY2FuIGJlIHNldC4gKi9cbnZhciBvcmRlciA9IFtcbiAgJ2hpc3RvcnknLFxuICAncGF0aCcsXG4gICdiYXNlbmFtZScsXG4gICdzdGVtJyxcbiAgJ2V4dG5hbWUnLFxuICAnZGlybmFtZSdcbl07XG5cbi8qIENvbnN0cnVjdCBhIG5ldyBmaWxlLiAqL1xuZnVuY3Rpb24gVkZpbGUob3B0aW9ucykge1xuICB2YXIgcHJvcDtcbiAgdmFyIGluZGV4O1xuICB2YXIgbGVuZ3RoO1xuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgYnVmZmVyKG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IHtjb250ZW50czogb3B0aW9uc307XG4gIH0gZWxzZSBpZiAoJ21lc3NhZ2UnIGluIG9wdGlvbnMgJiYgJ21lc3NhZ2VzJyBpbiBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVkZpbGUpKSB7XG4gICAgcmV0dXJuIG5ldyBWRmlsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuZGF0YSA9IHt9O1xuICB0aGlzLm1lc3NhZ2VzID0gW107XG4gIHRoaXMuaGlzdG9yeSA9IFtdO1xuICB0aGlzLmN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLyogU2V0IHBhdGggcmVsYXRlZCBwcm9wZXJ0aWVzIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAqL1xuICBpbmRleCA9IC0xO1xuICBsZW5ndGggPSBvcmRlci5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBwcm9wID0gb3JkZXJbaW5kZXhdO1xuXG4gICAgaWYgKG93bi5jYWxsKG9wdGlvbnMsIHByb3ApKSB7XG4gICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcbiAgICB9XG4gIH1cblxuICAvKiBTZXQgbm9uLXBhdGggcmVsYXRlZCBwcm9wZXJ0aWVzLiAqL1xuICBmb3IgKHByb3AgaW4gb3B0aW9ucykge1xuICAgIGlmIChvcmRlci5pbmRleE9mKHByb3ApID09PSAtMSkge1xuICAgICAgdGhpc1twcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gICAgfVxuICB9XG59XG5cbi8qIEFjY2VzcyBmdWxsIHBhdGggKGB+L2luZGV4Lm1pbi5qc2ApLiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAncGF0aCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMV07XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHBhdGgpIHtcbiAgICBhc3NlcnROb25FbXB0eShwYXRoLCAncGF0aCcpO1xuXG4gICAgaWYgKHBhdGggIT09IHRoaXMucGF0aCkge1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocGF0aCk7XG4gICAgfVxuICB9XG59KTtcblxuLyogQWNjZXNzIHBhcmVudCBwYXRoIChgfmApLiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnZGlybmFtZScsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICdzdHJpbmcnID8gcGF0aC5kaXJuYW1lKHRoaXMucGF0aCkgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGRpcm5hbWUpIHtcbiAgICBhc3NlcnRQYXRoKHRoaXMucGF0aCwgJ2Rpcm5hbWUnKTtcbiAgICB0aGlzLnBhdGggPSBwYXRoLmpvaW4oZGlybmFtZSB8fCAnJywgdGhpcy5iYXNlbmFtZSk7XG4gIH1cbn0pO1xuXG4vKiBBY2Nlc3MgYmFzZW5hbWUgKGBpbmRleC5taW4uanNgKS4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ2Jhc2VuYW1lJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmJhc2VuYW1lKHRoaXMucGF0aCkgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGJhc2VuYW1lKSB7XG4gICAgYXNzZXJ0Tm9uRW1wdHkoYmFzZW5hbWUsICdiYXNlbmFtZScpO1xuICAgIGFzc2VydFBhcnQoYmFzZW5hbWUsICdiYXNlbmFtZScpO1xuICAgIHRoaXMucGF0aCA9IHBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgJycsIGJhc2VuYW1lKTtcbiAgfVxufSk7XG5cbi8qIEFjY2VzcyBleHRuYW1lIChgLmpzYCkuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdleHRuYW1lJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmV4dG5hbWUodGhpcy5wYXRoKSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoZXh0bmFtZSkge1xuICAgIHZhciBleHQgPSBleHRuYW1lIHx8ICcnO1xuXG4gICAgYXNzZXJ0UGFydChleHQsICdleHRuYW1lJyk7XG4gICAgYXNzZXJ0UGF0aCh0aGlzLnBhdGgsICdleHRuYW1lJyk7XG5cbiAgICBpZiAoZXh0KSB7XG4gICAgICBpZiAoZXh0LmNoYXJBdCgwKSAhPT0gJy4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGV4dG5hbWVgIG11c3Qgc3RhcnQgd2l0aCBgLmAnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dC5pbmRleE9mKCcuJywgMSkgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGV4dG5hbWVgIGNhbm5vdCBjb250YWluIG11bHRpcGxlIGRvdHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdGggPSByZXBsYWNlKHRoaXMucGF0aCwgZXh0KTtcbiAgfVxufSk7XG5cbi8qIEFjY2VzcyBzdGVtIChgaW5kZXgubWluYCkuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdzdGVtJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmJhc2VuYW1lKHRoaXMucGF0aCwgdGhpcy5leHRuYW1lKSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoc3RlbSkge1xuICAgIGFzc2VydE5vbkVtcHR5KHN0ZW0sICdzdGVtJyk7XG4gICAgYXNzZXJ0UGFydChzdGVtLCAnc3RlbScpO1xuICAgIHRoaXMucGF0aCA9IHBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgJycsIHN0ZW0gKyAodGhpcy5leHRuYW1lIHx8ICcnKSk7XG4gIH1cbn0pO1xuXG4vKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcoZW5jb2RpbmcpIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5jb250ZW50cyB8fCAnJztcbiAgcmV0dXJuIGJ1ZmZlcih2YWx1ZSkgPyB2YWx1ZS50b1N0cmluZyhlbmNvZGluZykgOiBTdHJpbmcodmFsdWUpO1xufVxuXG4vKiBDcmVhdGUgYSBtZXNzYWdlIHdpdGggYHJlYXNvbmAgYXQgYHBvc2l0aW9uYC5cbiAqIFdoZW4gYW4gZXJyb3IgaXMgcGFzc2VkIGluIGFzIGByZWFzb25gLCBjb3BpZXMgdGhlIHN0YWNrLiAqL1xuZnVuY3Rpb24gbWVzc2FnZShyZWFzb24sIHBvc2l0aW9uLCBydWxlSWQpIHtcbiAgdmFyIGZpbGVQYXRoID0gdGhpcy5wYXRoO1xuICB2YXIgcmFuZ2UgPSBzdHJpbmdpZnkocG9zaXRpb24pIHx8ICcxOjEnO1xuICB2YXIgbG9jYXRpb247XG4gIHZhciBlcnI7XG5cbiAgbG9jYXRpb24gPSB7XG4gICAgc3RhcnQ6IHtsaW5lOiBudWxsLCBjb2x1bW46IG51bGx9LFxuICAgIGVuZDoge2xpbmU6IG51bGwsIGNvbHVtbjogbnVsbH1cbiAgfTtcblxuICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24ucG9zaXRpb24pIHtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLnBvc2l0aW9uO1xuICB9XG5cbiAgaWYgKHBvc2l0aW9uKSB7XG4gICAgLyogTG9jYXRpb24uICovXG4gICAgaWYgKHBvc2l0aW9uLnN0YXJ0KSB7XG4gICAgICBsb2NhdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbi5zdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogUG9zaXRpb24uICovXG4gICAgICBsb2NhdGlvbi5zdGFydCA9IHBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGVyciA9IG5ldyBWTWVzc2FnZShyZWFzb24ubWVzc2FnZSB8fCByZWFzb24pO1xuXG4gIGVyci5uYW1lID0gKGZpbGVQYXRoID8gZmlsZVBhdGggKyAnOicgOiAnJykgKyByYW5nZTtcbiAgZXJyLmZpbGUgPSBmaWxlUGF0aCB8fCAnJztcbiAgZXJyLnJlYXNvbiA9IHJlYXNvbi5tZXNzYWdlIHx8IHJlYXNvbjtcbiAgZXJyLmxpbmUgPSBwb3NpdGlvbiA/IHBvc2l0aW9uLmxpbmUgOiBudWxsO1xuICBlcnIuY29sdW1uID0gcG9zaXRpb24gPyBwb3NpdGlvbi5jb2x1bW4gOiBudWxsO1xuICBlcnIubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgZXJyLnJ1bGVJZCA9IHJ1bGVJZCB8fCBudWxsO1xuICBlcnIuc291cmNlID0gbnVsbDtcbiAgZXJyLmZhdGFsID0gZmFsc2U7XG5cbiAgaWYgKHJlYXNvbi5zdGFjaykge1xuICAgIGVyci5zdGFjayA9IHJlYXNvbi5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZXMucHVzaChlcnIpO1xuXG4gIHJldHVybiBlcnI7XG59XG5cbi8qIEZhaWwuIENyZWF0ZXMgYSB2bWVzc2FnZSwgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBmaWxlLFxuICogYW5kIHRocm93cyBpdC4gKi9cbmZ1bmN0aW9uIGZhaWwoKSB7XG4gIHZhciBtZXNzYWdlID0gdGhpcy5tZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgbWVzc2FnZS5mYXRhbCA9IHRydWU7XG5cbiAgdGhyb3cgbWVzc2FnZTtcbn1cblxuLyogSW5mby4gQ3JlYXRlcyBhIHZtZXNzYWdlLCBhc3NvY2lhdGVzIGl0IHdpdGggdGhlIGZpbGUsXG4gKiBhbmQgbWFya3MgdGhlIGZhdGFsaXR5IGFzIG51bGwuICovXG5mdW5jdGlvbiBpbmZvKCkge1xuICB2YXIgbWVzc2FnZSA9IHRoaXMubWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIG1lc3NhZ2UuZmF0YWwgPSBudWxsO1xuXG4gIHJldHVybiBtZXNzYWdlO1xufVxuXG4vKiBJbmhlcml0IGZyb20gYEVycm9yI2AuICovXG5mdW5jdGlvbiBWTWVzc2FnZVByb3RvdHlwZSgpIHt9XG5WTWVzc2FnZVByb3RvdHlwZS5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5WTWVzc2FnZS5wcm90b3R5cGUgPSBuZXcgVk1lc3NhZ2VQcm90b3R5cGUoKTtcblxuLyogTWVzc2FnZSBwcm9wZXJ0aWVzLiAqL1xucHJvdG8gPSBWTWVzc2FnZS5wcm90b3R5cGU7XG5cbnByb3RvLmZpbGUgPSAnJztcbnByb3RvLm5hbWUgPSAnJztcbnByb3RvLnJlYXNvbiA9ICcnO1xucHJvdG8ubWVzc2FnZSA9ICcnO1xucHJvdG8uc3RhY2sgPSAnJztcbnByb3RvLmZhdGFsID0gbnVsbDtcbnByb3RvLmNvbHVtbiA9IG51bGw7XG5wcm90by5saW5lID0gbnVsbDtcblxuLyogQ29uc3RydWN0IGEgbmV3IGZpbGUgbWVzc2FnZS5cbiAqXG4gKiBOb3RlOiBXZSBjYW5ub3QgaW52b2tlIGBFcnJvcmAgb24gdGhlIGNyZWF0ZWQgY29udGV4dCxcbiAqIGFzIHRoYXQgYWRkcyByZWFkb25seSBgbGluZWAgYW5kIGBjb2x1bW5gIGF0dHJpYnV0ZXMgb25cbiAqIFNhZmFyaSA5LCB0aHVzIHRocm93aW5nIGFuZCBmYWlsaW5nIHRoZSBkYXRhLiAqL1xuZnVuY3Rpb24gVk1lc3NhZ2UocmVhc29uKSB7XG4gIHRoaXMubWVzc2FnZSA9IHJlYXNvbjtcbn1cblxuLyogQXNzZXJ0IHRoYXQgYHBhcnRgIGlzIG5vdCBhIHBhdGggKGkuZS4sIGRvZXNcbiAqIG5vdCBjb250YWluIGBwYXRoLnNlcGApLiAqL1xuZnVuY3Rpb24gYXNzZXJ0UGFydChwYXJ0LCBuYW1lKSB7XG4gIGlmIChwYXJ0LmluZGV4T2YocGF0aC5zZXApICE9PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYCcgKyBuYW1lICsgJ2AgY2Fubm90IGJlIGEgcGF0aDogZGlkIG5vdCBleHBlY3QgYCcgKyBwYXRoLnNlcCArICdgJyk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IHRoYXQgYHBhcnRgIGlzIG5vdCBlbXB0eS4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vbkVtcHR5KHBhcnQsIG5hbWUpIHtcbiAgaWYgKCFwYXJ0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgJyArIG5hbWUgKyAnYCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgfVxufVxuXG4vKiBBc3NlcnQgYHBhdGhgIGV4aXN0cy4gKi9cbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aCwgbmFtZSkge1xuICBpZiAoIXBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldHRpbmcgYCcgKyBuYW1lICsgJ2AgcmVxdWlyZXMgYHBhdGhgIHRvIGJlIHNldCB0b28nKTtcbiAgfVxufVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxuZnVuY3Rpb24gcmVwbGFjZUV4dChucGF0aCwgZXh0KSB7XG4gIGlmICh0eXBlb2YgbnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5wYXRoO1xuICB9XG5cbiAgaWYgKG5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBucGF0aDtcbiAgfVxuXG4gIHZhciBuRmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKG5wYXRoLCBwYXRoLmV4dG5hbWUobnBhdGgpKSArIGV4dDtcbiAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUobnBhdGgpLCBuRmlsZU5hbWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcGxhY2VFeHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdpZnk7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSkge1xuICAvKiBOb3RoaW5nLiAqL1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qIE5vZGUuICovXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ3Bvc2l0aW9uJykgfHwgb3duLmNhbGwodmFsdWUsICd0eXBlJykpIHtcbiAgICByZXR1cm4gbG9jYXRpb24odmFsdWUucG9zaXRpb24pO1xuICB9XG5cbiAgLyogTG9jYXRpb24uICovXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ3N0YXJ0JykgfHwgb3duLmNhbGwodmFsdWUsICdlbmQnKSkge1xuICAgIHJldHVybiBsb2NhdGlvbih2YWx1ZSk7XG4gIH1cblxuICAvKiBQb3NpdGlvbi4gKi9cbiAgaWYgKG93bi5jYWxsKHZhbHVlLCAnbGluZScpIHx8IG93bi5jYWxsKHZhbHVlLCAnY29sdW1uJykpIHtcbiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUpO1xuICB9XG5cbiAgLyogPyAqL1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb24ocG9zKSB7XG4gIGlmICghcG9zIHx8IHR5cGVvZiBwb3MgIT09ICdvYmplY3QnKSB7XG4gICAgcG9zID0ge307XG4gIH1cblxuICByZXR1cm4gaW5kZXgocG9zLmxpbmUpICsgJzonICsgaW5kZXgocG9zLmNvbHVtbik7XG59XG5cbmZ1bmN0aW9uIGxvY2F0aW9uKGxvYykge1xuICBpZiAoIWxvYyB8fCB0eXBlb2YgbG9jICE9PSAnb2JqZWN0Jykge1xuICAgIGxvYyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHBvc2l0aW9uKGxvYy5zdGFydCkgKyAnLScgKyBwb3NpdGlvbihsb2MuZW5kKTtcbn1cblxuZnVuY3Rpb24gaW5kZXgodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IDE7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZm4pID09PSAnW29iamVjdCBGdW5jdGlvbl0nXG59XG4iLCJ2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmdcblxuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIlxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBEZXBlbmRlbmNpZXMuICovXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnZXh0ZW5kJyk7XG52YXIgYmFpbCA9IHJlcXVpcmUoJ2JhaWwnKTtcbnZhciB2ZmlsZSA9IHJlcXVpcmUoJ3ZmaWxlJyk7XG52YXIgdHJvdWdoID0gcmVxdWlyZSgndHJvdWdoJyk7XG52YXIgc3RyaW5nID0gcmVxdWlyZSgneC1pcy1zdHJpbmcnKTtcbnZhciBmdW5jID0gcmVxdWlyZSgneC1pcy1mdW5jdGlvbicpO1xudmFyIHBsYWluID0gcmVxdWlyZSgnaXMtcGxhaW4tb2JqJyk7XG5cbi8qIEV4cG9zZSBhIGZyb3plbiBwcm9jZXNzb3IuICovXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWZpZWQoKS5mcmVlemUoKTtcblxudmFyIHNsaWNlID0gW10uc2xpY2U7XG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cbi8qIFByb2Nlc3MgcGlwZWxpbmUuICovXG52YXIgcGlwZWxpbmUgPSB0cm91Z2goKS51c2UocGlwZWxpbmVQYXJzZSkudXNlKHBpcGVsaW5lUnVuKS51c2UocGlwZWxpbmVTdHJpbmdpZnkpO1xuXG5mdW5jdGlvbiBwaXBlbGluZVBhcnNlKHAsIGN0eCkge1xuICBjdHgudHJlZSA9IHAucGFyc2UoY3R4LmZpbGUpO1xufVxuXG5mdW5jdGlvbiBwaXBlbGluZVJ1bihwLCBjdHgsIG5leHQpIHtcbiAgcC5ydW4oY3R4LnRyZWUsIGN0eC5maWxlLCBkb25lKTtcblxuICBmdW5jdGlvbiBkb25lKGVyciwgdHJlZSwgZmlsZSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIG5leHQoZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4LnRyZWUgPSB0cmVlO1xuICAgICAgY3R4LmZpbGUgPSBmaWxlO1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZVN0cmluZ2lmeShwLCBjdHgpIHtcbiAgY3R4LmZpbGUuY29udGVudHMgPSBwLnN0cmluZ2lmeShjdHgudHJlZSwgY3R4LmZpbGUpO1xufVxuXG4vKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGZpcnN0IHByb2Nlc3Nvci4gKi9cbmZ1bmN0aW9uIHVuaWZpZWQoKSB7XG4gIHZhciBhdHRhY2hlcnMgPSBbXTtcbiAgdmFyIHRyYW5zZm9ybWVycyA9IHRyb3VnaCgpO1xuICB2YXIgbmFtZXNwYWNlID0ge307XG4gIHZhciBmcm96ZW4gPSBmYWxzZTtcbiAgdmFyIGZyZWV6ZUluZGV4ID0gLTE7XG5cbiAgLyogRGF0YSBtYW5hZ2VtZW50LiAqL1xuICBwcm9jZXNzb3IuZGF0YSA9IGRhdGE7XG5cbiAgLyogTG9jay4gKi9cbiAgcHJvY2Vzc29yLmZyZWV6ZSA9IGZyZWV6ZTtcblxuICAvKiBQbHVnLWlucy4gKi9cbiAgcHJvY2Vzc29yLmF0dGFjaGVycyA9IGF0dGFjaGVycztcbiAgcHJvY2Vzc29yLnVzZSA9IHVzZTtcblxuICAvKiBBUEkuICovXG4gIHByb2Nlc3Nvci5wYXJzZSA9IHBhcnNlO1xuICBwcm9jZXNzb3Iuc3RyaW5naWZ5ID0gc3RyaW5naWZ5O1xuICBwcm9jZXNzb3IucnVuID0gcnVuO1xuICBwcm9jZXNzb3IucnVuU3luYyA9IHJ1blN5bmM7XG4gIHByb2Nlc3Nvci5wcm9jZXNzID0gcHJvY2VzcztcbiAgcHJvY2Vzc29yLnByb2Nlc3NTeW5jID0gcHJvY2Vzc1N5bmM7XG5cbiAgLyogRXhwb3NlLiAqL1xuICByZXR1cm4gcHJvY2Vzc29yO1xuXG4gIC8qIENyZWF0ZSBhIG5ldyBwcm9jZXNzb3IgYmFzZWQgb24gdGhlIHByb2Nlc3NvclxuICAgKiBpbiB0aGUgY3VycmVudCBzY29wZS4gKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc29yKCkge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IHVuaWZpZWQoKTtcbiAgICB2YXIgbGVuZ3RoID0gYXR0YWNoZXJzLmxlbmd0aDtcbiAgICB2YXIgaW5kZXggPSAtMTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBkZXN0aW5hdGlvbi51c2UuYXBwbHkobnVsbCwgYXR0YWNoZXJzW2luZGV4XSk7XG4gICAgfVxuXG4gICAgZGVzdGluYXRpb24uZGF0YShleHRlbmQodHJ1ZSwge30sIG5hbWVzcGFjZSkpO1xuXG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICB9XG5cbiAgLyogRnJlZXplOiB1c2VkIHRvIHNpZ25hbCBhIHByb2Nlc3NvciB0aGF0IGhhcyBmaW5pc2hlZFxuICAgKiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgdGFrZSB1bmlmaWVkIGl0c2VsZi4gIEl04oCZcyBmcm96ZW4uXG4gICAqIFBsdWctaW5zIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gaXQuICBSYXRoZXIsIGl0IHNob3VsZFxuICAgKiBiZSBleHRlbmRlZCwgYnkgaW52b2tpbmcgaXQsIGJlZm9yZSBtb2RpZnlpbmcgaXQuXG4gICAqXG4gICAqIEluIGVzc2VuY2UsIGFsd2F5cyBpbnZva2UgdGhpcyB3aGVuIGV4cG9ydGluZyBhXG4gICAqIHByb2Nlc3Nvci4gKi9cbiAgZnVuY3Rpb24gZnJlZXplKCkge1xuICAgIHZhciB2YWx1ZXM7XG4gICAgdmFyIHBsdWdpbjtcbiAgICB2YXIgb3B0aW9ucztcbiAgICB2YXIgdHJhbnNmb3JtZXI7XG5cbiAgICBpZiAoZnJvemVuKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc29yO1xuICAgIH1cblxuICAgIHdoaWxlICgrK2ZyZWV6ZUluZGV4IDwgYXR0YWNoZXJzLmxlbmd0aCkge1xuICAgICAgdmFsdWVzID0gYXR0YWNoZXJzW2ZyZWV6ZUluZGV4XTtcbiAgICAgIHBsdWdpbiA9IHZhbHVlc1swXTtcbiAgICAgIG9wdGlvbnMgPSB2YWx1ZXNbMV07XG4gICAgICB0cmFuc2Zvcm1lciA9IG51bGw7XG5cbiAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWVzWzFdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lciA9IHBsdWdpbi5hcHBseShwcm9jZXNzb3IsIHZhbHVlcy5zbGljZSgxKSk7XG5cbiAgICAgIGlmIChmdW5jKHRyYW5zZm9ybWVyKSkge1xuICAgICAgICB0cmFuc2Zvcm1lcnMudXNlKHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmcm96ZW4gPSB0cnVlO1xuICAgIGZyZWV6ZUluZGV4ID0gSW5maW5pdHk7XG5cbiAgICByZXR1cm4gcHJvY2Vzc29yO1xuICB9XG5cbiAgLyogRGF0YSBtYW5hZ2VtZW50LlxuICAgKiBHZXR0ZXIgLyBzZXR0ZXIgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYyBpbmZvcm10aW9uLiAqL1xuICBmdW5jdGlvbiBkYXRhKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoc3RyaW5nKGtleSkpIHtcbiAgICAgIC8qIFNldCBga2V5YC4gKi9cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGFzc2VydFVuZnJvemVuKCdkYXRhJywgZnJvemVuKTtcblxuICAgICAgICBuYW1lc3BhY2Vba2V5XSA9IHZhbHVlO1xuXG4gICAgICAgIHJldHVybiBwcm9jZXNzb3I7XG4gICAgICB9XG5cbiAgICAgIC8qIEdldCBga2V5YC4gKi9cbiAgICAgIHJldHVybiAob3duLmNhbGwobmFtZXNwYWNlLCBrZXkpICYmIG5hbWVzcGFjZVtrZXldKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qIFNldCBzcGFjZS4gKi9cbiAgICBpZiAoa2V5KSB7XG4gICAgICBhc3NlcnRVbmZyb3plbignZGF0YScsIGZyb3plbik7XG4gICAgICBuYW1lc3BhY2UgPSBrZXk7XG4gICAgICByZXR1cm4gcHJvY2Vzc29yO1xuICAgIH1cblxuICAgIC8qIEdldCBzcGFjZS4gKi9cbiAgICByZXR1cm4gbmFtZXNwYWNlO1xuICB9XG5cbiAgLyogUGx1Zy1pbiBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBQYXNzIGl0OlxuICAgKiAqICAgYW4gYXR0YWNoZXIgYW5kIG9wdGlvbnMsXG4gICAqICogICBhIHByZXNldCxcbiAgICogKiAgIGEgbGlzdCBvZiBwcmVzZXRzLCBhdHRhY2hlcnMsIGFuZCBhcmd1bWVudHMgKGxpc3RcbiAgICogICAgIG9mIGF0dGFjaGVycyBhbmQgb3B0aW9ucykuICovXG4gIGZ1bmN0aW9uIHVzZSh2YWx1ZSkge1xuICAgIHZhciBzZXR0aW5ncztcblxuICAgIGFzc2VydFVuZnJvemVuKCd1c2UnLCBmcm96ZW4pO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIEVtcHR5ICovXG4gICAgfSBlbHNlIGlmIChmdW5jKHZhbHVlKSkge1xuICAgICAgYWRkUGx1Z2luLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoJ2xlbmd0aCcgaW4gdmFsdWUpIHtcbiAgICAgICAgYWRkTGlzdCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRQcmVzZXQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHVzYWJsZSB2YWx1ZSwgbm90IGAnICsgdmFsdWUgKyAnYCcpO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgbmFtZXNwYWNlLnNldHRpbmdzID0gZXh0ZW5kKG5hbWVzcGFjZS5zZXR0aW5ncyB8fCB7fSwgc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzb3I7XG5cbiAgICBmdW5jdGlvbiBhZGRQcmVzZXQocmVzdWx0KSB7XG4gICAgICBhZGRMaXN0KHJlc3VsdC5wbHVnaW5zKTtcblxuICAgICAgaWYgKHJlc3VsdC5zZXR0aW5ncykge1xuICAgICAgICBzZXR0aW5ncyA9IGV4dGVuZChzZXR0aW5ncyB8fCB7fSwgcmVzdWx0LnNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgIGlmIChmdW5jKHZhbHVlKSkge1xuICAgICAgICBhZGRQbHVnaW4odmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICgnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgICAgICAgIGFkZFBsdWdpbi5hcHBseShudWxsLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkUHJlc2V0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgJyArIHZhbHVlICsgJ2AnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRMaXN0KHBsdWdpbnMpIHtcbiAgICAgIHZhciBsZW5ndGg7XG4gICAgICB2YXIgaW5kZXg7XG5cbiAgICAgIGlmIChwbHVnaW5zID09PSBudWxsIHx8IHBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBFbXB0eSAqL1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2lucyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gcGx1Z2lucykge1xuICAgICAgICBsZW5ndGggPSBwbHVnaW5zLmxlbmd0aDtcbiAgICAgICAgaW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFkZChwbHVnaW5zW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBsaXN0IG9mIHBsdWdpbnMsIG5vdCBgJyArIHBsdWdpbnMgKyAnYCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFBsdWdpbihwbHVnaW4sIHZhbHVlKSB7XG4gICAgICB2YXIgZW50cnkgPSBmaW5kKHBsdWdpbik7XG5cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBpZiAocGxhaW4oZW50cnlbMV0pICYmIHBsYWluKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gZXh0ZW5kKGVudHJ5WzFdLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbnRyeVsxXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0YWNoZXJzLnB1c2goc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kKHBsdWdpbikge1xuICAgIHZhciBsZW5ndGggPSBhdHRhY2hlcnMubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBlbnRyeTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGF0dGFjaGVyc1tpbmRleF07XG5cbiAgICAgIGlmIChlbnRyeVswXSA9PT0gcGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiBQYXJzZSBhIGZpbGUgKGluIHN0cmluZyBvciBWRmlsZSByZXByZXNlbnRhdGlvbilcbiAgICogaW50byBhIFVuaXN0IG5vZGUgdXNpbmcgdGhlIGBQYXJzZXJgIG9uIHRoZVxuICAgKiBwcm9jZXNzb3IuICovXG4gIGZ1bmN0aW9uIHBhcnNlKGRvYykge1xuICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcbiAgICB2YXIgUGFyc2VyO1xuXG4gICAgZnJlZXplKCk7XG4gICAgUGFyc2VyID0gcHJvY2Vzc29yLlBhcnNlcjtcbiAgICBhc3NlcnRQYXJzZXIoJ3BhcnNlJywgUGFyc2VyKTtcblxuICAgIGlmIChuZXdhYmxlKFBhcnNlcikpIHtcbiAgICAgIHJldHVybiBuZXcgUGFyc2VyKFN0cmluZyhmaWxlKSwgZmlsZSkucGFyc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUGFyc2VyKFN0cmluZyhmaWxlKSwgZmlsZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgLyogUnVuIHRyYW5zZm9ybXMgb24gYSBVbmlzdCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZVxuICAgKiAoaW4gc3RyaW5nIG9yIFZGaWxlIHJlcHJlc2VudGF0aW9uKSwgYXN5bmMuICovXG4gIGZ1bmN0aW9uIHJ1bihub2RlLCBmaWxlLCBjYikge1xuICAgIGFzc2VydE5vZGUobm9kZSk7XG4gICAgZnJlZXplKCk7XG5cbiAgICBpZiAoIWNiICYmIGZ1bmMoZmlsZSkpIHtcbiAgICAgIGNiID0gZmlsZTtcbiAgICAgIGZpbGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghY2IpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShleGVjdXRvcik7XG4gICAgfVxuXG4gICAgZXhlY3V0b3IobnVsbCwgY2IpO1xuXG4gICAgZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB0cmFuc2Zvcm1lcnMucnVuKG5vZGUsIHZmaWxlKGZpbGUpLCBkb25lKTtcblxuICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIHRyZWUsIGZpbGUpIHtcbiAgICAgICAgdHJlZSA9IHRyZWUgfHwgbm9kZTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKHRyZWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiKG51bGwsIHRyZWUsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUnVuIHRyYW5zZm9ybXMgb24gYSBVbmlzdCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZVxuICAgKiAoaW4gc3RyaW5nIG9yIFZGaWxlIHJlcHJlc2VudGF0aW9uKSwgc3luYy4gKi9cbiAgZnVuY3Rpb24gcnVuU3luYyhub2RlLCBmaWxlKSB7XG4gICAgdmFyIGNvbXBsZXRlID0gZmFsc2U7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHJ1bihub2RlLCBmaWxlLCBkb25lKTtcblxuICAgIGFzc2VydERvbmUoJ3J1blN5bmMnLCAncnVuJywgY29tcGxldGUpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCB0cmVlKSB7XG4gICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICBiYWlsKGVycik7XG4gICAgICByZXN1bHQgPSB0cmVlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0cmluZ2lmeSBhIFVuaXN0IG5vZGUgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlXG4gICAqIChpbiBzdHJpbmcgb3IgVkZpbGUgcmVwcmVzZW50YXRpb24pIGludG8gYSBzdHJpbmdcbiAgICogdXNpbmcgdGhlIGBDb21waWxlcmAgb24gdGhlIHByb2Nlc3Nvci4gKi9cbiAgZnVuY3Rpb24gc3RyaW5naWZ5KG5vZGUsIGRvYykge1xuICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcbiAgICB2YXIgQ29tcGlsZXI7XG5cbiAgICBmcmVlemUoKTtcbiAgICBDb21waWxlciA9IHByb2Nlc3Nvci5Db21waWxlcjtcbiAgICBhc3NlcnRDb21waWxlcignc3RyaW5naWZ5JywgQ29tcGlsZXIpO1xuICAgIGFzc2VydE5vZGUobm9kZSk7XG5cbiAgICBpZiAobmV3YWJsZShDb21waWxlcikpIHtcbiAgICAgIHJldHVybiBuZXcgQ29tcGlsZXIobm9kZSwgZmlsZSkuY29tcGlsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBDb21waWxlcihub2RlLCBmaWxlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG4gIH1cblxuICAvKiBQYXJzZSBhIGZpbGUgKGluIHN0cmluZyBvciBWRmlsZSByZXByZXNlbnRhdGlvbilcbiAgICogaW50byBhIFVuaXN0IG5vZGUgdXNpbmcgdGhlIGBQYXJzZXJgIG9uIHRoZSBwcm9jZXNzb3IsXG4gICAqIHRoZW4gcnVuIHRyYW5zZm9ybXMgb24gdGhhdCBub2RlLCBhbmQgY29tcGlsZSB0aGVcbiAgICogcmVzdWx0aW5nIG5vZGUgdXNpbmcgdGhlIGBDb21waWxlcmAgb24gdGhlIHByb2Nlc3NvcixcbiAgICogYW5kIHN0b3JlIHRoYXQgcmVzdWx0IG9uIHRoZSBWRmlsZS4gKi9cbiAgZnVuY3Rpb24gcHJvY2Vzcyhkb2MsIGNiKSB7XG4gICAgZnJlZXplKCk7XG4gICAgYXNzZXJ0UGFyc2VyKCdwcm9jZXNzJywgcHJvY2Vzc29yLlBhcnNlcik7XG4gICAgYXNzZXJ0Q29tcGlsZXIoJ3Byb2Nlc3MnLCBwcm9jZXNzb3IuQ29tcGlsZXIpO1xuXG4gICAgaWYgKCFjYikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGV4ZWN1dG9yKTtcbiAgICB9XG5cbiAgICBleGVjdXRvcihudWxsLCBjYik7XG5cbiAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcblxuICAgICAgcGlwZWxpbmUucnVuKHByb2Nlc3Nvciwge2ZpbGU6IGZpbGV9LCBkb25lKTtcblxuICAgICAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiKG51bGwsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUHJvY2VzcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgKGluIHN0cmluZyBvciBWRmlsZVxuICAgKiByZXByZXNlbnRhdGlvbiksIHN5bmMuICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NTeW5jKGRvYykge1xuICAgIHZhciBjb21wbGV0ZSA9IGZhbHNlO1xuICAgIHZhciBmaWxlO1xuXG4gICAgZnJlZXplKCk7XG4gICAgYXNzZXJ0UGFyc2VyKCdwcm9jZXNzU3luYycsIHByb2Nlc3Nvci5QYXJzZXIpO1xuICAgIGFzc2VydENvbXBpbGVyKCdwcm9jZXNzU3luYycsIHByb2Nlc3Nvci5Db21waWxlcik7XG4gICAgZmlsZSA9IHZmaWxlKGRvYyk7XG5cbiAgICBwcm9jZXNzKGZpbGUsIGRvbmUpO1xuXG4gICAgYXNzZXJ0RG9uZSgncHJvY2Vzc1N5bmMnLCAncHJvY2VzcycsIGNvbXBsZXRlKTtcblxuICAgIHJldHVybiBmaWxlO1xuXG4gICAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIGJhaWwoZXJyKTtcbiAgICB9XG4gIH1cbn1cblxuLyogQ2hlY2sgaWYgYGZ1bmNgIGlzIGEgY29uc3RydWN0b3IuICovXG5mdW5jdGlvbiBuZXdhYmxlKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jKHZhbHVlKSAmJiBrZXlzKHZhbHVlLnByb3RvdHlwZSk7XG59XG5cbi8qIENoZWNrIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0IHdpdGgga2V5cy4gKi9cbmZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qIEFzc2VydCBhIHBhcnNlciBpcyBhdmFpbGFibGUuICovXG5mdW5jdGlvbiBhc3NlcnRQYXJzZXIobmFtZSwgUGFyc2VyKSB7XG4gIGlmICghZnVuYyhQYXJzZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYCcgKyBuYW1lICsgJ2Agd2l0aG91dCBgUGFyc2VyYCcpO1xuICB9XG59XG5cbi8qIEFzc2VydCBhIGNvbXBpbGVyIGlzIGF2YWlsYWJsZS4gKi9cbmZ1bmN0aW9uIGFzc2VydENvbXBpbGVyKG5hbWUsIENvbXBpbGVyKSB7XG4gIGlmICghZnVuYyhDb21waWxlcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBgJyArIG5hbWUgKyAnYCB3aXRob3V0IGBDb21waWxlcmAnKTtcbiAgfVxufVxuXG4vKiBBc3NlcnQgdGhlIHByb2Nlc3NvciBpcyBub3QgZnJvemVuLiAqL1xuZnVuY3Rpb24gYXNzZXJ0VW5mcm96ZW4obmFtZSwgZnJvemVuKSB7XG4gIGlmIChmcm96ZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IGludm9rZSBgJyArIG5hbWUgKyAnYCBvbiBhIGZyb3plbiBwcm9jZXNzb3IuXFxuJyArXG4gICAgICAnQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBmaXJzdCwgYnkgaW52b2tpbmcgaXQ6ICcgK1xuICAgICAgJ3VzZSBgcHJvY2Vzc29yKClgIGluc3RlYWQgb2YgYHByb2Nlc3NvcmAuJ1xuICAgICk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IGBub2RlYCBpcyBhIFVuaXN0IG5vZGUuICovXG5mdW5jdGlvbiBhc3NlcnROb2RlKG5vZGUpIHtcbiAgaWYgKCFub2RlIHx8ICFzdHJpbmcobm9kZS50eXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbm9kZSwgZ290IGAnICsgbm9kZSArICdgJyk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IHRoYXQgYGNvbXBsZXRlYCBpcyBgdHJ1ZWAuICovXG5mdW5jdGlvbiBhc3NlcnREb25lKG5hbWUsIGFzeW5jTmFtZSwgY29tcGxldGUpIHtcbiAgaWYgKCFjb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYCcgKyBuYW1lICsgJ2AgZmluaXNoZWQgYXN5bmMuIFVzZSBgJyArIGFzeW5jTmFtZSArICdgIGluc3RlYWQnKTtcbiAgfVxufVxuIl19 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o fromIndex) { if (value.charAt(index - 1) !== ' ') { break; } index--; } return index; } },{}],5:[function(require,module,exports){ 'use strict'; module.exports = locate; function locate(value, fromIndex) { return value.indexOf('`', fromIndex); } },{}],6:[function(require,module,exports){ 'use strict'; module.exports = locate; function locate(value, fromIndex) { return value.indexOf('~~', fromIndex); } },{}],7:[function(require,module,exports){ 'use strict'; module.exports = locate; function locate(value, fromIndex) { var asterisk = value.indexOf('*', fromIndex); var underscore = value.indexOf('_', fromIndex); if (underscore === -1) { return asterisk; } if (asterisk === -1) { return underscore; } return underscore < asterisk ? underscore : asterisk; } },{}],8:[function(require,module,exports){ 'use strict'; module.exports = locate; function locate(value, fromIndex) { return value.indexOf('\\', fromIndex); } },{}],9:[function(require,module,exports){ 'use strict'; module.exports = locate; function locate(value, fromIndex) { var link = value.indexOf('[', fromIndex); var image = value.indexOf('![', fromIndex); if (image === -1) { return link; } /* Link can never be `-1` if an image is found, so we don’t need * to check for that :) */ return link < image ? link : image; } },{}],10:[function(require,module,exports){ 'use strict'; module.exports = locate; function locate(value, fromIndex) { var asterisk = value.indexOf('**', fromIndex); var underscore = value.indexOf('__', fromIndex); if (underscore === -1) { return asterisk; } if (asterisk === -1) { return underscore; } return underscore < asterisk ? underscore : asterisk; } },{}],11:[function(require,module,exports){ 'use strict'; module.exports = locate; function locate(value, fromIndex) { return value.indexOf('<', fromIndex); } },{}],12:[function(require,module,exports){ 'use strict'; module.exports = locate; var PROTOCOLS = ['https://', 'http://', 'mailto:']; function locate(value, fromIndex) { var length = PROTOCOLS.length; var index = -1; var min = -1; var position; if (!this.options.gfm) { return -1; } while (++index < length) { position = value.indexOf(PROTOCOLS[index], fromIndex); if (position !== -1 && (position < min || min === -1)) { min = position; } } return min; } },{}],13:[function(require,module,exports){ 'use strict'; var xtend = require('xtend'); var removePosition = require('unist-util-remove-position'); module.exports = parse; var C_NEWLINE = '\n'; var EXPRESSION_LINE_BREAKS = /\r\n|\r/g; /* Parse the bound file. */ function parse() { var self = this; var value = String(self.file); var start = {line: 1, column: 1, offset: 0}; var content = xtend(start); var node; /* Clean non-unix newlines: `\r\n` and `\r` are all * changed to `\n`. This should not affect positional * information. */ value = value.replace(EXPRESSION_LINE_BREAKS, C_NEWLINE); if (value.charCodeAt(0) === 0xFEFF) { value = value.slice(1); content.column++; content.offset++; } node = { type: 'root', children: self.tokenizeBlock(value, content), position: { start: start, end: self.eof || xtend(start) } }; if (!self.options.position) { removePosition(node, true); } return node; } },{"unist-util-remove-position":66,"xtend":69}],14:[function(require,module,exports){ 'use strict'; var xtend = require('xtend'); var toggle = require('state-toggle'); var vfileLocation = require('vfile-location'); var unescape = require('./unescape'); var decode = require('./decode'); var tokenizer = require('./tokenizer'); module.exports = Parser; function Parser(doc, file) { this.file = file; this.offset = {}; this.options = xtend(this.options); this.setOptions({}); this.inList = false; this.inBlock = false; this.inLink = false; this.atStart = true; this.toOffset = vfileLocation(file).toOffset; this.unescape = unescape(this, 'escape'); this.decode = decode(this); } var proto = Parser.prototype; /* Expose core. */ proto.setOptions = require('./set-options'); proto.parse = require('./parse'); /* Expose `defaults`. */ proto.options = require('./defaults'); /* Enter and exit helpers. */ proto.exitStart = toggle('atStart', true); proto.enterList = toggle('inList', false); proto.enterLink = toggle('inLink', false); proto.enterBlock = toggle('inBlock', false); /* Nodes that can interupt a paragraph: * * ```markdown * A paragraph, followed by a thematic break. * ___ * ``` * * In the above example, the thematic break “interupts” * the paragraph. */ proto.interruptParagraph = [ ['thematicBreak'], ['atxHeading'], ['fencedCode'], ['blockquote'], ['html'], ['setextHeading', {commonmark: false}], ['definition', {commonmark: false}], ['footnote', {commonmark: false}] ]; /* Nodes that can interupt a list: * * ```markdown * - One * ___ * ``` * * In the above example, the thematic break “interupts” * the list. */ proto.interruptList = [ ['fencedCode', {pedantic: false}], ['thematicBreak', {pedantic: false}], ['definition', {commonmark: false}], ['footnote', {commonmark: false}] ]; /* Nodes that can interupt a blockquote: * * ```markdown * > A paragraph. * ___ * ``` * * In the above example, the thematic break “interupts” * the blockquote. */ proto.interruptBlockquote = [ ['indentedCode', {commonmark: true}], ['fencedCode', {commonmark: true}], ['atxHeading', {commonmark: true}], ['setextHeading', {commonmark: true}], ['thematicBreak', {commonmark: true}], ['html', {commonmark: true}], ['list', {commonmark: true}], ['definition', {commonmark: false}], ['footnote', {commonmark: false}] ]; /* Handlers. */ proto.blockTokenizers = { newline: require('./tokenize/newline'), indentedCode: require('./tokenize/code-indented'), fencedCode: require('./tokenize/code-fenced'), blockquote: require('./tokenize/blockquote'), atxHeading: require('./tokenize/heading-atx'), thematicBreak: require('./tokenize/thematic-break'), list: require('./tokenize/list'), setextHeading: require('./tokenize/heading-setext'), html: require('./tokenize/html-block'), footnote: require('./tokenize/footnote-definition'), definition: require('./tokenize/definition'), table: require('./tokenize/table'), paragraph: require('./tokenize/paragraph') }; proto.inlineTokenizers = { escape: require('./tokenize/escape'), autoLink: require('./tokenize/auto-link'), url: require('./tokenize/url'), html: require('./tokenize/html-inline'), link: require('./tokenize/link'), reference: require('./tokenize/reference'), strong: require('./tokenize/strong'), emphasis: require('./tokenize/emphasis'), deletion: require('./tokenize/delete'), code: require('./tokenize/code-inline'), break: require('./tokenize/break'), text: require('./tokenize/text') }; /* Expose precedence. */ proto.blockMethods = keys(proto.blockTokenizers); proto.inlineMethods = keys(proto.inlineTokenizers); /* Tokenizers. */ proto.tokenizeBlock = tokenizer('block'); proto.tokenizeInline = tokenizer('inline'); proto.tokenizeFactory = tokenizer; /* Get all keys in `value`. */ function keys(value) { var result = []; var key; for (key in value) { result.push(key); } return result; } },{"./decode":2,"./defaults":3,"./parse":13,"./set-options":15,"./tokenize/auto-link":16,"./tokenize/blockquote":17,"./tokenize/break":18,"./tokenize/code-fenced":19,"./tokenize/code-indented":20,"./tokenize/code-inline":21,"./tokenize/definition":22,"./tokenize/delete":23,"./tokenize/emphasis":24,"./tokenize/escape":25,"./tokenize/footnote-definition":26,"./tokenize/heading-atx":27,"./tokenize/heading-setext":28,"./tokenize/html-block":29,"./tokenize/html-inline":30,"./tokenize/link":31,"./tokenize/list":32,"./tokenize/newline":33,"./tokenize/paragraph":34,"./tokenize/reference":35,"./tokenize/strong":36,"./tokenize/table":37,"./tokenize/text":38,"./tokenize/thematic-break":39,"./tokenize/url":40,"./tokenizer":41,"./unescape":42,"state-toggle":61,"vfile-location":68,"xtend":69}],15:[function(require,module,exports){ 'use strict'; var xtend = require('xtend'); var escapes = require('markdown-escapes'); var defaults = require('./defaults'); module.exports = setOptions; function setOptions(options) { var self = this; var current = self.options; var key; var value; if (options == null) { options = {}; } else if (typeof options === 'object') { options = xtend(options); } else { throw new Error( 'Invalid value `' + options + '` ' + 'for setting `options`' ); } for (key in defaults) { value = options[key]; if (value == null) { value = current[key]; } if ( (key !== 'blocks' && typeof value !== 'boolean') || (key === 'blocks' && typeof value !== 'object') ) { throw new Error('Invalid value `' + value + '` for setting `options.' + key + '`'); } options[key] = value; } self.options = options; self.escape = escapes(options); return self; } },{"./defaults":3,"markdown-escapes":53,"xtend":69}],16:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); var decode = require('parse-entities'); var locate = require('../locate/tag'); module.exports = autoLink; autoLink.locator = locate; autoLink.notInLink = true; var C_LT = '<'; var C_GT = '>'; var C_AT_SIGN = '@'; var C_SLASH = '/'; var MAILTO = 'mailto:'; var MAILTO_LENGTH = MAILTO.length; /* Tokenise a link. */ function autoLink(eat, value, silent) { var self; var subvalue; var length; var index; var queue; var character; var hasAtCharacter; var link; var now; var content; var tokenize; var exit; if (value.charAt(0) !== C_LT) { return; } self = this; subvalue = ''; length = value.length; index = 0; queue = ''; hasAtCharacter = false; link = ''; index++; subvalue = C_LT; while (index < length) { character = value.charAt(index); if ( whitespace(character) || character === C_GT || character === C_AT_SIGN || (character === ':' && value.charAt(index + 1) === C_SLASH) ) { break; } queue += character; index++; } if (!queue) { return; } link += queue; queue = ''; character = value.charAt(index); link += character; index++; if (character === C_AT_SIGN) { hasAtCharacter = true; } else { if ( character !== ':' || value.charAt(index + 1) !== C_SLASH ) { return; } link += C_SLASH; index++; } while (index < length) { character = value.charAt(index); if (whitespace(character) || character === C_GT) { break; } queue += character; index++; } character = value.charAt(index); if (!queue || character !== C_GT) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } link += queue; content = link; subvalue += link + character; now = eat.now(); now.column++; now.offset++; if (hasAtCharacter) { if (link.slice(0, MAILTO_LENGTH).toLowerCase() === MAILTO) { content = content.substr(MAILTO_LENGTH); now.column += MAILTO_LENGTH; now.offset += MAILTO_LENGTH; } else { link = MAILTO + link; } } /* Temporarily remove support for escapes in autolinks. */ tokenize = self.inlineTokenizers.escape; self.inlineTokenizers.escape = null; exit = self.enterLink(); content = self.tokenizeInline(content, now); self.inlineTokenizers.escape = tokenize; exit(); return eat(subvalue)({ type: 'link', title: null, url: decode(link), children: content }); } },{"../locate/tag":11,"is-whitespace-character":51,"parse-entities":54}],17:[function(require,module,exports){ 'use strict'; var trim = require('trim'); var interrupt = require('../util/interrupt'); module.exports = blockquote; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var C_GT = '>'; /* Tokenise a blockquote. */ function blockquote(eat, value, silent) { var self = this; var offsets = self.offset; var tokenizers = self.blockTokenizers; var interruptors = self.interruptBlockquote; var now = eat.now(); var currentLine = now.line; var length = value.length; var values = []; var contents = []; var indents = []; var add; var index = 0; var character; var rest; var nextIndex; var content; var line; var startIndex; var prefixed; var exit; while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } index++; } if (value.charAt(index) !== C_GT) { return; } if (silent) { return true; } index = 0; while (index < length) { nextIndex = value.indexOf(C_NEWLINE, index); startIndex = index; prefixed = false; if (nextIndex === -1) { nextIndex = length; } while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } index++; } if (value.charAt(index) === C_GT) { index++; prefixed = true; if (value.charAt(index) === C_SPACE) { index++; } } else { index = startIndex; } content = value.slice(index, nextIndex); if (!prefixed && !trim(content)) { index = startIndex; break; } if (!prefixed) { rest = value.slice(index); /* Check if the following code contains a possible * block. */ if (interrupt(interruptors, tokenizers, self, [eat, rest, true])) { break; } } line = startIndex === index ? content : value.slice(startIndex, nextIndex); indents.push(index - startIndex); values.push(line); contents.push(content); index = nextIndex + 1; } index = -1; length = indents.length; add = eat(values.join(C_NEWLINE)); while (++index < length) { offsets[currentLine] = (offsets[currentLine] || 0) + indents[index]; currentLine++; } exit = self.enterBlock(); contents = self.tokenizeBlock(contents.join(C_NEWLINE), now); exit(); return add({ type: 'blockquote', children: contents }); } },{"../util/interrupt":45,"trim":63}],18:[function(require,module,exports){ 'use strict'; var locate = require('../locate/break'); module.exports = hardBreak; hardBreak.locator = locate; var MIN_BREAK_LENGTH = 2; function hardBreak(eat, value, silent) { var length = value.length; var index = -1; var queue = ''; var character; while (++index < length) { character = value.charAt(index); if (character === '\n') { if (index < MIN_BREAK_LENGTH) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } queue += character; return eat(queue)({type: 'break'}); } if (character !== ' ') { return; } queue += character; } } },{"../locate/break":4}],19:[function(require,module,exports){ 'use strict'; var trim = require('trim-trailing-lines'); module.exports = fencedCode; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var C_TILDE = '~'; var C_TICK = '`'; var MIN_FENCE_COUNT = 3; var CODE_INDENT_COUNT = 4; function fencedCode(eat, value, silent) { var self = this; var settings = self.options; var length = value.length + 1; var index = 0; var subvalue = ''; var fenceCount; var marker; var character; var flag; var queue; var content; var exdentedContent; var closing; var exdentedClosing; var indent; var now; if (!settings.gfm) { return; } /* Eat initial spacing. */ while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } subvalue += character; index++; } indent = index; /* Eat the fence. */ character = value.charAt(index); if (character !== C_TILDE && character !== C_TICK) { return; } index++; marker = character; fenceCount = 1; subvalue += character; while (index < length) { character = value.charAt(index); if (character !== marker) { break; } subvalue += character; fenceCount++; index++; } if (fenceCount < MIN_FENCE_COUNT) { return; } /* Eat spacing before flag. */ while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } subvalue += character; index++; } /* Eat flag. */ flag = ''; queue = ''; while (index < length) { character = value.charAt(index); if ( character === C_NEWLINE || character === C_TILDE || character === C_TICK ) { break; } if (character === C_SPACE || character === C_TAB) { queue += character; } else { flag += queue + character; queue = ''; } index++; } character = value.charAt(index); if (character && character !== C_NEWLINE) { return; } if (silent) { return true; } now = eat.now(); now.column += subvalue.length; now.offset += subvalue.length; subvalue += flag; flag = self.decode.raw(self.unescape(flag), now); if (queue) { subvalue += queue; } queue = ''; closing = ''; exdentedClosing = ''; content = ''; exdentedContent = ''; /* Eat content. */ while (index < length) { character = value.charAt(index); content += closing; exdentedContent += exdentedClosing; closing = ''; exdentedClosing = ''; if (character !== C_NEWLINE) { content += character; exdentedClosing += character; index++; continue; } /* Add the newline to `subvalue` if its the first * character. Otherwise, add it to the `closing` * queue. */ if (content) { closing += character; exdentedClosing += character; } else { subvalue += character; } queue = ''; index++; while (index < length) { character = value.charAt(index); if (character !== C_SPACE) { break; } queue += character; index++; } closing += queue; exdentedClosing += queue.slice(indent); if (queue.length >= CODE_INDENT_COUNT) { continue; } queue = ''; while (index < length) { character = value.charAt(index); if (character !== marker) { break; } queue += character; index++; } closing += queue; exdentedClosing += queue; if (queue.length < fenceCount) { continue; } queue = ''; while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } closing += character; exdentedClosing += character; index++; } if (!character || character === C_NEWLINE) { break; } } subvalue += content + closing; return eat(subvalue)({ type: 'code', lang: flag || null, value: trim(exdentedContent) }); } },{"trim-trailing-lines":62}],20:[function(require,module,exports){ 'use strict'; var repeat = require('repeat-string'); var trim = require('trim-trailing-lines'); module.exports = indentedCode; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var CODE_INDENT_COUNT = 4; var CODE_INDENT = repeat(C_SPACE, CODE_INDENT_COUNT); /* Tokenise indented code. */ function indentedCode(eat, value, silent) { var index = -1; var length = value.length; var subvalue = ''; var content = ''; var subvalueQueue = ''; var contentQueue = ''; var character; var blankQueue; var indent; while (++index < length) { character = value.charAt(index); if (indent) { indent = false; subvalue += subvalueQueue; content += contentQueue; subvalueQueue = ''; contentQueue = ''; if (character === C_NEWLINE) { subvalueQueue = character; contentQueue = character; } else { subvalue += character; content += character; while (++index < length) { character = value.charAt(index); if (!character || character === C_NEWLINE) { contentQueue = character; subvalueQueue = character; break; } subvalue += character; content += character; } } } else if ( character === C_SPACE && value.charAt(index + 1) === character && value.charAt(index + 2) === character && value.charAt(index + 3) === character ) { subvalueQueue += CODE_INDENT; index += 3; indent = true; } else if (character === C_TAB) { subvalueQueue += character; indent = true; } else { blankQueue = ''; while (character === C_TAB || character === C_SPACE) { blankQueue += character; character = value.charAt(++index); } if (character !== C_NEWLINE) { break; } subvalueQueue += blankQueue + character; contentQueue += character; } } if (content) { if (silent) { return true; } return eat(subvalue)({ type: 'code', lang: null, value: trim(content) }); } } },{"repeat-string":60,"trim-trailing-lines":62}],21:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); var locate = require('../locate/code-inline'); module.exports = inlineCode; inlineCode.locator = locate; var C_TICK = '`'; /* Tokenise inline code. */ function inlineCode(eat, value, silent) { var length = value.length; var index = 0; var queue = ''; var tickQueue = ''; var contentQueue; var subqueue; var count; var openingCount; var subvalue; var character; var found; var next; while (index < length) { if (value.charAt(index) !== C_TICK) { break; } queue += C_TICK; index++; } if (!queue) { return; } subvalue = queue; openingCount = index; queue = ''; next = value.charAt(index); count = 0; while (index < length) { character = next; next = value.charAt(index + 1); if (character === C_TICK) { count++; tickQueue += character; } else { count = 0; queue += character; } if (count && next !== C_TICK) { if (count === openingCount) { subvalue += queue + tickQueue; found = true; break; } queue += tickQueue; tickQueue = ''; } index++; } if (!found) { if (openingCount % 2 !== 0) { return; } queue = ''; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } contentQueue = ''; subqueue = ''; length = queue.length; index = -1; while (++index < length) { character = queue.charAt(index); if (whitespace(character)) { subqueue += character; continue; } if (subqueue) { if (contentQueue) { contentQueue += subqueue; } subqueue = ''; } contentQueue += character; } return eat(subvalue)({ type: 'inlineCode', value: contentQueue }); } },{"../locate/code-inline":5,"is-whitespace-character":51}],22:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); var normalize = require('../util/normalize'); module.exports = definition; definition.notInList = true; definition.notInBlock = true; var C_DOUBLE_QUOTE = '"'; var C_SINGLE_QUOTE = '\''; var C_BACKSLASH = '\\'; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var C_BRACKET_OPEN = '['; var C_BRACKET_CLOSE = ']'; var C_PAREN_OPEN = '('; var C_PAREN_CLOSE = ')'; var C_COLON = ':'; var C_LT = '<'; var C_GT = '>'; function definition(eat, value, silent) { var self = this; var commonmark = self.options.commonmark; var index = 0; var length = value.length; var subvalue = ''; var beforeURL; var beforeTitle; var queue; var character; var test; var identifier; var url; var title; while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } subvalue += character; index++; } character = value.charAt(index); if (character !== C_BRACKET_OPEN) { return; } index++; subvalue += character; queue = ''; while (index < length) { character = value.charAt(index); if (character === C_BRACKET_CLOSE) { break; } else if (character === C_BACKSLASH) { queue += character; index++; character = value.charAt(index); } queue += character; index++; } if ( !queue || value.charAt(index) !== C_BRACKET_CLOSE || value.charAt(index + 1) !== C_COLON ) { return; } identifier = queue; subvalue += queue + C_BRACKET_CLOSE + C_COLON; index = subvalue.length; queue = ''; while (index < length) { character = value.charAt(index); if ( character !== C_TAB && character !== C_SPACE && character !== C_NEWLINE ) { break; } subvalue += character; index++; } character = value.charAt(index); queue = ''; beforeURL = subvalue; if (character === C_LT) { index++; while (index < length) { character = value.charAt(index); if (!isEnclosedURLCharacter(character)) { break; } queue += character; index++; } character = value.charAt(index); if (character === isEnclosedURLCharacter.delimiter) { subvalue += C_LT + queue + character; index++; } else { if (commonmark) { return; } index -= queue.length + 1; queue = ''; } } if (!queue) { while (index < length) { character = value.charAt(index); if (!isUnclosedURLCharacter(character)) { break; } queue += character; index++; } subvalue += queue; } if (!queue) { return; } url = queue; queue = ''; while (index < length) { character = value.charAt(index); if ( character !== C_TAB && character !== C_SPACE && character !== C_NEWLINE ) { break; } queue += character; index++; } character = value.charAt(index); test = null; if (character === C_DOUBLE_QUOTE) { test = C_DOUBLE_QUOTE; } else if (character === C_SINGLE_QUOTE) { test = C_SINGLE_QUOTE; } else if (character === C_PAREN_OPEN) { test = C_PAREN_CLOSE; } if (!test) { queue = ''; index = subvalue.length; } else if (queue) { subvalue += queue + character; index = subvalue.length; queue = ''; while (index < length) { character = value.charAt(index); if (character === test) { break; } if (character === C_NEWLINE) { index++; character = value.charAt(index); if (character === C_NEWLINE || character === test) { return; } queue += C_NEWLINE; } queue += character; index++; } character = value.charAt(index); if (character !== test) { return; } beforeTitle = subvalue; subvalue += queue + character; index++; title = queue; queue = ''; } else { return; } while (index < length) { character = value.charAt(index); if (character !== C_TAB && character !== C_SPACE) { break; } subvalue += character; index++; } character = value.charAt(index); if (!character || character === C_NEWLINE) { if (silent) { return true; } beforeURL = eat(beforeURL).test().end; url = self.decode.raw(self.unescape(url), beforeURL); if (title) { beforeTitle = eat(beforeTitle).test().end; title = self.decode.raw(self.unescape(title), beforeTitle); } return eat(subvalue)({ type: 'definition', identifier: normalize(identifier), title: title || null, url: url }); } } /* Check if `character` can be inside an enclosed URI. */ function isEnclosedURLCharacter(character) { return character !== C_GT && character !== C_BRACKET_OPEN && character !== C_BRACKET_CLOSE; } isEnclosedURLCharacter.delimiter = C_GT; /* Check if `character` can be inside an unclosed URI. */ function isUnclosedURLCharacter(character) { return character !== C_BRACKET_OPEN && character !== C_BRACKET_CLOSE && !whitespace(character); } },{"../util/normalize":46,"is-whitespace-character":51}],23:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); var locate = require('../locate/delete'); module.exports = strikethrough; strikethrough.locator = locate; var C_TILDE = '~'; var DOUBLE = '~~'; function strikethrough(eat, value, silent) { var self = this; var character = ''; var previous = ''; var preceding = ''; var subvalue = ''; var index; var length; var now; if ( !self.options.gfm || value.charAt(0) !== C_TILDE || value.charAt(1) !== C_TILDE || whitespace(value.charAt(2)) ) { return; } index = 1; length = value.length; now = eat.now(); now.column += 2; now.offset += 2; while (++index < length) { character = value.charAt(index); if ( character === C_TILDE && previous === C_TILDE && (!preceding || !whitespace(preceding)) ) { /* istanbul ignore if - never used (yet) */ if (silent) { return true; } return eat(DOUBLE + subvalue + DOUBLE)({ type: 'delete', children: self.tokenizeInline(subvalue, now) }); } subvalue += previous; preceding = previous; previous = character; } } },{"../locate/delete":6,"is-whitespace-character":51}],24:[function(require,module,exports){ 'use strict'; var trim = require('trim'); var word = require('is-word-character'); var whitespace = require('is-whitespace-character'); var locate = require('../locate/emphasis'); module.exports = emphasis; emphasis.locator = locate; var C_ASTERISK = '*'; var C_UNDERSCORE = '_'; function emphasis(eat, value, silent) { var self = this; var index = 0; var character = value.charAt(index); var now; var pedantic; var marker; var queue; var subvalue; var length; var prev; if (character !== C_ASTERISK && character !== C_UNDERSCORE) { return; } pedantic = self.options.pedantic; subvalue = character; marker = character; length = value.length; index++; queue = ''; character = ''; if (pedantic && whitespace(value.charAt(index))) { return; } while (index < length) { prev = character; character = value.charAt(index); if (character === marker && (!pedantic || !whitespace(prev))) { character = value.charAt(++index); if (character !== marker) { if (!trim(queue) || prev === marker) { return; } if (!pedantic && marker === C_UNDERSCORE && word(character)) { queue += marker; continue; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } now = eat.now(); now.column++; now.offset++; return eat(subvalue + queue + marker)({ type: 'emphasis', children: self.tokenizeInline(queue, now) }); } queue += marker; } if (!pedantic && character === '\\') { queue += character; character = value.charAt(++index); } queue += character; index++; } } },{"../locate/emphasis":7,"is-whitespace-character":51,"is-word-character":52,"trim":63}],25:[function(require,module,exports){ 'use strict'; var locate = require('../locate/escape'); module.exports = escape; escape.locator = locate; function escape(eat, value, silent) { var self = this; var character; var node; if (value.charAt(0) === '\\') { character = value.charAt(1); if (self.escape.indexOf(character) !== -1) { /* istanbul ignore if - never used (yet) */ if (silent) { return true; } if (character === '\n') { node = {type: 'break'}; } else { node = { type: 'text', value: character }; } return eat('\\' + character)(node); } } } },{"../locate/escape":8}],26:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); var normalize = require('../util/normalize'); module.exports = footnoteDefinition; footnoteDefinition.notInList = true; footnoteDefinition.notInBlock = true; var C_BACKSLASH = '\\'; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var C_BRACKET_OPEN = '['; var C_BRACKET_CLOSE = ']'; var C_CARET = '^'; var C_COLON = ':'; var EXPRESSION_INITIAL_TAB = /^( {4}|\t)?/gm; function footnoteDefinition(eat, value, silent) { var self = this; var offsets = self.offset; var index; var length; var subvalue; var now; var currentLine; var content; var queue; var subqueue; var character; var identifier; var add; var exit; if (!self.options.footnotes) { return; } index = 0; length = value.length; subvalue = ''; now = eat.now(); currentLine = now.line; while (index < length) { character = value.charAt(index); if (!whitespace(character)) { break; } subvalue += character; index++; } if ( value.charAt(index) !== C_BRACKET_OPEN || value.charAt(index + 1) !== C_CARET ) { return; } subvalue += C_BRACKET_OPEN + C_CARET; index = subvalue.length; queue = ''; while (index < length) { character = value.charAt(index); if (character === C_BRACKET_CLOSE) { break; } else if (character === C_BACKSLASH) { queue += character; index++; character = value.charAt(index); } queue += character; index++; } if ( !queue || value.charAt(index) !== C_BRACKET_CLOSE || value.charAt(index + 1) !== C_COLON ) { return; } if (silent) { return true; } identifier = normalize(queue); subvalue += queue + C_BRACKET_CLOSE + C_COLON; index = subvalue.length; while (index < length) { character = value.charAt(index); if (character !== C_TAB && character !== C_SPACE) { break; } subvalue += character; index++; } now.column += subvalue.length; now.offset += subvalue.length; queue = ''; content = ''; subqueue = ''; while (index < length) { character = value.charAt(index); if (character === C_NEWLINE) { subqueue = character; index++; while (index < length) { character = value.charAt(index); if (character !== C_NEWLINE) { break; } subqueue += character; index++; } queue += subqueue; subqueue = ''; while (index < length) { character = value.charAt(index); if (character !== C_SPACE) { break; } subqueue += character; index++; } if (subqueue.length === 0) { break; } queue += subqueue; } if (queue) { content += queue; queue = ''; } content += character; index++; } subvalue += content; content = content.replace(EXPRESSION_INITIAL_TAB, function (line) { offsets[currentLine] = (offsets[currentLine] || 0) + line.length; currentLine++; return ''; }); add = eat(subvalue); exit = self.enterBlock(); content = self.tokenizeBlock(content, now); exit(); return add({ type: 'footnoteDefinition', identifier: identifier, children: content }); } },{"../util/normalize":46,"is-whitespace-character":51}],27:[function(require,module,exports){ 'use strict'; module.exports = atxHeading; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var C_HASH = '#'; var MAX_ATX_COUNT = 6; function atxHeading(eat, value, silent) { var self = this; var settings = self.options; var length = value.length + 1; var index = -1; var now = eat.now(); var subvalue = ''; var content = ''; var character; var queue; var depth; /* Eat initial spacing. */ while (++index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { index--; break; } subvalue += character; } /* Eat hashes. */ depth = 0; while (++index <= length) { character = value.charAt(index); if (character !== C_HASH) { index--; break; } subvalue += character; depth++; } if (depth > MAX_ATX_COUNT) { return; } if ( !depth || (!settings.pedantic && value.charAt(index + 1) === C_HASH) ) { return; } length = value.length + 1; /* Eat intermediate white-space. */ queue = ''; while (++index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { index--; break; } queue += character; } /* Exit when not in pedantic mode without spacing. */ if ( !settings.pedantic && queue.length === 0 && character && character !== C_NEWLINE ) { return; } if (silent) { return true; } /* Eat content. */ subvalue += queue; queue = ''; content = ''; while (++index < length) { character = value.charAt(index); if (!character || character === C_NEWLINE) { break; } if ( character !== C_SPACE && character !== C_TAB && character !== C_HASH ) { content += queue + character; queue = ''; continue; } while (character === C_SPACE || character === C_TAB) { queue += character; character = value.charAt(++index); } while (character === C_HASH) { queue += character; character = value.charAt(++index); } while (character === C_SPACE || character === C_TAB) { queue += character; character = value.charAt(++index); } index--; } now.column += subvalue.length; now.offset += subvalue.length; subvalue += content + queue; return eat(subvalue)({ type: 'heading', depth: depth, children: self.tokenizeInline(content, now) }); } },{}],28:[function(require,module,exports){ 'use strict'; module.exports = setextHeading; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var C_EQUALS = '='; var C_DASH = '-'; var MAX_HEADING_INDENT = 3; /* Map of characters which can be used to mark setext * headers, mapping to their corresponding depth. */ var SETEXT_MARKERS = {}; SETEXT_MARKERS[C_EQUALS] = 1; SETEXT_MARKERS[C_DASH] = 2; function setextHeading(eat, value, silent) { var self = this; var now = eat.now(); var length = value.length; var index = -1; var subvalue = ''; var content; var queue; var character; var marker; var depth; /* Eat initial indentation. */ while (++index < length) { character = value.charAt(index); if (character !== C_SPACE || index >= MAX_HEADING_INDENT) { index--; break; } subvalue += character; } /* Eat content. */ content = ''; queue = ''; while (++index < length) { character = value.charAt(index); if (character === C_NEWLINE) { index--; break; } if (character === C_SPACE || character === C_TAB) { queue += character; } else { content += queue + character; queue = ''; } } now.column += subvalue.length; now.offset += subvalue.length; subvalue += content + queue; /* Ensure the content is followed by a newline and a * valid marker. */ character = value.charAt(++index); marker = value.charAt(++index); if (character !== C_NEWLINE || !SETEXT_MARKERS[marker]) { return; } subvalue += character; /* Eat Setext-line. */ queue = marker; depth = SETEXT_MARKERS[marker]; while (++index < length) { character = value.charAt(index); if (character !== marker) { if (character !== C_NEWLINE) { return; } index--; break; } queue += character; } if (silent) { return true; } return eat(subvalue + queue)({ type: 'heading', depth: depth, children: self.tokenizeInline(content, now) }); } },{}],29:[function(require,module,exports){ 'use strict'; var openCloseTag = require('../util/html').openCloseTag; module.exports = blockHTML; var C_TAB = '\t'; var C_SPACE = ' '; var C_NEWLINE = '\n'; var C_LT = '<'; function blockHTML(eat, value, silent) { var self = this; var blocks = self.options.blocks; var length = value.length; var index = 0; var next; var line; var offset; var character; var count; var sequence; var subvalue; var sequences = [ [/^<(script|pre|style)(?=(\s|>|$))/i, /<\/(script|pre|style)>/i, true], [/^/, true], [/^<\?/, /\?>/, true], [/^/, true], [/^/, true], [new RegExp('^|$))', 'i'), /^$/, true], [new RegExp(openCloseTag.source + '\\s*$'), /^$/, false] ]; /* Eat initial spacing. */ while (index < length) { character = value.charAt(index); if (character !== C_TAB && character !== C_SPACE) { break; } index++; } if (value.charAt(index) !== C_LT) { return; } next = value.indexOf(C_NEWLINE, index + 1); next = next === -1 ? length : next; line = value.slice(index, next); offset = -1; count = sequences.length; while (++offset < count) { if (sequences[offset][0].test(line)) { sequence = sequences[offset]; break; } } if (!sequence) { return; } if (silent) { return sequence[2]; } index = next; if (!sequence[1].test(line)) { while (index < length) { next = value.indexOf(C_NEWLINE, index + 1); next = next === -1 ? length : next; line = value.slice(index + 1, next); if (sequence[1].test(line)) { if (line) { index = next; } break; } index = next; } } subvalue = value.slice(0, index); return eat(subvalue)({type: 'html', value: subvalue}); } },{"../util/html":44}],30:[function(require,module,exports){ 'use strict'; var alphabetical = require('is-alphabetical'); var locate = require('../locate/tag'); var tag = require('../util/html').tag; module.exports = inlineHTML; inlineHTML.locator = locate; var EXPRESSION_HTML_LINK_OPEN = /^/i; function inlineHTML(eat, value, silent) { var self = this; var length = value.length; var character; var subvalue; if (value.charAt(0) !== '<' || length < 3) { return; } character = value.charAt(1); if ( !alphabetical(character) && character !== '?' && character !== '!' && character !== '/' ) { return; } subvalue = value.match(tag); if (!subvalue) { return; } /* istanbul ignore if - not used yet. */ if (silent) { return true; } subvalue = subvalue[0]; if (!self.inLink && EXPRESSION_HTML_LINK_OPEN.test(subvalue)) { self.inLink = true; } else if (self.inLink && EXPRESSION_HTML_LINK_CLOSE.test(subvalue)) { self.inLink = false; } return eat(subvalue)({type: 'html', value: subvalue}); } },{"../locate/tag":11,"../util/html":44,"is-alphabetical":49}],31:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); var locate = require('../locate/link'); module.exports = link; link.locator = locate; var own = {}.hasOwnProperty; var C_BACKSLASH = '\\'; var C_BRACKET_OPEN = '['; var C_BRACKET_CLOSE = ']'; var C_PAREN_OPEN = '('; var C_PAREN_CLOSE = ')'; var C_LT = '<'; var C_GT = '>'; var C_TICK = '`'; var C_DOUBLE_QUOTE = '"'; var C_SINGLE_QUOTE = '\''; /* Map of characters, which can be used to mark link * and image titles. */ var LINK_MARKERS = {}; LINK_MARKERS[C_DOUBLE_QUOTE] = C_DOUBLE_QUOTE; LINK_MARKERS[C_SINGLE_QUOTE] = C_SINGLE_QUOTE; /* Map of characters, which can be used to mark link * and image titles in commonmark-mode. */ var COMMONMARK_LINK_MARKERS = {}; COMMONMARK_LINK_MARKERS[C_DOUBLE_QUOTE] = C_DOUBLE_QUOTE; COMMONMARK_LINK_MARKERS[C_SINGLE_QUOTE] = C_SINGLE_QUOTE; COMMONMARK_LINK_MARKERS[C_PAREN_OPEN] = C_PAREN_CLOSE; function link(eat, value, silent) { var self = this; var subvalue = ''; var index = 0; var character = value.charAt(0); var pedantic = self.options.pedantic; var commonmark = self.options.commonmark; var gfm = self.options.gfm; var closed; var count; var opening; var beforeURL; var beforeTitle; var subqueue; var hasMarker; var markers; var isImage; var content; var marker; var length; var title; var depth; var queue; var url; var now; var exit; var node; /* Detect whether this is an image. */ if (character === '!') { isImage = true; subvalue = character; character = value.charAt(++index); } /* Eat the opening. */ if (character !== C_BRACKET_OPEN) { return; } /* Exit when this is a link and we’re already inside * a link. */ if (!isImage && self.inLink) { return; } subvalue += character; queue = ''; index++; /* Eat the content. */ length = value.length; now = eat.now(); depth = 0; now.column += index; now.offset += index; while (index < length) { character = value.charAt(index); subqueue = character; if (character === C_TICK) { /* Inline-code in link content. */ count = 1; while (value.charAt(index + 1) === C_TICK) { subqueue += character; index++; count++; } if (!opening) { opening = count; } else if (count >= opening) { opening = 0; } } else if (character === C_BACKSLASH) { /* Allow brackets to be escaped. */ index++; subqueue += value.charAt(index); /* In GFM mode, brackets in code still count. * In all other modes, they don’t. This empty * block prevents the next statements are * entered. */ } else if ((!opening || gfm) && character === C_BRACKET_OPEN) { depth++; } else if ((!opening || gfm) && character === C_BRACKET_CLOSE) { if (depth) { depth--; } else { /* Allow white-space between content and * url in GFM mode. */ if (!pedantic) { while (index < length) { character = value.charAt(index + 1); if (!whitespace(character)) { break; } subqueue += character; index++; } } if (value.charAt(index + 1) !== C_PAREN_OPEN) { return; } subqueue += C_PAREN_OPEN; closed = true; index++; break; } } queue += subqueue; subqueue = ''; index++; } /* Eat the content closing. */ if (!closed) { return; } content = queue; subvalue += queue + subqueue; index++; /* Eat white-space. */ while (index < length) { character = value.charAt(index); if (!whitespace(character)) { break; } subvalue += character; index++; } /* Eat the URL. */ character = value.charAt(index); markers = commonmark ? COMMONMARK_LINK_MARKERS : LINK_MARKERS; queue = ''; beforeURL = subvalue; if (character === C_LT) { index++; beforeURL += C_LT; while (index < length) { character = value.charAt(index); if (character === C_GT) { break; } if (commonmark && character === '\n') { return; } queue += character; index++; } if (value.charAt(index) !== C_GT) { return; } subvalue += C_LT + queue + C_GT; url = queue; index++; } else { character = null; subqueue = ''; while (index < length) { character = value.charAt(index); if (subqueue && own.call(markers, character)) { break; } if (whitespace(character)) { if (!pedantic) { break; } subqueue += character; } else { if (character === C_PAREN_OPEN) { depth++; } else if (character === C_PAREN_CLOSE) { if (depth === 0) { break; } depth--; } queue += subqueue; subqueue = ''; if (character === C_BACKSLASH) { queue += C_BACKSLASH; character = value.charAt(++index); } queue += character; } index++; } subvalue += queue; url = queue; index = subvalue.length; } /* Eat white-space. */ queue = ''; while (index < length) { character = value.charAt(index); if (!whitespace(character)) { break; } queue += character; index++; } character = value.charAt(index); subvalue += queue; /* Eat the title. */ if (queue && own.call(markers, character)) { index++; subvalue += character; queue = ''; marker = markers[character]; beforeTitle = subvalue; /* In commonmark-mode, things are pretty easy: the * marker cannot occur inside the title. * * Non-commonmark does, however, support nested * delimiters. */ if (commonmark) { while (index < length) { character = value.charAt(index); if (character === marker) { break; } if (character === C_BACKSLASH) { queue += C_BACKSLASH; character = value.charAt(++index); } index++; queue += character; } character = value.charAt(index); if (character !== marker) { return; } title = queue; subvalue += queue + character; index++; while (index < length) { character = value.charAt(index); if (!whitespace(character)) { break; } subvalue += character; index++; } } else { subqueue = ''; while (index < length) { character = value.charAt(index); if (character === marker) { if (hasMarker) { queue += marker + subqueue; subqueue = ''; } hasMarker = true; } else if (!hasMarker) { queue += character; } else if (character === C_PAREN_CLOSE) { subvalue += queue + marker + subqueue; title = queue; break; } else if (whitespace(character)) { subqueue += character; } else { queue += marker + subqueue + character; subqueue = ''; hasMarker = false; } index++; } } } if (value.charAt(index) !== C_PAREN_CLOSE) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } subvalue += C_PAREN_CLOSE; url = self.decode.raw(self.unescape(url), eat(beforeURL).test().end); if (title) { beforeTitle = eat(beforeTitle).test().end; title = self.decode.raw(self.unescape(title), beforeTitle); } node = { type: isImage ? 'image' : 'link', title: title || null, url: url }; if (isImage) { node.alt = self.decode.raw(self.unescape(content), now) || null; } else { exit = self.enterLink(); node.children = self.tokenizeInline(content, now); exit(); } return eat(subvalue)(node); } },{"../locate/link":9,"is-whitespace-character":51}],32:[function(require,module,exports){ 'use strict'; /* eslint-disable max-params */ var trim = require('trim'); var repeat = require('repeat-string'); var decimal = require('is-decimal'); var getIndent = require('../util/get-indentation'); var removeIndent = require('../util/remove-indentation'); var interrupt = require('../util/interrupt'); module.exports = list; var C_ASTERISK = '*'; var C_UNDERSCORE = '_'; var C_PLUS = '+'; var C_DASH = '-'; var C_DOT = '.'; var C_SPACE = ' '; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_PAREN_CLOSE = ')'; var C_X_LOWER = 'x'; var TAB_SIZE = 4; var EXPRESSION_LOOSE_LIST_ITEM = /\n\n(?!\s*$)/; var EXPRESSION_TASK_ITEM = /^\[([ \t]|x|X)][ \t]/; var EXPRESSION_BULLET = /^([ \t]*)([*+-]|\d+[.)])( {1,4}(?! )| |\t|$|(?=\n))([^\n]*)/; var EXPRESSION_PEDANTIC_BULLET = /^([ \t]*)([*+-]|\d+[.)])([ \t]+)/; var EXPRESSION_INITIAL_INDENT = /^( {1,4}|\t)?/gm; /* Map of characters which can be used to mark * list-items. */ var LIST_UNORDERED_MARKERS = {}; LIST_UNORDERED_MARKERS[C_ASTERISK] = true; LIST_UNORDERED_MARKERS[C_PLUS] = true; LIST_UNORDERED_MARKERS[C_DASH] = true; /* Map of characters which can be used to mark * list-items after a digit. */ var LIST_ORDERED_MARKERS = {}; LIST_ORDERED_MARKERS[C_DOT] = true; /* Map of characters which can be used to mark * list-items after a digit. */ var LIST_ORDERED_COMMONMARK_MARKERS = {}; LIST_ORDERED_COMMONMARK_MARKERS[C_DOT] = true; LIST_ORDERED_COMMONMARK_MARKERS[C_PAREN_CLOSE] = true; function list(eat, value, silent) { var self = this; var commonmark = self.options.commonmark; var pedantic = self.options.pedantic; var tokenizers = self.blockTokenizers; var interuptors = self.interruptList; var markers; var index = 0; var length = value.length; var start = null; var size = 0; var queue; var ordered; var character; var marker; var nextIndex; var startIndex; var prefixed; var currentMarker; var content; var line; var prevEmpty; var empty; var items; var allLines; var emptyLines; var item; var enterTop; var exitBlockquote; var isLoose; var node; var now; var end; var indented; while (index < length) { character = value.charAt(index); if (character === C_TAB) { size += TAB_SIZE - (size % TAB_SIZE); } else if (character === C_SPACE) { size++; } else { break; } index++; } if (size >= TAB_SIZE) { return; } character = value.charAt(index); markers = commonmark ? LIST_ORDERED_COMMONMARK_MARKERS : LIST_ORDERED_MARKERS; if (LIST_UNORDERED_MARKERS[character] === true) { marker = character; ordered = false; } else { ordered = true; queue = ''; while (index < length) { character = value.charAt(index); if (!decimal(character)) { break; } queue += character; index++; } character = value.charAt(index); if (!queue || markers[character] !== true) { return; } start = parseInt(queue, 10); marker = character; } character = value.charAt(++index); if (character !== C_SPACE && character !== C_TAB) { return; } if (silent) { return true; } index = 0; items = []; allLines = []; emptyLines = []; while (index < length) { nextIndex = value.indexOf(C_NEWLINE, index); startIndex = index; prefixed = false; indented = false; if (nextIndex === -1) { nextIndex = length; } end = index + TAB_SIZE; size = 0; while (index < length) { character = value.charAt(index); if (character === C_TAB) { size += TAB_SIZE - (size % TAB_SIZE); } else if (character === C_SPACE) { size++; } else { break; } index++; } if (size >= TAB_SIZE) { indented = true; } if (item && size >= item.indent) { indented = true; } character = value.charAt(index); currentMarker = null; if (!indented) { if (LIST_UNORDERED_MARKERS[character] === true) { currentMarker = character; index++; size++; } else { queue = ''; while (index < length) { character = value.charAt(index); if (!decimal(character)) { break; } queue += character; index++; } character = value.charAt(index); index++; if (queue && markers[character] === true) { currentMarker = character; size += queue.length + 1; } } if (currentMarker) { character = value.charAt(index); if (character === C_TAB) { size += TAB_SIZE - (size % TAB_SIZE); index++; } else if (character === C_SPACE) { end = index + TAB_SIZE; while (index < end) { if (value.charAt(index) !== C_SPACE) { break; } index++; size++; } if (index === end && value.charAt(index) === C_SPACE) { index -= TAB_SIZE - 1; size -= TAB_SIZE - 1; } } else if (character !== C_NEWLINE && character !== '') { currentMarker = null; } } } if (currentMarker) { if (!pedantic && marker !== currentMarker) { break; } prefixed = true; } else { if (!commonmark && !indented && value.charAt(startIndex) === C_SPACE) { indented = true; } else if (commonmark && item) { indented = size >= item.indent || size > TAB_SIZE; } prefixed = false; index = startIndex; } line = value.slice(startIndex, nextIndex); content = startIndex === index ? line : value.slice(index, nextIndex); if ( currentMarker === C_ASTERISK || currentMarker === C_UNDERSCORE || currentMarker === C_DASH ) { if (tokenizers.thematicBreak.call(self, eat, line, true)) { break; } } prevEmpty = empty; empty = !trim(content).length; if (indented && item) { item.value = item.value.concat(emptyLines, line); allLines = allLines.concat(emptyLines, line); emptyLines = []; } else if (prefixed) { if (emptyLines.length !== 0) { item.value.push(''); item.trail = emptyLines.concat(); } item = { value: [line], indent: size, trail: [] }; items.push(item); allLines = allLines.concat(emptyLines, line); emptyLines = []; } else if (empty) { if (prevEmpty) { break; } emptyLines.push(line); } else { if (prevEmpty) { break; } if (interrupt(interuptors, tokenizers, self, [eat, line, true])) { break; } item.value = item.value.concat(emptyLines, line); allLines = allLines.concat(emptyLines, line); emptyLines = []; } index = nextIndex + 1; } node = eat(allLines.join(C_NEWLINE)).reset({ type: 'list', ordered: ordered, start: start, loose: null, children: [] }); enterTop = self.enterList(); exitBlockquote = self.enterBlock(); isLoose = false; index = -1; length = items.length; while (++index < length) { item = items[index].value.join(C_NEWLINE); now = eat.now(); item = eat(item)(listItem(self, item, now), node); if (item.loose) { isLoose = true; } item = items[index].trail.join(C_NEWLINE); if (index !== length - 1) { item += C_NEWLINE; } eat(item); } enterTop(); exitBlockquote(); node.loose = isLoose; return node; } function listItem(ctx, value, position) { var offsets = ctx.offset; var fn = ctx.options.pedantic ? pedanticListItem : normalListItem; var checked = null; var task; var indent; value = fn.apply(null, arguments); if (ctx.options.gfm) { task = value.match(EXPRESSION_TASK_ITEM); if (task) { indent = task[0].length; checked = task[1].toLowerCase() === C_X_LOWER; offsets[position.line] += indent; value = value.slice(indent); } } return { type: 'listItem', loose: EXPRESSION_LOOSE_LIST_ITEM.test(value) || value.charAt(value.length - 1) === C_NEWLINE, checked: checked, children: ctx.tokenizeBlock(value, position) }; } /* Create a list-item using overly simple mechanics. */ function pedanticListItem(ctx, value, position) { var offsets = ctx.offset; var line = position.line; /* Remove the list-item’s bullet. */ value = value.replace(EXPRESSION_PEDANTIC_BULLET, replacer); /* The initial line was also matched by the below, so * we reset the `line`. */ line = position.line; return value.replace(EXPRESSION_INITIAL_INDENT, replacer); /* A simple replacer which removed all matches, * and adds their length to `offset`. */ function replacer($0) { offsets[line] = (offsets[line] || 0) + $0.length; line++; return ''; } } /* Create a list-item using sane mechanics. */ function normalListItem(ctx, value, position) { var offsets = ctx.offset; var line = position.line; var max; var bullet; var rest; var lines; var trimmedLines; var index; var length; /* Remove the list-item’s bullet. */ value = value.replace(EXPRESSION_BULLET, replacer); lines = value.split(C_NEWLINE); trimmedLines = removeIndent(value, getIndent(max).indent).split(C_NEWLINE); /* We replaced the initial bullet with something * else above, which was used to trick * `removeIndentation` into removing some more * characters when possible. However, that could * result in the initial line to be stripped more * than it should be. */ trimmedLines[0] = rest; offsets[line] = (offsets[line] || 0) + bullet.length; line++; index = 0; length = lines.length; while (++index < length) { offsets[line] = (offsets[line] || 0) + lines[index].length - trimmedLines[index].length; line++; } return trimmedLines.join(C_NEWLINE); function replacer($0, $1, $2, $3, $4) { bullet = $1 + $2 + $3; rest = $4; /* Make sure that the first nine numbered list items * can indent with an extra space. That is, when * the bullet did not receive an extra final space. */ if (Number($2) < 10 && bullet.length % 2 === 1) { $2 = C_SPACE + $2; } max = $1 + repeat(C_SPACE, $2.length) + $3; return max + rest; } } },{"../util/get-indentation":43,"../util/interrupt":45,"../util/remove-indentation":47,"is-decimal":50,"repeat-string":60,"trim":63}],33:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); module.exports = newline; /* Tokenise newline. */ function newline(eat, value, silent) { var character = value.charAt(0); var length; var subvalue; var queue; var index; if (character !== '\n') { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } index = 1; length = value.length; subvalue = character; queue = ''; while (index < length) { character = value.charAt(index); if (!whitespace(character)) { break; } queue += character; if (character === '\n') { subvalue += queue; queue = ''; } index++; } eat(subvalue); } },{"is-whitespace-character":51}],34:[function(require,module,exports){ 'use strict'; var trim = require('trim'); var decimal = require('is-decimal'); var trimTrailingLines = require('trim-trailing-lines'); var interrupt = require('../util/interrupt'); module.exports = paragraph; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var TAB_SIZE = 4; /* Tokenise paragraph. */ function paragraph(eat, value, silent) { var self = this; var settings = self.options; var commonmark = settings.commonmark; var gfm = settings.gfm; var tokenizers = self.blockTokenizers; var interruptors = self.interruptParagraph; var index = value.indexOf(C_NEWLINE); var length = value.length; var position; var subvalue; var character; var size; var now; while (index < length) { /* Eat everything if there’s no following newline. */ if (index === -1) { index = length; break; } /* Stop if the next character is NEWLINE. */ if (value.charAt(index + 1) === C_NEWLINE) { break; } /* In commonmark-mode, following indented lines * are part of the paragraph. */ if (commonmark) { size = 0; position = index + 1; while (position < length) { character = value.charAt(position); if (character === C_TAB) { size = TAB_SIZE; break; } else if (character === C_SPACE) { size++; } else { break; } position++; } if (size >= TAB_SIZE) { index = value.indexOf(C_NEWLINE, index + 1); continue; } } subvalue = value.slice(index + 1); /* Check if the following code contains a possible * block. */ if (interrupt(interruptors, tokenizers, self, [eat, subvalue, true])) { break; } /* Break if the following line starts a list, when * already in a list, or when in commonmark, or when * in gfm mode and the bullet is *not* numeric. */ if ( tokenizers.list.call(self, eat, subvalue, true) && ( self.inList || commonmark || (gfm && !decimal(trim.left(subvalue).charAt(0))) ) ) { break; } position = index; index = value.indexOf(C_NEWLINE, index + 1); if (index !== -1 && trim(value.slice(position, index)) === '') { index = position; break; } } subvalue = value.slice(0, index); if (trim(subvalue) === '') { eat(subvalue); return null; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } now = eat.now(); subvalue = trimTrailingLines(subvalue); return eat(subvalue)({ type: 'paragraph', children: self.tokenizeInline(subvalue, now) }); } },{"../util/interrupt":45,"is-decimal":50,"trim":63,"trim-trailing-lines":62}],35:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); var locate = require('../locate/link'); var normalize = require('../util/normalize'); module.exports = reference; reference.locator = locate; var T_LINK = 'link'; var T_IMAGE = 'image'; var T_FOOTNOTE = 'footnote'; var REFERENCE_TYPE_SHORTCUT = 'shortcut'; var REFERENCE_TYPE_COLLAPSED = 'collapsed'; var REFERENCE_TYPE_FULL = 'full'; var C_CARET = '^'; var C_BACKSLASH = '\\'; var C_BRACKET_OPEN = '['; var C_BRACKET_CLOSE = ']'; function reference(eat, value, silent) { var self = this; var character = value.charAt(0); var index = 0; var length = value.length; var subvalue = ''; var intro = ''; var type = T_LINK; var referenceType = REFERENCE_TYPE_SHORTCUT; var content; var identifier; var now; var node; var exit; var queue; var bracketed; var depth; /* Check whether we’re eating an image. */ if (character === '!') { type = T_IMAGE; intro = character; character = value.charAt(++index); } if (character !== C_BRACKET_OPEN) { return; } index++; intro += character; queue = ''; /* Check whether we’re eating a footnote. */ if ( self.options.footnotes && type === T_LINK && value.charAt(index) === C_CARET ) { intro += C_CARET; index++; type = T_FOOTNOTE; } /* Eat the text. */ depth = 0; while (index < length) { character = value.charAt(index); if (character === C_BRACKET_OPEN) { bracketed = true; depth++; } else if (character === C_BRACKET_CLOSE) { if (!depth) { break; } depth--; } if (character === C_BACKSLASH) { queue += C_BACKSLASH; character = value.charAt(++index); } queue += character; index++; } subvalue = queue; content = queue; character = value.charAt(index); if (character !== C_BRACKET_CLOSE) { return; } index++; subvalue += character; queue = ''; while (index < length) { character = value.charAt(index); if (!whitespace(character)) { break; } queue += character; index++; } character = value.charAt(index); /* Inline footnotes cannot have an identifier. */ if (type !== T_FOOTNOTE && character === C_BRACKET_OPEN) { identifier = ''; queue += character; index++; while (index < length) { character = value.charAt(index); if (character === C_BRACKET_OPEN || character === C_BRACKET_CLOSE) { break; } if (character === C_BACKSLASH) { identifier += C_BACKSLASH; character = value.charAt(++index); } identifier += character; index++; } character = value.charAt(index); if (character === C_BRACKET_CLOSE) { referenceType = identifier ? REFERENCE_TYPE_FULL : REFERENCE_TYPE_COLLAPSED; queue += identifier + character; index++; } else { identifier = ''; } subvalue += queue; queue = ''; } else { if (!content) { return; } identifier = content; } /* Brackets cannot be inside the identifier. */ if (referenceType !== REFERENCE_TYPE_FULL && bracketed) { return; } subvalue = intro + subvalue; if (type === T_LINK && self.inLink) { return null; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } if (type === T_FOOTNOTE && content.indexOf(' ') !== -1) { return eat(subvalue)({ type: 'footnote', children: this.tokenizeInline(content, eat.now()) }); } now = eat.now(); now.column += intro.length; now.offset += intro.length; identifier = referenceType === REFERENCE_TYPE_FULL ? identifier : content; node = { type: type + 'Reference', identifier: normalize(identifier) }; if (type === T_LINK || type === T_IMAGE) { node.referenceType = referenceType; } if (type === T_LINK) { exit = self.enterLink(); node.children = self.tokenizeInline(content, now); exit(); } else if (type === T_IMAGE) { node.alt = self.decode.raw(self.unescape(content), now) || null; } return eat(subvalue)(node); } },{"../locate/link":9,"../util/normalize":46,"is-whitespace-character":51}],36:[function(require,module,exports){ 'use strict'; var trim = require('trim'); var whitespace = require('is-whitespace-character'); var locate = require('../locate/strong'); module.exports = strong; strong.locator = locate; var C_ASTERISK = '*'; var C_UNDERSCORE = '_'; function strong(eat, value, silent) { var self = this; var index = 0; var character = value.charAt(index); var now; var pedantic; var marker; var queue; var subvalue; var length; var prev; if ( (character !== C_ASTERISK && character !== C_UNDERSCORE) || value.charAt(++index) !== character ) { return; } pedantic = self.options.pedantic; marker = character; subvalue = marker + marker; length = value.length; index++; queue = ''; character = ''; if (pedantic && whitespace(value.charAt(index))) { return; } while (index < length) { prev = character; character = value.charAt(index); if ( character === marker && value.charAt(index + 1) === marker && (!pedantic || !whitespace(prev)) ) { character = value.charAt(index + 2); if (character !== marker) { if (!trim(queue)) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } now = eat.now(); now.column += 2; now.offset += 2; return eat(subvalue + queue + subvalue)({ type: 'strong', children: self.tokenizeInline(queue, now) }); } } if (!pedantic && character === '\\') { queue += character; character = value.charAt(++index); } queue += character; index++; } } },{"../locate/strong":10,"is-whitespace-character":51,"trim":63}],37:[function(require,module,exports){ 'use strict'; var whitespace = require('is-whitespace-character'); module.exports = table; var C_BACKSLASH = '\\'; var C_TICK = '`'; var C_DASH = '-'; var C_PIPE = '|'; var C_COLON = ':'; var C_SPACE = ' '; var C_NEWLINE = '\n'; var C_TAB = '\t'; var MIN_TABLE_COLUMNS = 1; var MIN_TABLE_ROWS = 2; var TABLE_ALIGN_LEFT = 'left'; var TABLE_ALIGN_CENTER = 'center'; var TABLE_ALIGN_RIGHT = 'right'; var TABLE_ALIGN_NONE = null; function table(eat, value, silent) { var self = this; var index; var alignments; var alignment; var subvalue; var row; var length; var lines; var queue; var character; var hasDash; var align; var cell; var preamble; var count; var opening; var now; var position; var lineCount; var line; var rows; var table; var lineIndex; var pipeIndex; var first; /* Exit when not in gfm-mode. */ if (!self.options.gfm) { return; } /* Get the rows. * Detecting tables soon is hard, so there are some * checks for performance here, such as the minimum * number of rows, and allowed characters in the * alignment row. */ index = 0; lineCount = 0; length = value.length + 1; lines = []; while (index < length) { lineIndex = value.indexOf(C_NEWLINE, index); pipeIndex = value.indexOf(C_PIPE, index + 1); if (lineIndex === -1) { lineIndex = value.length; } if (pipeIndex === -1 || pipeIndex > lineIndex) { if (lineCount < MIN_TABLE_ROWS) { return; } break; } lines.push(value.slice(index, lineIndex)); lineCount++; index = lineIndex + 1; } /* Parse the alignment row. */ subvalue = lines.join(C_NEWLINE); alignments = lines.splice(1, 1)[0] || []; index = 0; length = alignments.length; lineCount--; alignment = false; align = []; while (index < length) { character = alignments.charAt(index); if (character === C_PIPE) { hasDash = null; if (alignment === false) { if (first === false) { return; } } else { align.push(alignment); alignment = false; } first = false; } else if (character === C_DASH) { hasDash = true; alignment = alignment || TABLE_ALIGN_NONE; } else if (character === C_COLON) { if (alignment === TABLE_ALIGN_LEFT) { alignment = TABLE_ALIGN_CENTER; } else if (hasDash && alignment === TABLE_ALIGN_NONE) { alignment = TABLE_ALIGN_RIGHT; } else { alignment = TABLE_ALIGN_LEFT; } } else if (!whitespace(character)) { return; } index++; } if (alignment !== false) { align.push(alignment); } /* Exit when without enough columns. */ if (align.length < MIN_TABLE_COLUMNS) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } /* Parse the rows. */ position = -1; rows = []; table = eat(subvalue).reset({ type: 'table', align: align, children: rows }); while (++position < lineCount) { line = lines[position]; row = {type: 'tableRow', children: []}; /* Eat a newline character when this is not the * first row. */ if (position) { eat(C_NEWLINE); } /* Eat the row. */ eat(line).reset(row, table); length = line.length + 1; index = 0; queue = ''; cell = ''; preamble = true; count = null; opening = null; while (index < length) { character = line.charAt(index); if (character === C_TAB || character === C_SPACE) { if (cell) { queue += character; } else { eat(character); } index++; continue; } if (character === '' || character === C_PIPE) { if (preamble) { eat(character); } else { if (character && opening) { queue += character; index++; continue; } if ((cell || character) && !preamble) { subvalue = cell; if (queue.length > 1) { if (character) { subvalue += queue.slice(0, queue.length - 1); queue = queue.charAt(queue.length - 1); } else { subvalue += queue; queue = ''; } } now = eat.now(); eat(subvalue)({ type: 'tableCell', children: self.tokenizeInline(cell, now) }, row); } eat(queue + character); queue = ''; cell = ''; } } else { if (queue) { cell += queue; queue = ''; } cell += character; if (character === C_BACKSLASH && index !== length - 2) { cell += line.charAt(index + 1); index++; } if (character === C_TICK) { count = 1; while (line.charAt(index + 1) === character) { cell += character; index++; count++; } if (!opening) { opening = count; } else if (count >= opening) { opening = 0; } } } preamble = false; index++; } /* Eat the alignment row. */ if (!position) { eat(C_NEWLINE + alignments); } } return table; } },{"is-whitespace-character":51}],38:[function(require,module,exports){ 'use strict'; module.exports = text; function text(eat, value, silent) { var self = this; var methods; var tokenizers; var index; var length; var subvalue; var position; var tokenizer; var name; var min; var now; /* istanbul ignore if - never used (yet) */ if (silent) { return true; } methods = self.inlineMethods; length = methods.length; tokenizers = self.inlineTokenizers; index = -1; min = value.length; while (++index < length) { name = methods[index]; if (name === 'text' || !tokenizers[name]) { continue; } tokenizer = tokenizers[name].locator; if (!tokenizer) { eat.file.fail('Missing locator: `' + name + '`'); } position = tokenizer.call(self, value, 1); if (position !== -1 && position < min) { min = position; } } subvalue = value.slice(0, min); now = eat.now(); self.decode(subvalue, now, function (content, position, source) { eat(source || content)({ type: 'text', value: content }); }); } },{}],39:[function(require,module,exports){ 'use strict'; module.exports = thematicBreak; var C_NEWLINE = '\n'; var C_TAB = '\t'; var C_SPACE = ' '; var C_ASTERISK = '*'; var C_UNDERSCORE = '_'; var C_DASH = '-'; var THEMATIC_BREAK_MARKER_COUNT = 3; function thematicBreak(eat, value, silent) { var index = -1; var length = value.length + 1; var subvalue = ''; var character; var marker; var markerCount; var queue; while (++index < length) { character = value.charAt(index); if (character !== C_TAB && character !== C_SPACE) { break; } subvalue += character; } if ( character !== C_ASTERISK && character !== C_DASH && character !== C_UNDERSCORE ) { return; } marker = character; subvalue += character; markerCount = 1; queue = ''; while (++index < length) { character = value.charAt(index); if (character === marker) { markerCount++; subvalue += queue + marker; queue = ''; } else if (character === C_SPACE) { queue += character; } else if ( markerCount >= THEMATIC_BREAK_MARKER_COUNT && (!character || character === C_NEWLINE) ) { subvalue += queue; if (silent) { return true; } return eat(subvalue)({type: 'thematicBreak'}); } else { return; } } } },{}],40:[function(require,module,exports){ 'use strict'; var decode = require('parse-entities'); var whitespace = require('is-whitespace-character'); var locate = require('../locate/url'); module.exports = url; url.locator = locate; url.notInLink = true; var C_BRACKET_OPEN = '['; var C_BRACKET_CLOSE = ']'; var C_PAREN_OPEN = '('; var C_PAREN_CLOSE = ')'; var C_LT = '<'; var C_AT_SIGN = '@'; var HTTP_PROTOCOL = 'http://'; var HTTPS_PROTOCOL = 'https://'; var MAILTO_PROTOCOL = 'mailto:'; var PROTOCOLS = [ HTTP_PROTOCOL, HTTPS_PROTOCOL, MAILTO_PROTOCOL ]; var PROTOCOLS_LENGTH = PROTOCOLS.length; function url(eat, value, silent) { var self = this; var subvalue; var content; var character; var index; var position; var protocol; var match; var length; var queue; var parenCount; var nextCharacter; var exit; if (!self.options.gfm) { return; } subvalue = ''; index = -1; length = PROTOCOLS_LENGTH; while (++index < length) { protocol = PROTOCOLS[index]; match = value.slice(0, protocol.length); if (match.toLowerCase() === protocol) { subvalue = match; break; } } if (!subvalue) { return; } index = subvalue.length; length = value.length; queue = ''; parenCount = 0; while (index < length) { character = value.charAt(index); if (whitespace(character) || character === C_LT) { break; } if ( character === '.' || character === ',' || character === ':' || character === ';' || character === '"' || character === '\'' || character === ')' || character === ']' ) { nextCharacter = value.charAt(index + 1); if (!nextCharacter || whitespace(nextCharacter)) { break; } } if (character === C_PAREN_OPEN || character === C_BRACKET_OPEN) { parenCount++; } if (character === C_PAREN_CLOSE || character === C_BRACKET_CLOSE) { parenCount--; if (parenCount < 0) { break; } } queue += character; index++; } if (!queue) { return; } subvalue += queue; content = subvalue; if (protocol === MAILTO_PROTOCOL) { position = queue.indexOf(C_AT_SIGN); if (position === -1 || position === length - 1) { return; } content = content.substr(MAILTO_PROTOCOL.length); } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } exit = self.enterLink(); content = self.tokenizeInline(content, eat.now()); exit(); return eat(subvalue)({ type: 'link', title: null, url: decode(subvalue), children: content }); } },{"../locate/url":12,"is-whitespace-character":51,"parse-entities":54}],41:[function(require,module,exports){ 'use strict'; module.exports = factory; var MERGEABLE_NODES = { text: mergeText, blockquote: mergeBlockquote }; /* Check whether a node is mergeable with adjacent nodes. */ function mergeable(node) { var start; var end; if (node.type !== 'text' || !node.position) { return true; } start = node.position.start; end = node.position.end; /* Only merge nodes which occupy the same size as their * `value`. */ return start.line !== end.line || end.column - start.column === node.value.length; } /* Merge two text nodes: `node` into `prev`. */ function mergeText(prev, node) { prev.value += node.value; return prev; } /* Merge two blockquotes: `node` into `prev`, unless in * CommonMark mode. */ function mergeBlockquote(prev, node) { if (this.options.commonmark) { return node; } prev.children = prev.children.concat(node.children); return prev; } /* Construct a tokenizer. This creates both * `tokenizeInline` and `tokenizeBlock`. */ function factory(type) { return tokenize; /* Tokenizer for a bound `type`. */ function tokenize(value, location) { var self = this; var offset = self.offset; var tokens = []; var methods = self[type + 'Methods']; var tokenizers = self[type + 'Tokenizers']; var line = location.line; var column = location.column; var index; var length; var method; var name; var matched; var valueLength; /* Trim white space only lines. */ if (!value) { return tokens; } /* Expose on `eat`. */ eat.now = now; eat.file = self.file; /* Sync initial offset. */ updatePosition(''); /* Iterate over `value`, and iterate over all * tokenizers. When one eats something, re-iterate * with the remaining value. If no tokenizer eats, * something failed (should not happen) and an * exception is thrown. */ while (value) { index = -1; length = methods.length; matched = false; while (++index < length) { name = methods[index]; method = tokenizers[name]; if ( method && /* istanbul ignore next */ (!method.onlyAtStart || self.atStart) && (!method.notInList || !self.inList) && (!method.notInBlock || !self.inBlock) && (!method.notInLink || !self.inLink) ) { valueLength = value.length; method.apply(self, [eat, value]); matched = valueLength !== value.length; if (matched) { break; } } } /* istanbul ignore if */ if (!matched) { self.file.fail(new Error('Infinite loop'), eat.now()); } } self.eof = now(); return tokens; /* Update line, column, and offset based on * `value`. */ function updatePosition(subvalue) { var lastIndex = -1; var index = subvalue.indexOf('\n'); while (index !== -1) { line++; lastIndex = index; index = subvalue.indexOf('\n', index + 1); } if (lastIndex === -1) { column += subvalue.length; } else { column = subvalue.length - lastIndex; } if (line in offset) { if (lastIndex !== -1) { column += offset[line]; } else if (column <= offset[line]) { column = offset[line] + 1; } } } /* Get offset. Called before the first character is * eaten to retrieve the range's offsets. */ function getOffset() { var indentation = []; var pos = line + 1; /* Done. Called when the last character is * eaten to retrieve the range’s offsets. */ return function () { var last = line + 1; while (pos < last) { indentation.push((offset[pos] || 0) + 1); pos++; } return indentation; }; } /* Get the current position. */ function now() { var pos = {line: line, column: column}; pos.offset = self.toOffset(pos); return pos; } /* Store position information for a node. */ function Position(start) { this.start = start; this.end = now(); } /* Throw when a value is incorrectly eaten. * This shouldn’t happen but will throw on new, * incorrect rules. */ function validateEat(subvalue) { /* istanbul ignore if */ if (value.substring(0, subvalue.length) !== subvalue) { /* Capture stack-trace. */ self.file.fail( new Error( 'Incorrectly eaten value: please report this ' + 'warning on http://git.io/vg5Ft' ), now() ); } } /* Mark position and patch `node.position`. */ function position() { var before = now(); return update; /* Add the position to a node. */ function update(node, indent) { var prev = node.position; var start = prev ? prev.start : before; var combined = []; var n = prev && prev.end.line; var l = before.line; node.position = new Position(start); /* If there was already a `position`, this * node was merged. Fixing `start` wasn’t * hard, but the indent is different. * Especially because some information, the * indent between `n` and `l` wasn’t * tracked. Luckily, that space is * (should be?) empty, so we can safely * check for it now. */ if (prev && indent && prev.indent) { combined = prev.indent; if (n < l) { while (++n < l) { combined.push((offset[n] || 0) + 1); } combined.push(before.column); } indent = combined.concat(indent); } node.position.indent = indent || []; return node; } } /* Add `node` to `parent`s children or to `tokens`. * Performs merges where possible. */ function add(node, parent) { var children = parent ? parent.children : tokens; var prev = children[children.length - 1]; if ( prev && node.type === prev.type && node.type in MERGEABLE_NODES && mergeable(prev) && mergeable(node) ) { node = MERGEABLE_NODES[node.type].call(self, prev, node); } if (node !== prev) { children.push(node); } if (self.atStart && tokens.length !== 0) { self.exitStart(); } return node; } /* Remove `subvalue` from `value`. * `subvalue` must be at the start of `value`. */ function eat(subvalue) { var indent = getOffset(); var pos = position(); var current = now(); validateEat(subvalue); apply.reset = reset; reset.test = test; apply.test = test; value = value.substring(subvalue.length); updatePosition(subvalue); indent = indent(); return apply; /* Add the given arguments, add `position` to * the returned node, and return the node. */ function apply(node, parent) { return pos(add(pos(node), parent), indent); } /* Functions just like apply, but resets the * content: the line and column are reversed, * and the eaten value is re-added. * This is useful for nodes with a single * type of content, such as lists and tables. * See `apply` above for what parameters are * expected. */ function reset() { var node = apply.apply(null, arguments); line = current.line; column = current.column; value = subvalue + value; return node; } /* Test the position, after eating, and reverse * to a not-eaten state. */ function test() { var result = pos({}); line = current.line; column = current.column; value = subvalue + value; return result.position; } } } } },{}],42:[function(require,module,exports){ 'use strict'; module.exports = factory; /* Factory to de-escape a value, based on a list at `key` * in `ctx`. */ function factory(ctx, key) { return unescape; /* De-escape a string using the expression at `key` * in `ctx`. */ function unescape(value) { var prev = 0; var index = value.indexOf('\\'); var escape = ctx[key]; var queue = []; var character; while (index !== -1) { queue.push(value.slice(prev, index)); prev = index + 1; character = value.charAt(prev); /* If the following character is not a valid escape, * add the slash. */ if (!character || escape.indexOf(character) === -1) { queue.push('\\'); } index = value.indexOf('\\', prev); } queue.push(value.slice(prev)); return queue.join(''); } } },{}],43:[function(require,module,exports){ 'use strict'; module.exports = indentation; /* Map of characters, and their column length, * which can be used as indentation. */ var characters = {' ': 1, '\t': 4}; /* Gets indentation information for a line. */ function indentation(value) { var index = 0; var indent = 0; var character = value.charAt(index); var stops = {}; var size; while (character in characters) { size = characters[character]; indent += size; if (size > 1) { indent = Math.floor(indent / size) * size; } stops[indent] = index; character = value.charAt(++index); } return {indent: indent, stops: stops}; } },{}],44:[function(require,module,exports){ 'use strict'; var attributeName = '[a-zA-Z_:][a-zA-Z0-9:._-]*'; var unquoted = '[^"\'=<>`\\u0000-\\u0020]+'; var singleQuoted = '\'[^\']*\''; var doubleQuoted = '"[^"]*"'; var attributeValue = '(?:' + unquoted + '|' + singleQuoted + '|' + doubleQuoted + ')'; var attribute = '(?:\\s+' + attributeName + '(?:\\s*=\\s*' + attributeValue + ')?)'; var openTag = '<[A-Za-z][A-Za-z0-9\\-]*' + attribute + '*\\s*\\/?>'; var closeTag = '<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>'; var comment = '|'; var processing = '<[?].*?[?]>'; var declaration = ']*>'; var cdata = ''; exports.openCloseTag = new RegExp('^(?:' + openTag + '|' + closeTag + ')'); exports.tag = new RegExp('^(?:' + openTag + '|' + closeTag + '|' + comment + '|' + processing + '|' + declaration + '|' + cdata + ')'); },{}],45:[function(require,module,exports){ 'use strict'; module.exports = interrupt; function interrupt(interruptors, tokenizers, ctx, params) { var bools = ['pedantic', 'commonmark']; var count = bools.length; var length = interruptors.length; var index = -1; var interruptor; var config; var fn; var offset; var bool; var ignore; while (++index < length) { interruptor = interruptors[index]; config = interruptor[1] || {}; fn = interruptor[0]; offset = -1; ignore = false; while (++offset < count) { bool = bools[offset]; if (config[bool] !== undefined && config[bool] !== ctx.options[bool]) { ignore = true; break; } } if (ignore) { continue; } if (tokenizers[fn].apply(ctx, params)) { return true; } } return false; } },{}],46:[function(require,module,exports){ 'use strict'; var collapseWhiteSpace = require('collapse-white-space'); module.exports = normalize; /* Normalize an identifier. Collapses multiple white space * characters into a single space, and removes casing. */ function normalize(value) { return collapseWhiteSpace(value).toLowerCase(); } },{"collapse-white-space":48}],47:[function(require,module,exports){ 'use strict'; var trim = require('trim'); var repeat = require('repeat-string'); var getIndent = require('./get-indentation'); module.exports = indentation; var C_SPACE = ' '; var C_NEWLINE = '\n'; var C_TAB = '\t'; /* Remove the minimum indent from every line in `value`. * Supports both tab, spaced, and mixed indentation (as * well as possible). */ function indentation(value, maximum) { var values = value.split(C_NEWLINE); var position = values.length + 1; var minIndent = Infinity; var matrix = []; var index; var indentation; var stops; var padding; values.unshift(repeat(C_SPACE, maximum) + '!'); while (position--) { indentation = getIndent(values[position]); matrix[position] = indentation.stops; if (trim(values[position]).length === 0) { continue; } if (indentation.indent) { if (indentation.indent > 0 && indentation.indent < minIndent) { minIndent = indentation.indent; } } else { minIndent = Infinity; break; } } if (minIndent !== Infinity) { position = values.length; while (position--) { stops = matrix[position]; index = minIndent; while (index && !(index in stops)) { index--; } if ( trim(values[position]).length !== 0 && minIndent && index !== minIndent ) { padding = C_TAB; } else { padding = ''; } values[position] = padding + values[position].slice( index in stops ? stops[index] + 1 : 0 ); } } values.shift(); return values.join(C_NEWLINE); } },{"./get-indentation":43,"repeat-string":60,"trim":63}],48:[function(require,module,exports){ 'use strict'; module.exports = collapse; /* collapse(' \t\nbar \nbaz\t'); // ' bar baz ' */ function collapse(value) { return String(value).replace(/\s+/g, ' '); } },{}],49:[function(require,module,exports){ 'use strict'; module.exports = alphabetical; /* Check if the given character code, or the character * code at the first character, is alphabetical. */ function alphabetical(character) { var code = typeof character === 'string' ? character.charCodeAt(0) : character; return (code >= 97 && code <= 122) || /* a-z */ (code >= 65 && code <= 90); /* A-Z */ } },{}],50:[function(require,module,exports){ 'use strict'; module.exports = decimal; /* Check if the given character code, or the character * code at the first character, is decimal. */ function decimal(character) { var code = typeof character === 'string' ? character.charCodeAt(0) : character; return code >= 48 && code <= 57; /* 0-9 */ } },{}],51:[function(require,module,exports){ 'use strict'; module.exports = whitespace; var fromCode = String.fromCharCode; var re = /\s/; /* Check if the given character code, or the character * code at the first character, is a whitespace character. */ function whitespace(character) { return re.test( typeof character === 'number' ? fromCode(character) : character.charAt(0) ); } },{}],52:[function(require,module,exports){ 'use strict'; module.exports = wordCharacter; var fromCode = String.fromCharCode; var re = /\w/; /* Check if the given character code, or the character * code at the first character, is a word character. */ function wordCharacter(character) { return re.test( typeof character === 'number' ? fromCode(character) : character.charAt(0) ); } },{}],53:[function(require,module,exports){ 'use strict'; module.exports = escapes; var defaults = [ '\\', '`', '*', '{', '}', '[', ']', '(', ')', '#', '+', '-', '.', '!', '_', '>' ]; var gfm = defaults.concat(['~', '|']); var commonmark = gfm.concat([ '\n', '"', '$', '%', '&', '\'', ',', '/', ':', ';', '<', '=', '?', '@', '^' ]); escapes.default = defaults; escapes.gfm = gfm; escapes.commonmark = commonmark; /* Get markdown escapes. */ function escapes(options) { var settings = options || {}; if (settings.commonmark) { return commonmark; } return settings.gfm ? gfm : defaults; } },{}],54:[function(require,module,exports){ 'use strict'; /* Dependencies. */ var characterEntities = require('character-entities'); var legacy = require('character-entities-legacy'); var invalid = require('character-reference-invalid'); var decimal = require('is-decimal'); var hexadecimal = require('is-hexadecimal'); var alphanumerical = require('is-alphanumerical'); /* Expose. */ module.exports = wrapper; /* Methods. */ var own = {}.hasOwnProperty; var fromCharCode = String.fromCharCode; var noop = Function.prototype; /* Characters. */ var REPLACEMENT = '\uFFFD'; var FORM_FEED = '\f'; var AMPERSAND = '&'; var OCTOTHORP = '#'; var SEMICOLON = ';'; var NEWLINE = '\n'; var X_LOWER = 'x'; var X_UPPER = 'X'; var SPACE = ' '; var LESS_THAN = '<'; var EQUAL = '='; var EMPTY = ''; var TAB = '\t'; /* Default settings. */ var defaults = { warning: null, reference: null, text: null, warningContext: null, referenceContext: null, textContext: null, position: {}, additional: null, attribute: false, nonTerminated: true }; /* Reference types. */ var NAMED = 'named'; var HEXADECIMAL = 'hexadecimal'; var DECIMAL = 'decimal'; /* Map of bases. */ var BASE = {}; BASE[HEXADECIMAL] = 16; BASE[DECIMAL] = 10; /* Map of types to tests. Each type of character reference * accepts different characters. This test is used to * detect whether a reference has ended (as the semicolon * is not strictly needed). */ var TESTS = {}; TESTS[NAMED] = alphanumerical; TESTS[DECIMAL] = decimal; TESTS[HEXADECIMAL] = hexadecimal; /* Warning messages. */ var NAMED_NOT_TERMINATED = 1; var NUMERIC_NOT_TERMINATED = 2; var NAMED_EMPTY = 3; var NUMERIC_EMPTY = 4; var NAMED_UNKNOWN = 5; var NUMERIC_DISALLOWED = 6; var NUMERIC_PROHIBITED = 7; var NUMERIC_REFERENCE = 'Numeric character references'; var NAMED_REFERENCE = 'Named character references'; var TERMINATED = ' must be terminated by a semicolon'; var VOID = ' cannot be empty'; var MESSAGES = {}; MESSAGES[NAMED_NOT_TERMINATED] = NAMED_REFERENCE + TERMINATED; MESSAGES[NUMERIC_NOT_TERMINATED] = NUMERIC_REFERENCE + TERMINATED; MESSAGES[NAMED_EMPTY] = NAMED_REFERENCE + VOID; MESSAGES[NUMERIC_EMPTY] = NUMERIC_REFERENCE + VOID; MESSAGES[NAMED_UNKNOWN] = NAMED_REFERENCE + ' must be known'; MESSAGES[NUMERIC_DISALLOWED] = NUMERIC_REFERENCE + ' cannot be disallowed'; MESSAGES[NUMERIC_PROHIBITED] = NUMERIC_REFERENCE + ' cannot be outside the ' + 'permissible Unicode range'; /* Wrap to ensure clean parameters are given to `parse`. */ function wrapper(value, options) { var settings = {}; var option; var key; if (!options) { options = {}; } for (key in defaults) { option = options[key]; settings[key] = option === null || option === undefined ? defaults[key] : option; } if (settings.position.indent || settings.position.start) { settings.indent = settings.position.indent || []; settings.position = settings.position.start; } return parse(value, settings); } /* Parse entities. */ function parse(value, settings) { var additional = settings.additional; var nonTerminated = settings.nonTerminated; var handleText = settings.text; var handleReference = settings.reference; var handleWarning = settings.warning; var textContext = settings.textContext; var referenceContext = settings.referenceContext; var warningContext = settings.warningContext; var pos = settings.position; var indent = settings.indent || []; var length = value.length; var index = 0; var lines = -1; var column = pos.column || 1; var line = pos.line || 1; var queue = EMPTY; var result = []; var entityCharacters; var terminated; var characters; var character; var reference; var following; var warning; var reason; var output; var entity; var begin; var start; var type; var test; var prev; var next; var diff; var end; /* Cache the current point. */ prev = now(); /* Wrap `handleWarning`. */ warning = handleWarning ? parseError : noop; /* Ensure the algorithm walks over the first character * and the end (inclusive). */ index--; length++; while (++index < length) { /* If the previous character was a newline. */ if (character === NEWLINE) { column = indent[lines] || 1; } character = at(index); /* Handle anything other than an ampersand, * including newlines and EOF. */ if (character !== AMPERSAND) { if (character === NEWLINE) { line++; lines++; column = 0; } if (character) { queue += character; column++; } else { flush(); } } else { following = at(index + 1); /* The behaviour depends on the identity of the next * character. */ if ( following === TAB || following === NEWLINE || following === FORM_FEED || following === SPACE || following === LESS_THAN || following === AMPERSAND || following === EMPTY || (additional && following === additional) ) { /* Not a character reference. No characters * are consumed, and nothing is returned. * This is not an error, either. */ queue += character; column++; continue; } start = index + 1; begin = start; end = start; /* Numerical entity. */ if (following !== OCTOTHORP) { type = NAMED; } else { end = ++begin; /* The behaviour further depends on the * character after the U+0023 NUMBER SIGN. */ following = at(end); if (following === X_LOWER || following === X_UPPER) { /* ASCII hex digits. */ type = HEXADECIMAL; end = ++begin; } else { /* ASCII digits. */ type = DECIMAL; } } entityCharacters = EMPTY; entity = EMPTY; characters = EMPTY; test = TESTS[type]; end--; while (++end < length) { following = at(end); if (!test(following)) { break; } characters += following; /* Check if we can match a legacy named * reference. If so, we cache that as the * last viable named reference. This * ensures we do not need to walk backwards * later. */ if (type === NAMED && own.call(legacy, characters)) { entityCharacters = characters; entity = legacy[characters]; } } terminated = at(end) === SEMICOLON; if (terminated) { end++; if (type === NAMED && own.call(characterEntities, characters)) { entityCharacters = characters; entity = characterEntities[characters]; } } diff = 1 + end - start; if (!terminated && !nonTerminated) { /* Empty. */ } else if (!characters) { /* An empty (possible) entity is valid, unless * its numeric (thus an ampersand followed by * an octothorp). */ if (type !== NAMED) { warning(NUMERIC_EMPTY, diff); } } else if (type === NAMED) { /* An ampersand followed by anything * unknown, and not terminated, is invalid. */ if (terminated && !entity) { warning(NAMED_UNKNOWN, 1); } else { /* If theres something after an entity * name which is not known, cap the * reference. */ if (entityCharacters !== characters) { end = begin + entityCharacters.length; diff = 1 + end - begin; terminated = false; } /* If the reference is not terminated, * warn. */ if (!terminated) { reason = entityCharacters ? NAMED_NOT_TERMINATED : NAMED_EMPTY; if (!settings.attribute) { warning(reason, diff); } else { following = at(end); if (following === EQUAL) { warning(reason, diff); entity = null; } else if (alphanumerical(following)) { entity = null; } else { warning(reason, diff); } } } } reference = entity; } else { if (!terminated) { /* All non-terminated numeric entities are * not rendered, and trigger a warning. */ warning(NUMERIC_NOT_TERMINATED, diff); } /* When terminated and number, parse as * either hexadecimal or decimal. */ reference = parseInt(characters, BASE[type]); /* Trigger a warning when the parsed number * is prohibited, and replace with * replacement character. */ if (isProhibited(reference)) { warning(NUMERIC_PROHIBITED, diff); reference = REPLACEMENT; } else if (reference in invalid) { /* Trigger a warning when the parsed number * is disallowed, and replace by an * alternative. */ warning(NUMERIC_DISALLOWED, diff); reference = invalid[reference]; } else { /* Parse the number. */ output = EMPTY; /* Trigger a warning when the parsed * number should not be used. */ if (isWarning(reference)) { warning(NUMERIC_DISALLOWED, diff); } /* Stringify the number. */ if (reference > 0xFFFF) { reference -= 0x10000; output += fromCharCode((reference >>> (10 & 0x3FF)) | 0xD800); reference = 0xDC00 | (reference & 0x3FF); } reference = output + fromCharCode(reference); } } /* If we could not find a reference, queue the * checked characters (as normal characters), * and move the pointer to their end. This is * possible because we can be certain neither * newlines nor ampersands are included. */ if (!reference) { characters = value.slice(start - 1, end); queue += characters; column += characters.length; index = end - 1; } else { /* Found it! First eat the queued * characters as normal text, then eat * an entity. */ flush(); prev = now(); index = end - 1; column += end - start + 1; result.push(reference); next = now(); next.offset++; if (handleReference) { handleReference.call(referenceContext, reference, { start: prev, end: next }, value.slice(start - 1, end)); } prev = next; } } } /* Return the reduced nodes, and any possible warnings. */ return result.join(EMPTY); /* Get current position. */ function now() { return { line: line, column: column, offset: index + (pos.offset || 0) }; } /* “Throw” a parse-error: a warning. */ function parseError(code, offset) { var position = now(); position.column += offset; position.offset += offset; handleWarning.call(warningContext, MESSAGES[code], position, code); } /* Get character at position. */ function at(position) { return value.charAt(position); } /* Flush `queue` (normal text). Macro invoked before * each entity and at the end of `value`. * Does nothing when `queue` is empty. */ function flush() { if (queue) { result.push(queue); if (handleText) { handleText.call(textContext, queue, { start: prev, end: now() }); } queue = EMPTY; } } } /* Check if `character` is outside the permissible * unicode range. */ function isProhibited(code) { return (code >= 0xD800 && code <= 0xDFFF) || (code > 0x10FFFF); } /* Check if `character` is disallowed. */ function isWarning(code) { if ( (code >= 0x0001 && code <= 0x0008) || code === 0x000B || (code >= 0x000D && code <= 0x001F) || (code >= 0x007F && code <= 0x009F) || (code >= 0xFDD0 && code <= 0xFDEF) || (code & 0xFFFF) === 0xFFFF || (code & 0xFFFF) === 0xFFFE ) { return true; } return false; } },{"character-entities":56,"character-entities-legacy":55,"character-reference-invalid":57,"is-alphanumerical":58,"is-decimal":50,"is-hexadecimal":59}],55:[function(require,module,exports){ module.exports={ "AElig": "Æ", "AMP": "&", "Aacute": "Á", "Acirc": "Â", "Agrave": "À", "Aring": "Å", "Atilde": "Ã", "Auml": "Ä", "COPY": "©", "Ccedil": "Ç", "ETH": "Ð", "Eacute": "É", "Ecirc": "Ê", "Egrave": "È", "Euml": "Ë", "GT": ">", "Iacute": "Í", "Icirc": "Î", "Igrave": "Ì", "Iuml": "Ï", "LT": "<", "Ntilde": "Ñ", "Oacute": "Ó", "Ocirc": "Ô", "Ograve": "Ò", "Oslash": "Ø", "Otilde": "Õ", "Ouml": "Ö", "QUOT": "\"", "REG": "®", "THORN": "Þ", "Uacute": "Ú", "Ucirc": "Û", "Ugrave": "Ù", "Uuml": "Ü", "Yacute": "Ý", "aacute": "á", "acirc": "â", "acute": "´", "aelig": "æ", "agrave": "à", "amp": "&", "aring": "å", "atilde": "ã", "auml": "ä", "brvbar": "¦", "ccedil": "ç", "cedil": "¸", "cent": "¢", "copy": "©", "curren": "¤", "deg": "°", "divide": "÷", "eacute": "é", "ecirc": "ê", "egrave": "è", "eth": "ð", "euml": "ë", "frac12": "½", "frac14": "¼", "frac34": "¾", "gt": ">", "iacute": "í", "icirc": "î", "iexcl": "¡", "igrave": "ì", "iquest": "¿", "iuml": "ï", "laquo": "«", "lt": "<", "macr": "¯", "micro": "µ", "middot": "·", "nbsp": " ", "not": "¬", "ntilde": "ñ", "oacute": "ó", "ocirc": "ô", "ograve": "ò", "ordf": "ª", "ordm": "º", "oslash": "ø", "otilde": "õ", "ouml": "ö", "para": "¶", "plusmn": "±", "pound": "£", "quot": "\"", "raquo": "»", "reg": "®", "sect": "§", "shy": "­", "sup1": "¹", "sup2": "²", "sup3": "³", "szlig": "ß", "thorn": "þ", "times": "×", "uacute": "ú", "ucirc": "û", "ugrave": "ù", "uml": "¨", "uuml": "ü", "yacute": "ý", "yen": "¥", "yuml": "ÿ" } },{}],56:[function(require,module,exports){ module.exports={ "AEli": "Æ", "AElig": "Æ", "AM": "&", "AMP": "&", "Aacut": "Á", "Aacute": "Á", "Abreve": "Ă", "Acir": "Â", "Acirc": "Â", "Acy": "А", "Afr": "𝔄", "Agrav": "À", "Agrave": "À", "Alpha": "Α", "Amacr": "Ā", "And": "⩓", "Aogon": "Ą", "Aopf": "𝔸", "ApplyFunction": "⁡", "Arin": "Å", "Aring": "Å", "Ascr": "𝒜", "Assign": "≔", "Atild": "Ã", "Atilde": "Ã", "Aum": "Ä", "Auml": "Ä", "Backslash": "∖", "Barv": "⫧", "Barwed": "⌆", "Bcy": "Б", "Because": "∵", "Bernoullis": "ℬ", "Beta": "Β", "Bfr": "𝔅", "Bopf": "𝔹", "Breve": "˘", "Bscr": "ℬ", "Bumpeq": "≎", "CHcy": "Ч", "COP": "©", "COPY": "©", "Cacute": "Ć", "Cap": "⋒", "CapitalDifferentialD": "ⅅ", "Cayleys": "ℭ", "Ccaron": "Č", "Ccedi": "Ç", "Ccedil": "Ç", "Ccirc": "Ĉ", "Cconint": "∰", "Cdot": "Ċ", "Cedilla": "¸", "CenterDot": "·", "Cfr": "ℭ", "Chi": "Χ", "CircleDot": "⊙", "CircleMinus": "⊖", "CirclePlus": "⊕", "CircleTimes": "⊗", "ClockwiseContourIntegral": "∲", "CloseCurlyDoubleQuote": "”", "CloseCurlyQuote": "’", "Colon": "∷", "Colone": "⩴", "Congruent": "≡", "Conint": "∯", "ContourIntegral": "∮", "Copf": "ℂ", "Coproduct": "∐", "CounterClockwiseContourIntegral": "∳", "Cross": "⨯", "Cscr": "𝒞", "Cup": "⋓", "CupCap": "≍", "DD": "ⅅ", "DDotrahd": "⤑", "DJcy": "Ђ", "DScy": "Ѕ", "DZcy": "Џ", "Dagger": "‡", "Darr": "↡", "Dashv": "⫤", "Dcaron": "Ď", "Dcy": "Д", "Del": "∇", "Delta": "Δ", "Dfr": "𝔇", "DiacriticalAcute": "´", "DiacriticalDot": "˙", "DiacriticalDoubleAcute": "˝", "DiacriticalGrave": "`", "DiacriticalTilde": "˜", "Diamond": "⋄", "DifferentialD": "ⅆ", "Dopf": "𝔻", "Dot": "¨", "DotDot": "⃜", "DotEqual": "≐", "DoubleContourIntegral": "∯", "DoubleDot": "¨", "DoubleDownArrow": "⇓", "DoubleLeftArrow": "⇐", "DoubleLeftRightArrow": "⇔", "DoubleLeftTee": "⫤", "DoubleLongLeftArrow": "⟸", "DoubleLongLeftRightArrow": "⟺", "DoubleLongRightArrow": "⟹", "DoubleRightArrow": "⇒", "DoubleRightTee": "⊨", "DoubleUpArrow": "⇑", "DoubleUpDownArrow": "⇕", "DoubleVerticalBar": "∥", "DownArrow": "↓", "DownArrowBar": "⤓", "DownArrowUpArrow": "⇵", "DownBreve": "̑", "DownLeftRightVector": "⥐", "DownLeftTeeVector": "⥞", "DownLeftVector": "↽", "DownLeftVectorBar": "⥖", "DownRightTeeVector": "⥟", "DownRightVector": "⇁", "DownRightVectorBar": "⥗", "DownTee": "⊤", "DownTeeArrow": "↧", "Downarrow": "⇓", "Dscr": "𝒟", "Dstrok": "Đ", "ENG": "Ŋ", "ET": "Ð", "ETH": "Ð", "Eacut": "É", "Eacute": "É", "Ecaron": "Ě", "Ecir": "Ê", "Ecirc": "Ê", "Ecy": "Э", "Edot": "Ė", "Efr": "𝔈", "Egrav": "È", "Egrave": "È", "Element": "∈", "Emacr": "Ē", "EmptySmallSquare": "◻", "EmptyVerySmallSquare": "▫", "Eogon": "Ę", "Eopf": "𝔼", "Epsilon": "Ε", "Equal": "⩵", "EqualTilde": "≂", "Equilibrium": "⇌", "Escr": "ℰ", "Esim": "⩳", "Eta": "Η", "Eum": "Ë", "Euml": "Ë", "Exists": "∃", "ExponentialE": "ⅇ", "Fcy": "Ф", "Ffr": "𝔉", "FilledSmallSquare": "◼", "FilledVerySmallSquare": "▪", "Fopf": "𝔽", "ForAll": "∀", "Fouriertrf": "ℱ", "Fscr": "ℱ", "GJcy": "Ѓ", "G": ">", "GT": ">", "Gamma": "Γ", "Gammad": "Ϝ", "Gbreve": "Ğ", "Gcedil": "Ģ", "Gcirc": "Ĝ", "Gcy": "Г", "Gdot": "Ġ", "Gfr": "𝔊", "Gg": "⋙", "Gopf": "𝔾", "GreaterEqual": "≥", "GreaterEqualLess": "⋛", "GreaterFullEqual": "≧", "GreaterGreater": "⪢", "GreaterLess": "≷", "GreaterSlantEqual": "⩾", "GreaterTilde": "≳", "Gscr": "𝒢", "Gt": "≫", "HARDcy": "Ъ", "Hacek": "ˇ", "Hat": "^", "Hcirc": "Ĥ", "Hfr": "ℌ", "HilbertSpace": "ℋ", "Hopf": "ℍ", "HorizontalLine": "─", "Hscr": "ℋ", "Hstrok": "Ħ", "HumpDownHump": "≎", "HumpEqual": "≏", "IEcy": "Е", "IJlig": "IJ", "IOcy": "Ё", "Iacut": "Í", "Iacute": "Í", "Icir": "Î", "Icirc": "Î", "Icy": "И", "Idot": "İ", "Ifr": "ℑ", "Igrav": "Ì", "Igrave": "Ì", "Im": "ℑ", "Imacr": "Ī", "ImaginaryI": "ⅈ", "Implies": "⇒", "Int": "∬", "Integral": "∫", "Intersection": "⋂", "InvisibleComma": "⁣", "InvisibleTimes": "⁢", "Iogon": "Į", "Iopf": "𝕀", "Iota": "Ι", "Iscr": "ℐ", "Itilde": "Ĩ", "Iukcy": "І", "Ium": "Ï", "Iuml": "Ï", "Jcirc": "Ĵ", "Jcy": "Й", "Jfr": "𝔍", "Jopf": "𝕁", "Jscr": "𝒥", "Jsercy": "Ј", "Jukcy": "Є", "KHcy": "Х", "KJcy": "Ќ", "Kappa": "Κ", "Kcedil": "Ķ", "Kcy": "К", "Kfr": "𝔎", "Kopf": "𝕂", "Kscr": "𝒦", "LJcy": "Љ", "L": "<", "LT": "<", "Lacute": "Ĺ", "Lambda": "Λ", "Lang": "⟪", "Laplacetrf": "ℒ", "Larr": "↞", "Lcaron": "Ľ", "Lcedil": "Ļ", "Lcy": "Л", "LeftAngleBracket": "⟨", "LeftArrow": "←", "LeftArrowBar": "⇤", "LeftArrowRightArrow": "⇆", "LeftCeiling": "⌈", "LeftDoubleBracket": "⟦", "LeftDownTeeVector": "⥡", "LeftDownVector": "⇃", "LeftDownVectorBar": "⥙", "LeftFloor": "⌊", "LeftRightArrow": "↔", "LeftRightVector": "⥎", "LeftTee": "⊣", "LeftTeeArrow": "↤", "LeftTeeVector": "⥚", "LeftTriangle": "⊲", "LeftTriangleBar": "⧏", "LeftTriangleEqual": "⊴", "LeftUpDownVector": "⥑", "LeftUpTeeVector": "⥠", "LeftUpVector": "↿", "LeftUpVectorBar": "⥘", "LeftVector": "↼", "LeftVectorBar": "⥒", "Leftarrow": "⇐", "Leftrightarrow": "⇔", "LessEqualGreater": "⋚", "LessFullEqual": "≦", "LessGreater": "≶", "LessLess": "⪡", "LessSlantEqual": "⩽", "LessTilde": "≲", "Lfr": "𝔏", "Ll": "⋘", "Lleftarrow": "⇚", "Lmidot": "Ŀ", "LongLeftArrow": "⟵", "LongLeftRightArrow": "⟷", "LongRightArrow": "⟶", "Longleftarrow": "⟸", "Longleftrightarrow": "⟺", "Longrightarrow": "⟹", "Lopf": "𝕃", "LowerLeftArrow": "↙", "LowerRightArrow": "↘", "Lscr": "ℒ", "Lsh": "↰", "Lstrok": "Ł", "Lt": "≪", "Map": "⤅", "Mcy": "М", "MediumSpace": " ", "Mellintrf": "ℳ", "Mfr": "𝔐", "MinusPlus": "∓", "Mopf": "𝕄", "Mscr": "ℳ", "Mu": "Μ", "NJcy": "Њ", "Nacute": "Ń", "Ncaron": "Ň", "Ncedil": "Ņ", "Ncy": "Н", "NegativeMediumSpace": "​", "NegativeThickSpace": "​", "NegativeThinSpace": "​", "NegativeVeryThinSpace": "​", "NestedGreaterGreater": "≫", "NestedLessLess": "≪", "NewLine": "\n", "Nfr": "𝔑", "NoBreak": "⁠", "NonBreakingSpace": " ", "Nopf": "ℕ", "Not": "⫬", "NotCongruent": "≢", "NotCupCap": "≭", "NotDoubleVerticalBar": "∦", "NotElement": "∉", "NotEqual": "≠", "NotEqualTilde": "≂̸", "NotExists": "∄", "NotGreater": "≯", "NotGreaterEqual": "≱", "NotGreaterFullEqual": "≧̸", "NotGreaterGreater": "≫̸", "NotGreaterLess": "≹", "NotGreaterSlantEqual": "⩾̸", "NotGreaterTilde": "≵", "NotHumpDownHump": "≎̸", "NotHumpEqual": "≏̸", "NotLeftTriangle": "⋪", "NotLeftTriangleBar": "⧏̸", "NotLeftTriangleEqual": "⋬", "NotLess": "≮", "NotLessEqual": "≰", "NotLessGreater": "≸", "NotLessLess": "≪̸", "NotLessSlantEqual": "⩽̸", "NotLessTilde": "≴", "NotNestedGreaterGreater": "⪢̸", "NotNestedLessLess": "⪡̸", "NotPrecedes": "⊀", "NotPrecedesEqual": "⪯̸", "NotPrecedesSlantEqual": "⋠", "NotReverseElement": "∌", "NotRightTriangle": "⋫", "NotRightTriangleBar": "⧐̸", "NotRightTriangleEqual": "⋭", "NotSquareSubset": "⊏̸", "NotSquareSubsetEqual": "⋢", "NotSquareSuperset": "⊐̸", "NotSquareSupersetEqual": "⋣", "NotSubset": "⊂⃒", "NotSubsetEqual": "⊈", "NotSucceeds": "⊁", "NotSucceedsEqual": "⪰̸", "NotSucceedsSlantEqual": "⋡", "NotSucceedsTilde": "≿̸", "NotSuperset": "⊃⃒", "NotSupersetEqual": "⊉", "NotTilde": "≁", "NotTildeEqual": "≄", "NotTildeFullEqual": "≇", "NotTildeTilde": "≉", "NotVerticalBar": "∤", "Nscr": "𝒩", "Ntild": "Ñ", "Ntilde": "Ñ", "Nu": "Ν", "OElig": "Œ", "Oacut": "Ó", "Oacute": "Ó", "Ocir": "Ô", "Ocirc": "Ô", "Ocy": "О", "Odblac": "Ő", "Ofr": "𝔒", "Ograv": "Ò", "Ograve": "Ò", "Omacr": "Ō", "Omega": "Ω", "Omicron": "Ο", "Oopf": "𝕆", "OpenCurlyDoubleQuote": "“", "OpenCurlyQuote": "‘", "Or": "⩔", "Oscr": "𝒪", "Oslas": "Ø", "Oslash": "Ø", "Otild": "Õ", "Otilde": "Õ", "Otimes": "⨷", "Oum": "Ö", "Ouml": "Ö", "OverBar": "‾", "OverBrace": "⏞", "OverBracket": "⎴", "OverParenthesis": "⏜", "PartialD": "∂", "Pcy": "П", "Pfr": "𝔓", "Phi": "Φ", "Pi": "Π", "PlusMinus": "±", "Poincareplane": "ℌ", "Popf": "ℙ", "Pr": "⪻", "Precedes": "≺", "PrecedesEqual": "⪯", "PrecedesSlantEqual": "≼", "PrecedesTilde": "≾", "Prime": "″", "Product": "∏", "Proportion": "∷", "Proportional": "∝", "Pscr": "𝒫", "Psi": "Ψ", "QUO": "\"", "QUOT": "\"", "Qfr": "𝔔", "Qopf": "ℚ", "Qscr": "𝒬", "RBarr": "⤐", "RE": "®", "REG": "®", "Racute": "Ŕ", "Rang": "⟫", "Rarr": "↠", "Rarrtl": "⤖", "Rcaron": "Ř", "Rcedil": "Ŗ", "Rcy": "Р", "Re": "ℜ", "ReverseElement": "∋", "ReverseEquilibrium": "⇋", "ReverseUpEquilibrium": "⥯", "Rfr": "ℜ", "Rho": "Ρ", "RightAngleBracket": "⟩", "RightArrow": "→", "RightArrowBar": "⇥", "RightArrowLeftArrow": "⇄", "RightCeiling": "⌉", "RightDoubleBracket": "⟧", "RightDownTeeVector": "⥝", "RightDownVector": "⇂", "RightDownVectorBar": "⥕", "RightFloor": "⌋", "RightTee": "⊢", "RightTeeArrow": "↦", "RightTeeVector": "⥛", "RightTriangle": "⊳", "RightTriangleBar": "⧐", "RightTriangleEqual": "⊵", "RightUpDownVector": "⥏", "RightUpTeeVector": "⥜", "RightUpVector": "↾", "RightUpVectorBar": "⥔", "RightVector": "⇀", "RightVectorBar": "⥓", "Rightarrow": "⇒", "Ropf": "ℝ", "RoundImplies": "⥰", "Rrightarrow": "⇛", "Rscr": "ℛ", "Rsh": "↱", "RuleDelayed": "⧴", "SHCHcy": "Щ", "SHcy": "Ш", "SOFTcy": "Ь", "Sacute": "Ś", "Sc": "⪼", "Scaron": "Š", "Scedil": "Ş", "Scirc": "Ŝ", "Scy": "С", "Sfr": "𝔖", "ShortDownArrow": "↓", "ShortLeftArrow": "←", "ShortRightArrow": "→", "ShortUpArrow": "↑", "Sigma": "Σ", "SmallCircle": "∘", "Sopf": "𝕊", "Sqrt": "√", "Square": "□", "SquareIntersection": "⊓", "SquareSubset": "⊏", "SquareSubsetEqual": "⊑", "SquareSuperset": "⊐", "SquareSupersetEqual": "⊒", "SquareUnion": "⊔", "Sscr": "𝒮", "Star": "⋆", "Sub": "⋐", "Subset": "⋐", "SubsetEqual": "⊆", "Succeeds": "≻", "SucceedsEqual": "⪰", "SucceedsSlantEqual": "≽", "SucceedsTilde": "≿", "SuchThat": "∋", "Sum": "∑", "Sup": "⋑", "Superset": "⊃", "SupersetEqual": "⊇", "Supset": "⋑", "THOR": "Þ", "THORN": "Þ", "TRADE": "™", "TSHcy": "Ћ", "TScy": "Ц", "Tab": "\t", "Tau": "Τ", "Tcaron": "Ť", "Tcedil": "Ţ", "Tcy": "Т", "Tfr": "𝔗", "Therefore": "∴", "Theta": "Θ", "ThickSpace": "  ", "ThinSpace": " ", "Tilde": "∼", "TildeEqual": "≃", "TildeFullEqual": "≅", "TildeTilde": "≈", "Topf": "𝕋", "TripleDot": "⃛", "Tscr": "𝒯", "Tstrok": "Ŧ", "Uacut": "Ú", "Uacute": "Ú", "Uarr": "↟", "Uarrocir": "⥉", "Ubrcy": "Ў", "Ubreve": "Ŭ", "Ucir": "Û", "Ucirc": "Û", "Ucy": "У", "Udblac": "Ű", "Ufr": "𝔘", "Ugrav": "Ù", "Ugrave": "Ù", "Umacr": "Ū", "UnderBar": "_", "UnderBrace": "⏟", "UnderBracket": "⎵", "UnderParenthesis": "⏝", "Union": "⋃", "UnionPlus": "⊎", "Uogon": "Ų", "Uopf": "𝕌", "UpArrow": "↑", "UpArrowBar": "⤒", "UpArrowDownArrow": "⇅", "UpDownArrow": "↕", "UpEquilibrium": "⥮", "UpTee": "⊥", "UpTeeArrow": "↥", "Uparrow": "⇑", "Updownarrow": "⇕", "UpperLeftArrow": "↖", "UpperRightArrow": "↗", "Upsi": "ϒ", "Upsilon": "Υ", "Uring": "Ů", "Uscr": "𝒰", "Utilde": "Ũ", "Uum": "Ü", "Uuml": "Ü", "VDash": "⊫", "Vbar": "⫫", "Vcy": "В", "Vdash": "⊩", "Vdashl": "⫦", "Vee": "⋁", "Verbar": "‖", "Vert": "‖", "VerticalBar": "∣", "VerticalLine": "|", "VerticalSeparator": "❘", "VerticalTilde": "≀", "VeryThinSpace": " ", "Vfr": "𝔙", "Vopf": "𝕍", "Vscr": "𝒱", "Vvdash": "⊪", "Wcirc": "Ŵ", "Wedge": "⋀", "Wfr": "𝔚", "Wopf": "𝕎", "Wscr": "𝒲", "Xfr": "𝔛", "Xi": "Ξ", "Xopf": "𝕏", "Xscr": "𝒳", "YAcy": "Я", "YIcy": "Ї", "YUcy": "Ю", "Yacut": "Ý", "Yacute": "Ý", "Ycirc": "Ŷ", "Ycy": "Ы", "Yfr": "𝔜", "Yopf": "𝕐", "Yscr": "𝒴", "Yuml": "Ÿ", "ZHcy": "Ж", "Zacute": "Ź", "Zcaron": "Ž", "Zcy": "З", "Zdot": "Ż", "ZeroWidthSpace": "​", "Zeta": "Ζ", "Zfr": "ℨ", "Zopf": "ℤ", "Zscr": "𝒵", "aacut": "á", "aacute": "á", "abreve": "ă", "ac": "∾", "acE": "∾̳", "acd": "∿", "acir": "â", "acirc": "â", "acut": "´", "acute": "´", "acy": "а", "aeli": "æ", "aelig": "æ", "af": "⁡", "afr": "𝔞", "agrav": "à", "agrave": "à", "alefsym": "ℵ", "aleph": "ℵ", "alpha": "α", "amacr": "ā", "amalg": "⨿", "am": "&", "amp": "&", "and": "∧", "andand": "⩕", "andd": "⩜", "andslope": "⩘", "andv": "⩚", "ang": "∠", "ange": "⦤", "angle": "∠", "angmsd": "∡", "angmsdaa": "⦨", "angmsdab": "⦩", "angmsdac": "⦪", "angmsdad": "⦫", "angmsdae": "⦬", "angmsdaf": "⦭", "angmsdag": "⦮", "angmsdah": "⦯", "angrt": "∟", "angrtvb": "⊾", "angrtvbd": "⦝", "angsph": "∢", "angst": "Å", "angzarr": "⍼", "aogon": "ą", "aopf": "𝕒", "ap": "≈", "apE": "⩰", "apacir": "⩯", "ape": "≊", "apid": "≋", "apos": "'", "approx": "≈", "approxeq": "≊", "arin": "å", "aring": "å", "ascr": "𝒶", "ast": "*", "asymp": "≈", "asympeq": "≍", "atild": "ã", "atilde": "ã", "aum": "ä", "auml": "ä", "awconint": "∳", "awint": "⨑", "bNot": "⫭", "backcong": "≌", "backepsilon": "϶", "backprime": "‵", "backsim": "∽", "backsimeq": "⋍", "barvee": "⊽", "barwed": "⌅", "barwedge": "⌅", "bbrk": "⎵", "bbrktbrk": "⎶", "bcong": "≌", "bcy": "б", "bdquo": "„", "becaus": "∵", "because": "∵", "bemptyv": "⦰", "bepsi": "϶", "bernou": "ℬ", "beta": "β", "beth": "ℶ", "between": "≬", "bfr": "𝔟", "bigcap": "⋂", "bigcirc": "◯", "bigcup": "⋃", "bigodot": "⨀", "bigoplus": "⨁", "bigotimes": "⨂", "bigsqcup": "⨆", "bigstar": "★", "bigtriangledown": "▽", "bigtriangleup": "△", "biguplus": "⨄", "bigvee": "⋁", "bigwedge": "⋀", "bkarow": "⤍", "blacklozenge": "⧫", "blacksquare": "▪", "blacktriangle": "▴", "blacktriangledown": "▾", "blacktriangleleft": "◂", "blacktriangleright": "▸", "blank": "␣", "blk12": "▒", "blk14": "░", "blk34": "▓", "block": "█", "bne": "=⃥", "bnequiv": "≡⃥", "bnot": "⌐", "bopf": "𝕓", "bot": "⊥", "bottom": "⊥", "bowtie": "⋈", "boxDL": "╗", "boxDR": "╔", "boxDl": "╖", "boxDr": "╓", "boxH": "═", "boxHD": "╦", "boxHU": "╩", "boxHd": "╤", "boxHu": "╧", "boxUL": "╝", "boxUR": "╚", "boxUl": "╜", "boxUr": "╙", "boxV": "║", "boxVH": "╬", "boxVL": "╣", "boxVR": "╠", "boxVh": "╫", "boxVl": "╢", "boxVr": "╟", "boxbox": "⧉", "boxdL": "╕", "boxdR": "╒", "boxdl": "┐", "boxdr": "┌", "boxh": "─", "boxhD": "╥", "boxhU": "╨", "boxhd": "┬", "boxhu": "┴", "boxminus": "⊟", "boxplus": "⊞", "boxtimes": "⊠", "boxuL": "╛", "boxuR": "╘", "boxul": "┘", "boxur": "└", "boxv": "│", "boxvH": "╪", "boxvL": "╡", "boxvR": "╞", "boxvh": "┼", "boxvl": "┤", "boxvr": "├", "bprime": "‵", "breve": "˘", "brvba": "¦", "brvbar": "¦", "bscr": "𝒷", "bsemi": "⁏", "bsim": "∽", "bsime": "⋍", "bsol": "\\", "bsolb": "⧅", "bsolhsub": "⟈", "bull": "•", "bullet": "•", "bump": "≎", "bumpE": "⪮", "bumpe": "≏", "bumpeq": "≏", "cacute": "ć", "cap": "∩", "capand": "⩄", "capbrcup": "⩉", "capcap": "⩋", "capcup": "⩇", "capdot": "⩀", "caps": "∩︀", "caret": "⁁", "caron": "ˇ", "ccaps": "⩍", "ccaron": "č", "ccedi": "ç", "ccedil": "ç", "ccirc": "ĉ", "ccups": "⩌", "ccupssm": "⩐", "cdot": "ċ", "cedi": "¸", "cedil": "¸", "cemptyv": "⦲", "cen": "¢", "cent": "¢", "centerdot": "·", "cfr": "𝔠", "chcy": "ч", "check": "✓", "checkmark": "✓", "chi": "χ", "cir": "○", "cirE": "⧃", "circ": "ˆ", "circeq": "≗", "circlearrowleft": "↺", "circlearrowright": "↻", "circledR": "®", "circledS": "Ⓢ", "circledast": "⊛", "circledcirc": "⊚", "circleddash": "⊝", "cire": "≗", "cirfnint": "⨐", "cirmid": "⫯", "cirscir": "⧂", "clubs": "♣", "clubsuit": "♣", "colon": ":", "colone": "≔", "coloneq": "≔", "comma": ",", "commat": "@", "comp": "∁", "compfn": "∘", "complement": "∁", "complexes": "ℂ", "cong": "≅", "congdot": "⩭", "conint": "∮", "copf": "𝕔", "coprod": "∐", "cop": "©", "copy": "©", "copysr": "℗", "crarr": "↵", "cross": "✗", "cscr": "𝒸", "csub": "⫏", "csube": "⫑", "csup": "⫐", "csupe": "⫒", "ctdot": "⋯", "cudarrl": "⤸", "cudarrr": "⤵", "cuepr": "⋞", "cuesc": "⋟", "cularr": "↶", "cularrp": "⤽", "cup": "∪", "cupbrcap": "⩈", "cupcap": "⩆", "cupcup": "⩊", "cupdot": "⊍", "cupor": "⩅", "cups": "∪︀", "curarr": "↷", "curarrm": "⤼", "curlyeqprec": "⋞", "curlyeqsucc": "⋟", "curlyvee": "⋎", "curlywedge": "⋏", "curre": "¤", "curren": "¤", "curvearrowleft": "↶", "curvearrowright": "↷", "cuvee": "⋎", "cuwed": "⋏", "cwconint": "∲", "cwint": "∱", "cylcty": "⌭", "dArr": "⇓", "dHar": "⥥", "dagger": "†", "daleth": "ℸ", "darr": "↓", "dash": "‐", "dashv": "⊣", "dbkarow": "⤏", "dblac": "˝", "dcaron": "ď", "dcy": "д", "dd": "ⅆ", "ddagger": "‡", "ddarr": "⇊", "ddotseq": "⩷", "de": "°", "deg": "°", "delta": "δ", "demptyv": "⦱", "dfisht": "⥿", "dfr": "𝔡", "dharl": "⇃", "dharr": "⇂", "diam": "⋄", "diamond": "⋄", "diamondsuit": "♦", "diams": "♦", "die": "¨", "digamma": "ϝ", "disin": "⋲", "div": "÷", "divid": "÷", "divide": "÷", "divideontimes": "⋇", "divonx": "⋇", "djcy": "ђ", "dlcorn": "⌞", "dlcrop": "⌍", "dollar": "$", "dopf": "𝕕", "dot": "˙", "doteq": "≐", "doteqdot": "≑", "dotminus": "∸", "dotplus": "∔", "dotsquare": "⊡", "doublebarwedge": "⌆", "downarrow": "↓", "downdownarrows": "⇊", "downharpoonleft": "⇃", "downharpoonright": "⇂", "drbkarow": "⤐", "drcorn": "⌟", "drcrop": "⌌", "dscr": "𝒹", "dscy": "ѕ", "dsol": "⧶", "dstrok": "đ", "dtdot": "⋱", "dtri": "▿", "dtrif": "▾", "duarr": "⇵", "duhar": "⥯", "dwangle": "⦦", "dzcy": "џ", "dzigrarr": "⟿", "eDDot": "⩷", "eDot": "≑", "eacut": "é", "eacute": "é", "easter": "⩮", "ecaron": "ě", "ecir": "ê", "ecirc": "ê", "ecolon": "≕", "ecy": "э", "edot": "ė", "ee": "ⅇ", "efDot": "≒", "efr": "𝔢", "eg": "⪚", "egrav": "è", "egrave": "è", "egs": "⪖", "egsdot": "⪘", "el": "⪙", "elinters": "⏧", "ell": "ℓ", "els": "⪕", "elsdot": "⪗", "emacr": "ē", "empty": "∅", "emptyset": "∅", "emptyv": "∅", "emsp13": " ", "emsp14": " ", "emsp": " ", "eng": "ŋ", "ensp": " ", "eogon": "ę", "eopf": "𝕖", "epar": "⋕", "eparsl": "⧣", "eplus": "⩱", "epsi": "ε", "epsilon": "ε", "epsiv": "ϵ", "eqcirc": "≖", "eqcolon": "≕", "eqsim": "≂", "eqslantgtr": "⪖", "eqslantless": "⪕", "equals": "=", "equest": "≟", "equiv": "≡", "equivDD": "⩸", "eqvparsl": "⧥", "erDot": "≓", "erarr": "⥱", "escr": "ℯ", "esdot": "≐", "esim": "≂", "eta": "η", "et": "ð", "eth": "ð", "eum": "ë", "euml": "ë", "euro": "€", "excl": "!", "exist": "∃", "expectation": "ℰ", "exponentiale": "ⅇ", "fallingdotseq": "≒", "fcy": "ф", "female": "♀", "ffilig": "ffi", "fflig": "ff", "ffllig": "ffl", "ffr": "𝔣", "filig": "fi", "fjlig": "fj", "flat": "♭", "fllig": "fl", "fltns": "▱", "fnof": "ƒ", "fopf": "𝕗", "forall": "∀", "fork": "⋔", "forkv": "⫙", "fpartint": "⨍", "frac1": "¼", "frac12": "½", "frac13": "⅓", "frac14": "¼", "frac15": "⅕", "frac16": "⅙", "frac18": "⅛", "frac23": "⅔", "frac25": "⅖", "frac3": "¾", "frac34": "¾", "frac35": "⅗", "frac38": "⅜", "frac45": "⅘", "frac56": "⅚", "frac58": "⅝", "frac78": "⅞", "frasl": "⁄", "frown": "⌢", "fscr": "𝒻", "gE": "≧", "gEl": "⪌", "gacute": "ǵ", "gamma": "γ", "gammad": "ϝ", "gap": "⪆", "gbreve": "ğ", "gcirc": "ĝ", "gcy": "г", "gdot": "ġ", "ge": "≥", "gel": "⋛", "geq": "≥", "geqq": "≧", "geqslant": "⩾", "ges": "⩾", "gescc": "⪩", "gesdot": "⪀", "gesdoto": "⪂", "gesdotol": "⪄", "gesl": "⋛︀", "gesles": "⪔", "gfr": "𝔤", "gg": "≫", "ggg": "⋙", "gimel": "ℷ", "gjcy": "ѓ", "gl": "≷", "glE": "⪒", "gla": "⪥", "glj": "⪤", "gnE": "≩", "gnap": "⪊", "gnapprox": "⪊", "gne": "⪈", "gneq": "⪈", "gneqq": "≩", "gnsim": "⋧", "gopf": "𝕘", "grave": "`", "gscr": "ℊ", "gsim": "≳", "gsime": "⪎", "gsiml": "⪐", "g": ">", "gt": ">", "gtcc": "⪧", "gtcir": "⩺", "gtdot": "⋗", "gtlPar": "⦕", "gtquest": "⩼", "gtrapprox": "⪆", "gtrarr": "⥸", "gtrdot": "⋗", "gtreqless": "⋛", "gtreqqless": "⪌", "gtrless": "≷", "gtrsim": "≳", "gvertneqq": "≩︀", "gvnE": "≩︀", "hArr": "⇔", "hairsp": " ", "half": "½", "hamilt": "ℋ", "hardcy": "ъ", "harr": "↔", "harrcir": "⥈", "harrw": "↭", "hbar": "ℏ", "hcirc": "ĥ", "hearts": "♥", "heartsuit": "♥", "hellip": "…", "hercon": "⊹", "hfr": "𝔥", "hksearow": "⤥", "hkswarow": "⤦", "hoarr": "⇿", "homtht": "∻", "hookleftarrow": "↩", "hookrightarrow": "↪", "hopf": "𝕙", "horbar": "―", "hscr": "𝒽", "hslash": "ℏ", "hstrok": "ħ", "hybull": "⁃", "hyphen": "‐", "iacut": "í", "iacute": "í", "ic": "⁣", "icir": "î", "icirc": "î", "icy": "и", "iecy": "е", "iexc": "¡", "iexcl": "¡", "iff": "⇔", "ifr": "𝔦", "igrav": "ì", "igrave": "ì", "ii": "ⅈ", "iiiint": "⨌", "iiint": "∭", "iinfin": "⧜", "iiota": "℩", "ijlig": "ij", "imacr": "ī", "image": "ℑ", "imagline": "ℐ", "imagpart": "ℑ", "imath": "ı", "imof": "⊷", "imped": "Ƶ", "in": "∈", "incare": "℅", "infin": "∞", "infintie": "⧝", "inodot": "ı", "int": "∫", "intcal": "⊺", "integers": "ℤ", "intercal": "⊺", "intlarhk": "⨗", "intprod": "⨼", "iocy": "ё", "iogon": "į", "iopf": "𝕚", "iota": "ι", "iprod": "⨼", "iques": "¿", "iquest": "¿", "iscr": "𝒾", "isin": "∈", "isinE": "⋹", "isindot": "⋵", "isins": "⋴", "isinsv": "⋳", "isinv": "∈", "it": "⁢", "itilde": "ĩ", "iukcy": "і", "ium": "ï", "iuml": "ï", "jcirc": "ĵ", "jcy": "й", "jfr": "𝔧", "jmath": "ȷ", "jopf": "𝕛", "jscr": "𝒿", "jsercy": "ј", "jukcy": "є", "kappa": "κ", "kappav": "ϰ", "kcedil": "ķ", "kcy": "к", "kfr": "𝔨", "kgreen": "ĸ", "khcy": "х", "kjcy": "ќ", "kopf": "𝕜", "kscr": "𝓀", "lAarr": "⇚", "lArr": "⇐", "lAtail": "⤛", "lBarr": "⤎", "lE": "≦", "lEg": "⪋", "lHar": "⥢", "lacute": "ĺ", "laemptyv": "⦴", "lagran": "ℒ", "lambda": "λ", "lang": "⟨", "langd": "⦑", "langle": "⟨", "lap": "⪅", "laqu": "«", "laquo": "«", "larr": "←", "larrb": "⇤", "larrbfs": "⤟", "larrfs": "⤝", "larrhk": "↩", "larrlp": "↫", "larrpl": "⤹", "larrsim": "⥳", "larrtl": "↢", "lat": "⪫", "latail": "⤙", "late": "⪭", "lates": "⪭︀", "lbarr": "⤌", "lbbrk": "❲", "lbrace": "{", "lbrack": "[", "lbrke": "⦋", "lbrksld": "⦏", "lbrkslu": "⦍", "lcaron": "ľ", "lcedil": "ļ", "lceil": "⌈", "lcub": "{", "lcy": "л", "ldca": "⤶", "ldquo": "“", "ldquor": "„", "ldrdhar": "⥧", "ldrushar": "⥋", "ldsh": "↲", "le": "≤", "leftarrow": "←", "leftarrowtail": "↢", "leftharpoondown": "↽", "leftharpoonup": "↼", "leftleftarrows": "⇇", "leftrightarrow": "↔", "leftrightarrows": "⇆", "leftrightharpoons": "⇋", "leftrightsquigarrow": "↭", "leftthreetimes": "⋋", "leg": "⋚", "leq": "≤", "leqq": "≦", "leqslant": "⩽", "les": "⩽", "lescc": "⪨", "lesdot": "⩿", "lesdoto": "⪁", "lesdotor": "⪃", "lesg": "⋚︀", "lesges": "⪓", "lessapprox": "⪅", "lessdot": "⋖", "lesseqgtr": "⋚", "lesseqqgtr": "⪋", "lessgtr": "≶", "lesssim": "≲", "lfisht": "⥼", "lfloor": "⌊", "lfr": "𝔩", "lg": "≶", "lgE": "⪑", "lhard": "↽", "lharu": "↼", "lharul": "⥪", "lhblk": "▄", "ljcy": "љ", "ll": "≪", "llarr": "⇇", "llcorner": "⌞", "llhard": "⥫", "lltri": "◺", "lmidot": "ŀ", "lmoust": "⎰", "lmoustache": "⎰", "lnE": "≨", "lnap": "⪉", "lnapprox": "⪉", "lne": "⪇", "lneq": "⪇", "lneqq": "≨", "lnsim": "⋦", "loang": "⟬", "loarr": "⇽", "lobrk": "⟦", "longleftarrow": "⟵", "longleftrightarrow": "⟷", "longmapsto": "⟼", "longrightarrow": "⟶", "looparrowleft": "↫", "looparrowright": "↬", "lopar": "⦅", "lopf": "𝕝", "loplus": "⨭", "lotimes": "⨴", "lowast": "∗", "lowbar": "_", "loz": "◊", "lozenge": "◊", "lozf": "⧫", "lpar": "(", "lparlt": "⦓", "lrarr": "⇆", "lrcorner": "⌟", "lrhar": "⇋", "lrhard": "⥭", "lrm": "‎", "lrtri": "⊿", "lsaquo": "‹", "lscr": "𝓁", "lsh": "↰", "lsim": "≲", "lsime": "⪍", "lsimg": "⪏", "lsqb": "[", "lsquo": "‘", "lsquor": "‚", "lstrok": "ł", "l": "<", "lt": "<", "ltcc": "⪦", "ltcir": "⩹", "ltdot": "⋖", "lthree": "⋋", "ltimes": "⋉", "ltlarr": "⥶", "ltquest": "⩻", "ltrPar": "⦖", "ltri": "◃", "ltrie": "⊴", "ltrif": "◂", "lurdshar": "⥊", "luruhar": "⥦", "lvertneqq": "≨︀", "lvnE": "≨︀", "mDDot": "∺", "mac": "¯", "macr": "¯", "male": "♂", "malt": "✠", "maltese": "✠", "map": "↦", "mapsto": "↦", "mapstodown": "↧", "mapstoleft": "↤", "mapstoup": "↥", "marker": "▮", "mcomma": "⨩", "mcy": "м", "mdash": "—", "measuredangle": "∡", "mfr": "𝔪", "mho": "℧", "micr": "µ", "micro": "µ", "mid": "∣", "midast": "*", "midcir": "⫰", "middo": "·", "middot": "·", "minus": "−", "minusb": "⊟", "minusd": "∸", "minusdu": "⨪", "mlcp": "⫛", "mldr": "…", "mnplus": "∓", "models": "⊧", "mopf": "𝕞", "mp": "∓", "mscr": "𝓂", "mstpos": "∾", "mu": "μ", "multimap": "⊸", "mumap": "⊸", "nGg": "⋙̸", "nGt": "≫⃒", "nGtv": "≫̸", "nLeftarrow": "⇍", "nLeftrightarrow": "⇎", "nLl": "⋘̸", "nLt": "≪⃒", "nLtv": "≪̸", "nRightarrow": "⇏", "nVDash": "⊯", "nVdash": "⊮", "nabla": "∇", "nacute": "ń", "nang": "∠⃒", "nap": "≉", "napE": "⩰̸", "napid": "≋̸", "napos": "ʼn", "napprox": "≉", "natur": "♮", "natural": "♮", "naturals": "ℕ", "nbs": " ", "nbsp": " ", "nbump": "≎̸", "nbumpe": "≏̸", "ncap": "⩃", "ncaron": "ň", "ncedil": "ņ", "ncong": "≇", "ncongdot": "⩭̸", "ncup": "⩂", "ncy": "н", "ndash": "–", "ne": "≠", "neArr": "⇗", "nearhk": "⤤", "nearr": "↗", "nearrow": "↗", "nedot": "≐̸", "nequiv": "≢", "nesear": "⤨", "nesim": "≂̸", "nexist": "∄", "nexists": "∄", "nfr": "𝔫", "ngE": "≧̸", "nge": "≱", "ngeq": "≱", "ngeqq": "≧̸", "ngeqslant": "⩾̸", "nges": "⩾̸", "ngsim": "≵", "ngt": "≯", "ngtr": "≯", "nhArr": "⇎", "nharr": "↮", "nhpar": "⫲", "ni": "∋", "nis": "⋼", "nisd": "⋺", "niv": "∋", "njcy": "њ", "nlArr": "⇍", "nlE": "≦̸", "nlarr": "↚", "nldr": "‥", "nle": "≰", "nleftarrow": "↚", "nleftrightarrow": "↮", "nleq": "≰", "nleqq": "≦̸", "nleqslant": "⩽̸", "nles": "⩽̸", "nless": "≮", "nlsim": "≴", "nlt": "≮", "nltri": "⋪", "nltrie": "⋬", "nmid": "∤", "nopf": "𝕟", "no": "¬", "not": "¬", "notin": "∉", "notinE": "⋹̸", "notindot": "⋵̸", "notinva": "∉", "notinvb": "⋷", "notinvc": "⋶", "notni": "∌", "notniva": "∌", "notnivb": "⋾", "notnivc": "⋽", "npar": "∦", "nparallel": "∦", "nparsl": "⫽⃥", "npart": "∂̸", "npolint": "⨔", "npr": "⊀", "nprcue": "⋠", "npre": "⪯̸", "nprec": "⊀", "npreceq": "⪯̸", "nrArr": "⇏", "nrarr": "↛", "nrarrc": "⤳̸", "nrarrw": "↝̸", "nrightarrow": "↛", "nrtri": "⋫", "nrtrie": "⋭", "nsc": "⊁", "nsccue": "⋡", "nsce": "⪰̸", "nscr": "𝓃", "nshortmid": "∤", "nshortparallel": "∦", "nsim": "≁", "nsime": "≄", "nsimeq": "≄", "nsmid": "∤", "nspar": "∦", "nsqsube": "⋢", "nsqsupe": "⋣", "nsub": "⊄", "nsubE": "⫅̸", "nsube": "⊈", "nsubset": "⊂⃒", "nsubseteq": "⊈", "nsubseteqq": "⫅̸", "nsucc": "⊁", "nsucceq": "⪰̸", "nsup": "⊅", "nsupE": "⫆̸", "nsupe": "⊉", "nsupset": "⊃⃒", "nsupseteq": "⊉", "nsupseteqq": "⫆̸", "ntgl": "≹", "ntild": "ñ", "ntilde": "ñ", "ntlg": "≸", "ntriangleleft": "⋪", "ntrianglelefteq": "⋬", "ntriangleright": "⋫", "ntrianglerighteq": "⋭", "nu": "ν", "num": "#", "numero": "№", "numsp": " ", "nvDash": "⊭", "nvHarr": "⤄", "nvap": "≍⃒", "nvdash": "⊬", "nvge": "≥⃒", "nvgt": ">⃒", "nvinfin": "⧞", "nvlArr": "⤂", "nvle": "≤⃒", "nvlt": "<⃒", "nvltrie": "⊴⃒", "nvrArr": "⤃", "nvrtrie": "⊵⃒", "nvsim": "∼⃒", "nwArr": "⇖", "nwarhk": "⤣", "nwarr": "↖", "nwarrow": "↖", "nwnear": "⤧", "oS": "Ⓢ", "oacut": "ó", "oacute": "ó", "oast": "⊛", "ocir": "ô", "ocirc": "ô", "ocy": "о", "odash": "⊝", "odblac": "ő", "odiv": "⨸", "odot": "⊙", "odsold": "⦼", "oelig": "œ", "ofcir": "⦿", "ofr": "𝔬", "ogon": "˛", "ograv": "ò", "ograve": "ò", "ogt": "⧁", "ohbar": "⦵", "ohm": "Ω", "oint": "∮", "olarr": "↺", "olcir": "⦾", "olcross": "⦻", "oline": "‾", "olt": "⧀", "omacr": "ō", "omega": "ω", "omicron": "ο", "omid": "⦶", "ominus": "⊖", "oopf": "𝕠", "opar": "⦷", "operp": "⦹", "oplus": "⊕", "or": "∨", "orarr": "↻", "ord": "º", "order": "ℴ", "orderof": "ℴ", "ordf": "ª", "ordm": "º", "origof": "⊶", "oror": "⩖", "orslope": "⩗", "orv": "⩛", "oscr": "ℴ", "oslas": "ø", "oslash": "ø", "osol": "⊘", "otild": "õ", "otilde": "õ", "otimes": "⊗", "otimesas": "⨶", "oum": "ö", "ouml": "ö", "ovbar": "⌽", "par": "¶", "para": "¶", "parallel": "∥", "parsim": "⫳", "parsl": "⫽", "part": "∂", "pcy": "п", "percnt": "%", "period": ".", "permil": "‰", "perp": "⊥", "pertenk": "‱", "pfr": "𝔭", "phi": "φ", "phiv": "ϕ", "phmmat": "ℳ", "phone": "☎", "pi": "π", "pitchfork": "⋔", "piv": "ϖ", "planck": "ℏ", "planckh": "ℎ", "plankv": "ℏ", "plus": "+", "plusacir": "⨣", "plusb": "⊞", "pluscir": "⨢", "plusdo": "∔", "plusdu": "⨥", "pluse": "⩲", "plusm": "±", "plusmn": "±", "plussim": "⨦", "plustwo": "⨧", "pm": "±", "pointint": "⨕", "popf": "𝕡", "poun": "£", "pound": "£", "pr": "≺", "prE": "⪳", "prap": "⪷", "prcue": "≼", "pre": "⪯", "prec": "≺", "precapprox": "⪷", "preccurlyeq": "≼", "preceq": "⪯", "precnapprox": "⪹", "precneqq": "⪵", "precnsim": "⋨", "precsim": "≾", "prime": "′", "primes": "ℙ", "prnE": "⪵", "prnap": "⪹", "prnsim": "⋨", "prod": "∏", "profalar": "⌮", "profline": "⌒", "profsurf": "⌓", "prop": "∝", "propto": "∝", "prsim": "≾", "prurel": "⊰", "pscr": "𝓅", "psi": "ψ", "puncsp": " ", "qfr": "𝔮", "qint": "⨌", "qopf": "𝕢", "qprime": "⁗", "qscr": "𝓆", "quaternions": "ℍ", "quatint": "⨖", "quest": "?", "questeq": "≟", "quo": "\"", "quot": "\"", "rAarr": "⇛", "rArr": "⇒", "rAtail": "⤜", "rBarr": "⤏", "rHar": "⥤", "race": "∽̱", "racute": "ŕ", "radic": "√", "raemptyv": "⦳", "rang": "⟩", "rangd": "⦒", "range": "⦥", "rangle": "⟩", "raqu": "»", "raquo": "»", "rarr": "→", "rarrap": "⥵", "rarrb": "⇥", "rarrbfs": "⤠", "rarrc": "⤳", "rarrfs": "⤞", "rarrhk": "↪", "rarrlp": "↬", "rarrpl": "⥅", "rarrsim": "⥴", "rarrtl": "↣", "rarrw": "↝", "ratail": "⤚", "ratio": "∶", "rationals": "ℚ", "rbarr": "⤍", "rbbrk": "❳", "rbrace": "}", "rbrack": "]", "rbrke": "⦌", "rbrksld": "⦎", "rbrkslu": "⦐", "rcaron": "ř", "rcedil": "ŗ", "rceil": "⌉", "rcub": "}", "rcy": "р", "rdca": "⤷", "rdldhar": "⥩", "rdquo": "”", "rdquor": "”", "rdsh": "↳", "real": "ℜ", "realine": "ℛ", "realpart": "ℜ", "reals": "ℝ", "rect": "▭", "re": "®", "reg": "®", "rfisht": "⥽", "rfloor": "⌋", "rfr": "𝔯", "rhard": "⇁", "rharu": "⇀", "rharul": "⥬", "rho": "ρ", "rhov": "ϱ", "rightarrow": "→", "rightarrowtail": "↣", "rightharpoondown": "⇁", "rightharpoonup": "⇀", "rightleftarrows": "⇄", "rightleftharpoons": "⇌", "rightrightarrows": "⇉", "rightsquigarrow": "↝", "rightthreetimes": "⋌", "ring": "˚", "risingdotseq": "≓", "rlarr": "⇄", "rlhar": "⇌", "rlm": "‏", "rmoust": "⎱", "rmoustache": "⎱", "rnmid": "⫮", "roang": "⟭", "roarr": "⇾", "robrk": "⟧", "ropar": "⦆", "ropf": "𝕣", "roplus": "⨮", "rotimes": "⨵", "rpar": ")", "rpargt": "⦔", "rppolint": "⨒", "rrarr": "⇉", "rsaquo": "›", "rscr": "𝓇", "rsh": "↱", "rsqb": "]", "rsquo": "’", "rsquor": "’", "rthree": "⋌", "rtimes": "⋊", "rtri": "▹", "rtrie": "⊵", "rtrif": "▸", "rtriltri": "⧎", "ruluhar": "⥨", "rx": "℞", "sacute": "ś", "sbquo": "‚", "sc": "≻", "scE": "⪴", "scap": "⪸", "scaron": "š", "sccue": "≽", "sce": "⪰", "scedil": "ş", "scirc": "ŝ", "scnE": "⪶", "scnap": "⪺", "scnsim": "⋩", "scpolint": "⨓", "scsim": "≿", "scy": "с", "sdot": "⋅", "sdotb": "⊡", "sdote": "⩦", "seArr": "⇘", "searhk": "⤥", "searr": "↘", "searrow": "↘", "sec": "§", "sect": "§", "semi": ";", "seswar": "⤩", "setminus": "∖", "setmn": "∖", "sext": "✶", "sfr": "𝔰", "sfrown": "⌢", "sharp": "♯", "shchcy": "щ", "shcy": "ш", "shortmid": "∣", "shortparallel": "∥", "sh": "­", "shy": "­", "sigma": "σ", "sigmaf": "ς", "sigmav": "ς", "sim": "∼", "simdot": "⩪", "sime": "≃", "simeq": "≃", "simg": "⪞", "simgE": "⪠", "siml": "⪝", "simlE": "⪟", "simne": "≆", "simplus": "⨤", "simrarr": "⥲", "slarr": "←", "smallsetminus": "∖", "smashp": "⨳", "smeparsl": "⧤", "smid": "∣", "smile": "⌣", "smt": "⪪", "smte": "⪬", "smtes": "⪬︀", "softcy": "ь", "sol": "/", "solb": "⧄", "solbar": "⌿", "sopf": "𝕤", "spades": "♠", "spadesuit": "♠", "spar": "∥", "sqcap": "⊓", "sqcaps": "⊓︀", "sqcup": "⊔", "sqcups": "⊔︀", "sqsub": "⊏", "sqsube": "⊑", "sqsubset": "⊏", "sqsubseteq": "⊑", "sqsup": "⊐", "sqsupe": "⊒", "sqsupset": "⊐", "sqsupseteq": "⊒", "squ": "□", "square": "□", "squarf": "▪", "squf": "▪", "srarr": "→", "sscr": "𝓈", "ssetmn": "∖", "ssmile": "⌣", "sstarf": "⋆", "star": "☆", "starf": "★", "straightepsilon": "ϵ", "straightphi": "ϕ", "strns": "¯", "sub": "⊂", "subE": "⫅", "subdot": "⪽", "sube": "⊆", "subedot": "⫃", "submult": "⫁", "subnE": "⫋", "subne": "⊊", "subplus": "⪿", "subrarr": "⥹", "subset": "⊂", "subseteq": "⊆", "subseteqq": "⫅", "subsetneq": "⊊", "subsetneqq": "⫋", "subsim": "⫇", "subsub": "⫕", "subsup": "⫓", "succ": "≻", "succapprox": "⪸", "succcurlyeq": "≽", "succeq": "⪰", "succnapprox": "⪺", "succneqq": "⪶", "succnsim": "⋩", "succsim": "≿", "sum": "∑", "sung": "♪", "sup": "⊃", "sup1": "¹", "sup2": "²", "sup3": "³", "supE": "⫆", "supdot": "⪾", "supdsub": "⫘", "supe": "⊇", "supedot": "⫄", "suphsol": "⟉", "suphsub": "⫗", "suplarr": "⥻", "supmult": "⫂", "supnE": "⫌", "supne": "⊋", "supplus": "⫀", "supset": "⊃", "supseteq": "⊇", "supseteqq": "⫆", "supsetneq": "⊋", "supsetneqq": "⫌", "supsim": "⫈", "supsub": "⫔", "supsup": "⫖", "swArr": "⇙", "swarhk": "⤦", "swarr": "↙", "swarrow": "↙", "swnwar": "⤪", "szli": "ß", "szlig": "ß", "target": "⌖", "tau": "τ", "tbrk": "⎴", "tcaron": "ť", "tcedil": "ţ", "tcy": "т", "tdot": "⃛", "telrec": "⌕", "tfr": "𝔱", "there4": "∴", "therefore": "∴", "theta": "θ", "thetasym": "ϑ", "thetav": "ϑ", "thickapprox": "≈", "thicksim": "∼", "thinsp": " ", "thkap": "≈", "thksim": "∼", "thor": "þ", "thorn": "þ", "tilde": "˜", "time": "×", "times": "×", "timesb": "⊠", "timesbar": "⨱", "timesd": "⨰", "tint": "∭", "toea": "⤨", "top": "⊤", "topbot": "⌶", "topcir": "⫱", "topf": "𝕥", "topfork": "⫚", "tosa": "⤩", "tprime": "‴", "trade": "™", "triangle": "▵", "triangledown": "▿", "triangleleft": "◃", "trianglelefteq": "⊴", "triangleq": "≜", "triangleright": "▹", "trianglerighteq": "⊵", "tridot": "◬", "trie": "≜", "triminus": "⨺", "triplus": "⨹", "trisb": "⧍", "tritime": "⨻", "trpezium": "⏢", "tscr": "𝓉", "tscy": "ц", "tshcy": "ћ", "tstrok": "ŧ", "twixt": "≬", "twoheadleftarrow": "↞", "twoheadrightarrow": "↠", "uArr": "⇑", "uHar": "⥣", "uacut": "ú", "uacute": "ú", "uarr": "↑", "ubrcy": "ў", "ubreve": "ŭ", "ucir": "û", "ucirc": "û", "ucy": "у", "udarr": "⇅", "udblac": "ű", "udhar": "⥮", "ufisht": "⥾", "ufr": "𝔲", "ugrav": "ù", "ugrave": "ù", "uharl": "↿", "uharr": "↾", "uhblk": "▀", "ulcorn": "⌜", "ulcorner": "⌜", "ulcrop": "⌏", "ultri": "◸", "umacr": "ū", "um": "¨", "uml": "¨", "uogon": "ų", "uopf": "𝕦", "uparrow": "↑", "updownarrow": "↕", "upharpoonleft": "↿", "upharpoonright": "↾", "uplus": "⊎", "upsi": "υ", "upsih": "ϒ", "upsilon": "υ", "upuparrows": "⇈", "urcorn": "⌝", "urcorner": "⌝", "urcrop": "⌎", "uring": "ů", "urtri": "◹", "uscr": "𝓊", "utdot": "⋰", "utilde": "ũ", "utri": "▵", "utrif": "▴", "uuarr": "⇈", "uum": "ü", "uuml": "ü", "uwangle": "⦧", "vArr": "⇕", "vBar": "⫨", "vBarv": "⫩", "vDash": "⊨", "vangrt": "⦜", "varepsilon": "ϵ", "varkappa": "ϰ", "varnothing": "∅", "varphi": "ϕ", "varpi": "ϖ", "varpropto": "∝", "varr": "↕", "varrho": "ϱ", "varsigma": "ς", "varsubsetneq": "⊊︀", "varsubsetneqq": "⫋︀", "varsupsetneq": "⊋︀", "varsupsetneqq": "⫌︀", "vartheta": "ϑ", "vartriangleleft": "⊲", "vartriangleright": "⊳", "vcy": "в", "vdash": "⊢", "vee": "∨", "veebar": "⊻", "veeeq": "≚", "vellip": "⋮", "verbar": "|", "vert": "|", "vfr": "𝔳", "vltri": "⊲", "vnsub": "⊂⃒", "vnsup": "⊃⃒", "vopf": "𝕧", "vprop": "∝", "vrtri": "⊳", "vscr": "𝓋", "vsubnE": "⫋︀", "vsubne": "⊊︀", "vsupnE": "⫌︀", "vsupne": "⊋︀", "vzigzag": "⦚", "wcirc": "ŵ", "wedbar": "⩟", "wedge": "∧", "wedgeq": "≙", "weierp": "℘", "wfr": "𝔴", "wopf": "𝕨", "wp": "℘", "wr": "≀", "wreath": "≀", "wscr": "𝓌", "xcap": "⋂", "xcirc": "◯", "xcup": "⋃", "xdtri": "▽", "xfr": "𝔵", "xhArr": "⟺", "xharr": "⟷", "xi": "ξ", "xlArr": "⟸", "xlarr": "⟵", "xmap": "⟼", "xnis": "⋻", "xodot": "⨀", "xopf": "𝕩", "xoplus": "⨁", "xotime": "⨂", "xrArr": "⟹", "xrarr": "⟶", "xscr": "𝓍", "xsqcup": "⨆", "xuplus": "⨄", "xutri": "△", "xvee": "⋁", "xwedge": "⋀", "yacut": "ý", "yacute": "ý", "yacy": "я", "ycirc": "ŷ", "ycy": "ы", "ye": "¥", "yen": "¥", "yfr": "𝔶", "yicy": "ї", "yopf": "𝕪", "yscr": "𝓎", "yucy": "ю", "yum": "ÿ", "yuml": "ÿ", "zacute": "ź", "zcaron": "ž", "zcy": "з", "zdot": "ż", "zeetrf": "ℨ", "zeta": "ζ", "zfr": "𝔷", "zhcy": "ж", "zigrarr": "⇝", "zopf": "𝕫", "zscr": "𝓏", "zwj": "‍", "zwnj": "‌" } },{}],57:[function(require,module,exports){ module.exports={ "0": "�", "128": "€", "130": "‚", "131": "ƒ", "132": "„", "133": "…", "134": "†", "135": "‡", "136": "ˆ", "137": "‰", "138": "Š", "139": "‹", "140": "Œ", "142": "Ž", "145": "‘", "146": "’", "147": "“", "148": "”", "149": "•", "150": "–", "151": "—", "152": "˜", "153": "™", "154": "š", "155": "›", "156": "œ", "158": "ž", "159": "Ÿ" } },{}],58:[function(require,module,exports){ 'use strict'; var alphabetical = require('is-alphabetical'); var decimal = require('is-decimal'); module.exports = alphanumerical; /* Check if the given character code, or the character * code at the first character, is alphanumerical. */ function alphanumerical(character) { return alphabetical(character) || decimal(character); } },{"is-alphabetical":49,"is-decimal":50}],59:[function(require,module,exports){ 'use strict'; module.exports = hexadecimal; /* Check if the given character code, or the character * code at the first character, is hexadecimal. */ function hexadecimal(character) { var code = typeof character === 'string' ? character.charCodeAt(0) : character; return (code >= 97 /* a */ && code <= 102 /* z */) || (code >= 65 /* A */ && code <= 70 /* Z */) || (code >= 48 /* A */ && code <= 57 /* Z */); } },{}],60:[function(require,module,exports){ /*! * repeat-string * * Copyright (c) 2014-2015, Jon Schlinkert. * Licensed under the MIT License. */ 'use strict'; /** * Results cache */ var res = ''; var cache; /** * Expose `repeat` */ module.exports = repeat; /** * Repeat the given `string` the specified `number` * of times. * * **Example:** * * ```js * var repeat = require('repeat-string'); * repeat('A', 5); * //=> AAAAA * ``` * * @param {String} `string` The string to repeat * @param {Number} `number` The number of times to repeat the string * @return {String} Repeated string * @api public */ function repeat(str, num) { if (typeof str !== 'string') { throw new TypeError('expected a string'); } // cover common, quick use cases if (num === 1) return str; if (num === 2) return str + str; var max = str.length * num; if (cache !== str || typeof cache === 'undefined') { cache = str; res = ''; } else if (res.length >= max) { return res.substr(0, max); } while (max > res.length && num > 1) { if (num & 1) { res += str; } num >>= 1; str += str; } res += str; res = res.substr(0, max); return res; } },{}],61:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2016 Titus Wormer * @license MIT * @module state-toggle * @fileoverview Enter/exit a state. */ 'use strict'; /* eslint-env commonjs */ /* Expose. */ module.exports = factory; /** * Construct a state `toggler`: a function which inverses * `property` in context based on its current value. * The by `toggler` returned function restores that value. * * @param {string} key - Property to toggle. * @param {boolean} state - Default state. * @param {Object?} [ctx] - Context object. * @return {Function} - Enter. */ function factory(key, state, ctx) { /** * Enter a state. * * @return {Function} - Exit state. */ return function () { var context = ctx || this; var current = context[key]; context[key] = !state; /** * Cancel state to its value before entering. */ return function () { context[key] = current; }; }; } },{}],62:[function(require,module,exports){ 'use strict'; module.exports = trimTrailingLines; var line = '\n'; /* Remove final newline characters from `value`. */ function trimTrailingLines(value) { var val = String(value); var index = val.length; while (val.charAt(--index) === line) { /* empty */ } return val.slice(0, index + 1); } },{}],63:[function(require,module,exports){ exports = module.exports = trim; function trim(str){ return str.replace(/^\s*|\s*$/g, ''); } exports.left = function(str){ return str.replace(/^\s*/, ''); }; exports.right = function(str){ return str.replace(/\s*$/, ''); }; },{}],64:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module unherit * @fileoverview Create a custom constructor which can be modified * without affecting the original class. */ 'use strict'; /* Dependencies. */ var xtend = require('xtend'); var inherits = require('inherits'); /* Expose. */ module.exports = unherit; /** * Create a custom constructor which can be modified * without affecting the original class. * * @param {Function} Super - Super-class. * @return {Function} - Constructor acting like `Super`, * which can be modified without affecting the original * class. */ function unherit(Super) { var result; var key; var value; inherits(Of, Super); inherits(From, Of); /* Clone values. */ result = Of.prototype; for (key in result) { value = result[key]; if (value && typeof value === 'object') { result[key] = 'concat' in value ? value.concat() : xtend(value); } } return Of; /** * Constructor accepting a single argument, * which itself is an `arguments` object. */ function From(parameters) { return Super.apply(this, parameters); } /** * Constructor accepting variadic arguments. */ function Of() { if (!(this instanceof Of)) { return new From(arguments); } return Super.apply(this, arguments); } } },{"inherits":65,"xtend":69}],65:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } },{}],66:[function(require,module,exports){ 'use strict'; var visit = require('unist-util-visit'); module.exports = removePosition; /* Remove `position`s from `tree`. */ function removePosition(node, force) { visit(node, force ? hard : soft); return node; } function hard(node) { delete node.position; } function soft(node) { node.position = undefined; } },{"unist-util-visit":67}],67:[function(require,module,exports){ 'use strict'; /* Expose. */ module.exports = visit; /* Visit. */ function visit(tree, type, visitor, reverse) { if (typeof type === 'function') { reverse = visitor; visitor = type; type = null; } one(tree); /* Visit a single node. */ function one(node, index, parent) { var result; index = index || (parent ? 0 : null); if (!type || node.type === type) { result = visitor(node, index, parent || null); } if (node.children && result !== false) { return all(node.children, node); } return result; } /* Visit children in `parent`. */ function all(children, parent) { var step = reverse ? -1 : 1; var max = children.length; var min = -1; var index = (reverse ? max : min) + step; var child; while (index > min && index < max) { child = children[index]; if (child && one(child, index, parent) === false) { return false; } index += step; } return true; } } },{}],68:[function(require,module,exports){ 'use strict'; /* Expose. */ module.exports = factory; /* Factory. */ function factory(file) { var contents = indices(String(file)); return { toPosition: offsetToPositionFactory(contents), toOffset: positionToOffsetFactory(contents) }; } /* Factory to get the line and column-based `position` for * `offset` in the bound indices. */ function offsetToPositionFactory(indices) { return offsetToPosition; /* Get the line and column-based `position` for * `offset` in the bound indices. */ function offsetToPosition(offset) { var index = -1; var length = indices.length; if (offset < 0) { return {}; } while (++index < length) { if (indices[index] > offset) { return { line: index + 1, column: (offset - (indices[index - 1] || 0)) + 1, offset: offset }; } } return {}; } } /* Factory to get the `offset` for a line and column-based * `position` in the bound indices. */ function positionToOffsetFactory(indices) { return positionToOffset; /* Get the `offset` for a line and column-based * `position` in the bound indices. */ function positionToOffset(position) { var line = position && position.line; var column = position && position.column; if (!isNaN(line) && !isNaN(column) && line - 1 in indices) { return ((indices[line - 2] || 0) + column - 1) || 0; } return -1; } } /* Get indices of line-breaks in `value`. */ function indices(value) { var result = []; var index = value.indexOf('\n'); while (index !== -1) { result.push(index + 1); index = value.indexOf('\n', index + 1); } result.push(value.length + 1); return result; } },{}],69:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; function extend() { var target = {} for (var i = 0; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } },{}],"remark-parse":[function(require,module,exports){ 'use strict'; var unherit = require('unherit'); var xtend = require('xtend'); var Parser = require('./lib/parser.js'); module.exports = parse; parse.Parser = Parser; function parse(options) { var Local = unherit(Parser); Local.prototype.options = xtend(Local.prototype.options, this.data('settings'), options); this.Parser = Local; } },{"./lib/parser.js":14,"unherit":64,"xtend":69}]},{},[]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImxpYi9ibG9jay1lbGVtZW50cy5qc29uIiwibGliL2RlY29kZS5qcyIsImxpYi9kZWZhdWx0cy5qcyIsImxpYi9sb2NhdGUvYnJlYWsuanMiLCJsaWIvbG9jYXRlL2NvZGUtaW5saW5lLmpzIiwibGliL2xvY2F0ZS9kZWxldGUuanMiLCJsaWIvbG9jYXRlL2VtcGhhc2lzLmpzIiwibGliL2xvY2F0ZS9lc2NhcGUuanMiLCJsaWIvbG9jYXRlL2xpbmsuanMiLCJsaWIvbG9jYXRlL3N0cm9uZy5qcyIsImxpYi9sb2NhdGUvdGFnLmpzIiwibGliL2xvY2F0ZS91cmwuanMiLCJsaWIvcGFyc2UuanMiLCJsaWIvcGFyc2VyLmpzIiwibGliL3NldC1vcHRpb25zLmpzIiwibGliL3Rva2VuaXplL2F1dG8tbGluay5qcyIsImxpYi90b2tlbml6ZS9ibG9ja3F1b3RlLmpzIiwibGliL3Rva2VuaXplL2JyZWFrLmpzIiwibGliL3Rva2VuaXplL2NvZGUtZmVuY2VkLmpzIiwibGliL3Rva2VuaXplL2NvZGUtaW5kZW50ZWQuanMiLCJsaWIvdG9rZW5pemUvY29kZS1pbmxpbmUuanMiLCJsaWIvdG9rZW5pemUvZGVmaW5pdGlvbi5qcyIsImxpYi90b2tlbml6ZS9kZWxldGUuanMiLCJsaWIvdG9rZW5pemUvZW1waGFzaXMuanMiLCJsaWIvdG9rZW5pemUvZXNjYXBlLmpzIiwibGliL3Rva2VuaXplL2Zvb3Rub3RlLWRlZmluaXRpb24uanMiLCJsaWIvdG9rZW5pemUvaGVhZGluZy1hdHguanMiLCJsaWIvdG9rZW5pemUvaGVhZGluZy1zZXRleHQuanMiLCJsaWIvdG9rZW5pemUvaHRtbC1ibG9jay5qcyIsImxpYi90b2tlbml6ZS9odG1sLWlubGluZS5qcyIsImxpYi90b2tlbml6ZS9saW5rLmpzIiwibGliL3Rva2VuaXplL2xpc3QuanMiLCJsaWIvdG9rZW5pemUvbmV3bGluZS5qcyIsImxpYi90b2tlbml6ZS9wYXJhZ3JhcGguanMiLCJsaWIvdG9rZW5pemUvcmVmZXJlbmNlLmpzIiwibGliL3Rva2VuaXplL3N0cm9uZy5qcyIsImxpYi90b2tlbml6ZS90YWJsZS5qcyIsImxpYi90b2tlbml6ZS90ZXh0LmpzIiwibGliL3Rva2VuaXplL3RoZW1hdGljLWJyZWFrLmpzIiwibGliL3Rva2VuaXplL3VybC5qcyIsImxpYi90b2tlbml6ZXIuanMiLCJsaWIvdW5lc2NhcGUuanMiLCJsaWIvdXRpbC9nZXQtaW5kZW50YXRpb24uanMiLCJsaWIvdXRpbC9odG1sLmpzIiwibGliL3V0aWwvaW50ZXJydXB0LmpzIiwibGliL3V0aWwvbm9ybWFsaXplLmpzIiwibGliL3V0aWwvcmVtb3ZlLWluZGVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvbGxhcHNlLXdoaXRlLXNwYWNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWFscGhhYmV0aWNhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1kZWNpbWFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLXdvcmQtY2hhcmFjdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21hcmtkb3duLWVzY2FwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2UtZW50aXRpZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2UtZW50aXRpZXMvbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3kvaW5kZXguanNvbiIsIm5vZGVfbW9kdWxlcy9wYXJzZS1lbnRpdGllcy9ub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzL2luZGV4Lmpzb24iLCJub2RlX21vZHVsZXMvcGFyc2UtZW50aXRpZXMvbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1yZWZlcmVuY2UtaW52YWxpZC9pbmRleC5qc29uIiwibm9kZV9tb2R1bGVzL3BhcnNlLWVudGl0aWVzL25vZGVfbW9kdWxlcy9pcy1hbHBoYW51bWVyaWNhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZS1lbnRpdGllcy9ub2RlX21vZHVsZXMvaXMtaGV4YWRlY2ltYWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVwZWF0LXN0cmluZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdGF0ZS10b2dnbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHJpbS10cmFpbGluZy1saW5lcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90cmltL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VuaGVyaXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdW5oZXJpdC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLXJlbW92ZS1wb3NpdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLXJlbW92ZS1wb3NpdGlvbi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92ZmlsZS1sb2NhdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94dGVuZC9pbW11dGFibGUuanMiLCJyZW1hcmstcGFyc2UiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6ZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaHJFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIm1vZHVsZS5leHBvcnRzPVtcbiAgXCJhZGRyZXNzXCIsXG4gIFwiYXJ0aWNsZVwiLFxuICBcImFzaWRlXCIsXG4gIFwiYmFzZVwiLFxuICBcImJhc2Vmb250XCIsXG4gIFwiYmxvY2txdW90ZVwiLFxuICBcImJvZHlcIixcbiAgXCJjYXB0aW9uXCIsXG4gIFwiY2VudGVyXCIsXG4gIFwiY29sXCIsXG4gIFwiY29sZ3JvdXBcIixcbiAgXCJkZFwiLFxuICBcImRldGFpbHNcIixcbiAgXCJkaWFsb2dcIixcbiAgXCJkaXJcIixcbiAgXCJkaXZcIixcbiAgXCJkbFwiLFxuICBcImR0XCIsXG4gIFwiZmllbGRzZXRcIixcbiAgXCJmaWdjYXB0aW9uXCIsXG4gIFwiZmlndXJlXCIsXG4gIFwiZm9vdGVyXCIsXG4gIFwiZm9ybVwiLFxuICBcImZyYW1lXCIsXG4gIFwiZnJhbWVzZXRcIixcbiAgXCJoMVwiLFxuICBcImgyXCIsXG4gIFwiaDNcIixcbiAgXCJoNFwiLFxuICBcImg1XCIsXG4gIFwiaDZcIixcbiAgXCJoZWFkXCIsXG4gIFwiaGVhZGVyXCIsXG4gIFwiaGdyb3VwXCIsXG4gIFwiaHJcIixcbiAgXCJodG1sXCIsXG4gIFwiaWZyYW1lXCIsXG4gIFwibGVnZW5kXCIsXG4gIFwibGlcIixcbiAgXCJsaW5rXCIsXG4gIFwibWFpblwiLFxuICBcIm1lbnVcIixcbiAgXCJtZW51aXRlbVwiLFxuICBcIm1ldGFcIixcbiAgXCJuYXZcIixcbiAgXCJub2ZyYW1lc1wiLFxuICBcIm9sXCIsXG4gIFwib3B0Z3JvdXBcIixcbiAgXCJvcHRpb25cIixcbiAgXCJwXCIsXG4gIFwicGFyYW1cIixcbiAgXCJwcmVcIixcbiAgXCJzZWN0aW9uXCIsXG4gIFwic291cmNlXCIsXG4gIFwidGl0bGVcIixcbiAgXCJzdW1tYXJ5XCIsXG4gIFwidGFibGVcIixcbiAgXCJ0Ym9keVwiLFxuICBcInRkXCIsXG4gIFwidGZvb3RcIixcbiAgXCJ0aFwiLFxuICBcInRoZWFkXCIsXG4gIFwidGl0bGVcIixcbiAgXCJ0clwiLFxuICBcInRyYWNrXCIsXG4gIFwidWxcIlxuXVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW50aXRpZXMgPSByZXF1aXJlKCdwYXJzZS1lbnRpdGllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG5cbi8qIEZhY3RvcnkgdG8gY3JlYXRlIGFuIGVudGl0eSBkZWNvZGVyLiAqL1xuZnVuY3Rpb24gZmFjdG9yeShjdHgpIHtcbiAgZGVjb2Rlci5yYXcgPSBkZWNvZGVSYXc7XG5cbiAgcmV0dXJuIGRlY29kZXI7XG5cbiAgLyogTm9ybWFsaXplIGBwb3NpdGlvbmAgdG8gYWRkIGFuIGBpbmRlbnRgLiAqL1xuICBmdW5jdGlvbiBub3JtYWxpemUocG9zaXRpb24pIHtcbiAgICB2YXIgb2Zmc2V0cyA9IGN0eC5vZmZzZXQ7XG4gICAgdmFyIGxpbmUgPSBwb3NpdGlvbi5saW5lO1xuICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2xpbmUpIHtcbiAgICAgIGlmICghKGxpbmUgaW4gb2Zmc2V0cykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5wdXNoKChvZmZzZXRzW2xpbmVdIHx8IDApICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBwb3NpdGlvbixcbiAgICAgIGluZGVudDogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIC8qIEhhbmRsZSBhIHdhcm5pbmcuXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vd29vb3JtL3BhcnNlLWVudGl0aWVzXG4gICAqIGZvciB0aGUgd2FybmluZ3MuICovXG4gIGZ1bmN0aW9uIGhhbmRsZVdhcm5pbmcocmVhc29uLCBwb3NpdGlvbiwgY29kZSkge1xuICAgIGlmIChjb2RlID09PSAzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY3R4LmZpbGUubWVzc2FnZShyZWFzb24sIHBvc2l0aW9uKTtcbiAgfVxuXG4gIC8qIERlY29kZSBgdmFsdWVgIChhdCBgcG9zaXRpb25gKSBpbnRvIHRleHQtbm9kZXMuICovXG4gIGZ1bmN0aW9uIGRlY29kZXIodmFsdWUsIHBvc2l0aW9uLCBoYW5kbGVyKSB7XG4gICAgZW50aXRpZXModmFsdWUsIHtcbiAgICAgIHBvc2l0aW9uOiBub3JtYWxpemUocG9zaXRpb24pLFxuICAgICAgd2FybmluZzogaGFuZGxlV2FybmluZyxcbiAgICAgIHRleHQ6IGhhbmRsZXIsXG4gICAgICByZWZlcmVuY2U6IGhhbmRsZXIsXG4gICAgICB0ZXh0Q29udGV4dDogY3R4LFxuICAgICAgcmVmZXJlbmNlQ29udGV4dDogY3R4XG4gICAgfSk7XG4gIH1cblxuICAvKiBEZWNvZGUgYHZhbHVlYCAoYXQgYHBvc2l0aW9uYCkgaW50byBhIHN0cmluZy4gKi9cbiAgZnVuY3Rpb24gZGVjb2RlUmF3KHZhbHVlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBlbnRpdGllcyh2YWx1ZSwge1xuICAgICAgcG9zaXRpb246IG5vcm1hbGl6ZShwb3NpdGlvbiksXG4gICAgICB3YXJuaW5nOiBoYW5kbGVXYXJuaW5nXG4gICAgfSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBvc2l0aW9uOiB0cnVlLFxuICBnZm06IHRydWUsXG4gIGNvbW1vbm1hcms6IGZhbHNlLFxuICBmb290bm90ZXM6IGZhbHNlLFxuICBwZWRhbnRpYzogZmFsc2UsXG4gIGJsb2NrczogcmVxdWlyZSgnLi9ibG9jay1lbGVtZW50cy5qc29uJylcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCdcXG4nLCBmcm9tSW5kZXgpO1xuXG4gIHdoaWxlIChpbmRleCA+IGZyb21JbmRleCkge1xuICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXggLSAxKSAhPT0gJyAnKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpbmRleC0tO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvY2F0ZTtcblxuZnVuY3Rpb24gbG9jYXRlKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlLmluZGV4T2YoJ2AnLCBmcm9tSW5kZXgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvY2F0ZTtcblxuZnVuY3Rpb24gbG9jYXRlKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlLmluZGV4T2YoJ35+JywgZnJvbUluZGV4KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBsb2NhdGU7XG5cbmZ1bmN0aW9uIGxvY2F0ZSh2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBhc3RlcmlzayA9IHZhbHVlLmluZGV4T2YoJyonLCBmcm9tSW5kZXgpO1xuICB2YXIgdW5kZXJzY29yZSA9IHZhbHVlLmluZGV4T2YoJ18nLCBmcm9tSW5kZXgpO1xuXG4gIGlmICh1bmRlcnNjb3JlID09PSAtMSkge1xuICAgIHJldHVybiBhc3RlcmlzaztcbiAgfVxuXG4gIGlmIChhc3RlcmlzayA9PT0gLTEpIHtcbiAgICByZXR1cm4gdW5kZXJzY29yZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlcnNjb3JlIDwgYXN0ZXJpc2sgPyB1bmRlcnNjb3JlIDogYXN0ZXJpc2s7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICByZXR1cm4gdmFsdWUuaW5kZXhPZignXFxcXCcsIGZyb21JbmRleCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgbGluayA9IHZhbHVlLmluZGV4T2YoJ1snLCBmcm9tSW5kZXgpO1xuICB2YXIgaW1hZ2UgPSB2YWx1ZS5pbmRleE9mKCchWycsIGZyb21JbmRleCk7XG5cbiAgaWYgKGltYWdlID09PSAtMSkge1xuICAgIHJldHVybiBsaW5rO1xuICB9XG5cbiAgLyogTGluayBjYW4gbmV2ZXIgYmUgYC0xYCBpZiBhbiBpbWFnZSBpcyBmb3VuZCwgc28gd2UgZG9u4oCZdCBuZWVkXG4gICAqIHRvIGNoZWNrIGZvciB0aGF0IDopICovXG4gIHJldHVybiBsaW5rIDwgaW1hZ2UgPyBsaW5rIDogaW1hZ2U7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgYXN0ZXJpc2sgPSB2YWx1ZS5pbmRleE9mKCcqKicsIGZyb21JbmRleCk7XG4gIHZhciB1bmRlcnNjb3JlID0gdmFsdWUuaW5kZXhPZignX18nLCBmcm9tSW5kZXgpO1xuXG4gIGlmICh1bmRlcnNjb3JlID09PSAtMSkge1xuICAgIHJldHVybiBhc3RlcmlzaztcbiAgfVxuXG4gIGlmIChhc3RlcmlzayA9PT0gLTEpIHtcbiAgICByZXR1cm4gdW5kZXJzY29yZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlcnNjb3JlIDwgYXN0ZXJpc2sgPyB1bmRlcnNjb3JlIDogYXN0ZXJpc2s7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICByZXR1cm4gdmFsdWUuaW5kZXhPZignPCcsIGZyb21JbmRleCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG52YXIgUFJPVE9DT0xTID0gWydodHRwczovLycsICdodHRwOi8vJywgJ21haWx0bzonXTtcblxuZnVuY3Rpb24gbG9jYXRlKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IFBST1RPQ09MUy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbWluID0gLTE7XG4gIHZhciBwb3NpdGlvbjtcblxuICBpZiAoIXRoaXMub3B0aW9ucy5nZm0pIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHBvc2l0aW9uID0gdmFsdWUuaW5kZXhPZihQUk9UT0NPTFNbaW5kZXhdLCBmcm9tSW5kZXgpO1xuXG4gICAgaWYgKHBvc2l0aW9uICE9PSAtMSAmJiAocG9zaXRpb24gPCBtaW4gfHwgbWluID09PSAtMSkpIHtcbiAgICAgIG1pbiA9IHBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaW47XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJyk7XG52YXIgcmVtb3ZlUG9zaXRpb24gPSByZXF1aXJlKCd1bmlzdC11dGlsLXJlbW92ZS1wb3NpdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuXG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgRVhQUkVTU0lPTl9MSU5FX0JSRUFLUyA9IC9cXHJcXG58XFxyL2c7XG5cbi8qIFBhcnNlIHRoZSBib3VuZCBmaWxlLiAqL1xuZnVuY3Rpb24gcGFyc2UoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHZhbHVlID0gU3RyaW5nKHNlbGYuZmlsZSk7XG4gIHZhciBzdGFydCA9IHtsaW5lOiAxLCBjb2x1bW46IDEsIG9mZnNldDogMH07XG4gIHZhciBjb250ZW50ID0geHRlbmQoc3RhcnQpO1xuICB2YXIgbm9kZTtcblxuICAvKiBDbGVhbiBub24tdW5peCBuZXdsaW5lczogYFxcclxcbmAgYW5kIGBcXHJgIGFyZSBhbGxcbiAgICogY2hhbmdlZCB0byBgXFxuYC4gIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgcG9zaXRpb25hbFxuICAgKiBpbmZvcm1hdGlvbi4gKi9cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEVYUFJFU1NJT05fTElORV9CUkVBS1MsIENfTkVXTElORSk7XG5cbiAgaWYgKHZhbHVlLmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG5cbiAgICBjb250ZW50LmNvbHVtbisrO1xuICAgIGNvbnRlbnQub2Zmc2V0Kys7XG4gIH1cblxuICBub2RlID0ge1xuICAgIHR5cGU6ICdyb290JyxcbiAgICBjaGlsZHJlbjogc2VsZi50b2tlbml6ZUJsb2NrKHZhbHVlLCBjb250ZW50KSxcbiAgICBwb3NpdGlvbjoge1xuICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgZW5kOiBzZWxmLmVvZiB8fCB4dGVuZChzdGFydClcbiAgICB9XG4gIH07XG5cbiAgaWYgKCFzZWxmLm9wdGlvbnMucG9zaXRpb24pIHtcbiAgICByZW1vdmVQb3NpdGlvbihub2RlLCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgeHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpO1xudmFyIHRvZ2dsZSA9IHJlcXVpcmUoJ3N0YXRlLXRvZ2dsZScpO1xudmFyIHZmaWxlTG9jYXRpb24gPSByZXF1aXJlKCd2ZmlsZS1sb2NhdGlvbicpO1xudmFyIHVuZXNjYXBlID0gcmVxdWlyZSgnLi91bmVzY2FwZScpO1xudmFyIGRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG52YXIgdG9rZW5pemVyID0gcmVxdWlyZSgnLi90b2tlbml6ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXI7XG5cbmZ1bmN0aW9uIFBhcnNlcihkb2MsIGZpbGUpIHtcbiAgdGhpcy5maWxlID0gZmlsZTtcbiAgdGhpcy5vZmZzZXQgPSB7fTtcbiAgdGhpcy5vcHRpb25zID0geHRlbmQodGhpcy5vcHRpb25zKTtcbiAgdGhpcy5zZXRPcHRpb25zKHt9KTtcblxuICB0aGlzLmluTGlzdCA9IGZhbHNlO1xuICB0aGlzLmluQmxvY2sgPSBmYWxzZTtcbiAgdGhpcy5pbkxpbmsgPSBmYWxzZTtcbiAgdGhpcy5hdFN0YXJ0ID0gdHJ1ZTtcblxuICB0aGlzLnRvT2Zmc2V0ID0gdmZpbGVMb2NhdGlvbihmaWxlKS50b09mZnNldDtcbiAgdGhpcy51bmVzY2FwZSA9IHVuZXNjYXBlKHRoaXMsICdlc2NhcGUnKTtcbiAgdGhpcy5kZWNvZGUgPSBkZWNvZGUodGhpcyk7XG59XG5cbnZhciBwcm90byA9IFBhcnNlci5wcm90b3R5cGU7XG5cbi8qIEV4cG9zZSBjb3JlLiAqL1xucHJvdG8uc2V0T3B0aW9ucyA9IHJlcXVpcmUoJy4vc2V0LW9wdGlvbnMnKTtcbnByb3RvLnBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xuXG4vKiBFeHBvc2UgYGRlZmF1bHRzYC4gKi9cbnByb3RvLm9wdGlvbnMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qIEVudGVyIGFuZCBleGl0IGhlbHBlcnMuICovXG5wcm90by5leGl0U3RhcnQgPSB0b2dnbGUoJ2F0U3RhcnQnLCB0cnVlKTtcbnByb3RvLmVudGVyTGlzdCA9IHRvZ2dsZSgnaW5MaXN0JywgZmFsc2UpO1xucHJvdG8uZW50ZXJMaW5rID0gdG9nZ2xlKCdpbkxpbmsnLCBmYWxzZSk7XG5wcm90by5lbnRlckJsb2NrID0gdG9nZ2xlKCdpbkJsb2NrJywgZmFsc2UpO1xuXG4vKiBOb2RlcyB0aGF0IGNhbiBpbnRlcnVwdCBhIHBhcmFncmFwaDpcbiAqXG4gKiBgYGBtYXJrZG93blxuICogQSBwYXJhZ3JhcGgsIGZvbGxvd2VkIGJ5IGEgdGhlbWF0aWMgYnJlYWsuXG4gKiBfX19cbiAqIGBgYFxuICpcbiAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgdGhlbWF0aWMgYnJlYWsg4oCcaW50ZXJ1cHRz4oCdXG4gKiB0aGUgcGFyYWdyYXBoLiAqL1xucHJvdG8uaW50ZXJydXB0UGFyYWdyYXBoID0gW1xuICBbJ3RoZW1hdGljQnJlYWsnXSxcbiAgWydhdHhIZWFkaW5nJ10sXG4gIFsnZmVuY2VkQ29kZSddLFxuICBbJ2Jsb2NrcXVvdGUnXSxcbiAgWydodG1sJ10sXG4gIFsnc2V0ZXh0SGVhZGluZycsIHtjb21tb25tYXJrOiBmYWxzZX1dLFxuICBbJ2RlZmluaXRpb24nLCB7Y29tbW9ubWFyazogZmFsc2V9XSxcbiAgWydmb290bm90ZScsIHtjb21tb25tYXJrOiBmYWxzZX1dXG5dO1xuXG4vKiBOb2RlcyB0aGF0IGNhbiBpbnRlcnVwdCBhIGxpc3Q6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIC0gT25lXG4gKiBfX19cbiAqIGBgYFxuICpcbiAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgdGhlbWF0aWMgYnJlYWsg4oCcaW50ZXJ1cHRz4oCdXG4gKiB0aGUgbGlzdC4gKi9cbnByb3RvLmludGVycnVwdExpc3QgPSBbXG4gIFsnZmVuY2VkQ29kZScsIHtwZWRhbnRpYzogZmFsc2V9XSxcbiAgWyd0aGVtYXRpY0JyZWFrJywge3BlZGFudGljOiBmYWxzZX1dLFxuICBbJ2RlZmluaXRpb24nLCB7Y29tbW9ubWFyazogZmFsc2V9XSxcbiAgWydmb290bm90ZScsIHtjb21tb25tYXJrOiBmYWxzZX1dXG5dO1xuXG4vKiBOb2RlcyB0aGF0IGNhbiBpbnRlcnVwdCBhIGJsb2NrcXVvdGU6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqID4gQSBwYXJhZ3JhcGguXG4gKiBfX19cbiAqIGBgYFxuICpcbiAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgdGhlbWF0aWMgYnJlYWsg4oCcaW50ZXJ1cHRz4oCdXG4gKiB0aGUgYmxvY2txdW90ZS4gKi9cbnByb3RvLmludGVycnVwdEJsb2NrcXVvdGUgPSBbXG4gIFsnaW5kZW50ZWRDb2RlJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydmZW5jZWRDb2RlJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydhdHhIZWFkaW5nJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydzZXRleHRIZWFkaW5nJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWyd0aGVtYXRpY0JyZWFrJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydodG1sJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydsaXN0Jywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydkZWZpbml0aW9uJywge2NvbW1vbm1hcms6IGZhbHNlfV0sXG4gIFsnZm9vdG5vdGUnLCB7Y29tbW9ubWFyazogZmFsc2V9XVxuXTtcblxuLyogSGFuZGxlcnMuICovXG5wcm90by5ibG9ja1Rva2VuaXplcnMgPSB7XG4gIG5ld2xpbmU6IHJlcXVpcmUoJy4vdG9rZW5pemUvbmV3bGluZScpLFxuICBpbmRlbnRlZENvZGU6IHJlcXVpcmUoJy4vdG9rZW5pemUvY29kZS1pbmRlbnRlZCcpLFxuICBmZW5jZWRDb2RlOiByZXF1aXJlKCcuL3Rva2VuaXplL2NvZGUtZmVuY2VkJyksXG4gIGJsb2NrcXVvdGU6IHJlcXVpcmUoJy4vdG9rZW5pemUvYmxvY2txdW90ZScpLFxuICBhdHhIZWFkaW5nOiByZXF1aXJlKCcuL3Rva2VuaXplL2hlYWRpbmctYXR4JyksXG4gIHRoZW1hdGljQnJlYWs6IHJlcXVpcmUoJy4vdG9rZW5pemUvdGhlbWF0aWMtYnJlYWsnKSxcbiAgbGlzdDogcmVxdWlyZSgnLi90b2tlbml6ZS9saXN0JyksXG4gIHNldGV4dEhlYWRpbmc6IHJlcXVpcmUoJy4vdG9rZW5pemUvaGVhZGluZy1zZXRleHQnKSxcbiAgaHRtbDogcmVxdWlyZSgnLi90b2tlbml6ZS9odG1sLWJsb2NrJyksXG4gIGZvb3Rub3RlOiByZXF1aXJlKCcuL3Rva2VuaXplL2Zvb3Rub3RlLWRlZmluaXRpb24nKSxcbiAgZGVmaW5pdGlvbjogcmVxdWlyZSgnLi90b2tlbml6ZS9kZWZpbml0aW9uJyksXG4gIHRhYmxlOiByZXF1aXJlKCcuL3Rva2VuaXplL3RhYmxlJyksXG4gIHBhcmFncmFwaDogcmVxdWlyZSgnLi90b2tlbml6ZS9wYXJhZ3JhcGgnKVxufTtcblxucHJvdG8uaW5saW5lVG9rZW5pemVycyA9IHtcbiAgZXNjYXBlOiByZXF1aXJlKCcuL3Rva2VuaXplL2VzY2FwZScpLFxuICBhdXRvTGluazogcmVxdWlyZSgnLi90b2tlbml6ZS9hdXRvLWxpbmsnKSxcbiAgdXJsOiByZXF1aXJlKCcuL3Rva2VuaXplL3VybCcpLFxuICBodG1sOiByZXF1aXJlKCcuL3Rva2VuaXplL2h0bWwtaW5saW5lJyksXG4gIGxpbms6IHJlcXVpcmUoJy4vdG9rZW5pemUvbGluaycpLFxuICByZWZlcmVuY2U6IHJlcXVpcmUoJy4vdG9rZW5pemUvcmVmZXJlbmNlJyksXG4gIHN0cm9uZzogcmVxdWlyZSgnLi90b2tlbml6ZS9zdHJvbmcnKSxcbiAgZW1waGFzaXM6IHJlcXVpcmUoJy4vdG9rZW5pemUvZW1waGFzaXMnKSxcbiAgZGVsZXRpb246IHJlcXVpcmUoJy4vdG9rZW5pemUvZGVsZXRlJyksXG4gIGNvZGU6IHJlcXVpcmUoJy4vdG9rZW5pemUvY29kZS1pbmxpbmUnKSxcbiAgYnJlYWs6IHJlcXVpcmUoJy4vdG9rZW5pemUvYnJlYWsnKSxcbiAgdGV4dDogcmVxdWlyZSgnLi90b2tlbml6ZS90ZXh0Jylcbn07XG5cbi8qIEV4cG9zZSBwcmVjZWRlbmNlLiAqL1xucHJvdG8uYmxvY2tNZXRob2RzID0ga2V5cyhwcm90by5ibG9ja1Rva2VuaXplcnMpO1xucHJvdG8uaW5saW5lTWV0aG9kcyA9IGtleXMocHJvdG8uaW5saW5lVG9rZW5pemVycyk7XG5cbi8qIFRva2VuaXplcnMuICovXG5wcm90by50b2tlbml6ZUJsb2NrID0gdG9rZW5pemVyKCdibG9jaycpO1xucHJvdG8udG9rZW5pemVJbmxpbmUgPSB0b2tlbml6ZXIoJ2lubGluZScpO1xucHJvdG8udG9rZW5pemVGYWN0b3J5ID0gdG9rZW5pemVyO1xuXG4vKiBHZXQgYWxsIGtleXMgaW4gYHZhbHVlYC4gKi9cbmZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuXG4gIGZvciAoa2V5IGluIHZhbHVlKSB7XG4gICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJyk7XG52YXIgZXNjYXBlcyA9IHJlcXVpcmUoJ21hcmtkb3duLWVzY2FwZXMnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRPcHRpb25zO1xuXG5mdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3VycmVudCA9IHNlbGYub3B0aW9ucztcbiAgdmFyIGtleTtcbiAgdmFyIHZhbHVlO1xuXG4gIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IHh0ZW5kKG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIHZhbHVlIGAnICsgb3B0aW9ucyArICdgICcgK1xuICAgICAgJ2ZvciBzZXR0aW5nIGBvcHRpb25zYCdcbiAgICApO1xuICB9XG5cbiAgZm9yIChrZXkgaW4gZGVmYXVsdHMpIHtcbiAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTtcblxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoa2V5ICE9PSAnYmxvY2tzJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykgfHxcbiAgICAgIChrZXkgPT09ICdibG9ja3MnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgYCcgKyB2YWx1ZSArICdgIGZvciBzZXR0aW5nIGBvcHRpb25zLicgKyBrZXkgKyAnYCcpO1xuICAgIH1cblxuICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgc2VsZi5vcHRpb25zID0gb3B0aW9ucztcbiAgc2VsZi5lc2NhcGUgPSBlc2NhcGVzKG9wdGlvbnMpO1xuXG4gIHJldHVybiBzZWxmO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgZGVjb2RlID0gcmVxdWlyZSgncGFyc2UtZW50aXRpZXMnKTtcbnZhciBsb2NhdGUgPSByZXF1aXJlKCcuLi9sb2NhdGUvdGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXV0b0xpbms7XG5hdXRvTGluay5sb2NhdG9yID0gbG9jYXRlO1xuYXV0b0xpbmsubm90SW5MaW5rID0gdHJ1ZTtcblxudmFyIENfTFQgPSAnPCc7XG52YXIgQ19HVCA9ICc+JztcbnZhciBDX0FUX1NJR04gPSAnQCc7XG52YXIgQ19TTEFTSCA9ICcvJztcbnZhciBNQUlMVE8gPSAnbWFpbHRvOic7XG52YXIgTUFJTFRPX0xFTkdUSCA9IE1BSUxUTy5sZW5ndGg7XG5cbi8qIFRva2VuaXNlIGEgbGluay4gKi9cbmZ1bmN0aW9uIGF1dG9MaW5rKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZjtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgbGVuZ3RoO1xuICB2YXIgaW5kZXg7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIGhhc0F0Q2hhcmFjdGVyO1xuICB2YXIgbGluaztcbiAgdmFyIG5vdztcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciB0b2tlbml6ZTtcbiAgdmFyIGV4aXQ7XG5cbiAgaWYgKHZhbHVlLmNoYXJBdCgwKSAhPT0gQ19MVCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNlbGYgPSB0aGlzO1xuICBzdWJ2YWx1ZSA9ICcnO1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIGluZGV4ID0gMDtcbiAgcXVldWUgPSAnJztcbiAgaGFzQXRDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgbGluayA9ICcnO1xuXG4gIGluZGV4Kys7XG4gIHN1YnZhbHVlID0gQ19MVDtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKFxuICAgICAgd2hpdGVzcGFjZShjaGFyYWN0ZXIpIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09IENfR1QgfHxcbiAgICAgIGNoYXJhY3RlciA9PT0gQ19BVF9TSUdOIHx8XG4gICAgICAoY2hhcmFjdGVyID09PSAnOicgJiYgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IENfU0xBU0gpXG4gICAgKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmICghcXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5rICs9IHF1ZXVlO1xuICBxdWV1ZSA9ICcnO1xuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gIGxpbmsgKz0gY2hhcmFjdGVyO1xuICBpbmRleCsrO1xuXG4gIGlmIChjaGFyYWN0ZXIgPT09IENfQVRfU0lHTikge1xuICAgIGhhc0F0Q2hhcmFjdGVyID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXG4gICAgICBjaGFyYWN0ZXIgIT09ICc6JyB8fFxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgIT09IENfU0xBU0hcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsaW5rICs9IENfU0xBU0g7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAod2hpdGVzcGFjZShjaGFyYWN0ZXIpIHx8IGNoYXJhY3RlciA9PT0gQ19HVCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gIGlmICghcXVldWUgfHwgY2hhcmFjdGVyICE9PSBDX0dUKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbmV2ZXIgdXNlZCAoeWV0KSAqL1xuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBsaW5rICs9IHF1ZXVlO1xuICBjb250ZW50ID0gbGluaztcbiAgc3VidmFsdWUgKz0gbGluayArIGNoYXJhY3RlcjtcbiAgbm93ID0gZWF0Lm5vdygpO1xuICBub3cuY29sdW1uKys7XG4gIG5vdy5vZmZzZXQrKztcblxuICBpZiAoaGFzQXRDaGFyYWN0ZXIpIHtcbiAgICBpZiAobGluay5zbGljZSgwLCBNQUlMVE9fTEVOR1RIKS50b0xvd2VyQ2FzZSgpID09PSBNQUlMVE8pIHtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnN1YnN0cihNQUlMVE9fTEVOR1RIKTtcbiAgICAgIG5vdy5jb2x1bW4gKz0gTUFJTFRPX0xFTkdUSDtcbiAgICAgIG5vdy5vZmZzZXQgKz0gTUFJTFRPX0xFTkdUSDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluayA9IE1BSUxUTyArIGxpbms7XG4gICAgfVxuICB9XG5cbiAgLyogVGVtcG9yYXJpbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIGVzY2FwZXMgaW4gYXV0b2xpbmtzLiAqL1xuICB0b2tlbml6ZSA9IHNlbGYuaW5saW5lVG9rZW5pemVycy5lc2NhcGU7XG4gIHNlbGYuaW5saW5lVG9rZW5pemVycy5lc2NhcGUgPSBudWxsO1xuICBleGl0ID0gc2VsZi5lbnRlckxpbmsoKTtcblxuICBjb250ZW50ID0gc2VsZi50b2tlbml6ZUlubGluZShjb250ZW50LCBub3cpO1xuXG4gIHNlbGYuaW5saW5lVG9rZW5pemVycy5lc2NhcGUgPSB0b2tlbml6ZTtcbiAgZXhpdCgpO1xuXG4gIHJldHVybiBlYXQoc3VidmFsdWUpKHtcbiAgICB0eXBlOiAnbGluaycsXG4gICAgdGl0bGU6IG51bGwsXG4gICAgdXJsOiBkZWNvZGUobGluayksXG4gICAgY2hpbGRyZW46IGNvbnRlbnRcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0cmltID0gcmVxdWlyZSgndHJpbScpO1xudmFyIGludGVycnVwdCA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJydXB0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmxvY2txdW90ZTtcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcbnZhciBDX0dUID0gJz4nO1xuXG4vKiBUb2tlbmlzZSBhIGJsb2NrcXVvdGUuICovXG5mdW5jdGlvbiBibG9ja3F1b3RlKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvZmZzZXRzID0gc2VsZi5vZmZzZXQ7XG4gIHZhciB0b2tlbml6ZXJzID0gc2VsZi5ibG9ja1Rva2VuaXplcnM7XG4gIHZhciBpbnRlcnJ1cHRvcnMgPSBzZWxmLmludGVycnVwdEJsb2NrcXVvdGU7XG4gIHZhciBub3cgPSBlYXQubm93KCk7XG4gIHZhciBjdXJyZW50TGluZSA9IG5vdy5saW5lO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgdmFsdWVzID0gW107XG4gIHZhciBjb250ZW50cyA9IFtdO1xuICB2YXIgaW5kZW50cyA9IFtdO1xuICB2YXIgYWRkO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgcmVzdDtcbiAgdmFyIG5leHRJbmRleDtcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBsaW5lO1xuICB2YXIgc3RhcnRJbmRleDtcbiAgdmFyIHByZWZpeGVkO1xuICB2YXIgZXhpdDtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciAhPT0gQ19TUEFDRSAmJiBjaGFyYWN0ZXIgIT09IENfVEFCKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfR1QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgbmV4dEluZGV4ID0gdmFsdWUuaW5kZXhPZihDX05FV0xJTkUsIGluZGV4KTtcbiAgICBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgcHJlZml4ZWQgPSBmYWxzZTtcblxuICAgIGlmIChuZXh0SW5kZXggPT09IC0xKSB7XG4gICAgICBuZXh0SW5kZXggPSBsZW5ndGg7XG4gICAgfVxuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmIGNoYXJhY3RlciAhPT0gQ19UQUIpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgPT09IENfR1QpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBwcmVmaXhlZCA9IHRydWU7XG5cbiAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX1NQQUNFKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4ID0gc3RhcnRJbmRleDtcbiAgICB9XG5cbiAgICBjb250ZW50ID0gdmFsdWUuc2xpY2UoaW5kZXgsIG5leHRJbmRleCk7XG5cbiAgICBpZiAoIXByZWZpeGVkICYmICF0cmltKGNvbnRlbnQpKSB7XG4gICAgICBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoIXByZWZpeGVkKSB7XG4gICAgICByZXN0ID0gdmFsdWUuc2xpY2UoaW5kZXgpO1xuXG4gICAgICAvKiBDaGVjayBpZiB0aGUgZm9sbG93aW5nIGNvZGUgY29udGFpbnMgYSBwb3NzaWJsZVxuICAgICAgICogYmxvY2suICovXG4gICAgICBpZiAoaW50ZXJydXB0KGludGVycnVwdG9ycywgdG9rZW5pemVycywgc2VsZiwgW2VhdCwgcmVzdCwgdHJ1ZV0pKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpbmUgPSBzdGFydEluZGV4ID09PSBpbmRleCA/IGNvbnRlbnQgOiB2YWx1ZS5zbGljZShzdGFydEluZGV4LCBuZXh0SW5kZXgpO1xuXG4gICAgaW5kZW50cy5wdXNoKGluZGV4IC0gc3RhcnRJbmRleCk7XG4gICAgdmFsdWVzLnB1c2gobGluZSk7XG4gICAgY29udGVudHMucHVzaChjb250ZW50KTtcblxuICAgIGluZGV4ID0gbmV4dEluZGV4ICsgMTtcbiAgfVxuXG4gIGluZGV4ID0gLTE7XG4gIGxlbmd0aCA9IGluZGVudHMubGVuZ3RoO1xuICBhZGQgPSBlYXQodmFsdWVzLmpvaW4oQ19ORVdMSU5FKSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBvZmZzZXRzW2N1cnJlbnRMaW5lXSA9IChvZmZzZXRzW2N1cnJlbnRMaW5lXSB8fCAwKSArIGluZGVudHNbaW5kZXhdO1xuICAgIGN1cnJlbnRMaW5lKys7XG4gIH1cblxuICBleGl0ID0gc2VsZi5lbnRlckJsb2NrKCk7XG4gIGNvbnRlbnRzID0gc2VsZi50b2tlbml6ZUJsb2NrKGNvbnRlbnRzLmpvaW4oQ19ORVdMSU5FKSwgbm93KTtcbiAgZXhpdCgpO1xuXG4gIHJldHVybiBhZGQoe1xuICAgIHR5cGU6ICdibG9ja3F1b3RlJyxcbiAgICBjaGlsZHJlbjogY29udGVudHNcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBsb2NhdGUgPSByZXF1aXJlKCcuLi9sb2NhdGUvYnJlYWsnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBoYXJkQnJlYWs7XG5oYXJkQnJlYWsubG9jYXRvciA9IGxvY2F0ZTtcblxudmFyIE1JTl9CUkVBS19MRU5HVEggPSAyO1xuXG5mdW5jdGlvbiBoYXJkQnJlYWsoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgcXVldWUgPSAnJztcbiAgdmFyIGNoYXJhY3RlcjtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxuJykge1xuICAgICAgaWYgKGluZGV4IDwgTUlOX0JSRUFLX0xFTkdUSCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcblxuICAgICAgcmV0dXJuIGVhdChxdWV1ZSkoe3R5cGU6ICdicmVhayd9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSAnICcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRyaW0gPSByZXF1aXJlKCd0cmltLXRyYWlsaW5nLWxpbmVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmVuY2VkQ29kZTtcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcbnZhciBDX1RJTERFID0gJ34nO1xudmFyIENfVElDSyA9ICdgJztcblxudmFyIE1JTl9GRU5DRV9DT1VOVCA9IDM7XG52YXIgQ09ERV9JTkRFTlRfQ09VTlQgPSA0O1xuXG5mdW5jdGlvbiBmZW5jZWRDb2RlKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucztcbiAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aCArIDE7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdWJ2YWx1ZSA9ICcnO1xuICB2YXIgZmVuY2VDb3VudDtcbiAgdmFyIG1hcmtlcjtcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIGZsYWc7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBleGRlbnRlZENvbnRlbnQ7XG4gIHZhciBjbG9zaW5nO1xuICB2YXIgZXhkZW50ZWRDbG9zaW5nO1xuICB2YXIgaW5kZW50O1xuICB2YXIgbm93O1xuXG4gIGlmICghc2V0dGluZ3MuZ2ZtKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogRWF0IGluaXRpYWwgc3BhY2luZy4gKi9cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpbmRlbnQgPSBpbmRleDtcblxuICAvKiBFYXQgdGhlIGZlbmNlLiAqL1xuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gIGlmIChjaGFyYWN0ZXIgIT09IENfVElMREUgJiYgY2hhcmFjdGVyICE9PSBDX1RJQ0spIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbmRleCsrO1xuICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gIGZlbmNlQ291bnQgPSAxO1xuICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IG1hcmtlcikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGZlbmNlQ291bnQrKztcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKGZlbmNlQ291bnQgPCBNSU5fRkVOQ0VfQ09VTlQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiBFYXQgc3BhY2luZyBiZWZvcmUgZmxhZy4gKi9cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICAvKiBFYXQgZmxhZy4gKi9cbiAgZmxhZyA9ICcnO1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoXG4gICAgICBjaGFyYWN0ZXIgPT09IENfTkVXTElORSB8fFxuICAgICAgY2hhcmFjdGVyID09PSBDX1RJTERFIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09IENfVElDS1xuICAgICkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSB8fCBjaGFyYWN0ZXIgPT09IENfVEFCKSB7XG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsYWcgKz0gcXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICBxdWV1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gIGlmIChjaGFyYWN0ZXIgJiYgY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBub3cgPSBlYXQubm93KCk7XG4gIG5vdy5jb2x1bW4gKz0gc3VidmFsdWUubGVuZ3RoO1xuICBub3cub2Zmc2V0ICs9IHN1YnZhbHVlLmxlbmd0aDtcblxuICBzdWJ2YWx1ZSArPSBmbGFnO1xuICBmbGFnID0gc2VsZi5kZWNvZGUucmF3KHNlbGYudW5lc2NhcGUoZmxhZyksIG5vdyk7XG5cbiAgaWYgKHF1ZXVlKSB7XG4gICAgc3VidmFsdWUgKz0gcXVldWU7XG4gIH1cblxuICBxdWV1ZSA9ICcnO1xuICBjbG9zaW5nID0gJyc7XG4gIGV4ZGVudGVkQ2xvc2luZyA9ICcnO1xuICBjb250ZW50ID0gJyc7XG4gIGV4ZGVudGVkQ29udGVudCA9ICcnO1xuXG4gIC8qIEVhdCBjb250ZW50LiAqL1xuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIGNvbnRlbnQgKz0gY2xvc2luZztcbiAgICBleGRlbnRlZENvbnRlbnQgKz0gZXhkZW50ZWRDbG9zaW5nO1xuICAgIGNsb3NpbmcgPSAnJztcbiAgICBleGRlbnRlZENsb3NpbmcgPSAnJztcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfTkVXTElORSkge1xuICAgICAgY29udGVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBleGRlbnRlZENsb3NpbmcgKz0gY2hhcmFjdGVyO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qIEFkZCB0aGUgbmV3bGluZSB0byBgc3VidmFsdWVgIGlmIGl0cyB0aGUgZmlyc3RcbiAgICAgKiBjaGFyYWN0ZXIuICBPdGhlcndpc2UsIGFkZCBpdCB0byB0aGUgYGNsb3NpbmdgXG4gICAgICogcXVldWUuICovXG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGNsb3NpbmcgKz0gY2hhcmFjdGVyO1xuICAgICAgZXhkZW50ZWRDbG9zaW5nICs9IGNoYXJhY3RlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIH1cblxuICAgIHF1ZXVlID0gJyc7XG4gICAgaW5kZXgrKztcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gQ19TUEFDRSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBjbG9zaW5nICs9IHF1ZXVlO1xuICAgIGV4ZGVudGVkQ2xvc2luZyArPSBxdWV1ZS5zbGljZShpbmRlbnQpO1xuXG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA+PSBDT0RFX0lOREVOVF9DT1VOVCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcXVldWUgPSAnJztcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gbWFya2VyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNsb3NpbmcgKz0gcXVldWU7XG4gICAgZXhkZW50ZWRDbG9zaW5nICs9IHF1ZXVlO1xuXG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA8IGZlbmNlQ291bnQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHF1ZXVlID0gJyc7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2xvc2luZyArPSBjaGFyYWN0ZXI7XG4gICAgICBleGRlbnRlZENsb3NpbmcgKz0gY2hhcmFjdGVyO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoIWNoYXJhY3RlciB8fCBjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc3VidmFsdWUgKz0gY29udGVudCArIGNsb3Npbmc7XG5cbiAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgIHR5cGU6ICdjb2RlJyxcbiAgICBsYW5nOiBmbGFnIHx8IG51bGwsXG4gICAgdmFsdWU6IHRyaW0oZXhkZW50ZWRDb250ZW50KVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgndHJpbS10cmFpbGluZy1saW5lcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluZGVudGVkQ29kZTtcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcblxudmFyIENPREVfSU5ERU5UX0NPVU5UID0gNDtcbnZhciBDT0RFX0lOREVOVCA9IHJlcGVhdChDX1NQQUNFLCBDT0RFX0lOREVOVF9DT1VOVCk7XG5cbi8qIFRva2VuaXNlIGluZGVudGVkIGNvZGUuICovXG5mdW5jdGlvbiBpbmRlbnRlZENvZGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgc3VidmFsdWUgPSAnJztcbiAgdmFyIGNvbnRlbnQgPSAnJztcbiAgdmFyIHN1YnZhbHVlUXVldWUgPSAnJztcbiAgdmFyIGNvbnRlbnRRdWV1ZSA9ICcnO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgYmxhbmtRdWV1ZTtcbiAgdmFyIGluZGVudDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoaW5kZW50KSB7XG4gICAgICBpbmRlbnQgPSBmYWxzZTtcblxuICAgICAgc3VidmFsdWUgKz0gc3VidmFsdWVRdWV1ZTtcbiAgICAgIGNvbnRlbnQgKz0gY29udGVudFF1ZXVlO1xuICAgICAgc3VidmFsdWVRdWV1ZSA9ICcnO1xuICAgICAgY29udGVudFF1ZXVlID0gJyc7XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgICBzdWJ2YWx1ZVF1ZXVlID0gY2hhcmFjdGVyO1xuICAgICAgICBjb250ZW50UXVldWUgPSBjaGFyYWN0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGNvbnRlbnQgKz0gY2hhcmFjdGVyO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgIGlmICghY2hhcmFjdGVyIHx8IGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICAgICAgICBjb250ZW50UXVldWUgPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBzdWJ2YWx1ZVF1ZXVlID0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgIGNvbnRlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNoYXJhY3RlciA9PT0gQ19TUEFDRSAmJlxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IGNoYXJhY3RlciAmJlxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMikgPT09IGNoYXJhY3RlciAmJlxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMykgPT09IGNoYXJhY3RlclxuICAgICkge1xuICAgICAgc3VidmFsdWVRdWV1ZSArPSBDT0RFX0lOREVOVDtcbiAgICAgIGluZGV4ICs9IDM7XG4gICAgICBpbmRlbnQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgc3VidmFsdWVRdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRlbnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBibGFua1F1ZXVlID0gJyc7XG5cbiAgICAgIHdoaWxlIChjaGFyYWN0ZXIgPT09IENfVEFCIHx8IGNoYXJhY3RlciA9PT0gQ19TUEFDRSkge1xuICAgICAgICBibGFua1F1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN1YnZhbHVlUXVldWUgKz0gYmxhbmtRdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgIGNvbnRlbnRRdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRlbnQpIHtcbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWF0KHN1YnZhbHVlKSh7XG4gICAgICB0eXBlOiAnY29kZScsXG4gICAgICBsYW5nOiBudWxsLFxuICAgICAgdmFsdWU6IHRyaW0oY29udGVudClcbiAgICB9KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL2NvZGUtaW5saW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5saW5lQ29kZTtcbmlubGluZUNvZGUubG9jYXRvciA9IGxvY2F0ZTtcblxudmFyIENfVElDSyA9ICdgJztcblxuLyogVG9rZW5pc2UgaW5saW5lIGNvZGUuICovXG5mdW5jdGlvbiBpbmxpbmVDb2RlKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcXVldWUgPSAnJztcbiAgdmFyIHRpY2tRdWV1ZSA9ICcnO1xuICB2YXIgY29udGVudFF1ZXVlO1xuICB2YXIgc3VicXVldWU7XG4gIHZhciBjb3VudDtcbiAgdmFyIG9wZW5pbmdDb3VudDtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgZm91bmQ7XG4gIHZhciBuZXh0O1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX1RJQ0spIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IENfVElDSztcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKCFxdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnZhbHVlID0gcXVldWU7XG4gIG9wZW5pbmdDb3VudCA9IGluZGV4O1xuICBxdWV1ZSA9ICcnO1xuICBuZXh0ID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgY291bnQgPSAwO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IG5leHQ7XG4gICAgbmV4dCA9IHZhbHVlLmNoYXJBdChpbmRleCArIDEpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19USUNLKSB7XG4gICAgICBjb3VudCsrO1xuICAgICAgdGlja1F1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgPSAwO1xuICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIH1cblxuICAgIGlmIChjb3VudCAmJiBuZXh0ICE9PSBDX1RJQ0spIHtcbiAgICAgIGlmIChjb3VudCA9PT0gb3BlbmluZ0NvdW50KSB7XG4gICAgICAgIHN1YnZhbHVlICs9IHF1ZXVlICsgdGlja1F1ZXVlO1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSB0aWNrUXVldWU7XG4gICAgICB0aWNrUXVldWUgPSAnJztcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKCFmb3VuZCkge1xuICAgIGlmIChvcGVuaW5nQ291bnQgJSAyICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVldWUgPSAnJztcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29udGVudFF1ZXVlID0gJyc7XG4gIHN1YnF1ZXVlID0gJyc7XG4gIGxlbmd0aCA9IHF1ZXVlLmxlbmd0aDtcbiAgaW5kZXggPSAtMTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHF1ZXVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAod2hpdGVzcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3VicXVldWUpIHtcbiAgICAgIGlmIChjb250ZW50UXVldWUpIHtcbiAgICAgICAgY29udGVudFF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgfVxuXG4gICAgICBzdWJxdWV1ZSA9ICcnO1xuICAgIH1cblxuICAgIGNvbnRlbnRRdWV1ZSArPSBjaGFyYWN0ZXI7XG4gIH1cblxuICByZXR1cm4gZWF0KHN1YnZhbHVlKSh7XG4gICAgdHlwZTogJ2lubGluZUNvZGUnLFxuICAgIHZhbHVlOiBjb250ZW50UXVldWVcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB3aGl0ZXNwYWNlID0gcmVxdWlyZSgnaXMtd2hpdGVzcGFjZS1jaGFyYWN0ZXInKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKCcuLi91dGlsL25vcm1hbGl6ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb247XG5kZWZpbml0aW9uLm5vdEluTGlzdCA9IHRydWU7XG5kZWZpbml0aW9uLm5vdEluQmxvY2sgPSB0cnVlO1xuXG52YXIgQ19ET1VCTEVfUVVPVEUgPSAnXCInO1xudmFyIENfU0lOR0xFX1FVT1RFID0gJ1xcJyc7XG52YXIgQ19CQUNLU0xBU0ggPSAnXFxcXCc7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19UQUIgPSAnXFx0JztcbnZhciBDX1NQQUNFID0gJyAnO1xudmFyIENfQlJBQ0tFVF9PUEVOID0gJ1snO1xudmFyIENfQlJBQ0tFVF9DTE9TRSA9ICddJztcbnZhciBDX1BBUkVOX09QRU4gPSAnKCc7XG52YXIgQ19QQVJFTl9DTE9TRSA9ICcpJztcbnZhciBDX0NPTE9OID0gJzonO1xudmFyIENfTFQgPSAnPCc7XG52YXIgQ19HVCA9ICc+JztcblxuZnVuY3Rpb24gZGVmaW5pdGlvbihlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY29tbW9ubWFyayA9IHNlbGYub3B0aW9ucy5jb21tb25tYXJrO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgc3VidmFsdWUgPSAnJztcbiAgdmFyIGJlZm9yZVVSTDtcbiAgdmFyIGJlZm9yZVRpdGxlO1xuICB2YXIgcXVldWU7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciB0ZXN0O1xuICB2YXIgaWRlbnRpZmllcjtcbiAgdmFyIHVybDtcbiAgdmFyIHRpdGxlO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmIGNoYXJhY3RlciAhPT0gQ19UQUIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICBpZiAoY2hhcmFjdGVyICE9PSBDX0JSQUNLRVRfT1BFTikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGluZGV4Kys7XG4gIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgcXVldWUgPSAnJztcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0gpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGluZGV4Kys7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKFxuICAgICFxdWV1ZSB8fFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfQlJBQ0tFVF9DTE9TRSB8fFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCArIDEpICE9PSBDX0NPTE9OXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlkZW50aWZpZXIgPSBxdWV1ZTtcbiAgc3VidmFsdWUgKz0gcXVldWUgKyBDX0JSQUNLRVRfQ0xPU0UgKyBDX0NPTE9OO1xuICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgcXVldWUgPSAnJztcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKFxuICAgICAgY2hhcmFjdGVyICE9PSBDX1RBQiAmJlxuICAgICAgY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmXG4gICAgICBjaGFyYWN0ZXIgIT09IENfTkVXTElORVxuICAgICkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICBxdWV1ZSA9ICcnO1xuICBiZWZvcmVVUkwgPSBzdWJ2YWx1ZTtcblxuICBpZiAoY2hhcmFjdGVyID09PSBDX0xUKSB7XG4gICAgaW5kZXgrKztcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKCFpc0VuY2xvc2VkVVJMQ2hhcmFjdGVyKGNoYXJhY3RlcikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IGlzRW5jbG9zZWRVUkxDaGFyYWN0ZXIuZGVsaW1pdGVyKSB7XG4gICAgICBzdWJ2YWx1ZSArPSBDX0xUICsgcXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGluZGV4IC09IHF1ZXVlLmxlbmd0aCArIDE7XG4gICAgICBxdWV1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcXVldWUpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgIGlmICghaXNVbmNsb3NlZFVSTENoYXJhY3RlcihjaGFyYWN0ZXIpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IHF1ZXVlO1xuICB9XG5cbiAgaWYgKCFxdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHVybCA9IHF1ZXVlO1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoXG4gICAgICBjaGFyYWN0ZXIgIT09IENfVEFCICYmXG4gICAgICBjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiZcbiAgICAgIGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FXG4gICAgKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gIHRlc3QgPSBudWxsO1xuXG4gIGlmIChjaGFyYWN0ZXIgPT09IENfRE9VQkxFX1FVT1RFKSB7XG4gICAgdGVzdCA9IENfRE9VQkxFX1FVT1RFO1xuICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19TSU5HTEVfUVVPVEUpIHtcbiAgICB0ZXN0ID0gQ19TSU5HTEVfUVVPVEU7XG4gIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1BBUkVOX09QRU4pIHtcbiAgICB0ZXN0ID0gQ19QQVJFTl9DTE9TRTtcbiAgfVxuXG4gIGlmICghdGVzdCkge1xuICAgIHF1ZXVlID0gJyc7XG4gICAgaW5kZXggPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gIH0gZWxzZSBpZiAocXVldWUpIHtcbiAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgICBxdWV1ZSA9ICcnO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSB0ZXN0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX05FV0xJTkUgfHwgY2hhcmFjdGVyID09PSB0ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gQ19ORVdMSU5FO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSB0ZXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYmVmb3JlVGl0bGUgPSBzdWJ2YWx1ZTtcbiAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICAgIHRpdGxlID0gcXVldWU7XG4gICAgcXVldWUgPSAnJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciAhPT0gQ19UQUIgJiYgY2hhcmFjdGVyICE9PSBDX1NQQUNFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgaWYgKCFjaGFyYWN0ZXIgfHwgY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBiZWZvcmVVUkwgPSBlYXQoYmVmb3JlVVJMKS50ZXN0KCkuZW5kO1xuICAgIHVybCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLnVuZXNjYXBlKHVybCksIGJlZm9yZVVSTCk7XG5cbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGJlZm9yZVRpdGxlID0gZWF0KGJlZm9yZVRpdGxlKS50ZXN0KCkuZW5kO1xuICAgICAgdGl0bGUgPSBzZWxmLmRlY29kZS5yYXcoc2VsZi51bmVzY2FwZSh0aXRsZSksIGJlZm9yZVRpdGxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWF0KHN1YnZhbHVlKSh7XG4gICAgICB0eXBlOiAnZGVmaW5pdGlvbicsXG4gICAgICBpZGVudGlmaWVyOiBub3JtYWxpemUoaWRlbnRpZmllciksXG4gICAgICB0aXRsZTogdGl0bGUgfHwgbnVsbCxcbiAgICAgIHVybDogdXJsXG4gICAgfSk7XG4gIH1cbn1cblxuLyogQ2hlY2sgaWYgYGNoYXJhY3RlcmAgY2FuIGJlIGluc2lkZSBhbiBlbmNsb3NlZCBVUkkuICovXG5mdW5jdGlvbiBpc0VuY2xvc2VkVVJMQ2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICByZXR1cm4gY2hhcmFjdGVyICE9PSBDX0dUICYmXG4gICAgY2hhcmFjdGVyICE9PSBDX0JSQUNLRVRfT1BFTiAmJlxuICAgIGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX0NMT1NFO1xufVxuXG5pc0VuY2xvc2VkVVJMQ2hhcmFjdGVyLmRlbGltaXRlciA9IENfR1Q7XG5cbi8qIENoZWNrIGlmIGBjaGFyYWN0ZXJgIGNhbiBiZSBpbnNpZGUgYW4gdW5jbG9zZWQgVVJJLiAqL1xuZnVuY3Rpb24gaXNVbmNsb3NlZFVSTENoYXJhY3RlcihjaGFyYWN0ZXIpIHtcbiAgcmV0dXJuIGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX09QRU4gJiZcbiAgICBjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9DTE9TRSAmJlxuICAgICF3aGl0ZXNwYWNlKGNoYXJhY3Rlcik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB3aGl0ZXNwYWNlID0gcmVxdWlyZSgnaXMtd2hpdGVzcGFjZS1jaGFyYWN0ZXInKTtcbnZhciBsb2NhdGUgPSByZXF1aXJlKCcuLi9sb2NhdGUvZGVsZXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWtldGhyb3VnaDtcbnN0cmlrZXRocm91Z2gubG9jYXRvciA9IGxvY2F0ZTtcblxudmFyIENfVElMREUgPSAnfic7XG52YXIgRE9VQkxFID0gJ35+JztcblxuZnVuY3Rpb24gc3RyaWtldGhyb3VnaChlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2hhcmFjdGVyID0gJyc7XG4gIHZhciBwcmV2aW91cyA9ICcnO1xuICB2YXIgcHJlY2VkaW5nID0gJyc7XG4gIHZhciBzdWJ2YWx1ZSA9ICcnO1xuICB2YXIgaW5kZXg7XG4gIHZhciBsZW5ndGg7XG4gIHZhciBub3c7XG5cbiAgaWYgKFxuICAgICFzZWxmLm9wdGlvbnMuZ2ZtIHx8XG4gICAgdmFsdWUuY2hhckF0KDApICE9PSBDX1RJTERFIHx8XG4gICAgdmFsdWUuY2hhckF0KDEpICE9PSBDX1RJTERFIHx8XG4gICAgd2hpdGVzcGFjZSh2YWx1ZS5jaGFyQXQoMikpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGluZGV4ID0gMTtcbiAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBub3cgPSBlYXQubm93KCk7XG4gIG5vdy5jb2x1bW4gKz0gMjtcbiAgbm93Lm9mZnNldCArPSAyO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChcbiAgICAgIGNoYXJhY3RlciA9PT0gQ19USUxERSAmJlxuICAgICAgcHJldmlvdXMgPT09IENfVElMREUgJiZcbiAgICAgICghcHJlY2VkaW5nIHx8ICF3aGl0ZXNwYWNlKHByZWNlZGluZykpXG4gICAgKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWF0KERPVUJMRSArIHN1YnZhbHVlICsgRE9VQkxFKSh7XG4gICAgICAgIHR5cGU6ICdkZWxldGUnLFxuICAgICAgICBjaGlsZHJlbjogc2VsZi50b2tlbml6ZUlubGluZShzdWJ2YWx1ZSwgbm93KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gcHJldmlvdXM7XG4gICAgcHJlY2VkaW5nID0gcHJldmlvdXM7XG4gICAgcHJldmlvdXMgPSBjaGFyYWN0ZXI7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRyaW0gPSByZXF1aXJlKCd0cmltJyk7XG52YXIgd29yZCA9IHJlcXVpcmUoJ2lzLXdvcmQtY2hhcmFjdGVyJyk7XG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL2VtcGhhc2lzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW1waGFzaXM7XG5lbXBoYXNpcy5sb2NhdG9yID0gbG9jYXRlO1xuXG52YXIgQ19BU1RFUklTSyA9ICcqJztcbnZhciBDX1VOREVSU0NPUkUgPSAnXyc7XG5cbmZ1bmN0aW9uIGVtcGhhc2lzKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICB2YXIgbm93O1xuICB2YXIgcGVkYW50aWM7XG4gIHZhciBtYXJrZXI7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgbGVuZ3RoO1xuICB2YXIgcHJldjtcblxuICBpZiAoY2hhcmFjdGVyICE9PSBDX0FTVEVSSVNLICYmIGNoYXJhY3RlciAhPT0gQ19VTkRFUlNDT1JFKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcGVkYW50aWMgPSBzZWxmLm9wdGlvbnMucGVkYW50aWM7XG4gIHN1YnZhbHVlID0gY2hhcmFjdGVyO1xuICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgaW5kZXgrKztcbiAgcXVldWUgPSAnJztcbiAgY2hhcmFjdGVyID0gJyc7XG5cbiAgaWYgKHBlZGFudGljICYmIHdoaXRlc3BhY2UodmFsdWUuY2hhckF0KGluZGV4KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBwcmV2ID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBtYXJrZXIgJiYgKCFwZWRhbnRpYyB8fCAhd2hpdGVzcGFjZShwcmV2KSkpIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gbWFya2VyKSB7XG4gICAgICAgIGlmICghdHJpbShxdWV1ZSkgfHwgcHJldiA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwZWRhbnRpYyAmJiBtYXJrZXIgPT09IENfVU5ERVJTQ09SRSAmJiB3b3JkKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICBxdWV1ZSArPSBtYXJrZXI7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vdyA9IGVhdC5ub3coKTtcbiAgICAgICAgbm93LmNvbHVtbisrO1xuICAgICAgICBub3cub2Zmc2V0Kys7XG5cbiAgICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSArIHF1ZXVlICsgbWFya2VyKSh7XG4gICAgICAgICAgdHlwZTogJ2VtcGhhc2lzJyxcbiAgICAgICAgICBjaGlsZHJlbjogc2VsZi50b2tlbml6ZUlubGluZShxdWV1ZSwgbm93KVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgKz0gbWFya2VyO1xuICAgIH1cblxuICAgIGlmICghcGVkYW50aWMgJiYgY2hhcmFjdGVyID09PSAnXFxcXCcpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL2VzY2FwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZTtcbmVzY2FwZS5sb2NhdG9yID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBlc2NhcGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIG5vZGU7XG5cbiAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PT0gJ1xcXFwnKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KDEpO1xuXG4gICAgaWYgKHNlbGYuZXNjYXBlLmluZGV4T2YoY2hhcmFjdGVyKSAhPT0gLTEpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXG4nKSB7XG4gICAgICAgIG5vZGUgPSB7dHlwZTogJ2JyZWFrJ307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlID0ge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB2YWx1ZTogY2hhcmFjdGVyXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlYXQoJ1xcXFwnICsgY2hhcmFjdGVyKShub2RlKTtcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHdoaXRlc3BhY2UgPSByZXF1aXJlKCdpcy13aGl0ZXNwYWNlLWNoYXJhY3RlcicpO1xudmFyIG5vcm1hbGl6ZSA9IHJlcXVpcmUoJy4uL3V0aWwvbm9ybWFsaXplJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZm9vdG5vdGVEZWZpbml0aW9uO1xuZm9vdG5vdGVEZWZpbml0aW9uLm5vdEluTGlzdCA9IHRydWU7XG5mb290bm90ZURlZmluaXRpb24ubm90SW5CbG9jayA9IHRydWU7XG5cbnZhciBDX0JBQ0tTTEFTSCA9ICdcXFxcJztcbnZhciBDX05FV0xJTkUgPSAnXFxuJztcbnZhciBDX1RBQiA9ICdcXHQnO1xudmFyIENfU1BBQ0UgPSAnICc7XG52YXIgQ19CUkFDS0VUX09QRU4gPSAnWyc7XG52YXIgQ19CUkFDS0VUX0NMT1NFID0gJ10nO1xudmFyIENfQ0FSRVQgPSAnXic7XG52YXIgQ19DT0xPTiA9ICc6JztcblxudmFyIEVYUFJFU1NJT05fSU5JVElBTF9UQUIgPSAvXiggezR9fFxcdCk/L2dtO1xuXG5mdW5jdGlvbiBmb290bm90ZURlZmluaXRpb24oZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG9mZnNldHMgPSBzZWxmLm9mZnNldDtcbiAgdmFyIGluZGV4O1xuICB2YXIgbGVuZ3RoO1xuICB2YXIgc3VidmFsdWU7XG4gIHZhciBub3c7XG4gIHZhciBjdXJyZW50TGluZTtcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIHN1YnF1ZXVlO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgaWRlbnRpZmllcjtcbiAgdmFyIGFkZDtcbiAgdmFyIGV4aXQ7XG5cbiAgaWYgKCFzZWxmLm9wdGlvbnMuZm9vdG5vdGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW5kZXggPSAwO1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHN1YnZhbHVlID0gJyc7XG4gIG5vdyA9IGVhdC5ub3coKTtcbiAgY3VycmVudExpbmUgPSBub3cubGluZTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKCF3aGl0ZXNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfQlJBQ0tFVF9PUEVOIHx8XG4gICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgIT09IENfQ0FSRVRcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3VidmFsdWUgKz0gQ19CUkFDS0VUX09QRU4gKyBDX0NBUkVUO1xuICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgcXVldWUgPSAnJztcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0gpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGluZGV4Kys7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKFxuICAgICFxdWV1ZSB8fFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfQlJBQ0tFVF9DTE9TRSB8fFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCArIDEpICE9PSBDX0NPTE9OXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlkZW50aWZpZXIgPSBub3JtYWxpemUocXVldWUpO1xuICBzdWJ2YWx1ZSArPSBxdWV1ZSArIENfQlJBQ0tFVF9DTE9TRSArIENfQ09MT047XG4gIGluZGV4ID0gc3VidmFsdWUubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1RBQiAmJiBjaGFyYWN0ZXIgIT09IENfU1BBQ0UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgbm93LmNvbHVtbiArPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gIG5vdy5vZmZzZXQgKz0gc3VidmFsdWUubGVuZ3RoO1xuICBxdWV1ZSA9ICcnO1xuICBjb250ZW50ID0gJyc7XG4gIHN1YnF1ZXVlID0gJyc7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgc3VicXVldWUgPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YnF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgcXVldWUgKz0gc3VicXVldWU7XG4gICAgICBzdWJxdWV1ZSA9ICcnO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdWJxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgIH1cblxuICAgIGlmIChxdWV1ZSkge1xuICAgICAgY29udGVudCArPSBxdWV1ZTtcbiAgICAgIHF1ZXVlID0gJyc7XG4gICAgfVxuXG4gICAgY29udGVudCArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIHN1YnZhbHVlICs9IGNvbnRlbnQ7XG5cbiAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShFWFBSRVNTSU9OX0lOSVRJQUxfVEFCLCBmdW5jdGlvbiAobGluZSkge1xuICAgIG9mZnNldHNbY3VycmVudExpbmVdID0gKG9mZnNldHNbY3VycmVudExpbmVdIHx8IDApICsgbGluZS5sZW5ndGg7XG4gICAgY3VycmVudExpbmUrKztcblxuICAgIHJldHVybiAnJztcbiAgfSk7XG5cbiAgYWRkID0gZWF0KHN1YnZhbHVlKTtcblxuICBleGl0ID0gc2VsZi5lbnRlckJsb2NrKCk7XG4gIGNvbnRlbnQgPSBzZWxmLnRva2VuaXplQmxvY2soY29udGVudCwgbm93KTtcbiAgZXhpdCgpO1xuXG4gIHJldHVybiBhZGQoe1xuICAgIHR5cGU6ICdmb290bm90ZURlZmluaXRpb24nLFxuICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgY2hpbGRyZW46IGNvbnRlbnRcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gYXR4SGVhZGluZztcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcbnZhciBDX0hBU0ggPSAnIyc7XG5cbnZhciBNQVhfQVRYX0NPVU5UID0gNjtcblxuZnVuY3Rpb24gYXR4SGVhZGluZyhlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc2V0dGluZ3MgPSBzZWxmLm9wdGlvbnM7XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyAxO1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIG5vdyA9IGVhdC5ub3coKTtcbiAgdmFyIHN1YnZhbHVlID0gJyc7XG4gIHZhciBjb250ZW50ID0gJyc7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGRlcHRoO1xuXG4gIC8qIEVhdCBpbml0aWFsIHNwYWNpbmcuICovXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgaW5kZXgtLTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIC8qIEVhdCBoYXNoZXMuICovXG4gIGRlcHRoID0gMDtcblxuICB3aGlsZSAoKytpbmRleCA8PSBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciAhPT0gQ19IQVNIKSB7XG4gICAgICBpbmRleC0tO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGRlcHRoKys7XG4gIH1cblxuICBpZiAoZGVwdGggPiBNQVhfQVRYX0NPVU5UKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICAgICFkZXB0aCB8fFxuICAgICghc2V0dGluZ3MucGVkYW50aWMgJiYgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IENfSEFTSClcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoICsgMTtcblxuICAvKiBFYXQgaW50ZXJtZWRpYXRlIHdoaXRlLXNwYWNlLiAqL1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgaW5kZXgtLTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIC8qIEV4aXQgd2hlbiBub3QgaW4gcGVkYW50aWMgbW9kZSB3aXRob3V0IHNwYWNpbmcuICovXG4gIGlmIChcbiAgICAhc2V0dGluZ3MucGVkYW50aWMgJiZcbiAgICBxdWV1ZS5sZW5ndGggPT09IDAgJiZcbiAgICBjaGFyYWN0ZXIgJiZcbiAgICBjaGFyYWN0ZXIgIT09IENfTkVXTElORVxuICApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiBFYXQgY29udGVudC4gKi9cbiAgc3VidmFsdWUgKz0gcXVldWU7XG4gIHF1ZXVlID0gJyc7XG4gIGNvbnRlbnQgPSAnJztcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIWNoYXJhY3RlciB8fCBjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmXG4gICAgICBjaGFyYWN0ZXIgIT09IENfVEFCICYmXG4gICAgICBjaGFyYWN0ZXIgIT09IENfSEFTSFxuICAgICkge1xuICAgICAgY29udGVudCArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgIHF1ZXVlID0gJyc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2hhcmFjdGVyID09PSBDX1NQQUNFIHx8IGNoYXJhY3RlciA9PT0gQ19UQUIpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2hhcmFjdGVyID09PSBDX0hBU0gpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2hhcmFjdGVyID09PSBDX1NQQUNFIHx8IGNoYXJhY3RlciA9PT0gQ19UQUIpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICBpbmRleC0tO1xuICB9XG5cbiAgbm93LmNvbHVtbiArPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gIG5vdy5vZmZzZXQgKz0gc3VidmFsdWUubGVuZ3RoO1xuICBzdWJ2YWx1ZSArPSBjb250ZW50ICsgcXVldWU7XG5cbiAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICBkZXB0aDogZGVwdGgsXG4gICAgY2hpbGRyZW46IHNlbGYudG9rZW5pemVJbmxpbmUoY29udGVudCwgbm93KVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRleHRIZWFkaW5nO1xuXG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19UQUIgPSAnXFx0JztcbnZhciBDX1NQQUNFID0gJyAnO1xudmFyIENfRVFVQUxTID0gJz0nO1xudmFyIENfREFTSCA9ICctJztcblxudmFyIE1BWF9IRUFESU5HX0lOREVOVCA9IDM7XG5cbi8qIE1hcCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmsgc2V0ZXh0XG4gKiBoZWFkZXJzLCBtYXBwaW5nIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZGVwdGguICovXG52YXIgU0VURVhUX01BUktFUlMgPSB7fTtcblxuU0VURVhUX01BUktFUlNbQ19FUVVBTFNdID0gMTtcblNFVEVYVF9NQVJLRVJTW0NfREFTSF0gPSAyO1xuXG5mdW5jdGlvbiBzZXRleHRIZWFkaW5nKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBub3cgPSBlYXQubm93KCk7XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgc3VidmFsdWUgPSAnJztcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIG1hcmtlcjtcbiAgdmFyIGRlcHRoO1xuXG4gIC8qIEVhdCBpbml0aWFsIGluZGVudGF0aW9uLiAqL1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFIHx8IGluZGV4ID49IE1BWF9IRUFESU5HX0lOREVOVCkge1xuICAgICAgaW5kZXgtLTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIC8qIEVhdCBjb250ZW50LiAqL1xuICBjb250ZW50ID0gJyc7XG4gIHF1ZXVlID0gJyc7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICBpbmRleC0tO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSB8fCBjaGFyYWN0ZXIgPT09IENfVEFCKSB7XG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgKz0gcXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICBxdWV1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIG5vdy5jb2x1bW4gKz0gc3VidmFsdWUubGVuZ3RoO1xuICBub3cub2Zmc2V0ICs9IHN1YnZhbHVlLmxlbmd0aDtcbiAgc3VidmFsdWUgKz0gY29udGVudCArIHF1ZXVlO1xuXG4gIC8qIEVuc3VyZSB0aGUgY29udGVudCBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUgYW5kIGFcbiAgICogdmFsaWQgbWFya2VyLiAqL1xuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gIG1hcmtlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcblxuICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUgfHwgIVNFVEVYVF9NQVJLRVJTW21hcmtlcl0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG5cbiAgLyogRWF0IFNldGV4dC1saW5lLiAqL1xuICBxdWV1ZSA9IG1hcmtlcjtcbiAgZGVwdGggPSBTRVRFWFRfTUFSS0VSU1ttYXJrZXJdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IG1hcmtlcikge1xuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaW5kZXgtLTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBlYXQoc3VidmFsdWUgKyBxdWV1ZSkoe1xuICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICBkZXB0aDogZGVwdGgsXG4gICAgY2hpbGRyZW46IHNlbGYudG9rZW5pemVJbmxpbmUoY29udGVudCwgbm93KVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG9wZW5DbG9zZVRhZyA9IHJlcXVpcmUoJy4uL3V0aWwvaHRtbCcpLm9wZW5DbG9zZVRhZztcblxubW9kdWxlLmV4cG9ydHMgPSBibG9ja0hUTUw7XG5cbnZhciBDX1RBQiA9ICdcXHQnO1xudmFyIENfU1BBQ0UgPSAnICc7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19MVCA9ICc8JztcblxuZnVuY3Rpb24gYmxvY2tIVE1MKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBibG9ja3MgPSBzZWxmLm9wdGlvbnMuYmxvY2tzO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbmV4dDtcbiAgdmFyIGxpbmU7XG4gIHZhciBvZmZzZXQ7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBjb3VudDtcbiAgdmFyIHNlcXVlbmNlO1xuICB2YXIgc3VidmFsdWU7XG5cbiAgdmFyIHNlcXVlbmNlcyA9IFtcbiAgICBbL148KHNjcmlwdHxwcmV8c3R5bGUpKD89KFxcc3w+fCQpKS9pLCAvPFxcLyhzY3JpcHR8cHJlfHN0eWxlKT4vaSwgdHJ1ZV0sXG4gICAgWy9ePCEtLS8sIC8tLT4vLCB0cnVlXSxcbiAgICBbL148XFw/LywgL1xcPz4vLCB0cnVlXSxcbiAgICBbL148IVtBLVphLXpdLywgLz4vLCB0cnVlXSxcbiAgICBbL148IVxcW0NEQVRBXFxbLywgL1xcXVxcXT4vLCB0cnVlXSxcbiAgICBbbmV3IFJlZ0V4cCgnXjwvPygnICsgYmxvY2tzLmpvaW4oJ3wnKSArICcpKD89KFxcXFxzfC8/PnwkKSknLCAnaScpLCAvXiQvLCB0cnVlXSxcbiAgICBbbmV3IFJlZ0V4cChvcGVuQ2xvc2VUYWcuc291cmNlICsgJ1xcXFxzKiQnKSwgL14kLywgZmFsc2VdXG4gIF07XG5cbiAgLyogRWF0IGluaXRpYWwgc3BhY2luZy4gKi9cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfVEFCICYmIGNoYXJhY3RlciAhPT0gQ19TUEFDRSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX0xUKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbmV4dCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCArIDEpO1xuICBuZXh0ID0gbmV4dCA9PT0gLTEgPyBsZW5ndGggOiBuZXh0O1xuICBsaW5lID0gdmFsdWUuc2xpY2UoaW5kZXgsIG5leHQpO1xuICBvZmZzZXQgPSAtMTtcbiAgY291bnQgPSBzZXF1ZW5jZXMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK29mZnNldCA8IGNvdW50KSB7XG4gICAgaWYgKHNlcXVlbmNlc1tvZmZzZXRdWzBdLnRlc3QobGluZSkpIHtcbiAgICAgIHNlcXVlbmNlID0gc2VxdWVuY2VzW29mZnNldF07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIXNlcXVlbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiBzZXF1ZW5jZVsyXTtcbiAgfVxuXG4gIGluZGV4ID0gbmV4dDtcblxuICBpZiAoIXNlcXVlbmNlWzFdLnRlc3QobGluZSkpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIG5leHQgPSB2YWx1ZS5pbmRleE9mKENfTkVXTElORSwgaW5kZXggKyAxKTtcbiAgICAgIG5leHQgPSBuZXh0ID09PSAtMSA/IGxlbmd0aCA6IG5leHQ7XG4gICAgICBsaW5lID0gdmFsdWUuc2xpY2UoaW5kZXggKyAxLCBuZXh0KTtcblxuICAgICAgaWYgKHNlcXVlbmNlWzFdLnRlc3QobGluZSkpIHtcbiAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICBpbmRleCA9IG5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSBuZXh0O1xuICAgIH1cbiAgfVxuXG4gIHN1YnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpO1xuXG4gIHJldHVybiBlYXQoc3VidmFsdWUpKHt0eXBlOiAnaHRtbCcsIHZhbHVlOiBzdWJ2YWx1ZX0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYWxwaGFiZXRpY2FsID0gcmVxdWlyZSgnaXMtYWxwaGFiZXRpY2FsJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL3RhZycpO1xudmFyIHRhZyA9IHJlcXVpcmUoJy4uL3V0aWwvaHRtbCcpLnRhZztcblxubW9kdWxlLmV4cG9ydHMgPSBpbmxpbmVIVE1MO1xuaW5saW5lSFRNTC5sb2NhdG9yID0gbG9jYXRlO1xuXG52YXIgRVhQUkVTU0lPTl9IVE1MX0xJTktfT1BFTiA9IC9ePGEgL2k7XG52YXIgRVhQUkVTU0lPTl9IVE1MX0xJTktfQ0xPU0UgPSAvXjxcXC9hPi9pO1xuXG5mdW5jdGlvbiBpbmxpbmVIVE1MKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBzdWJ2YWx1ZTtcblxuICBpZiAodmFsdWUuY2hhckF0KDApICE9PSAnPCcgfHwgbGVuZ3RoIDwgMykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgxKTtcblxuICBpZiAoXG4gICAgIWFscGhhYmV0aWNhbChjaGFyYWN0ZXIpICYmXG4gICAgY2hhcmFjdGVyICE9PSAnPycgJiZcbiAgICBjaGFyYWN0ZXIgIT09ICchJyAmJlxuICAgIGNoYXJhY3RlciAhPT0gJy8nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnZhbHVlID0gdmFsdWUubWF0Y2godGFnKTtcblxuICBpZiAoIXN1YnZhbHVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbm90IHVzZWQgeWV0LiAqL1xuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdWJ2YWx1ZSA9IHN1YnZhbHVlWzBdO1xuXG4gIGlmICghc2VsZi5pbkxpbmsgJiYgRVhQUkVTU0lPTl9IVE1MX0xJTktfT1BFTi50ZXN0KHN1YnZhbHVlKSkge1xuICAgIHNlbGYuaW5MaW5rID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzZWxmLmluTGluayAmJiBFWFBSRVNTSU9OX0hUTUxfTElOS19DTE9TRS50ZXN0KHN1YnZhbHVlKSkge1xuICAgIHNlbGYuaW5MaW5rID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZWF0KHN1YnZhbHVlKSh7dHlwZTogJ2h0bWwnLCB2YWx1ZTogc3VidmFsdWV9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHdoaXRlc3BhY2UgPSByZXF1aXJlKCdpcy13aGl0ZXNwYWNlLWNoYXJhY3RlcicpO1xudmFyIGxvY2F0ZSA9IHJlcXVpcmUoJy4uL2xvY2F0ZS9saW5rJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbGluaztcbmxpbmsubG9jYXRvciA9IGxvY2F0ZTtcblxudmFyIG93biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG52YXIgQ19CQUNLU0xBU0ggPSAnXFxcXCc7XG52YXIgQ19CUkFDS0VUX09QRU4gPSAnWyc7XG52YXIgQ19CUkFDS0VUX0NMT1NFID0gJ10nO1xudmFyIENfUEFSRU5fT1BFTiA9ICcoJztcbnZhciBDX1BBUkVOX0NMT1NFID0gJyknO1xudmFyIENfTFQgPSAnPCc7XG52YXIgQ19HVCA9ICc+JztcbnZhciBDX1RJQ0sgPSAnYCc7XG52YXIgQ19ET1VCTEVfUVVPVEUgPSAnXCInO1xudmFyIENfU0lOR0xFX1FVT1RFID0gJ1xcJyc7XG5cbi8qIE1hcCBvZiBjaGFyYWN0ZXJzLCB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXJrIGxpbmtcbiAqIGFuZCBpbWFnZSB0aXRsZXMuICovXG52YXIgTElOS19NQVJLRVJTID0ge307XG5cbkxJTktfTUFSS0VSU1tDX0RPVUJMRV9RVU9URV0gPSBDX0RPVUJMRV9RVU9URTtcbkxJTktfTUFSS0VSU1tDX1NJTkdMRV9RVU9URV0gPSBDX1NJTkdMRV9RVU9URTtcblxuLyogTWFwIG9mIGNoYXJhY3RlcnMsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmsgbGlua1xuICogYW5kIGltYWdlIHRpdGxlcyBpbiBjb21tb25tYXJrLW1vZGUuICovXG52YXIgQ09NTU9OTUFSS19MSU5LX01BUktFUlMgPSB7fTtcblxuQ09NTU9OTUFSS19MSU5LX01BUktFUlNbQ19ET1VCTEVfUVVPVEVdID0gQ19ET1VCTEVfUVVPVEU7XG5DT01NT05NQVJLX0xJTktfTUFSS0VSU1tDX1NJTkdMRV9RVU9URV0gPSBDX1NJTkdMRV9RVU9URTtcbkNPTU1PTk1BUktfTElOS19NQVJLRVJTW0NfUEFSRU5fT1BFTl0gPSBDX1BBUkVOX0NMT1NFO1xuXG5mdW5jdGlvbiBsaW5rKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdWJ2YWx1ZSA9ICcnO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KDApO1xuICB2YXIgcGVkYW50aWMgPSBzZWxmLm9wdGlvbnMucGVkYW50aWM7XG4gIHZhciBjb21tb25tYXJrID0gc2VsZi5vcHRpb25zLmNvbW1vbm1hcms7XG4gIHZhciBnZm0gPSBzZWxmLm9wdGlvbnMuZ2ZtO1xuICB2YXIgY2xvc2VkO1xuICB2YXIgY291bnQ7XG4gIHZhciBvcGVuaW5nO1xuICB2YXIgYmVmb3JlVVJMO1xuICB2YXIgYmVmb3JlVGl0bGU7XG4gIHZhciBzdWJxdWV1ZTtcbiAgdmFyIGhhc01hcmtlcjtcbiAgdmFyIG1hcmtlcnM7XG4gIHZhciBpc0ltYWdlO1xuICB2YXIgY29udGVudDtcbiAgdmFyIG1hcmtlcjtcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIHRpdGxlO1xuICB2YXIgZGVwdGg7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIHVybDtcbiAgdmFyIG5vdztcbiAgdmFyIGV4aXQ7XG4gIHZhciBub2RlO1xuXG4gIC8qIERldGVjdCB3aGV0aGVyIHRoaXMgaXMgYW4gaW1hZ2UuICovXG4gIGlmIChjaGFyYWN0ZXIgPT09ICchJykge1xuICAgIGlzSW1hZ2UgPSB0cnVlO1xuICAgIHN1YnZhbHVlID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgfVxuXG4gIC8qIEVhdCB0aGUgb3BlbmluZy4gKi9cbiAgaWYgKGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX09QRU4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiBFeGl0IHdoZW4gdGhpcyBpcyBhIGxpbmsgYW5kIHdl4oCZcmUgYWxyZWFkeSBpbnNpZGVcbiAgICogYSBsaW5rLiAqL1xuICBpZiAoIWlzSW1hZ2UgJiYgc2VsZi5pbkxpbmspIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gIHF1ZXVlID0gJyc7XG4gIGluZGV4Kys7XG5cbiAgLyogRWF0IHRoZSBjb250ZW50LiAqL1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIG5vdyA9IGVhdC5ub3coKTtcbiAgZGVwdGggPSAwO1xuXG4gIG5vdy5jb2x1bW4gKz0gaW5kZXg7XG4gIG5vdy5vZmZzZXQgKz0gaW5kZXg7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICBzdWJxdWV1ZSA9IGNoYXJhY3RlcjtcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVElDSykge1xuICAgICAgLyogSW5saW5lLWNvZGUgaW4gbGluayBjb250ZW50LiAqL1xuICAgICAgY291bnQgPSAxO1xuXG4gICAgICB3aGlsZSAodmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IENfVElDSykge1xuICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3BlbmluZykge1xuICAgICAgICBvcGVuaW5nID0gY291bnQ7XG4gICAgICB9IGVsc2UgaWYgKGNvdW50ID49IG9wZW5pbmcpIHtcbiAgICAgICAgb3BlbmluZyA9IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAvKiBBbGxvdyBicmFja2V0cyB0byBiZSBlc2NhcGVkLiAqL1xuICAgICAgaW5kZXgrKztcbiAgICAgIHN1YnF1ZXVlICs9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gICAgLyogSW4gR0ZNIG1vZGUsIGJyYWNrZXRzIGluIGNvZGUgc3RpbGwgY291bnQuXG4gICAgICogSW4gYWxsIG90aGVyIG1vZGVzLCB0aGV5IGRvbuKAmXQuICBUaGlzIGVtcHR5XG4gICAgICogYmxvY2sgcHJldmVudHMgdGhlIG5leHQgc3RhdGVtZW50cyBhcmVcbiAgICAgKiBlbnRlcmVkLiAqL1xuICAgIH0gZWxzZSBpZiAoKCFvcGVuaW5nIHx8IGdmbSkgJiYgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgICAgZGVwdGgrKztcbiAgICB9IGVsc2UgaWYgKCghb3BlbmluZyB8fCBnZm0pICYmIGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICBpZiAoZGVwdGgpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEFsbG93IHdoaXRlLXNwYWNlIGJldHdlZW4gY29udGVudCBhbmRcbiAgICAgICAgICogdXJsIGluIEdGTSBtb2RlLiAqL1xuICAgICAgICBpZiAoIXBlZGFudGljKSB7XG4gICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKTtcblxuICAgICAgICAgICAgaWYgKCF3aGl0ZXNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1YnF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCArIDEpICE9PSBDX1BBUkVOX09QRU4pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdWJxdWV1ZSArPSBDX1BBUkVOX09QRU47XG4gICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVldWUgKz0gc3VicXVldWU7XG4gICAgc3VicXVldWUgPSAnJztcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgLyogRWF0IHRoZSBjb250ZW50IGNsb3NpbmcuICovXG4gIGlmICghY2xvc2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29udGVudCA9IHF1ZXVlO1xuICBzdWJ2YWx1ZSArPSBxdWV1ZSArIHN1YnF1ZXVlO1xuICBpbmRleCsrO1xuXG4gIC8qIEVhdCB3aGl0ZS1zcGFjZS4gKi9cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmICghd2hpdGVzcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIC8qIEVhdCB0aGUgVVJMLiAqL1xuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICBtYXJrZXJzID0gY29tbW9ubWFyayA/IENPTU1PTk1BUktfTElOS19NQVJLRVJTIDogTElOS19NQVJLRVJTO1xuICBxdWV1ZSA9ICcnO1xuICBiZWZvcmVVUkwgPSBzdWJ2YWx1ZTtcblxuICBpZiAoY2hhcmFjdGVyID09PSBDX0xUKSB7XG4gICAgaW5kZXgrKztcbiAgICBiZWZvcmVVUkwgKz0gQ19MVDtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19HVCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1vbm1hcmsgJiYgY2hhcmFjdGVyID09PSAnXFxuJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfR1QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSArPSBDX0xUICsgcXVldWUgKyBDX0dUO1xuICAgIHVybCA9IHF1ZXVlO1xuICAgIGluZGV4Kys7XG4gIH0gZWxzZSB7XG4gICAgY2hhcmFjdGVyID0gbnVsbDtcbiAgICBzdWJxdWV1ZSA9ICcnO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoc3VicXVldWUgJiYgb3duLmNhbGwobWFya2VycywgY2hhcmFjdGVyKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICBpZiAoIXBlZGFudGljKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX1BBUkVOX09QRU4pIHtcbiAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19QQVJFTl9DTE9TRSkge1xuICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgICBzdWJxdWV1ZSA9ICcnO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgcXVldWUgKz0gQ19CQUNLU0xBU0g7XG4gICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgfVxuXG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IHF1ZXVlO1xuICAgIHVybCA9IHF1ZXVlO1xuICAgIGluZGV4ID0gc3VidmFsdWUubGVuZ3RoO1xuICB9XG5cbiAgLyogRWF0IHdoaXRlLXNwYWNlLiAqL1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIXdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICBzdWJ2YWx1ZSArPSBxdWV1ZTtcblxuICAvKiBFYXQgdGhlIHRpdGxlLiAqL1xuICBpZiAocXVldWUgJiYgb3duLmNhbGwobWFya2VycywgY2hhcmFjdGVyKSkge1xuICAgIGluZGV4Kys7XG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIHF1ZXVlID0gJyc7XG4gICAgbWFya2VyID0gbWFya2Vyc1tjaGFyYWN0ZXJdO1xuICAgIGJlZm9yZVRpdGxlID0gc3VidmFsdWU7XG5cbiAgICAvKiBJbiBjb21tb25tYXJrLW1vZGUsIHRoaW5ncyBhcmUgcHJldHR5IGVhc3k6IHRoZVxuICAgICAqIG1hcmtlciBjYW5ub3Qgb2NjdXIgaW5zaWRlIHRoZSB0aXRsZS5cbiAgICAgKlxuICAgICAqIE5vbi1jb21tb25tYXJrIGRvZXMsIGhvd2V2ZXIsIHN1cHBvcnQgbmVzdGVkXG4gICAgICogZGVsaW1pdGVycy4gKi9cbiAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHF1ZXVlICs9IENfQkFDS1NMQVNIO1xuICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIH1cblxuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gbWFya2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGl0bGUgPSBxdWV1ZTtcbiAgICAgIHN1YnZhbHVlICs9IHF1ZXVlICsgY2hhcmFjdGVyO1xuICAgICAgaW5kZXgrKztcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKCF3aGl0ZXNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VicXVldWUgPSAnJztcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgaWYgKGhhc01hcmtlcikge1xuICAgICAgICAgICAgcXVldWUgKz0gbWFya2VyICsgc3VicXVldWU7XG4gICAgICAgICAgICBzdWJxdWV1ZSA9ICcnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGhhc01hcmtlciA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc01hcmtlcikge1xuICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfUEFSRU5fQ0xPU0UpIHtcbiAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIG1hcmtlciArIHN1YnF1ZXVlO1xuICAgICAgICAgIHRpdGxlID0gcXVldWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAod2hpdGVzcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgc3VicXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlICs9IG1hcmtlciArIHN1YnF1ZXVlICsgY2hhcmFjdGVyO1xuICAgICAgICAgIHN1YnF1ZXVlID0gJyc7XG4gICAgICAgICAgaGFzTWFya2VyID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX1BBUkVOX0NMT1NFKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbmV2ZXIgdXNlZCAoeWV0KSAqL1xuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdWJ2YWx1ZSArPSBDX1BBUkVOX0NMT1NFO1xuXG4gIHVybCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLnVuZXNjYXBlKHVybCksIGVhdChiZWZvcmVVUkwpLnRlc3QoKS5lbmQpO1xuXG4gIGlmICh0aXRsZSkge1xuICAgIGJlZm9yZVRpdGxlID0gZWF0KGJlZm9yZVRpdGxlKS50ZXN0KCkuZW5kO1xuICAgIHRpdGxlID0gc2VsZi5kZWNvZGUucmF3KHNlbGYudW5lc2NhcGUodGl0bGUpLCBiZWZvcmVUaXRsZSk7XG4gIH1cblxuICBub2RlID0ge1xuICAgIHR5cGU6IGlzSW1hZ2UgPyAnaW1hZ2UnIDogJ2xpbmsnLFxuICAgIHRpdGxlOiB0aXRsZSB8fCBudWxsLFxuICAgIHVybDogdXJsXG4gIH07XG5cbiAgaWYgKGlzSW1hZ2UpIHtcbiAgICBub2RlLmFsdCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLnVuZXNjYXBlKGNvbnRlbnQpLCBub3cpIHx8IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgZXhpdCA9IHNlbGYuZW50ZXJMaW5rKCk7XG4gICAgbm9kZS5jaGlsZHJlbiA9IHNlbGYudG9rZW5pemVJbmxpbmUoY29udGVudCwgbm93KTtcbiAgICBleGl0KCk7XG4gIH1cblxuICByZXR1cm4gZWF0KHN1YnZhbHVlKShub2RlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LXBhcmFtcyAqL1xuXG52YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG52YXIgZGVjaW1hbCA9IHJlcXVpcmUoJ2lzLWRlY2ltYWwnKTtcbnZhciBnZXRJbmRlbnQgPSByZXF1aXJlKCcuLi91dGlsL2dldC1pbmRlbnRhdGlvbicpO1xudmFyIHJlbW92ZUluZGVudCA9IHJlcXVpcmUoJy4uL3V0aWwvcmVtb3ZlLWluZGVudGF0aW9uJyk7XG52YXIgaW50ZXJydXB0ID0gcmVxdWlyZSgnLi4vdXRpbC9pbnRlcnJ1cHQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0O1xuXG52YXIgQ19BU1RFUklTSyA9ICcqJztcbnZhciBDX1VOREVSU0NPUkUgPSAnXyc7XG52YXIgQ19QTFVTID0gJysnO1xudmFyIENfREFTSCA9ICctJztcbnZhciBDX0RPVCA9ICcuJztcbnZhciBDX1NQQUNFID0gJyAnO1xudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19QQVJFTl9DTE9TRSA9ICcpJztcbnZhciBDX1hfTE9XRVIgPSAneCc7XG5cbnZhciBUQUJfU0laRSA9IDQ7XG52YXIgRVhQUkVTU0lPTl9MT09TRV9MSVNUX0lURU0gPSAvXFxuXFxuKD8hXFxzKiQpLztcbnZhciBFWFBSRVNTSU9OX1RBU0tfSVRFTSA9IC9eXFxbKFsgXFx0XXx4fFgpXVsgXFx0XS87XG52YXIgRVhQUkVTU0lPTl9CVUxMRVQgPSAvXihbIFxcdF0qKShbKistXXxcXGQrWy4pXSkoIHsxLDR9KD8hICl8IHxcXHR8JHwoPz1cXG4pKShbXlxcbl0qKS87XG52YXIgRVhQUkVTU0lPTl9QRURBTlRJQ19CVUxMRVQgPSAvXihbIFxcdF0qKShbKistXXxcXGQrWy4pXSkoWyBcXHRdKykvO1xudmFyIEVYUFJFU1NJT05fSU5JVElBTF9JTkRFTlQgPSAvXiggezEsNH18XFx0KT8vZ207XG5cbi8qIE1hcCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmtcbiAqIGxpc3QtaXRlbXMuICovXG52YXIgTElTVF9VTk9SREVSRURfTUFSS0VSUyA9IHt9O1xuXG5MSVNUX1VOT1JERVJFRF9NQVJLRVJTW0NfQVNURVJJU0tdID0gdHJ1ZTtcbkxJU1RfVU5PUkRFUkVEX01BUktFUlNbQ19QTFVTXSA9IHRydWU7XG5MSVNUX1VOT1JERVJFRF9NQVJLRVJTW0NfREFTSF0gPSB0cnVlO1xuXG4vKiBNYXAgb2YgY2hhcmFjdGVycyB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXJrXG4gKiBsaXN0LWl0ZW1zIGFmdGVyIGEgZGlnaXQuICovXG52YXIgTElTVF9PUkRFUkVEX01BUktFUlMgPSB7fTtcblxuTElTVF9PUkRFUkVEX01BUktFUlNbQ19ET1RdID0gdHJ1ZTtcblxuLyogTWFwIG9mIGNoYXJhY3RlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFya1xuICogbGlzdC1pdGVtcyBhZnRlciBhIGRpZ2l0LiAqL1xudmFyIExJU1RfT1JERVJFRF9DT01NT05NQVJLX01BUktFUlMgPSB7fTtcblxuTElTVF9PUkRFUkVEX0NPTU1PTk1BUktfTUFSS0VSU1tDX0RPVF0gPSB0cnVlO1xuTElTVF9PUkRFUkVEX0NPTU1PTk1BUktfTUFSS0VSU1tDX1BBUkVOX0NMT1NFXSA9IHRydWU7XG5cbmZ1bmN0aW9uIGxpc3QoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNvbW1vbm1hcmsgPSBzZWxmLm9wdGlvbnMuY29tbW9ubWFyaztcbiAgdmFyIHBlZGFudGljID0gc2VsZi5vcHRpb25zLnBlZGFudGljO1xuICB2YXIgdG9rZW5pemVycyA9IHNlbGYuYmxvY2tUb2tlbml6ZXJzO1xuICB2YXIgaW50ZXJ1cHRvcnMgPSBzZWxmLmludGVycnVwdExpc3Q7XG4gIHZhciBtYXJrZXJzO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBudWxsO1xuICB2YXIgc2l6ZSA9IDA7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIG9yZGVyZWQ7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBtYXJrZXI7XG4gIHZhciBuZXh0SW5kZXg7XG4gIHZhciBzdGFydEluZGV4O1xuICB2YXIgcHJlZml4ZWQ7XG4gIHZhciBjdXJyZW50TWFya2VyO1xuICB2YXIgY29udGVudDtcbiAgdmFyIGxpbmU7XG4gIHZhciBwcmV2RW1wdHk7XG4gIHZhciBlbXB0eTtcbiAgdmFyIGl0ZW1zO1xuICB2YXIgYWxsTGluZXM7XG4gIHZhciBlbXB0eUxpbmVzO1xuICB2YXIgaXRlbTtcbiAgdmFyIGVudGVyVG9wO1xuICB2YXIgZXhpdEJsb2NrcXVvdGU7XG4gIHZhciBpc0xvb3NlO1xuICB2YXIgbm9kZTtcbiAgdmFyIG5vdztcbiAgdmFyIGVuZDtcbiAgdmFyIGluZGVudGVkO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgc2l6ZSArPSBUQUJfU0laRSAtIChzaXplICUgVEFCX1NJWkUpO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICBzaXplKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAoc2l6ZSA+PSBUQUJfU0laRSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgbWFya2VycyA9IGNvbW1vbm1hcmsgP1xuICAgIExJU1RfT1JERVJFRF9DT01NT05NQVJLX01BUktFUlMgOlxuICAgIExJU1RfT1JERVJFRF9NQVJLRVJTO1xuXG4gIGlmIChMSVNUX1VOT1JERVJFRF9NQVJLRVJTW2NoYXJhY3Rlcl0gPT09IHRydWUpIHtcbiAgICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gICAgb3JkZXJlZCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG9yZGVyZWQgPSB0cnVlO1xuICAgIHF1ZXVlID0gJyc7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgIGlmICghZGVjaW1hbChjaGFyYWN0ZXIpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIXF1ZXVlIHx8IG1hcmtlcnNbY2hhcmFjdGVyXSAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN0YXJ0ID0gcGFyc2VJbnQocXVldWUsIDEwKTtcbiAgICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG5cbiAgaWYgKGNoYXJhY3RlciAhPT0gQ19TUEFDRSAmJiBjaGFyYWN0ZXIgIT09IENfVEFCKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaW5kZXggPSAwO1xuICBpdGVtcyA9IFtdO1xuICBhbGxMaW5lcyA9IFtdO1xuICBlbXB0eUxpbmVzID0gW107XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgbmV4dEluZGV4ID0gdmFsdWUuaW5kZXhPZihDX05FV0xJTkUsIGluZGV4KTtcbiAgICBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgcHJlZml4ZWQgPSBmYWxzZTtcbiAgICBpbmRlbnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKG5leHRJbmRleCA9PT0gLTEpIHtcbiAgICAgIG5leHRJbmRleCA9IGxlbmd0aDtcbiAgICB9XG5cbiAgICBlbmQgPSBpbmRleCArIFRBQl9TSVpFO1xuICAgIHNpemUgPSAwO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgICBzaXplICs9IFRBQl9TSVpFIC0gKHNpemUgJSBUQUJfU0laRSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSkge1xuICAgICAgICBzaXplKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSA+PSBUQUJfU0laRSkge1xuICAgICAgaW5kZW50ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpdGVtICYmIHNpemUgPj0gaXRlbS5pbmRlbnQpIHtcbiAgICAgIGluZGVudGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIGN1cnJlbnRNYXJrZXIgPSBudWxsO1xuXG4gICAgaWYgKCFpbmRlbnRlZCkge1xuICAgICAgaWYgKExJU1RfVU5PUkRFUkVEX01BUktFUlNbY2hhcmFjdGVyXSA9PT0gdHJ1ZSkge1xuICAgICAgICBjdXJyZW50TWFya2VyID0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBzaXplKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZSA9ICcnO1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICBpZiAoIWRlY2ltYWwoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgIGlmIChxdWV1ZSAmJiBtYXJrZXJzW2NoYXJhY3Rlcl0gPT09IHRydWUpIHtcbiAgICAgICAgICBjdXJyZW50TWFya2VyID0gY2hhcmFjdGVyO1xuICAgICAgICAgIHNpemUgKz0gcXVldWUubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudE1hcmtlcikge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVEFCKSB7XG4gICAgICAgICAgc2l6ZSArPSBUQUJfU0laRSAtIChzaXplICUgVEFCX1NJWkUpO1xuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICAgICAgZW5kID0gaW5kZXggKyBUQUJfU0laRTtcblxuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfU1BBQ0UpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBlbmQgJiYgdmFsdWUuY2hhckF0KGluZGV4KSA9PT0gQ19TUEFDRSkge1xuICAgICAgICAgICAgaW5kZXggLT0gVEFCX1NJWkUgLSAxO1xuICAgICAgICAgICAgc2l6ZSAtPSBUQUJfU0laRSAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FICYmIGNoYXJhY3RlciAhPT0gJycpIHtcbiAgICAgICAgICBjdXJyZW50TWFya2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50TWFya2VyKSB7XG4gICAgICBpZiAoIXBlZGFudGljICYmIG1hcmtlciAhPT0gY3VycmVudE1hcmtlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJlZml4ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNvbW1vbm1hcmsgJiYgIWluZGVudGVkICYmIHZhbHVlLmNoYXJBdChzdGFydEluZGV4KSA9PT0gQ19TUEFDRSkge1xuICAgICAgICBpbmRlbnRlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbW1vbm1hcmsgJiYgaXRlbSkge1xuICAgICAgICBpbmRlbnRlZCA9IHNpemUgPj0gaXRlbS5pbmRlbnQgfHwgc2l6ZSA+IFRBQl9TSVpFO1xuICAgICAgfVxuXG4gICAgICBwcmVmaXhlZCA9IGZhbHNlO1xuICAgICAgaW5kZXggPSBzdGFydEluZGV4O1xuICAgIH1cblxuICAgIGxpbmUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4LCBuZXh0SW5kZXgpO1xuICAgIGNvbnRlbnQgPSBzdGFydEluZGV4ID09PSBpbmRleCA/IGxpbmUgOiB2YWx1ZS5zbGljZShpbmRleCwgbmV4dEluZGV4KTtcblxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRNYXJrZXIgPT09IENfQVNURVJJU0sgfHxcbiAgICAgIGN1cnJlbnRNYXJrZXIgPT09IENfVU5ERVJTQ09SRSB8fFxuICAgICAgY3VycmVudE1hcmtlciA9PT0gQ19EQVNIXG4gICAgKSB7XG4gICAgICBpZiAodG9rZW5pemVycy50aGVtYXRpY0JyZWFrLmNhbGwoc2VsZiwgZWF0LCBsaW5lLCB0cnVlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmV2RW1wdHkgPSBlbXB0eTtcbiAgICBlbXB0eSA9ICF0cmltKGNvbnRlbnQpLmxlbmd0aDtcblxuICAgIGlmIChpbmRlbnRlZCAmJiBpdGVtKSB7XG4gICAgICBpdGVtLnZhbHVlID0gaXRlbS52YWx1ZS5jb25jYXQoZW1wdHlMaW5lcywgbGluZSk7XG4gICAgICBhbGxMaW5lcyA9IGFsbExpbmVzLmNvbmNhdChlbXB0eUxpbmVzLCBsaW5lKTtcbiAgICAgIGVtcHR5TGluZXMgPSBbXTtcbiAgICB9IGVsc2UgaWYgKHByZWZpeGVkKSB7XG4gICAgICBpZiAoZW1wdHlMaW5lcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgaXRlbS52YWx1ZS5wdXNoKCcnKTtcbiAgICAgICAgaXRlbS50cmFpbCA9IGVtcHR5TGluZXMuY29uY2F0KCk7XG4gICAgICB9XG5cbiAgICAgIGl0ZW0gPSB7XG4gICAgICAgIHZhbHVlOiBbbGluZV0sXG4gICAgICAgIGluZGVudDogc2l6ZSxcbiAgICAgICAgdHJhaWw6IFtdXG4gICAgICB9O1xuXG4gICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgYWxsTGluZXMgPSBhbGxMaW5lcy5jb25jYXQoZW1wdHlMaW5lcywgbGluZSk7XG4gICAgICBlbXB0eUxpbmVzID0gW107XG4gICAgfSBlbHNlIGlmIChlbXB0eSkge1xuICAgICAgaWYgKHByZXZFbXB0eSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZW1wdHlMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldkVtcHR5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW50ZXJydXB0KGludGVydXB0b3JzLCB0b2tlbml6ZXJzLCBzZWxmLCBbZWF0LCBsaW5lLCB0cnVlXSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGl0ZW0udmFsdWUgPSBpdGVtLnZhbHVlLmNvbmNhdChlbXB0eUxpbmVzLCBsaW5lKTtcbiAgICAgIGFsbExpbmVzID0gYWxsTGluZXMuY29uY2F0KGVtcHR5TGluZXMsIGxpbmUpO1xuICAgICAgZW1wdHlMaW5lcyA9IFtdO1xuICAgIH1cblxuICAgIGluZGV4ID0gbmV4dEluZGV4ICsgMTtcbiAgfVxuXG4gIG5vZGUgPSBlYXQoYWxsTGluZXMuam9pbihDX05FV0xJTkUpKS5yZXNldCh7XG4gICAgdHlwZTogJ2xpc3QnLFxuICAgIG9yZGVyZWQ6IG9yZGVyZWQsXG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGxvb3NlOiBudWxsLFxuICAgIGNoaWxkcmVuOiBbXVxuICB9KTtcblxuICBlbnRlclRvcCA9IHNlbGYuZW50ZXJMaXN0KCk7XG4gIGV4aXRCbG9ja3F1b3RlID0gc2VsZi5lbnRlckJsb2NrKCk7XG4gIGlzTG9vc2UgPSBmYWxzZTtcbiAgaW5kZXggPSAtMTtcbiAgbGVuZ3RoID0gaXRlbXMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaXRlbSA9IGl0ZW1zW2luZGV4XS52YWx1ZS5qb2luKENfTkVXTElORSk7XG4gICAgbm93ID0gZWF0Lm5vdygpO1xuXG4gICAgaXRlbSA9IGVhdChpdGVtKShsaXN0SXRlbShzZWxmLCBpdGVtLCBub3cpLCBub2RlKTtcblxuICAgIGlmIChpdGVtLmxvb3NlKSB7XG4gICAgICBpc0xvb3NlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpdGVtID0gaXRlbXNbaW5kZXhdLnRyYWlsLmpvaW4oQ19ORVdMSU5FKTtcblxuICAgIGlmIChpbmRleCAhPT0gbGVuZ3RoIC0gMSkge1xuICAgICAgaXRlbSArPSBDX05FV0xJTkU7XG4gICAgfVxuXG4gICAgZWF0KGl0ZW0pO1xuICB9XG5cbiAgZW50ZXJUb3AoKTtcbiAgZXhpdEJsb2NrcXVvdGUoKTtcblxuICBub2RlLmxvb3NlID0gaXNMb29zZTtcblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gbGlzdEl0ZW0oY3R4LCB2YWx1ZSwgcG9zaXRpb24pIHtcbiAgdmFyIG9mZnNldHMgPSBjdHgub2Zmc2V0O1xuICB2YXIgZm4gPSBjdHgub3B0aW9ucy5wZWRhbnRpYyA/IHBlZGFudGljTGlzdEl0ZW0gOiBub3JtYWxMaXN0SXRlbTtcbiAgdmFyIGNoZWNrZWQgPSBudWxsO1xuICB2YXIgdGFzaztcbiAgdmFyIGluZGVudDtcblxuICB2YWx1ZSA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cbiAgaWYgKGN0eC5vcHRpb25zLmdmbSkge1xuICAgIHRhc2sgPSB2YWx1ZS5tYXRjaChFWFBSRVNTSU9OX1RBU0tfSVRFTSk7XG5cbiAgICBpZiAodGFzaykge1xuICAgICAgaW5kZW50ID0gdGFza1swXS5sZW5ndGg7XG4gICAgICBjaGVja2VkID0gdGFza1sxXS50b0xvd2VyQ2FzZSgpID09PSBDX1hfTE9XRVI7XG4gICAgICBvZmZzZXRzW3Bvc2l0aW9uLmxpbmVdICs9IGluZGVudDtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoaW5kZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgbG9vc2U6IEVYUFJFU1NJT05fTE9PU0VfTElTVF9JVEVNLnRlc3QodmFsdWUpIHx8XG4gICAgICB2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoIC0gMSkgPT09IENfTkVXTElORSxcbiAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgIGNoaWxkcmVuOiBjdHgudG9rZW5pemVCbG9jayh2YWx1ZSwgcG9zaXRpb24pXG4gIH07XG59XG5cbi8qIENyZWF0ZSBhIGxpc3QtaXRlbSB1c2luZyBvdmVybHkgc2ltcGxlIG1lY2hhbmljcy4gKi9cbmZ1bmN0aW9uIHBlZGFudGljTGlzdEl0ZW0oY3R4LCB2YWx1ZSwgcG9zaXRpb24pIHtcbiAgdmFyIG9mZnNldHMgPSBjdHgub2Zmc2V0O1xuICB2YXIgbGluZSA9IHBvc2l0aW9uLmxpbmU7XG5cbiAgLyogUmVtb3ZlIHRoZSBsaXN0LWl0ZW3igJlzIGJ1bGxldC4gKi9cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEVYUFJFU1NJT05fUEVEQU5USUNfQlVMTEVULCByZXBsYWNlcik7XG5cbiAgLyogVGhlIGluaXRpYWwgbGluZSB3YXMgYWxzbyBtYXRjaGVkIGJ5IHRoZSBiZWxvdywgc29cbiAgICogd2UgcmVzZXQgdGhlIGBsaW5lYC4gKi9cbiAgbGluZSA9IHBvc2l0aW9uLmxpbmU7XG5cbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoRVhQUkVTU0lPTl9JTklUSUFMX0lOREVOVCwgcmVwbGFjZXIpO1xuXG4gIC8qIEEgc2ltcGxlIHJlcGxhY2VyIHdoaWNoIHJlbW92ZWQgYWxsIG1hdGNoZXMsXG4gICAqIGFuZCBhZGRzIHRoZWlyIGxlbmd0aCB0byBgb2Zmc2V0YC4gKi9cbiAgZnVuY3Rpb24gcmVwbGFjZXIoJDApIHtcbiAgICBvZmZzZXRzW2xpbmVdID0gKG9mZnNldHNbbGluZV0gfHwgMCkgKyAkMC5sZW5ndGg7XG4gICAgbGluZSsrO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8qIENyZWF0ZSBhIGxpc3QtaXRlbSB1c2luZyBzYW5lIG1lY2hhbmljcy4gKi9cbmZ1bmN0aW9uIG5vcm1hbExpc3RJdGVtKGN0eCwgdmFsdWUsIHBvc2l0aW9uKSB7XG4gIHZhciBvZmZzZXRzID0gY3R4Lm9mZnNldDtcbiAgdmFyIGxpbmUgPSBwb3NpdGlvbi5saW5lO1xuICB2YXIgbWF4O1xuICB2YXIgYnVsbGV0O1xuICB2YXIgcmVzdDtcbiAgdmFyIGxpbmVzO1xuICB2YXIgdHJpbW1lZExpbmVzO1xuICB2YXIgaW5kZXg7XG4gIHZhciBsZW5ndGg7XG5cbiAgLyogUmVtb3ZlIHRoZSBsaXN0LWl0ZW3igJlzIGJ1bGxldC4gKi9cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEVYUFJFU1NJT05fQlVMTEVULCByZXBsYWNlcik7XG5cbiAgbGluZXMgPSB2YWx1ZS5zcGxpdChDX05FV0xJTkUpO1xuXG4gIHRyaW1tZWRMaW5lcyA9IHJlbW92ZUluZGVudCh2YWx1ZSwgZ2V0SW5kZW50KG1heCkuaW5kZW50KS5zcGxpdChDX05FV0xJTkUpO1xuXG4gIC8qIFdlIHJlcGxhY2VkIHRoZSBpbml0aWFsIGJ1bGxldCB3aXRoIHNvbWV0aGluZ1xuICAgKiBlbHNlIGFib3ZlLCB3aGljaCB3YXMgdXNlZCB0byB0cmlja1xuICAgKiBgcmVtb3ZlSW5kZW50YXRpb25gIGludG8gcmVtb3Zpbmcgc29tZSBtb3JlXG4gICAqIGNoYXJhY3RlcnMgd2hlbiBwb3NzaWJsZS4gIEhvd2V2ZXIsIHRoYXQgY291bGRcbiAgICogcmVzdWx0IGluIHRoZSBpbml0aWFsIGxpbmUgdG8gYmUgc3RyaXBwZWQgbW9yZVxuICAgKiB0aGFuIGl0IHNob3VsZCBiZS4gKi9cbiAgdHJpbW1lZExpbmVzWzBdID0gcmVzdDtcblxuICBvZmZzZXRzW2xpbmVdID0gKG9mZnNldHNbbGluZV0gfHwgMCkgKyBidWxsZXQubGVuZ3RoO1xuICBsaW5lKys7XG5cbiAgaW5kZXggPSAwO1xuICBsZW5ndGggPSBsaW5lcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBvZmZzZXRzW2xpbmVdID0gKG9mZnNldHNbbGluZV0gfHwgMCkgK1xuICAgICAgbGluZXNbaW5kZXhdLmxlbmd0aCAtIHRyaW1tZWRMaW5lc1tpbmRleF0ubGVuZ3RoO1xuICAgIGxpbmUrKztcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkTGluZXMuam9pbihDX05FV0xJTkUpO1xuXG4gIGZ1bmN0aW9uIHJlcGxhY2VyKCQwLCAkMSwgJDIsICQzLCAkNCkge1xuICAgIGJ1bGxldCA9ICQxICsgJDIgKyAkMztcbiAgICByZXN0ID0gJDQ7XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgbmluZSBudW1iZXJlZCBsaXN0IGl0ZW1zXG4gICAgICogY2FuIGluZGVudCB3aXRoIGFuIGV4dHJhIHNwYWNlLiAgVGhhdCBpcywgd2hlblxuICAgICAqIHRoZSBidWxsZXQgZGlkIG5vdCByZWNlaXZlIGFuIGV4dHJhIGZpbmFsIHNwYWNlLiAqL1xuICAgIGlmIChOdW1iZXIoJDIpIDwgMTAgJiYgYnVsbGV0Lmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICQyID0gQ19TUEFDRSArICQyO1xuICAgIH1cblxuICAgIG1heCA9ICQxICsgcmVwZWF0KENfU1BBQ0UsICQyLmxlbmd0aCkgKyAkMztcblxuICAgIHJldHVybiBtYXggKyByZXN0O1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB3aGl0ZXNwYWNlID0gcmVxdWlyZSgnaXMtd2hpdGVzcGFjZS1jaGFyYWN0ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXdsaW5lO1xuXG4vKiBUb2tlbmlzZSBuZXdsaW5lLiAqL1xuZnVuY3Rpb24gbmV3bGluZShlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgwKTtcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgcXVldWU7XG4gIHZhciBpbmRleDtcblxuICBpZiAoY2hhcmFjdGVyICE9PSAnXFxuJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaW5kZXggPSAxO1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHN1YnZhbHVlID0gY2hhcmFjdGVyO1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIXdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcbicpIHtcbiAgICAgIHN1YnZhbHVlICs9IHF1ZXVlO1xuICAgICAgcXVldWUgPSAnJztcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgZWF0KHN1YnZhbHVlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRyaW0gPSByZXF1aXJlKCd0cmltJyk7XG52YXIgZGVjaW1hbCA9IHJlcXVpcmUoJ2lzLWRlY2ltYWwnKTtcbnZhciB0cmltVHJhaWxpbmdMaW5lcyA9IHJlcXVpcmUoJ3RyaW0tdHJhaWxpbmctbGluZXMnKTtcbnZhciBpbnRlcnJ1cHQgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycnVwdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmFncmFwaDtcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcblxudmFyIFRBQl9TSVpFID0gNDtcblxuLyogVG9rZW5pc2UgcGFyYWdyYXBoLiAqL1xuZnVuY3Rpb24gcGFyYWdyYXBoKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucztcbiAgdmFyIGNvbW1vbm1hcmsgPSBzZXR0aW5ncy5jb21tb25tYXJrO1xuICB2YXIgZ2ZtID0gc2V0dGluZ3MuZ2ZtO1xuICB2YXIgdG9rZW5pemVycyA9IHNlbGYuYmxvY2tUb2tlbml6ZXJzO1xuICB2YXIgaW50ZXJydXB0b3JzID0gc2VsZi5pbnRlcnJ1cHRQYXJhZ3JhcGg7XG4gIHZhciBpbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FKTtcbiAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgdmFyIHBvc2l0aW9uO1xuICB2YXIgc3VidmFsdWU7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBzaXplO1xuICB2YXIgbm93O1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIC8qIEVhdCBldmVyeXRoaW5nIGlmIHRoZXJl4oCZcyBubyBmb2xsb3dpbmcgbmV3bGluZS4gKi9cbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIFN0b3AgaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIE5FV0xJTkUuICovXG4gICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09PSBDX05FV0xJTkUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIEluIGNvbW1vbm1hcmstbW9kZSwgZm9sbG93aW5nIGluZGVudGVkIGxpbmVzXG4gICAgICogYXJlIHBhcnQgb2YgdGhlIHBhcmFncmFwaC4gKi9cbiAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgc2l6ZSA9IDA7XG4gICAgICBwb3NpdGlvbiA9IGluZGV4ICsgMTtcblxuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChwb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19UQUIpIHtcbiAgICAgICAgICBzaXplID0gVEFCX1NJWkU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICAgICAgc2l6ZSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zaXRpb24rKztcbiAgICAgIH1cblxuICAgICAgaWYgKHNpemUgPj0gVEFCX1NJWkUpIHtcbiAgICAgICAgaW5kZXggPSB2YWx1ZS5pbmRleE9mKENfTkVXTElORSwgaW5kZXggKyAxKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VidmFsdWUgPSB2YWx1ZS5zbGljZShpbmRleCArIDEpO1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZvbGxvd2luZyBjb2RlIGNvbnRhaW5zIGEgcG9zc2libGVcbiAgICAgKiBibG9jay4gKi9cbiAgICBpZiAoaW50ZXJydXB0KGludGVycnVwdG9ycywgdG9rZW5pemVycywgc2VsZiwgW2VhdCwgc3VidmFsdWUsIHRydWVdKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyogQnJlYWsgaWYgdGhlIGZvbGxvd2luZyBsaW5lIHN0YXJ0cyBhIGxpc3QsIHdoZW5cbiAgICAgKiBhbHJlYWR5IGluIGEgbGlzdCwgb3Igd2hlbiBpbiBjb21tb25tYXJrLCBvciB3aGVuXG4gICAgICogaW4gZ2ZtIG1vZGUgYW5kIHRoZSBidWxsZXQgaXMgKm5vdCogbnVtZXJpYy4gKi9cbiAgICBpZiAoXG4gICAgICB0b2tlbml6ZXJzLmxpc3QuY2FsbChzZWxmLCBlYXQsIHN1YnZhbHVlLCB0cnVlKSAmJlxuICAgICAgKFxuICAgICAgICBzZWxmLmluTGlzdCB8fFxuICAgICAgICBjb21tb25tYXJrIHx8XG4gICAgICAgIChnZm0gJiYgIWRlY2ltYWwodHJpbS5sZWZ0KHN1YnZhbHVlKS5jaGFyQXQoMCkpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcG9zaXRpb24gPSBpbmRleDtcbiAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCArIDEpO1xuXG4gICAgaWYgKGluZGV4ICE9PSAtMSAmJiB0cmltKHZhbHVlLnNsaWNlKHBvc2l0aW9uLCBpbmRleCkpID09PSAnJykge1xuICAgICAgaW5kZXggPSBwb3NpdGlvbjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHN1YnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpO1xuXG4gIGlmICh0cmltKHN1YnZhbHVlKSA9PT0gJycpIHtcbiAgICBlYXQoc3VidmFsdWUpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG5vdyA9IGVhdC5ub3coKTtcbiAgc3VidmFsdWUgPSB0cmltVHJhaWxpbmdMaW5lcyhzdWJ2YWx1ZSk7XG5cbiAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICAgIGNoaWxkcmVuOiBzZWxmLnRva2VuaXplSW5saW5lKHN1YnZhbHVlLCBub3cpXG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL2xpbmsnKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKCcuLi91dGlsL25vcm1hbGl6ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZmVyZW5jZTtcbnJlZmVyZW5jZS5sb2NhdG9yID0gbG9jYXRlO1xuXG52YXIgVF9MSU5LID0gJ2xpbmsnO1xudmFyIFRfSU1BR0UgPSAnaW1hZ2UnO1xudmFyIFRfRk9PVE5PVEUgPSAnZm9vdG5vdGUnO1xudmFyIFJFRkVSRU5DRV9UWVBFX1NIT1JUQ1VUID0gJ3Nob3J0Y3V0JztcbnZhciBSRUZFUkVOQ0VfVFlQRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJztcbnZhciBSRUZFUkVOQ0VfVFlQRV9GVUxMID0gJ2Z1bGwnO1xudmFyIENfQ0FSRVQgPSAnXic7XG52YXIgQ19CQUNLU0xBU0ggPSAnXFxcXCc7XG52YXIgQ19CUkFDS0VUX09QRU4gPSAnWyc7XG52YXIgQ19CUkFDS0VUX0NMT1NFID0gJ10nO1xuXG5mdW5jdGlvbiByZWZlcmVuY2UoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgwKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgdmFyIHN1YnZhbHVlID0gJyc7XG4gIHZhciBpbnRybyA9ICcnO1xuICB2YXIgdHlwZSA9IFRfTElOSztcbiAgdmFyIHJlZmVyZW5jZVR5cGUgPSBSRUZFUkVOQ0VfVFlQRV9TSE9SVENVVDtcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBpZGVudGlmaWVyO1xuICB2YXIgbm93O1xuICB2YXIgbm9kZTtcbiAgdmFyIGV4aXQ7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGJyYWNrZXRlZDtcbiAgdmFyIGRlcHRoO1xuXG4gIC8qIENoZWNrIHdoZXRoZXIgd2XigJlyZSBlYXRpbmcgYW4gaW1hZ2UuICovXG4gIGlmIChjaGFyYWN0ZXIgPT09ICchJykge1xuICAgIHR5cGUgPSBUX0lNQUdFO1xuICAgIGludHJvID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgfVxuXG4gIGlmIChjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9PUEVOKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW5kZXgrKztcbiAgaW50cm8gKz0gY2hhcmFjdGVyO1xuICBxdWV1ZSA9ICcnO1xuXG4gIC8qIENoZWNrIHdoZXRoZXIgd2XigJlyZSBlYXRpbmcgYSBmb290bm90ZS4gKi9cbiAgaWYgKFxuICAgIHNlbGYub3B0aW9ucy5mb290bm90ZXMgJiZcbiAgICB0eXBlID09PSBUX0xJTksgJiZcbiAgICB2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX0NBUkVUXG4gICkge1xuICAgIGludHJvICs9IENfQ0FSRVQ7XG4gICAgaW5kZXgrKztcbiAgICB0eXBlID0gVF9GT09UTk9URTtcbiAgfVxuXG4gIC8qIEVhdCB0aGUgdGV4dC4gKi9cbiAgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgICAgYnJhY2tldGVkID0gdHJ1ZTtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfQlJBQ0tFVF9DTE9TRSkge1xuICAgICAgaWYgKCFkZXB0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVwdGgtLTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JBQ0tTTEFTSCkge1xuICAgICAgcXVldWUgKz0gQ19CQUNLU0xBU0g7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBzdWJ2YWx1ZSA9IHF1ZXVlO1xuICBjb250ZW50ID0gcXVldWU7XG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgaWYgKGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW5kZXgrKztcbiAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIXdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gIC8qIElubGluZSBmb290bm90ZXMgY2Fubm90IGhhdmUgYW4gaWRlbnRpZmllci4gKi9cbiAgaWYgKHR5cGUgIT09IFRfRk9PVE5PVEUgJiYgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgIGlkZW50aWZpZXIgPSAnJztcbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX09QRU4gfHwgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAgIGlkZW50aWZpZXIgKz0gQ19CQUNLU0xBU0g7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgIH1cblxuICAgICAgaWRlbnRpZmllciArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgIHJlZmVyZW5jZVR5cGUgPSBpZGVudGlmaWVyID8gUkVGRVJFTkNFX1RZUEVfRlVMTCA6IFJFRkVSRU5DRV9UWVBFX0NPTExBUFNFRDtcbiAgICAgIHF1ZXVlICs9IGlkZW50aWZpZXIgKyBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZGVudGlmaWVyID0gJyc7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgcXVldWUgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZGVudGlmaWVyID0gY29udGVudDtcbiAgfVxuXG4gIC8qIEJyYWNrZXRzIGNhbm5vdCBiZSBpbnNpZGUgdGhlIGlkZW50aWZpZXIuICovXG4gIGlmIChyZWZlcmVuY2VUeXBlICE9PSBSRUZFUkVOQ0VfVFlQRV9GVUxMICYmIGJyYWNrZXRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnZhbHVlID0gaW50cm8gKyBzdWJ2YWx1ZTtcblxuICBpZiAodHlwZSA9PT0gVF9MSU5LICYmIHNlbGYuaW5MaW5rKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBUX0ZPT1ROT1RFICYmIGNvbnRlbnQuaW5kZXhPZignICcpICE9PSAtMSkge1xuICAgIHJldHVybiBlYXQoc3VidmFsdWUpKHtcbiAgICAgIHR5cGU6ICdmb290bm90ZScsXG4gICAgICBjaGlsZHJlbjogdGhpcy50b2tlbml6ZUlubGluZShjb250ZW50LCBlYXQubm93KCkpXG4gICAgfSk7XG4gIH1cblxuICBub3cgPSBlYXQubm93KCk7XG4gIG5vdy5jb2x1bW4gKz0gaW50cm8ubGVuZ3RoO1xuICBub3cub2Zmc2V0ICs9IGludHJvLmxlbmd0aDtcbiAgaWRlbnRpZmllciA9IHJlZmVyZW5jZVR5cGUgPT09IFJFRkVSRU5DRV9UWVBFX0ZVTEwgPyBpZGVudGlmaWVyIDogY29udGVudDtcblxuICBub2RlID0ge1xuICAgIHR5cGU6IHR5cGUgKyAnUmVmZXJlbmNlJyxcbiAgICBpZGVudGlmaWVyOiBub3JtYWxpemUoaWRlbnRpZmllcilcbiAgfTtcblxuICBpZiAodHlwZSA9PT0gVF9MSU5LIHx8IHR5cGUgPT09IFRfSU1BR0UpIHtcbiAgICBub2RlLnJlZmVyZW5jZVR5cGUgPSByZWZlcmVuY2VUeXBlO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFRfTElOSykge1xuICAgIGV4aXQgPSBzZWxmLmVudGVyTGluaygpO1xuICAgIG5vZGUuY2hpbGRyZW4gPSBzZWxmLnRva2VuaXplSW5saW5lKGNvbnRlbnQsIG5vdyk7XG4gICAgZXhpdCgpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFRfSU1BR0UpIHtcbiAgICBub2RlLmFsdCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLnVuZXNjYXBlKGNvbnRlbnQpLCBub3cpIHx8IG51bGw7XG4gIH1cblxuICByZXR1cm4gZWF0KHN1YnZhbHVlKShub2RlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRyaW0gPSByZXF1aXJlKCd0cmltJyk7XG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL3N0cm9uZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cm9uZztcbnN0cm9uZy5sb2NhdG9yID0gbG9jYXRlO1xuXG52YXIgQ19BU1RFUklTSyA9ICcqJztcbnZhciBDX1VOREVSU0NPUkUgPSAnXyc7XG5cbmZ1bmN0aW9uIHN0cm9uZyhlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgdmFyIG5vdztcbiAgdmFyIHBlZGFudGljO1xuICB2YXIgbWFya2VyO1xuICB2YXIgcXVldWU7XG4gIHZhciBzdWJ2YWx1ZTtcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIHByZXY7XG5cbiAgaWYgKFxuICAgIChjaGFyYWN0ZXIgIT09IENfQVNURVJJU0sgJiYgY2hhcmFjdGVyICE9PSBDX1VOREVSU0NPUkUpIHx8XG4gICAgdmFsdWUuY2hhckF0KCsraW5kZXgpICE9PSBjaGFyYWN0ZXJcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcGVkYW50aWMgPSBzZWxmLm9wdGlvbnMucGVkYW50aWM7XG4gIG1hcmtlciA9IGNoYXJhY3RlcjtcbiAgc3VidmFsdWUgPSBtYXJrZXIgKyBtYXJrZXI7XG4gIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgaW5kZXgrKztcbiAgcXVldWUgPSAnJztcbiAgY2hhcmFjdGVyID0gJyc7XG5cbiAgaWYgKHBlZGFudGljICYmIHdoaXRlc3BhY2UodmFsdWUuY2hhckF0KGluZGV4KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBwcmV2ID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoXG4gICAgICBjaGFyYWN0ZXIgPT09IG1hcmtlciAmJlxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IG1hcmtlciAmJlxuICAgICAgKCFwZWRhbnRpYyB8fCAhd2hpdGVzcGFjZShwcmV2KSlcbiAgICApIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCArIDIpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyICE9PSBtYXJrZXIpIHtcbiAgICAgICAgaWYgKCF0cmltKHF1ZXVlKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbm93ID0gZWF0Lm5vdygpO1xuICAgICAgICBub3cuY29sdW1uICs9IDI7XG4gICAgICAgIG5vdy5vZmZzZXQgKz0gMjtcblxuICAgICAgICByZXR1cm4gZWF0KHN1YnZhbHVlICsgcXVldWUgKyBzdWJ2YWx1ZSkoe1xuICAgICAgICAgIHR5cGU6ICdzdHJvbmcnLFxuICAgICAgICAgIGNoaWxkcmVuOiBzZWxmLnRva2VuaXplSW5saW5lKHF1ZXVlLCBub3cpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGVkYW50aWMgJiYgY2hhcmFjdGVyID09PSAnXFxcXCcpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdGFibGU7XG5cbnZhciBDX0JBQ0tTTEFTSCA9ICdcXFxcJztcbnZhciBDX1RJQ0sgPSAnYCc7XG52YXIgQ19EQVNIID0gJy0nO1xudmFyIENfUElQRSA9ICd8JztcbnZhciBDX0NPTE9OID0gJzonO1xudmFyIENfU1BBQ0UgPSAnICc7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19UQUIgPSAnXFx0JztcblxudmFyIE1JTl9UQUJMRV9DT0xVTU5TID0gMTtcbnZhciBNSU5fVEFCTEVfUk9XUyA9IDI7XG5cbnZhciBUQUJMRV9BTElHTl9MRUZUID0gJ2xlZnQnO1xudmFyIFRBQkxFX0FMSUdOX0NFTlRFUiA9ICdjZW50ZXInO1xudmFyIFRBQkxFX0FMSUdOX1JJR0hUID0gJ3JpZ2h0JztcbnZhciBUQUJMRV9BTElHTl9OT05FID0gbnVsbDtcblxuZnVuY3Rpb24gdGFibGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGluZGV4O1xuICB2YXIgYWxpZ25tZW50cztcbiAgdmFyIGFsaWdubWVudDtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgcm93O1xuICB2YXIgbGVuZ3RoO1xuICB2YXIgbGluZXM7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIGhhc0Rhc2g7XG4gIHZhciBhbGlnbjtcbiAgdmFyIGNlbGw7XG4gIHZhciBwcmVhbWJsZTtcbiAgdmFyIGNvdW50O1xuICB2YXIgb3BlbmluZztcbiAgdmFyIG5vdztcbiAgdmFyIHBvc2l0aW9uO1xuICB2YXIgbGluZUNvdW50O1xuICB2YXIgbGluZTtcbiAgdmFyIHJvd3M7XG4gIHZhciB0YWJsZTtcbiAgdmFyIGxpbmVJbmRleDtcbiAgdmFyIHBpcGVJbmRleDtcbiAgdmFyIGZpcnN0O1xuXG4gIC8qIEV4aXQgd2hlbiBub3QgaW4gZ2ZtLW1vZGUuICovXG4gIGlmICghc2VsZi5vcHRpb25zLmdmbSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIEdldCB0aGUgcm93cy5cbiAgICogRGV0ZWN0aW5nIHRhYmxlcyBzb29uIGlzIGhhcmQsIHNvIHRoZXJlIGFyZSBzb21lXG4gICAqIGNoZWNrcyBmb3IgcGVyZm9ybWFuY2UgaGVyZSwgc3VjaCBhcyB0aGUgbWluaW11bVxuICAgKiBudW1iZXIgb2Ygcm93cywgYW5kIGFsbG93ZWQgY2hhcmFjdGVycyBpbiB0aGVcbiAgICogYWxpZ25tZW50IHJvdy4gKi9cbiAgaW5kZXggPSAwO1xuICBsaW5lQ291bnQgPSAwO1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyAxO1xuICBsaW5lcyA9IFtdO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGxpbmVJbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCk7XG4gICAgcGlwZUluZGV4ID0gdmFsdWUuaW5kZXhPZihDX1BJUEUsIGluZGV4ICsgMSk7XG5cbiAgICBpZiAobGluZUluZGV4ID09PSAtMSkge1xuICAgICAgbGluZUluZGV4ID0gdmFsdWUubGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChwaXBlSW5kZXggPT09IC0xIHx8IHBpcGVJbmRleCA+IGxpbmVJbmRleCkge1xuICAgICAgaWYgKGxpbmVDb3VudCA8IE1JTl9UQUJMRV9ST1dTKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaCh2YWx1ZS5zbGljZShpbmRleCwgbGluZUluZGV4KSk7XG4gICAgbGluZUNvdW50Kys7XG4gICAgaW5kZXggPSBsaW5lSW5kZXggKyAxO1xuICB9XG5cbiAgLyogUGFyc2UgdGhlIGFsaWdubWVudCByb3cuICovXG4gIHN1YnZhbHVlID0gbGluZXMuam9pbihDX05FV0xJTkUpO1xuICBhbGlnbm1lbnRzID0gbGluZXMuc3BsaWNlKDEsIDEpWzBdIHx8IFtdO1xuICBpbmRleCA9IDA7XG4gIGxlbmd0aCA9IGFsaWdubWVudHMubGVuZ3RoO1xuICBsaW5lQ291bnQtLTtcbiAgYWxpZ25tZW50ID0gZmFsc2U7XG4gIGFsaWduID0gW107XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gYWxpZ25tZW50cy5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19QSVBFKSB7XG4gICAgICBoYXNEYXNoID0gbnVsbDtcblxuICAgICAgaWYgKGFsaWdubWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGZpcnN0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxpZ24ucHVzaChhbGlnbm1lbnQpO1xuICAgICAgICBhbGlnbm1lbnQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19EQVNIKSB7XG4gICAgICBoYXNEYXNoID0gdHJ1ZTtcbiAgICAgIGFsaWdubWVudCA9IGFsaWdubWVudCB8fCBUQUJMRV9BTElHTl9OT05FO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX0NPTE9OKSB7XG4gICAgICBpZiAoYWxpZ25tZW50ID09PSBUQUJMRV9BTElHTl9MRUZUKSB7XG4gICAgICAgIGFsaWdubWVudCA9IFRBQkxFX0FMSUdOX0NFTlRFUjtcbiAgICAgIH0gZWxzZSBpZiAoaGFzRGFzaCAmJiBhbGlnbm1lbnQgPT09IFRBQkxFX0FMSUdOX05PTkUpIHtcbiAgICAgICAgYWxpZ25tZW50ID0gVEFCTEVfQUxJR05fUklHSFQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGlnbm1lbnQgPSBUQUJMRV9BTElHTl9MRUZUO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAoYWxpZ25tZW50ICE9PSBmYWxzZSkge1xuICAgIGFsaWduLnB1c2goYWxpZ25tZW50KTtcbiAgfVxuXG4gIC8qIEV4aXQgd2hlbiB3aXRob3V0IGVub3VnaCBjb2x1bW5zLiAqL1xuICBpZiAoYWxpZ24ubGVuZ3RoIDwgTUlOX1RBQkxFX0NPTFVNTlMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIFBhcnNlIHRoZSByb3dzLiAqL1xuICBwb3NpdGlvbiA9IC0xO1xuICByb3dzID0gW107XG5cbiAgdGFibGUgPSBlYXQoc3VidmFsdWUpLnJlc2V0KHtcbiAgICB0eXBlOiAndGFibGUnLFxuICAgIGFsaWduOiBhbGlnbixcbiAgICBjaGlsZHJlbjogcm93c1xuICB9KTtcblxuICB3aGlsZSAoKytwb3NpdGlvbiA8IGxpbmVDb3VudCkge1xuICAgIGxpbmUgPSBsaW5lc1twb3NpdGlvbl07XG4gICAgcm93ID0ge3R5cGU6ICd0YWJsZVJvdycsIGNoaWxkcmVuOiBbXX07XG5cbiAgICAvKiBFYXQgYSBuZXdsaW5lIGNoYXJhY3RlciB3aGVuIHRoaXMgaXMgbm90IHRoZVxuICAgICAqIGZpcnN0IHJvdy4gKi9cbiAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgIGVhdChDX05FV0xJTkUpO1xuICAgIH1cblxuICAgIC8qIEVhdCB0aGUgcm93LiAqL1xuICAgIGVhdChsaW5lKS5yZXNldChyb3csIHRhYmxlKTtcblxuICAgIGxlbmd0aCA9IGxpbmUubGVuZ3RoICsgMTtcbiAgICBpbmRleCA9IDA7XG4gICAgcXVldWUgPSAnJztcbiAgICBjZWxsID0gJyc7XG4gICAgcHJlYW1ibGUgPSB0cnVlO1xuICAgIGNvdW50ID0gbnVsbDtcbiAgICBvcGVuaW5nID0gbnVsbDtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gbGluZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBDX1RBQiB8fCBjaGFyYWN0ZXIgPT09IENfU1BBQ0UpIHtcbiAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWF0KGNoYXJhY3Rlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJycgfHwgY2hhcmFjdGVyID09PSBDX1BJUEUpIHtcbiAgICAgICAgaWYgKHByZWFtYmxlKSB7XG4gICAgICAgICAgZWF0KGNoYXJhY3Rlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoYXJhY3RlciAmJiBvcGVuaW5nKSB7XG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKChjZWxsIHx8IGNoYXJhY3RlcikgJiYgIXByZWFtYmxlKSB7XG4gICAgICAgICAgICBzdWJ2YWx1ZSA9IGNlbGw7XG5cbiAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZS5zbGljZSgwLCBxdWV1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLmNoYXJBdChxdWV1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZTtcbiAgICAgICAgICAgICAgICBxdWV1ZSA9ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vdyA9IGVhdC5ub3coKTtcblxuICAgICAgICAgICAgZWF0KHN1YnZhbHVlKSh7XG4gICAgICAgICAgICAgIHR5cGU6ICd0YWJsZUNlbGwnLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogc2VsZi50b2tlbml6ZUlubGluZShjZWxsLCBub3cpXG4gICAgICAgICAgICB9LCByb3cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVhdChxdWV1ZSArIGNoYXJhY3Rlcik7XG5cbiAgICAgICAgICBxdWV1ZSA9ICcnO1xuICAgICAgICAgIGNlbGwgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgY2VsbCArPSBxdWV1ZTtcbiAgICAgICAgICBxdWV1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY2VsbCArPSBjaGFyYWN0ZXI7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0ggJiYgaW5kZXggIT09IGxlbmd0aCAtIDIpIHtcbiAgICAgICAgICBjZWxsICs9IGxpbmUuY2hhckF0KGluZGV4ICsgMSk7XG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVElDSykge1xuICAgICAgICAgIGNvdW50ID0gMTtcblxuICAgICAgICAgIHdoaWxlIChsaW5lLmNoYXJBdChpbmRleCArIDEpID09PSBjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIGNlbGwgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFvcGVuaW5nKSB7XG4gICAgICAgICAgICBvcGVuaW5nID0gY291bnQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA+PSBvcGVuaW5nKSB7XG4gICAgICAgICAgICBvcGVuaW5nID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJlYW1ibGUgPSBmYWxzZTtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgLyogRWF0IHRoZSBhbGlnbm1lbnQgcm93LiAqL1xuICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgIGVhdChDX05FV0xJTkUgKyBhbGlnbm1lbnRzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gdGV4dDtcblxuZnVuY3Rpb24gdGV4dChlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbWV0aG9kcztcbiAgdmFyIHRva2VuaXplcnM7XG4gIHZhciBpbmRleDtcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgcG9zaXRpb247XG4gIHZhciB0b2tlbml6ZXI7XG4gIHZhciBuYW1lO1xuICB2YXIgbWluO1xuICB2YXIgbm93O1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbWV0aG9kcyA9IHNlbGYuaW5saW5lTWV0aG9kcztcbiAgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7XG4gIHRva2VuaXplcnMgPSBzZWxmLmlubGluZVRva2VuaXplcnM7XG4gIGluZGV4ID0gLTE7XG4gIG1pbiA9IHZhbHVlLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIG5hbWUgPSBtZXRob2RzW2luZGV4XTtcblxuICAgIGlmIChuYW1lID09PSAndGV4dCcgfHwgIXRva2VuaXplcnNbbmFtZV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRva2VuaXplciA9IHRva2VuaXplcnNbbmFtZV0ubG9jYXRvcjtcblxuICAgIGlmICghdG9rZW5pemVyKSB7XG4gICAgICBlYXQuZmlsZS5mYWlsKCdNaXNzaW5nIGxvY2F0b3I6IGAnICsgbmFtZSArICdgJyk7XG4gICAgfVxuXG4gICAgcG9zaXRpb24gPSB0b2tlbml6ZXIuY2FsbChzZWxmLCB2YWx1ZSwgMSk7XG5cbiAgICBpZiAocG9zaXRpb24gIT09IC0xICYmIHBvc2l0aW9uIDwgbWluKSB7XG4gICAgICBtaW4gPSBwb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICBzdWJ2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIG1pbik7XG4gIG5vdyA9IGVhdC5ub3coKTtcblxuICBzZWxmLmRlY29kZShzdWJ2YWx1ZSwgbm93LCBmdW5jdGlvbiAoY29udGVudCwgcG9zaXRpb24sIHNvdXJjZSkge1xuICAgIGVhdChzb3VyY2UgfHwgY29udGVudCkoe1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgdmFsdWU6IGNvbnRlbnRcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gdGhlbWF0aWNCcmVhaztcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcbnZhciBDX0FTVEVSSVNLID0gJyonO1xudmFyIENfVU5ERVJTQ09SRSA9ICdfJztcbnZhciBDX0RBU0ggPSAnLSc7XG5cbnZhciBUSEVNQVRJQ19CUkVBS19NQVJLRVJfQ09VTlQgPSAzO1xuXG5mdW5jdGlvbiB0aGVtYXRpY0JyZWFrKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aCArIDE7XG4gIHZhciBzdWJ2YWx1ZSA9ICcnO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgbWFya2VyO1xuICB2YXIgbWFya2VyQ291bnQ7XG4gIHZhciBxdWV1ZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1RBQiAmJiBjaGFyYWN0ZXIgIT09IENfU1BBQ0UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIGlmIChcbiAgICBjaGFyYWN0ZXIgIT09IENfQVNURVJJU0sgJiZcbiAgICBjaGFyYWN0ZXIgIT09IENfREFTSCAmJlxuICAgIGNoYXJhY3RlciAhPT0gQ19VTkRFUlNDT1JFXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG1hcmtlciA9IGNoYXJhY3RlcjtcbiAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICBtYXJrZXJDb3VudCA9IDE7XG4gIHF1ZXVlID0gJyc7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gbWFya2VyKSB7XG4gICAgICBtYXJrZXJDb3VudCsrO1xuICAgICAgc3VidmFsdWUgKz0gcXVldWUgKyBtYXJrZXI7XG4gICAgICBxdWV1ZSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIG1hcmtlckNvdW50ID49IFRIRU1BVElDX0JSRUFLX01BUktFUl9DT1VOVCAmJlxuICAgICAgKCFjaGFyYWN0ZXIgfHwgY2hhcmFjdGVyID09PSBDX05FV0xJTkUpXG4gICAgKSB7XG4gICAgICBzdWJ2YWx1ZSArPSBxdWV1ZTtcblxuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe3R5cGU6ICd0aGVtYXRpY0JyZWFrJ30pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWNvZGUgPSByZXF1aXJlKCdwYXJzZS1lbnRpdGllcycpO1xudmFyIHdoaXRlc3BhY2UgPSByZXF1aXJlKCdpcy13aGl0ZXNwYWNlLWNoYXJhY3RlcicpO1xudmFyIGxvY2F0ZSA9IHJlcXVpcmUoJy4uL2xvY2F0ZS91cmwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1cmw7XG51cmwubG9jYXRvciA9IGxvY2F0ZTtcbnVybC5ub3RJbkxpbmsgPSB0cnVlO1xuXG52YXIgQ19CUkFDS0VUX09QRU4gPSAnWyc7XG52YXIgQ19CUkFDS0VUX0NMT1NFID0gJ10nO1xudmFyIENfUEFSRU5fT1BFTiA9ICcoJztcbnZhciBDX1BBUkVOX0NMT1NFID0gJyknO1xudmFyIENfTFQgPSAnPCc7XG52YXIgQ19BVF9TSUdOID0gJ0AnO1xuXG52YXIgSFRUUF9QUk9UT0NPTCA9ICdodHRwOi8vJztcbnZhciBIVFRQU19QUk9UT0NPTCA9ICdodHRwczovLyc7XG52YXIgTUFJTFRPX1BST1RPQ09MID0gJ21haWx0bzonO1xuXG52YXIgUFJPVE9DT0xTID0gW1xuICBIVFRQX1BST1RPQ09MLFxuICBIVFRQU19QUk9UT0NPTCxcbiAgTUFJTFRPX1BST1RPQ09MXG5dO1xuXG52YXIgUFJPVE9DT0xTX0xFTkdUSCA9IFBST1RPQ09MUy5sZW5ndGg7XG5cbmZ1bmN0aW9uIHVybChlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3VidmFsdWU7XG4gIHZhciBjb250ZW50O1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgaW5kZXg7XG4gIHZhciBwb3NpdGlvbjtcbiAgdmFyIHByb3RvY29sO1xuICB2YXIgbWF0Y2g7XG4gIHZhciBsZW5ndGg7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIHBhcmVuQ291bnQ7XG4gIHZhciBuZXh0Q2hhcmFjdGVyO1xuICB2YXIgZXhpdDtcblxuICBpZiAoIXNlbGYub3B0aW9ucy5nZm0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJ2YWx1ZSA9ICcnO1xuICBpbmRleCA9IC0xO1xuICBsZW5ndGggPSBQUk9UT0NPTFNfTEVOR1RIO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcHJvdG9jb2wgPSBQUk9UT0NPTFNbaW5kZXhdO1xuICAgIG1hdGNoID0gdmFsdWUuc2xpY2UoMCwgcHJvdG9jb2wubGVuZ3RoKTtcblxuICAgIGlmIChtYXRjaC50b0xvd2VyQ2FzZSgpID09PSBwcm90b2NvbCkge1xuICAgICAgc3VidmFsdWUgPSBtYXRjaDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICghc3VidmFsdWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBxdWV1ZSA9ICcnO1xuICBwYXJlbkNvdW50ID0gMDtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKHdoaXRlc3BhY2UoY2hhcmFjdGVyKSB8fCBjaGFyYWN0ZXIgPT09IENfTFQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYXJhY3RlciA9PT0gJy4nIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09ICcsJyB8fFxuICAgICAgY2hhcmFjdGVyID09PSAnOicgfHxcbiAgICAgIGNoYXJhY3RlciA9PT0gJzsnIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09ICdcIicgfHxcbiAgICAgIGNoYXJhY3RlciA9PT0gJ1xcJycgfHxcbiAgICAgIGNoYXJhY3RlciA9PT0gJyknIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09ICddJ1xuICAgICkge1xuICAgICAgbmV4dENoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCArIDEpO1xuXG4gICAgICBpZiAoIW5leHRDaGFyYWN0ZXIgfHwgd2hpdGVzcGFjZShuZXh0Q2hhcmFjdGVyKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX1BBUkVOX09QRU4gfHwgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgICAgcGFyZW5Db3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfUEFSRU5fQ0xPU0UgfHwgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgIHBhcmVuQ291bnQtLTtcblxuICAgICAgaWYgKHBhcmVuQ291bnQgPCAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKCFxdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnZhbHVlICs9IHF1ZXVlO1xuICBjb250ZW50ID0gc3VidmFsdWU7XG5cbiAgaWYgKHByb3RvY29sID09PSBNQUlMVE9fUFJPVE9DT0wpIHtcbiAgICBwb3NpdGlvbiA9IHF1ZXVlLmluZGV4T2YoQ19BVF9TSUdOKTtcblxuICAgIGlmIChwb3NpdGlvbiA9PT0gLTEgfHwgcG9zaXRpb24gPT09IGxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHIoTUFJTFRPX1BST1RPQ09MLmxlbmd0aCk7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGV4aXQgPSBzZWxmLmVudGVyTGluaygpO1xuICBjb250ZW50ID0gc2VsZi50b2tlbml6ZUlubGluZShjb250ZW50LCBlYXQubm93KCkpO1xuICBleGl0KCk7XG5cbiAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgIHR5cGU6ICdsaW5rJyxcbiAgICB0aXRsZTogbnVsbCxcbiAgICB1cmw6IGRlY29kZShzdWJ2YWx1ZSksXG4gICAgY2hpbGRyZW46IGNvbnRlbnRcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcblxudmFyIE1FUkdFQUJMRV9OT0RFUyA9IHtcbiAgdGV4dDogbWVyZ2VUZXh0LFxuICBibG9ja3F1b3RlOiBtZXJnZUJsb2NrcXVvdGVcbn07XG5cbi8qIENoZWNrIHdoZXRoZXIgYSBub2RlIGlzIG1lcmdlYWJsZSB3aXRoIGFkamFjZW50IG5vZGVzLiAqL1xuZnVuY3Rpb24gbWVyZ2VhYmxlKG5vZGUpIHtcbiAgdmFyIHN0YXJ0O1xuICB2YXIgZW5kO1xuXG4gIGlmIChub2RlLnR5cGUgIT09ICd0ZXh0JyB8fCAhbm9kZS5wb3NpdGlvbikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhcnQgPSBub2RlLnBvc2l0aW9uLnN0YXJ0O1xuICBlbmQgPSBub2RlLnBvc2l0aW9uLmVuZDtcblxuICAvKiBPbmx5IG1lcmdlIG5vZGVzIHdoaWNoIG9jY3VweSB0aGUgc2FtZSBzaXplIGFzIHRoZWlyXG4gICAqIGB2YWx1ZWAuICovXG4gIHJldHVybiBzdGFydC5saW5lICE9PSBlbmQubGluZSB8fFxuICAgICAgZW5kLmNvbHVtbiAtIHN0YXJ0LmNvbHVtbiA9PT0gbm9kZS52YWx1ZS5sZW5ndGg7XG59XG5cbi8qIE1lcmdlIHR3byB0ZXh0IG5vZGVzOiBgbm9kZWAgaW50byBgcHJldmAuICovXG5mdW5jdGlvbiBtZXJnZVRleHQocHJldiwgbm9kZSkge1xuICBwcmV2LnZhbHVlICs9IG5vZGUudmFsdWU7XG5cbiAgcmV0dXJuIHByZXY7XG59XG5cbi8qIE1lcmdlIHR3byBibG9ja3F1b3RlczogYG5vZGVgIGludG8gYHByZXZgLCB1bmxlc3MgaW5cbiAqIENvbW1vbk1hcmsgbW9kZS4gKi9cbmZ1bmN0aW9uIG1lcmdlQmxvY2txdW90ZShwcmV2LCBub2RlKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuY29tbW9ubWFyaykge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcHJldi5jaGlsZHJlbiA9IHByZXYuY2hpbGRyZW4uY29uY2F0KG5vZGUuY2hpbGRyZW4pO1xuXG4gIHJldHVybiBwcmV2O1xufVxuXG4vKiBDb25zdHJ1Y3QgYSB0b2tlbml6ZXIuICBUaGlzIGNyZWF0ZXMgYm90aFxuICogYHRva2VuaXplSW5saW5lYCBhbmQgYHRva2VuaXplQmxvY2tgLiAqL1xuZnVuY3Rpb24gZmFjdG9yeSh0eXBlKSB7XG4gIHJldHVybiB0b2tlbml6ZTtcblxuICAvKiBUb2tlbml6ZXIgZm9yIGEgYm91bmQgYHR5cGVgLiAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZSwgbG9jYXRpb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG9mZnNldCA9IHNlbGYub2Zmc2V0O1xuICAgIHZhciB0b2tlbnMgPSBbXTtcbiAgICB2YXIgbWV0aG9kcyA9IHNlbGZbdHlwZSArICdNZXRob2RzJ107XG4gICAgdmFyIHRva2VuaXplcnMgPSBzZWxmW3R5cGUgKyAnVG9rZW5pemVycyddO1xuICAgIHZhciBsaW5lID0gbG9jYXRpb24ubGluZTtcbiAgICB2YXIgY29sdW1uID0gbG9jYXRpb24uY29sdW1uO1xuICAgIHZhciBpbmRleDtcbiAgICB2YXIgbGVuZ3RoO1xuICAgIHZhciBtZXRob2Q7XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIG1hdGNoZWQ7XG4gICAgdmFyIHZhbHVlTGVuZ3RoO1xuXG4gICAgLyogVHJpbSB3aGl0ZSBzcGFjZSBvbmx5IGxpbmVzLiAqL1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgLyogRXhwb3NlIG9uIGBlYXRgLiAqL1xuICAgIGVhdC5ub3cgPSBub3c7XG4gICAgZWF0LmZpbGUgPSBzZWxmLmZpbGU7XG5cbiAgICAvKiBTeW5jIGluaXRpYWwgb2Zmc2V0LiAqL1xuICAgIHVwZGF0ZVBvc2l0aW9uKCcnKTtcblxuICAgIC8qIEl0ZXJhdGUgb3ZlciBgdmFsdWVgLCBhbmQgaXRlcmF0ZSBvdmVyIGFsbFxuICAgICAqIHRva2VuaXplcnMuICBXaGVuIG9uZSBlYXRzIHNvbWV0aGluZywgcmUtaXRlcmF0ZVxuICAgICAqIHdpdGggdGhlIHJlbWFpbmluZyB2YWx1ZS4gIElmIG5vIHRva2VuaXplciBlYXRzLFxuICAgICAqIHNvbWV0aGluZyBmYWlsZWQgKHNob3VsZCBub3QgaGFwcGVuKSBhbmQgYW5cbiAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLiAqL1xuICAgIHdoaWxlICh2YWx1ZSkge1xuICAgICAgaW5kZXggPSAtMTtcbiAgICAgIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoO1xuICAgICAgbWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBuYW1lID0gbWV0aG9kc1tpbmRleF07XG4gICAgICAgIG1ldGhvZCA9IHRva2VuaXplcnNbbmFtZV07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1ldGhvZCAmJlxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovICghbWV0aG9kLm9ubHlBdFN0YXJ0IHx8IHNlbGYuYXRTdGFydCkgJiZcbiAgICAgICAgICAoIW1ldGhvZC5ub3RJbkxpc3QgfHwgIXNlbGYuaW5MaXN0KSAmJlxuICAgICAgICAgICghbWV0aG9kLm5vdEluQmxvY2sgfHwgIXNlbGYuaW5CbG9jaykgJiZcbiAgICAgICAgICAoIW1ldGhvZC5ub3RJbkxpbmsgfHwgIXNlbGYuaW5MaW5rKVxuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgIG1ldGhvZC5hcHBseShzZWxmLCBbZWF0LCB2YWx1ZV0pO1xuXG4gICAgICAgICAgbWF0Y2hlZCA9IHZhbHVlTGVuZ3RoICE9PSB2YWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICAgIHNlbGYuZmlsZS5mYWlsKG5ldyBFcnJvcignSW5maW5pdGUgbG9vcCcpLCBlYXQubm93KCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNlbGYuZW9mID0gbm93KCk7XG5cbiAgICByZXR1cm4gdG9rZW5zO1xuXG4gICAgLyogVXBkYXRlIGxpbmUsIGNvbHVtbiwgYW5kIG9mZnNldCBiYXNlZCBvblxuICAgICAqIGB2YWx1ZWAuICovXG4gICAgZnVuY3Rpb24gdXBkYXRlUG9zaXRpb24oc3VidmFsdWUpIHtcbiAgICAgIHZhciBsYXN0SW5kZXggPSAtMTtcbiAgICAgIHZhciBpbmRleCA9IHN1YnZhbHVlLmluZGV4T2YoJ1xcbicpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGxpbmUrKztcbiAgICAgICAgbGFzdEluZGV4ID0gaW5kZXg7XG4gICAgICAgIGluZGV4ID0gc3VidmFsdWUuaW5kZXhPZignXFxuJywgaW5kZXggKyAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgY29sdW1uICs9IHN1YnZhbHVlLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbHVtbiA9IHN1YnZhbHVlLmxlbmd0aCAtIGxhc3RJbmRleDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmUgaW4gb2Zmc2V0KSB7XG4gICAgICAgIGlmIChsYXN0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgY29sdW1uICs9IG9mZnNldFtsaW5lXTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4gPD0gb2Zmc2V0W2xpbmVdKSB7XG4gICAgICAgICAgY29sdW1uID0gb2Zmc2V0W2xpbmVdICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEdldCBvZmZzZXQuICBDYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXNcbiAgICAgKiBlYXRlbiB0byByZXRyaWV2ZSB0aGUgcmFuZ2UncyBvZmZzZXRzLiAqL1xuICAgIGZ1bmN0aW9uIGdldE9mZnNldCgpIHtcbiAgICAgIHZhciBpbmRlbnRhdGlvbiA9IFtdO1xuICAgICAgdmFyIHBvcyA9IGxpbmUgKyAxO1xuXG4gICAgICAvKiBEb25lLiAgQ2FsbGVkIHdoZW4gdGhlIGxhc3QgY2hhcmFjdGVyIGlzXG4gICAgICAgKiBlYXRlbiB0byByZXRyaWV2ZSB0aGUgcmFuZ2XigJlzIG9mZnNldHMuICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFzdCA9IGxpbmUgKyAxO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPCBsYXN0KSB7XG4gICAgICAgICAgaW5kZW50YXRpb24ucHVzaCgob2Zmc2V0W3Bvc10gfHwgMCkgKyAxKTtcblxuICAgICAgICAgIHBvcysrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZGVudGF0aW9uO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiBHZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uICovXG4gICAgZnVuY3Rpb24gbm93KCkge1xuICAgICAgdmFyIHBvcyA9IHtsaW5lOiBsaW5lLCBjb2x1bW46IGNvbHVtbn07XG5cbiAgICAgIHBvcy5vZmZzZXQgPSBzZWxmLnRvT2Zmc2V0KHBvcyk7XG5cbiAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgLyogU3RvcmUgcG9zaXRpb24gaW5mb3JtYXRpb24gZm9yIGEgbm9kZS4gKi9cbiAgICBmdW5jdGlvbiBQb3NpdGlvbihzdGFydCkge1xuICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgdGhpcy5lbmQgPSBub3coKTtcbiAgICB9XG5cbiAgICAvKiBUaHJvdyB3aGVuIGEgdmFsdWUgaXMgaW5jb3JyZWN0bHkgZWF0ZW4uXG4gICAgICogVGhpcyBzaG91bGRu4oCZdCBoYXBwZW4gYnV0IHdpbGwgdGhyb3cgb24gbmV3LFxuICAgICAqIGluY29ycmVjdCBydWxlcy4gKi9cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUVhdChzdWJ2YWx1ZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodmFsdWUuc3Vic3RyaW5nKDAsIHN1YnZhbHVlLmxlbmd0aCkgIT09IHN1YnZhbHVlKSB7XG4gICAgICAgIC8qIENhcHR1cmUgc3RhY2stdHJhY2UuICovXG4gICAgICAgIHNlbGYuZmlsZS5mYWlsKFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdJbmNvcnJlY3RseSBlYXRlbiB2YWx1ZTogcGxlYXNlIHJlcG9ydCB0aGlzICcgK1xuICAgICAgICAgICAgJ3dhcm5pbmcgb24gaHR0cDovL2dpdC5pby92ZzVGdCdcbiAgICAgICAgICApLFxuICAgICAgICAgIG5vdygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogTWFyayBwb3NpdGlvbiBhbmQgcGF0Y2ggYG5vZGUucG9zaXRpb25gLiAqL1xuICAgIGZ1bmN0aW9uIHBvc2l0aW9uKCkge1xuICAgICAgdmFyIGJlZm9yZSA9IG5vdygpO1xuXG4gICAgICByZXR1cm4gdXBkYXRlO1xuXG4gICAgICAvKiBBZGQgdGhlIHBvc2l0aW9uIHRvIGEgbm9kZS4gKi9cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZShub2RlLCBpbmRlbnQpIHtcbiAgICAgICAgdmFyIHByZXYgPSBub2RlLnBvc2l0aW9uO1xuICAgICAgICB2YXIgc3RhcnQgPSBwcmV2ID8gcHJldi5zdGFydCA6IGJlZm9yZTtcbiAgICAgICAgdmFyIGNvbWJpbmVkID0gW107XG4gICAgICAgIHZhciBuID0gcHJldiAmJiBwcmV2LmVuZC5saW5lO1xuICAgICAgICB2YXIgbCA9IGJlZm9yZS5saW5lO1xuXG4gICAgICAgIG5vZGUucG9zaXRpb24gPSBuZXcgUG9zaXRpb24oc3RhcnQpO1xuXG4gICAgICAgIC8qIElmIHRoZXJlIHdhcyBhbHJlYWR5IGEgYHBvc2l0aW9uYCwgdGhpc1xuICAgICAgICAgKiBub2RlIHdhcyBtZXJnZWQuICBGaXhpbmcgYHN0YXJ0YCB3YXNu4oCZdFxuICAgICAgICAgKiBoYXJkLCBidXQgdGhlIGluZGVudCBpcyBkaWZmZXJlbnQuXG4gICAgICAgICAqIEVzcGVjaWFsbHkgYmVjYXVzZSBzb21lIGluZm9ybWF0aW9uLCB0aGVcbiAgICAgICAgICogaW5kZW50IGJldHdlZW4gYG5gIGFuZCBgbGAgd2FzbuKAmXRcbiAgICAgICAgICogdHJhY2tlZC4gIEx1Y2tpbHksIHRoYXQgc3BhY2UgaXNcbiAgICAgICAgICogKHNob3VsZCBiZT8pIGVtcHR5LCBzbyB3ZSBjYW4gc2FmZWx5XG4gICAgICAgICAqIGNoZWNrIGZvciBpdCBub3cuICovXG4gICAgICAgIGlmIChwcmV2ICYmIGluZGVudCAmJiBwcmV2LmluZGVudCkge1xuICAgICAgICAgIGNvbWJpbmVkID0gcHJldi5pbmRlbnQ7XG5cbiAgICAgICAgICBpZiAobiA8IGwpIHtcbiAgICAgICAgICAgIHdoaWxlICgrK24gPCBsKSB7XG4gICAgICAgICAgICAgIGNvbWJpbmVkLnB1c2goKG9mZnNldFtuXSB8fCAwKSArIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21iaW5lZC5wdXNoKGJlZm9yZS5jb2x1bW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGVudCA9IGNvbWJpbmVkLmNvbmNhdChpbmRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5wb3NpdGlvbi5pbmRlbnQgPSBpbmRlbnQgfHwgW107XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogQWRkIGBub2RlYCB0byBgcGFyZW50YHMgY2hpbGRyZW4gb3IgdG8gYHRva2Vuc2AuXG4gICAgICogUGVyZm9ybXMgbWVyZ2VzIHdoZXJlIHBvc3NpYmxlLiAqL1xuICAgIGZ1bmN0aW9uIGFkZChub2RlLCBwYXJlbnQpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbiA6IHRva2VucztcbiAgICAgIHZhciBwcmV2ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJldiAmJlxuICAgICAgICBub2RlLnR5cGUgPT09IHByZXYudHlwZSAmJlxuICAgICAgICBub2RlLnR5cGUgaW4gTUVSR0VBQkxFX05PREVTICYmXG4gICAgICAgIG1lcmdlYWJsZShwcmV2KSAmJlxuICAgICAgICBtZXJnZWFibGUobm9kZSlcbiAgICAgICkge1xuICAgICAgICBub2RlID0gTUVSR0VBQkxFX05PREVTW25vZGUudHlwZV0uY2FsbChzZWxmLCBwcmV2LCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgIT09IHByZXYpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuYXRTdGFydCAmJiB0b2tlbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHNlbGYuZXhpdFN0YXJ0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8qIFJlbW92ZSBgc3VidmFsdWVgIGZyb20gYHZhbHVlYC5cbiAgICAgKiBgc3VidmFsdWVgIG11c3QgYmUgYXQgdGhlIHN0YXJ0IG9mIGB2YWx1ZWAuICovXG4gICAgZnVuY3Rpb24gZWF0KHN1YnZhbHVlKSB7XG4gICAgICB2YXIgaW5kZW50ID0gZ2V0T2Zmc2V0KCk7XG4gICAgICB2YXIgcG9zID0gcG9zaXRpb24oKTtcbiAgICAgIHZhciBjdXJyZW50ID0gbm93KCk7XG5cbiAgICAgIHZhbGlkYXRlRWF0KHN1YnZhbHVlKTtcblxuICAgICAgYXBwbHkucmVzZXQgPSByZXNldDtcbiAgICAgIHJlc2V0LnRlc3QgPSB0ZXN0O1xuICAgICAgYXBwbHkudGVzdCA9IHRlc3Q7XG5cbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHN1YnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgIHVwZGF0ZVBvc2l0aW9uKHN1YnZhbHVlKTtcblxuICAgICAgaW5kZW50ID0gaW5kZW50KCk7XG5cbiAgICAgIHJldHVybiBhcHBseTtcblxuICAgICAgLyogQWRkIHRoZSBnaXZlbiBhcmd1bWVudHMsIGFkZCBgcG9zaXRpb25gIHRvXG4gICAgICAgKiB0aGUgcmV0dXJuZWQgbm9kZSwgYW5kIHJldHVybiB0aGUgbm9kZS4gKi9cbiAgICAgIGZ1bmN0aW9uIGFwcGx5KG5vZGUsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4gcG9zKGFkZChwb3Mobm9kZSksIHBhcmVudCksIGluZGVudCk7XG4gICAgICB9XG5cbiAgICAgIC8qIEZ1bmN0aW9ucyBqdXN0IGxpa2UgYXBwbHksIGJ1dCByZXNldHMgdGhlXG4gICAgICAgKiBjb250ZW50OiAgdGhlIGxpbmUgYW5kIGNvbHVtbiBhcmUgcmV2ZXJzZWQsXG4gICAgICAgKiBhbmQgdGhlIGVhdGVuIHZhbHVlIGlzIHJlLWFkZGVkLlxuICAgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIG5vZGVzIHdpdGggYSBzaW5nbGVcbiAgICAgICAqIHR5cGUgb2YgY29udGVudCwgc3VjaCBhcyBsaXN0cyBhbmQgdGFibGVzLlxuICAgICAgICogU2VlIGBhcHBseWAgYWJvdmUgZm9yIHdoYXQgcGFyYW1ldGVycyBhcmVcbiAgICAgICAqIGV4cGVjdGVkLiAqL1xuICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIHZhciBub2RlID0gYXBwbHkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblxuICAgICAgICBsaW5lID0gY3VycmVudC5saW5lO1xuICAgICAgICBjb2x1bW4gPSBjdXJyZW50LmNvbHVtbjtcbiAgICAgICAgdmFsdWUgPSBzdWJ2YWx1ZSArIHZhbHVlO1xuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICAvKiBUZXN0IHRoZSBwb3NpdGlvbiwgYWZ0ZXIgZWF0aW5nLCBhbmQgcmV2ZXJzZVxuICAgICAgICogdG8gYSBub3QtZWF0ZW4gc3RhdGUuICovXG4gICAgICBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcG9zKHt9KTtcblxuICAgICAgICBsaW5lID0gY3VycmVudC5saW5lO1xuICAgICAgICBjb2x1bW4gPSBjdXJyZW50LmNvbHVtbjtcbiAgICAgICAgdmFsdWUgPSBzdWJ2YWx1ZSArIHZhbHVlO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcblxuLyogRmFjdG9yeSB0byBkZS1lc2NhcGUgYSB2YWx1ZSwgYmFzZWQgb24gYSBsaXN0IGF0IGBrZXlgXG4gKiBpbiBgY3R4YC4gKi9cbmZ1bmN0aW9uIGZhY3RvcnkoY3R4LCBrZXkpIHtcbiAgcmV0dXJuIHVuZXNjYXBlO1xuXG4gIC8qIERlLWVzY2FwZSBhIHN0cmluZyB1c2luZyB0aGUgZXhwcmVzc2lvbiBhdCBga2V5YFxuICAgKiBpbiBgY3R4YC4gKi9cbiAgZnVuY3Rpb24gdW5lc2NhcGUodmFsdWUpIHtcbiAgICB2YXIgcHJldiA9IDA7XG4gICAgdmFyIGluZGV4ID0gdmFsdWUuaW5kZXhPZignXFxcXCcpO1xuICAgIHZhciBlc2NhcGUgPSBjdHhba2V5XTtcbiAgICB2YXIgcXVldWUgPSBbXTtcbiAgICB2YXIgY2hhcmFjdGVyO1xuXG4gICAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcXVldWUucHVzaCh2YWx1ZS5zbGljZShwcmV2LCBpbmRleCkpO1xuICAgICAgcHJldiA9IGluZGV4ICsgMTtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChwcmV2KTtcblxuICAgICAgLyogSWYgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgaXMgbm90IGEgdmFsaWQgZXNjYXBlLFxuICAgICAgICogYWRkIHRoZSBzbGFzaC4gKi9cbiAgICAgIGlmICghY2hhcmFjdGVyIHx8IGVzY2FwZS5pbmRleE9mKGNoYXJhY3RlcikgPT09IC0xKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goJ1xcXFwnKTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCdcXFxcJywgcHJldik7XG4gICAgfVxuXG4gICAgcXVldWUucHVzaCh2YWx1ZS5zbGljZShwcmV2KSk7XG5cbiAgICByZXR1cm4gcXVldWUuam9pbignJyk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBpbmRlbnRhdGlvbjtcblxuLyogTWFwIG9mIGNoYXJhY3RlcnMsIGFuZCB0aGVpciBjb2x1bW4gbGVuZ3RoLFxuICogd2hpY2ggY2FuIGJlIHVzZWQgYXMgaW5kZW50YXRpb24uICovXG52YXIgY2hhcmFjdGVycyA9IHsnICc6IDEsICdcXHQnOiA0fTtcblxuLyogR2V0cyBpbmRlbnRhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBsaW5lLiAqL1xuZnVuY3Rpb24gaW5kZW50YXRpb24odmFsdWUpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGluZGVudCA9IDA7XG4gIHZhciBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICB2YXIgc3RvcHMgPSB7fTtcbiAgdmFyIHNpemU7XG5cbiAgd2hpbGUgKGNoYXJhY3RlciBpbiBjaGFyYWN0ZXJzKSB7XG4gICAgc2l6ZSA9IGNoYXJhY3RlcnNbY2hhcmFjdGVyXTtcblxuICAgIGluZGVudCArPSBzaXplO1xuXG4gICAgaWYgKHNpemUgPiAxKSB7XG4gICAgICBpbmRlbnQgPSBNYXRoLmZsb29yKGluZGVudCAvIHNpemUpICogc2l6ZTtcbiAgICB9XG5cbiAgICBzdG9wc1tpbmRlbnRdID0gaW5kZXg7XG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gIH1cblxuICByZXR1cm4ge2luZGVudDogaW5kZW50LCBzdG9wczogc3RvcHN9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXR0cmlidXRlTmFtZSA9ICdbYS16QS1aXzpdW2EtekEtWjAtOTouXy1dKic7XG52YXIgdW5xdW90ZWQgPSAnW15cIlxcJz08PmBcXFxcdTAwMDAtXFxcXHUwMDIwXSsnO1xudmFyIHNpbmdsZVF1b3RlZCA9ICdcXCdbXlxcJ10qXFwnJztcbnZhciBkb3VibGVRdW90ZWQgPSAnXCJbXlwiXSpcIic7XG52YXIgYXR0cmlidXRlVmFsdWUgPSAnKD86JyArIHVucXVvdGVkICsgJ3wnICsgc2luZ2xlUXVvdGVkICsgJ3wnICsgZG91YmxlUXVvdGVkICsgJyknO1xudmFyIGF0dHJpYnV0ZSA9ICcoPzpcXFxccysnICsgYXR0cmlidXRlTmFtZSArICcoPzpcXFxccyo9XFxcXHMqJyArIGF0dHJpYnV0ZVZhbHVlICsgJyk/KSc7XG52YXIgb3BlblRhZyA9ICc8W0EtWmEtel1bQS1aYS16MC05XFxcXC1dKicgKyBhdHRyaWJ1dGUgKyAnKlxcXFxzKlxcXFwvPz4nO1xudmFyIGNsb3NlVGFnID0gJzxcXFxcL1tBLVphLXpdW0EtWmEtejAtOVxcXFwtXSpcXFxccyo+JztcbnZhciBjb21tZW50ID0gJzwhLS0tLT58PCEtLSg/Oi0/W14+LV0pKD86LT9bXi1dKSotLT4nO1xudmFyIHByb2Nlc3NpbmcgPSAnPFs/XS4qP1s/XT4nO1xudmFyIGRlY2xhcmF0aW9uID0gJzwhW0EtWmEtel0rXFxcXHMrW14+XSo+JztcbnZhciBjZGF0YSA9ICc8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/XFxcXF1cXFxcXT4nO1xuXG5leHBvcnRzLm9wZW5DbG9zZVRhZyA9IG5ldyBSZWdFeHAoJ14oPzonICsgb3BlblRhZyArICd8JyArIGNsb3NlVGFnICsgJyknKTtcblxuZXhwb3J0cy50YWcgPSBuZXcgUmVnRXhwKCdeKD86JyArXG4gIG9wZW5UYWcgKyAnfCcgK1xuICBjbG9zZVRhZyArICd8JyArXG4gIGNvbW1lbnQgKyAnfCcgK1xuICBwcm9jZXNzaW5nICsgJ3wnICtcbiAgZGVjbGFyYXRpb24gKyAnfCcgK1xuICBjZGF0YSArXG4nKScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGludGVycnVwdDtcblxuZnVuY3Rpb24gaW50ZXJydXB0KGludGVycnVwdG9ycywgdG9rZW5pemVycywgY3R4LCBwYXJhbXMpIHtcbiAgdmFyIGJvb2xzID0gWydwZWRhbnRpYycsICdjb21tb25tYXJrJ107XG4gIHZhciBjb3VudCA9IGJvb2xzLmxlbmd0aDtcbiAgdmFyIGxlbmd0aCA9IGludGVycnVwdG9ycy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgaW50ZXJydXB0b3I7XG4gIHZhciBjb25maWc7XG4gIHZhciBmbjtcbiAgdmFyIG9mZnNldDtcbiAgdmFyIGJvb2w7XG4gIHZhciBpZ25vcmU7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpbnRlcnJ1cHRvciA9IGludGVycnVwdG9yc1tpbmRleF07XG4gICAgY29uZmlnID0gaW50ZXJydXB0b3JbMV0gfHwge307XG4gICAgZm4gPSBpbnRlcnJ1cHRvclswXTtcbiAgICBvZmZzZXQgPSAtMTtcbiAgICBpZ25vcmUgPSBmYWxzZTtcblxuICAgIHdoaWxlICgrK29mZnNldCA8IGNvdW50KSB7XG4gICAgICBib29sID0gYm9vbHNbb2Zmc2V0XTtcblxuICAgICAgaWYgKGNvbmZpZ1tib29sXSAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZ1tib29sXSAhPT0gY3R4Lm9wdGlvbnNbYm9vbF0pIHtcbiAgICAgICAgaWdub3JlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlnbm9yZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuaXplcnNbZm5dLmFwcGx5KGN0eCwgcGFyYW1zKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29sbGFwc2VXaGl0ZVNwYWNlID0gcmVxdWlyZSgnY29sbGFwc2Utd2hpdGUtc3BhY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3JtYWxpemU7XG5cbi8qIE5vcm1hbGl6ZSBhbiBpZGVudGlmaWVyLiAgQ29sbGFwc2VzIG11bHRpcGxlIHdoaXRlIHNwYWNlXG4gKiBjaGFyYWN0ZXJzIGludG8gYSBzaW5nbGUgc3BhY2UsIGFuZCByZW1vdmVzIGNhc2luZy4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZSh2YWx1ZSkge1xuICByZXR1cm4gY29sbGFwc2VXaGl0ZVNwYWNlKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG52YXIgZ2V0SW5kZW50ID0gcmVxdWlyZSgnLi9nZXQtaW5kZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbmRlbnRhdGlvbjtcblxudmFyIENfU1BBQ0UgPSAnICc7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19UQUIgPSAnXFx0JztcblxuLyogUmVtb3ZlIHRoZSBtaW5pbXVtIGluZGVudCBmcm9tIGV2ZXJ5IGxpbmUgaW4gYHZhbHVlYC5cbiAqIFN1cHBvcnRzIGJvdGggdGFiLCBzcGFjZWQsIGFuZCBtaXhlZCBpbmRlbnRhdGlvbiAoYXNcbiAqIHdlbGwgYXMgcG9zc2libGUpLiAqL1xuZnVuY3Rpb24gaW5kZW50YXRpb24odmFsdWUsIG1heGltdW0pIHtcbiAgdmFyIHZhbHVlcyA9IHZhbHVlLnNwbGl0KENfTkVXTElORSk7XG4gIHZhciBwb3NpdGlvbiA9IHZhbHVlcy5sZW5ndGggKyAxO1xuICB2YXIgbWluSW5kZW50ID0gSW5maW5pdHk7XG4gIHZhciBtYXRyaXggPSBbXTtcbiAgdmFyIGluZGV4O1xuICB2YXIgaW5kZW50YXRpb247XG4gIHZhciBzdG9wcztcbiAgdmFyIHBhZGRpbmc7XG5cbiAgdmFsdWVzLnVuc2hpZnQocmVwZWF0KENfU1BBQ0UsIG1heGltdW0pICsgJyEnKTtcblxuICB3aGlsZSAocG9zaXRpb24tLSkge1xuICAgIGluZGVudGF0aW9uID0gZ2V0SW5kZW50KHZhbHVlc1twb3NpdGlvbl0pO1xuXG4gICAgbWF0cml4W3Bvc2l0aW9uXSA9IGluZGVudGF0aW9uLnN0b3BzO1xuXG4gICAgaWYgKHRyaW0odmFsdWVzW3Bvc2l0aW9uXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZW50YXRpb24uaW5kZW50KSB7XG4gICAgICBpZiAoaW5kZW50YXRpb24uaW5kZW50ID4gMCAmJiBpbmRlbnRhdGlvbi5pbmRlbnQgPCBtaW5JbmRlbnQpIHtcbiAgICAgICAgbWluSW5kZW50ID0gaW5kZW50YXRpb24uaW5kZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtaW5JbmRlbnQgPSBJbmZpbml0eTtcblxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbkluZGVudCAhPT0gSW5maW5pdHkpIHtcbiAgICBwb3NpdGlvbiA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAocG9zaXRpb24tLSkge1xuICAgICAgc3RvcHMgPSBtYXRyaXhbcG9zaXRpb25dO1xuICAgICAgaW5kZXggPSBtaW5JbmRlbnQ7XG5cbiAgICAgIHdoaWxlIChpbmRleCAmJiAhKGluZGV4IGluIHN0b3BzKSkge1xuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRyaW0odmFsdWVzW3Bvc2l0aW9uXSkubGVuZ3RoICE9PSAwICYmXG4gICAgICAgIG1pbkluZGVudCAmJlxuICAgICAgICBpbmRleCAhPT0gbWluSW5kZW50XG4gICAgICApIHtcbiAgICAgICAgcGFkZGluZyA9IENfVEFCO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFkZGluZyA9ICcnO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZXNbcG9zaXRpb25dID0gcGFkZGluZyArIHZhbHVlc1twb3NpdGlvbl0uc2xpY2UoXG4gICAgICAgIGluZGV4IGluIHN0b3BzID8gc3RvcHNbaW5kZXhdICsgMSA6IDBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsdWVzLnNoaWZ0KCk7XG5cbiAgcmV0dXJuIHZhbHVlcy5qb2luKENfTkVXTElORSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY29sbGFwc2U7XG5cbi8qIGNvbGxhcHNlKCcgXFx0XFxuYmFyIFxcbmJhelxcdCcpOyAvLyAnIGJhciBiYXogJyAqL1xuZnVuY3Rpb24gY29sbGFwc2UodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFscGhhYmV0aWNhbDtcblxuLyogQ2hlY2sgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBjb2RlLCBvciB0aGUgY2hhcmFjdGVyXG4gKiBjb2RlIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIsIGlzIGFscGhhYmV0aWNhbC4gKi9cbmZ1bmN0aW9uIGFscGhhYmV0aWNhbChjaGFyYWN0ZXIpIHtcbiAgdmFyIGNvZGUgPSB0eXBlb2YgY2hhcmFjdGVyID09PSAnc3RyaW5nJyA/XG4gICAgY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkgOiBjaGFyYWN0ZXI7XG5cbiAgcmV0dXJuIChjb2RlID49IDk3ICYmIGNvZGUgPD0gMTIyKSB8fCAvKiBhLXogKi9cbiAgICAoY29kZSA+PSA2NSAmJiBjb2RlIDw9IDkwKTsgLyogQS1aICovXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVjaW1hbDtcblxuLyogQ2hlY2sgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBjb2RlLCBvciB0aGUgY2hhcmFjdGVyXG4gKiBjb2RlIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIsIGlzIGRlY2ltYWwuICovXG5mdW5jdGlvbiBkZWNpbWFsKGNoYXJhY3Rlcikge1xuICB2YXIgY29kZSA9IHR5cGVvZiBjaGFyYWN0ZXIgPT09ICdzdHJpbmcnID9cbiAgICBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKSA6IGNoYXJhY3RlcjtcblxuICByZXR1cm4gY29kZSA+PSA0OCAmJiBjb2RlIDw9IDU3OyAvKiAwLTkgKi9cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB3aGl0ZXNwYWNlO1xuXG52YXIgZnJvbUNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyIHJlID0gL1xccy87XG5cbi8qIENoZWNrIGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY29kZSwgb3IgdGhlIGNoYXJhY3RlclxuICogY29kZSBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyLCBpcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xuZnVuY3Rpb24gd2hpdGVzcGFjZShjaGFyYWN0ZXIpIHtcbiAgcmV0dXJuIHJlLnRlc3QoXG4gICAgdHlwZW9mIGNoYXJhY3RlciA9PT0gJ251bWJlcicgPyBmcm9tQ29kZShjaGFyYWN0ZXIpIDogY2hhcmFjdGVyLmNoYXJBdCgwKVxuICApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdvcmRDaGFyYWN0ZXI7XG5cbnZhciBmcm9tQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgcmUgPSAvXFx3LztcblxuLyogQ2hlY2sgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBjb2RlLCBvciB0aGUgY2hhcmFjdGVyXG4gKiBjb2RlIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIsIGlzIGEgd29yZCBjaGFyYWN0ZXIuICovXG5mdW5jdGlvbiB3b3JkQ2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICByZXR1cm4gcmUudGVzdChcbiAgICB0eXBlb2YgY2hhcmFjdGVyID09PSAnbnVtYmVyJyA/IGZyb21Db2RlKGNoYXJhY3RlcikgOiBjaGFyYWN0ZXIuY2hhckF0KDApXG4gICk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZXNjYXBlcztcblxudmFyIGRlZmF1bHRzID0gW1xuICAnXFxcXCcsXG4gICdgJyxcbiAgJyonLFxuICAneycsXG4gICd9JyxcbiAgJ1snLFxuICAnXScsXG4gICcoJyxcbiAgJyknLFxuICAnIycsXG4gICcrJyxcbiAgJy0nLFxuICAnLicsXG4gICchJyxcbiAgJ18nLFxuICAnPidcbl07XG5cbnZhciBnZm0gPSBkZWZhdWx0cy5jb25jYXQoWyd+JywgJ3wnXSk7XG5cbnZhciBjb21tb25tYXJrID0gZ2ZtLmNvbmNhdChbXG4gICdcXG4nLFxuICAnXCInLFxuICAnJCcsXG4gICclJyxcbiAgJyYnLFxuICAnXFwnJyxcbiAgJywnLFxuICAnLycsXG4gICc6JyxcbiAgJzsnLFxuICAnPCcsXG4gICc9JyxcbiAgJz8nLFxuICAnQCcsXG4gICdeJ1xuXSk7XG5cbmVzY2FwZXMuZGVmYXVsdCA9IGRlZmF1bHRzO1xuZXNjYXBlcy5nZm0gPSBnZm07XG5lc2NhcGVzLmNvbW1vbm1hcmsgPSBjb21tb25tYXJrO1xuXG4vKiBHZXQgbWFya2Rvd24gZXNjYXBlcy4gKi9cbmZ1bmN0aW9uIGVzY2FwZXMob3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChzZXR0aW5ncy5jb21tb25tYXJrKSB7XG4gICAgcmV0dXJuIGNvbW1vbm1hcms7XG4gIH1cblxuICByZXR1cm4gc2V0dGluZ3MuZ2ZtID8gZ2ZtIDogZGVmYXVsdHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIERlcGVuZGVuY2llcy4gKi9cbnZhciBjaGFyYWN0ZXJFbnRpdGllcyA9IHJlcXVpcmUoJ2NoYXJhY3Rlci1lbnRpdGllcycpO1xudmFyIGxlZ2FjeSA9IHJlcXVpcmUoJ2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3knKTtcbnZhciBpbnZhbGlkID0gcmVxdWlyZSgnY2hhcmFjdGVyLXJlZmVyZW5jZS1pbnZhbGlkJyk7XG52YXIgZGVjaW1hbCA9IHJlcXVpcmUoJ2lzLWRlY2ltYWwnKTtcbnZhciBoZXhhZGVjaW1hbCA9IHJlcXVpcmUoJ2lzLWhleGFkZWNpbWFsJyk7XG52YXIgYWxwaGFudW1lcmljYWwgPSByZXF1aXJlKCdpcy1hbHBoYW51bWVyaWNhbCcpO1xuXG4vKiBFeHBvc2UuICovXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBwZXI7XG5cbi8qIE1ldGhvZHMuICovXG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7XG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBub29wID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiBDaGFyYWN0ZXJzLiAqL1xudmFyIFJFUExBQ0VNRU5UID0gJ1xcdUZGRkQnO1xudmFyIEZPUk1fRkVFRCA9ICdcXGYnO1xudmFyIEFNUEVSU0FORCA9ICcmJztcbnZhciBPQ1RPVEhPUlAgPSAnIyc7XG52YXIgU0VNSUNPTE9OID0gJzsnO1xudmFyIE5FV0xJTkUgPSAnXFxuJztcbnZhciBYX0xPV0VSID0gJ3gnO1xudmFyIFhfVVBQRVIgPSAnWCc7XG52YXIgU1BBQ0UgPSAnICc7XG52YXIgTEVTU19USEFOID0gJzwnO1xudmFyIEVRVUFMID0gJz0nO1xudmFyIEVNUFRZID0gJyc7XG52YXIgVEFCID0gJ1xcdCc7XG5cbi8qIERlZmF1bHQgc2V0dGluZ3MuICovXG52YXIgZGVmYXVsdHMgPSB7XG4gIHdhcm5pbmc6IG51bGwsXG4gIHJlZmVyZW5jZTogbnVsbCxcbiAgdGV4dDogbnVsbCxcbiAgd2FybmluZ0NvbnRleHQ6IG51bGwsXG4gIHJlZmVyZW5jZUNvbnRleHQ6IG51bGwsXG4gIHRleHRDb250ZXh0OiBudWxsLFxuICBwb3NpdGlvbjoge30sXG4gIGFkZGl0aW9uYWw6IG51bGwsXG4gIGF0dHJpYnV0ZTogZmFsc2UsXG4gIG5vblRlcm1pbmF0ZWQ6IHRydWVcbn07XG5cbi8qIFJlZmVyZW5jZSB0eXBlcy4gKi9cbnZhciBOQU1FRCA9ICduYW1lZCc7XG52YXIgSEVYQURFQ0lNQUwgPSAnaGV4YWRlY2ltYWwnO1xudmFyIERFQ0lNQUwgPSAnZGVjaW1hbCc7XG5cbi8qIE1hcCBvZiBiYXNlcy4gKi9cbnZhciBCQVNFID0ge307XG5cbkJBU0VbSEVYQURFQ0lNQUxdID0gMTY7XG5CQVNFW0RFQ0lNQUxdID0gMTA7XG5cbi8qIE1hcCBvZiB0eXBlcyB0byB0ZXN0cy4gRWFjaCB0eXBlIG9mIGNoYXJhY3RlciByZWZlcmVuY2VcbiAqIGFjY2VwdHMgZGlmZmVyZW50IGNoYXJhY3RlcnMuIFRoaXMgdGVzdCBpcyB1c2VkIHRvXG4gKiBkZXRlY3Qgd2hldGhlciBhIHJlZmVyZW5jZSBoYXMgZW5kZWQgKGFzIHRoZSBzZW1pY29sb25cbiAqIGlzIG5vdCBzdHJpY3RseSBuZWVkZWQpLiAqL1xudmFyIFRFU1RTID0ge307XG5cblRFU1RTW05BTUVEXSA9IGFscGhhbnVtZXJpY2FsO1xuVEVTVFNbREVDSU1BTF0gPSBkZWNpbWFsO1xuVEVTVFNbSEVYQURFQ0lNQUxdID0gaGV4YWRlY2ltYWw7XG5cbi8qIFdhcm5pbmcgbWVzc2FnZXMuICovXG52YXIgTkFNRURfTk9UX1RFUk1JTkFURUQgPSAxO1xudmFyIE5VTUVSSUNfTk9UX1RFUk1JTkFURUQgPSAyO1xudmFyIE5BTUVEX0VNUFRZID0gMztcbnZhciBOVU1FUklDX0VNUFRZID0gNDtcbnZhciBOQU1FRF9VTktOT1dOID0gNTtcbnZhciBOVU1FUklDX0RJU0FMTE9XRUQgPSA2O1xudmFyIE5VTUVSSUNfUFJPSElCSVRFRCA9IDc7XG5cbnZhciBOVU1FUklDX1JFRkVSRU5DRSA9ICdOdW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2VzJztcbnZhciBOQU1FRF9SRUZFUkVOQ0UgPSAnTmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZXMnO1xudmFyIFRFUk1JTkFURUQgPSAnIG11c3QgYmUgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbic7XG52YXIgVk9JRCA9ICcgY2Fubm90IGJlIGVtcHR5JztcblxudmFyIE1FU1NBR0VTID0ge307XG5cbk1FU1NBR0VTW05BTUVEX05PVF9URVJNSU5BVEVEXSA9IE5BTUVEX1JFRkVSRU5DRSArIFRFUk1JTkFURUQ7XG5NRVNTQUdFU1tOVU1FUklDX05PVF9URVJNSU5BVEVEXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgVEVSTUlOQVRFRDtcbk1FU1NBR0VTW05BTUVEX0VNUFRZXSA9IE5BTUVEX1JFRkVSRU5DRSArIFZPSUQ7XG5NRVNTQUdFU1tOVU1FUklDX0VNUFRZXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgVk9JRDtcbk1FU1NBR0VTW05BTUVEX1VOS05PV05dID0gTkFNRURfUkVGRVJFTkNFICsgJyBtdXN0IGJlIGtub3duJztcbk1FU1NBR0VTW05VTUVSSUNfRElTQUxMT1dFRF0gPSBOVU1FUklDX1JFRkVSRU5DRSArICcgY2Fubm90IGJlIGRpc2FsbG93ZWQnO1xuTUVTU0FHRVNbTlVNRVJJQ19QUk9ISUJJVEVEXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgJyBjYW5ub3QgYmUgb3V0c2lkZSB0aGUgJyArXG4gICAgJ3Blcm1pc3NpYmxlIFVuaWNvZGUgcmFuZ2UnO1xuXG4vKiBXcmFwIHRvIGVuc3VyZSBjbGVhbiBwYXJhbWV0ZXJzIGFyZSBnaXZlbiB0byBgcGFyc2VgLiAqL1xuZnVuY3Rpb24gd3JhcHBlcih2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSB7fTtcbiAgdmFyIG9wdGlvbjtcbiAgdmFyIGtleTtcblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBmb3IgKGtleSBpbiBkZWZhdWx0cykge1xuICAgIG9wdGlvbiA9IG9wdGlvbnNba2V5XTtcbiAgICBzZXR0aW5nc1trZXldID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdHNba2V5XSA6IG9wdGlvbjtcbiAgfVxuXG4gIGlmIChzZXR0aW5ncy5wb3NpdGlvbi5pbmRlbnQgfHwgc2V0dGluZ3MucG9zaXRpb24uc3RhcnQpIHtcbiAgICBzZXR0aW5ncy5pbmRlbnQgPSBzZXR0aW5ncy5wb3NpdGlvbi5pbmRlbnQgfHwgW107XG4gICAgc2V0dGluZ3MucG9zaXRpb24gPSBzZXR0aW5ncy5wb3NpdGlvbi5zdGFydDtcbiAgfVxuXG4gIHJldHVybiBwYXJzZSh2YWx1ZSwgc2V0dGluZ3MpO1xufVxuXG4vKiBQYXJzZSBlbnRpdGllcy4gKi9cbmZ1bmN0aW9uIHBhcnNlKHZhbHVlLCBzZXR0aW5ncykge1xuICB2YXIgYWRkaXRpb25hbCA9IHNldHRpbmdzLmFkZGl0aW9uYWw7XG4gIHZhciBub25UZXJtaW5hdGVkID0gc2V0dGluZ3Mubm9uVGVybWluYXRlZDtcbiAgdmFyIGhhbmRsZVRleHQgPSBzZXR0aW5ncy50ZXh0O1xuICB2YXIgaGFuZGxlUmVmZXJlbmNlID0gc2V0dGluZ3MucmVmZXJlbmNlO1xuICB2YXIgaGFuZGxlV2FybmluZyA9IHNldHRpbmdzLndhcm5pbmc7XG4gIHZhciB0ZXh0Q29udGV4dCA9IHNldHRpbmdzLnRleHRDb250ZXh0O1xuICB2YXIgcmVmZXJlbmNlQ29udGV4dCA9IHNldHRpbmdzLnJlZmVyZW5jZUNvbnRleHQ7XG4gIHZhciB3YXJuaW5nQ29udGV4dCA9IHNldHRpbmdzLndhcm5pbmdDb250ZXh0O1xuICB2YXIgcG9zID0gc2V0dGluZ3MucG9zaXRpb247XG4gIHZhciBpbmRlbnQgPSBzZXR0aW5ncy5pbmRlbnQgfHwgW107XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsaW5lcyA9IC0xO1xuICB2YXIgY29sdW1uID0gcG9zLmNvbHVtbiB8fCAxO1xuICB2YXIgbGluZSA9IHBvcy5saW5lIHx8IDE7XG4gIHZhciBxdWV1ZSA9IEVNUFRZO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBlbnRpdHlDaGFyYWN0ZXJzO1xuICB2YXIgdGVybWluYXRlZDtcbiAgdmFyIGNoYXJhY3RlcnM7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciByZWZlcmVuY2U7XG4gIHZhciBmb2xsb3dpbmc7XG4gIHZhciB3YXJuaW5nO1xuICB2YXIgcmVhc29uO1xuICB2YXIgb3V0cHV0O1xuICB2YXIgZW50aXR5O1xuICB2YXIgYmVnaW47XG4gIHZhciBzdGFydDtcbiAgdmFyIHR5cGU7XG4gIHZhciB0ZXN0O1xuICB2YXIgcHJldjtcbiAgdmFyIG5leHQ7XG4gIHZhciBkaWZmO1xuICB2YXIgZW5kO1xuXG4gIC8qIENhY2hlIHRoZSBjdXJyZW50IHBvaW50LiAqL1xuICBwcmV2ID0gbm93KCk7XG5cbiAgLyogV3JhcCBgaGFuZGxlV2FybmluZ2AuICovXG4gIHdhcm5pbmcgPSBoYW5kbGVXYXJuaW5nID8gcGFyc2VFcnJvciA6IG5vb3A7XG5cbiAgLyogRW5zdXJlIHRoZSBhbGdvcml0aG0gd2Fsa3Mgb3ZlciB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gICAqIGFuZCB0aGUgZW5kIChpbmNsdXNpdmUpLiAqL1xuICBpbmRleC0tO1xuICBsZW5ndGgrKztcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIC8qIElmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIGEgbmV3bGluZS4gKi9cbiAgICBpZiAoY2hhcmFjdGVyID09PSBORVdMSU5FKSB7XG4gICAgICBjb2x1bW4gPSBpbmRlbnRbbGluZXNdIHx8IDE7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyID0gYXQoaW5kZXgpO1xuXG4gICAgLyogSGFuZGxlIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gYW1wZXJzYW5kLFxuICAgICAqIGluY2x1ZGluZyBuZXdsaW5lcyBhbmQgRU9GLiAqL1xuICAgIGlmIChjaGFyYWN0ZXIgIT09IEFNUEVSU0FORCkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTkVXTElORSkge1xuICAgICAgICBsaW5lKys7XG4gICAgICAgIGxpbmVzKys7XG4gICAgICAgIGNvbHVtbiA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIpIHtcbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBjb2x1bW4rKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvbGxvd2luZyA9IGF0KGluZGV4ICsgMSk7XG5cbiAgICAgIC8qIFRoZSBiZWhhdmlvdXIgZGVwZW5kcyBvbiB0aGUgaWRlbnRpdHkgb2YgdGhlIG5leHRcbiAgICAgICAqIGNoYXJhY3Rlci4gKi9cbiAgICAgIGlmIChcbiAgICAgICAgZm9sbG93aW5nID09PSBUQUIgfHxcbiAgICAgICAgZm9sbG93aW5nID09PSBORVdMSU5FIHx8XG4gICAgICAgIGZvbGxvd2luZyA9PT0gRk9STV9GRUVEIHx8XG4gICAgICAgIGZvbGxvd2luZyA9PT0gU1BBQ0UgfHxcbiAgICAgICAgZm9sbG93aW5nID09PSBMRVNTX1RIQU4gfHxcbiAgICAgICAgZm9sbG93aW5nID09PSBBTVBFUlNBTkQgfHxcbiAgICAgICAgZm9sbG93aW5nID09PSBFTVBUWSB8fFxuICAgICAgICAoYWRkaXRpb25hbCAmJiBmb2xsb3dpbmcgPT09IGFkZGl0aW9uYWwpXG4gICAgICApIHtcbiAgICAgICAgLyogTm90IGEgY2hhcmFjdGVyIHJlZmVyZW5jZS4gTm8gY2hhcmFjdGVyc1xuICAgICAgICAgKiBhcmUgY29uc3VtZWQsIGFuZCBub3RoaW5nIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgZWl0aGVyLiAqL1xuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGNvbHVtbisrO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIGJlZ2luID0gc3RhcnQ7XG4gICAgICBlbmQgPSBzdGFydDtcblxuICAgICAgLyogTnVtZXJpY2FsIGVudGl0eS4gKi9cbiAgICAgIGlmIChmb2xsb3dpbmcgIT09IE9DVE9USE9SUCkge1xuICAgICAgICB0eXBlID0gTkFNRUQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSArK2JlZ2luO1xuXG4gICAgICAgIC8qIFRoZSBiZWhhdmlvdXIgZnVydGhlciBkZXBlbmRzIG9uIHRoZVxuICAgICAgICAgKiBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIFUrMDAyMyBOVU1CRVIgU0lHTi4gKi9cbiAgICAgICAgZm9sbG93aW5nID0gYXQoZW5kKTtcblxuICAgICAgICBpZiAoZm9sbG93aW5nID09PSBYX0xPV0VSIHx8IGZvbGxvd2luZyA9PT0gWF9VUFBFUikge1xuICAgICAgICAgIC8qIEFTQ0lJIGhleCBkaWdpdHMuICovXG4gICAgICAgICAgdHlwZSA9IEhFWEFERUNJTUFMO1xuICAgICAgICAgIGVuZCA9ICsrYmVnaW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogQVNDSUkgZGlnaXRzLiAqL1xuICAgICAgICAgIHR5cGUgPSBERUNJTUFMO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVudGl0eUNoYXJhY3RlcnMgPSBFTVBUWTtcbiAgICAgIGVudGl0eSA9IEVNUFRZO1xuICAgICAgY2hhcmFjdGVycyA9IEVNUFRZO1xuICAgICAgdGVzdCA9IFRFU1RTW3R5cGVdO1xuICAgICAgZW5kLS07XG5cbiAgICAgIHdoaWxlICgrK2VuZCA8IGxlbmd0aCkge1xuICAgICAgICBmb2xsb3dpbmcgPSBhdChlbmQpO1xuXG4gICAgICAgIGlmICghdGVzdChmb2xsb3dpbmcpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFyYWN0ZXJzICs9IGZvbGxvd2luZztcblxuICAgICAgICAvKiBDaGVjayBpZiB3ZSBjYW4gbWF0Y2ggYSBsZWdhY3kgbmFtZWRcbiAgICAgICAgICogcmVmZXJlbmNlLiAgSWYgc28sIHdlIGNhY2hlIHRoYXQgYXMgdGhlXG4gICAgICAgICAqIGxhc3QgdmlhYmxlIG5hbWVkIHJlZmVyZW5jZS4gIFRoaXNcbiAgICAgICAgICogZW5zdXJlcyB3ZSBkbyBub3QgbmVlZCB0byB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgKiBsYXRlci4gKi9cbiAgICAgICAgaWYgKHR5cGUgPT09IE5BTUVEICYmIG93bi5jYWxsKGxlZ2FjeSwgY2hhcmFjdGVycykpIHtcbiAgICAgICAgICBlbnRpdHlDaGFyYWN0ZXJzID0gY2hhcmFjdGVycztcbiAgICAgICAgICBlbnRpdHkgPSBsZWdhY3lbY2hhcmFjdGVyc107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGVybWluYXRlZCA9IGF0KGVuZCkgPT09IFNFTUlDT0xPTjtcblxuICAgICAgaWYgKHRlcm1pbmF0ZWQpIHtcbiAgICAgICAgZW5kKys7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IE5BTUVEICYmIG93bi5jYWxsKGNoYXJhY3RlckVudGl0aWVzLCBjaGFyYWN0ZXJzKSkge1xuICAgICAgICAgIGVudGl0eUNoYXJhY3RlcnMgPSBjaGFyYWN0ZXJzO1xuICAgICAgICAgIGVudGl0eSA9IGNoYXJhY3RlckVudGl0aWVzW2NoYXJhY3RlcnNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRpZmYgPSAxICsgZW5kIC0gc3RhcnQ7XG5cbiAgICAgIGlmICghdGVybWluYXRlZCAmJiAhbm9uVGVybWluYXRlZCkge1xuICAgICAgICAvKiBFbXB0eS4gKi9cbiAgICAgIH0gZWxzZSBpZiAoIWNoYXJhY3RlcnMpIHtcbiAgICAgICAgLyogQW4gZW1wdHkgKHBvc3NpYmxlKSBlbnRpdHkgaXMgdmFsaWQsIHVubGVzc1xuICAgICAgICAgKiBpdHMgbnVtZXJpYyAodGh1cyBhbiBhbXBlcnNhbmQgZm9sbG93ZWQgYnlcbiAgICAgICAgICogYW4gb2N0b3Rob3JwKS4gKi9cbiAgICAgICAgaWYgKHR5cGUgIT09IE5BTUVEKSB7XG4gICAgICAgICAgd2FybmluZyhOVU1FUklDX0VNUFRZLCBkaWZmKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBOQU1FRCkge1xuICAgICAgICAvKiBBbiBhbXBlcnNhbmQgZm9sbG93ZWQgYnkgYW55dGhpbmdcbiAgICAgICAgICogdW5rbm93biwgYW5kIG5vdCB0ZXJtaW5hdGVkLCBpcyBpbnZhbGlkLiAqL1xuICAgICAgICBpZiAodGVybWluYXRlZCAmJiAhZW50aXR5KSB7XG4gICAgICAgICAgd2FybmluZyhOQU1FRF9VTktOT1dOLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBJZiB0aGVyZXMgc29tZXRoaW5nIGFmdGVyIGFuIGVudGl0eVxuICAgICAgICAgICAqIG5hbWUgd2hpY2ggaXMgbm90IGtub3duLCBjYXAgdGhlXG4gICAgICAgICAgICogcmVmZXJlbmNlLiAqL1xuICAgICAgICAgIGlmIChlbnRpdHlDaGFyYWN0ZXJzICE9PSBjaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICBlbmQgPSBiZWdpbiArIGVudGl0eUNoYXJhY3RlcnMubGVuZ3RoO1xuICAgICAgICAgICAgZGlmZiA9IDEgKyBlbmQgLSBiZWdpbjtcbiAgICAgICAgICAgIHRlcm1pbmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKiBJZiB0aGUgcmVmZXJlbmNlIGlzIG5vdCB0ZXJtaW5hdGVkLFxuICAgICAgICAgICAqIHdhcm4uICovXG4gICAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7XG4gICAgICAgICAgICByZWFzb24gPSBlbnRpdHlDaGFyYWN0ZXJzID9cbiAgICAgICAgICAgICAgTkFNRURfTk9UX1RFUk1JTkFURUQgOlxuICAgICAgICAgICAgICBOQU1FRF9FTVBUWTtcblxuICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5hdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgd2FybmluZyhyZWFzb24sIGRpZmYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9sbG93aW5nID0gYXQoZW5kKTtcblxuICAgICAgICAgICAgICBpZiAoZm9sbG93aW5nID09PSBFUVVBTCkge1xuICAgICAgICAgICAgICAgIHdhcm5pbmcocmVhc29uLCBkaWZmKTtcbiAgICAgICAgICAgICAgICBlbnRpdHkgPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFscGhhbnVtZXJpY2FsKGZvbGxvd2luZykpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkgPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm5pbmcocmVhc29uLCBkaWZmKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlZmVyZW5jZSA9IGVudGl0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGVybWluYXRlZCkge1xuICAgICAgICAgIC8qIEFsbCBub24tdGVybWluYXRlZCBudW1lcmljIGVudGl0aWVzIGFyZVxuICAgICAgICAgICAqIG5vdCByZW5kZXJlZCwgYW5kIHRyaWdnZXIgYSB3YXJuaW5nLiAqL1xuICAgICAgICAgIHdhcm5pbmcoTlVNRVJJQ19OT1RfVEVSTUlOQVRFRCwgZGlmZik7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBXaGVuIHRlcm1pbmF0ZWQgYW5kIG51bWJlciwgcGFyc2UgYXNcbiAgICAgICAgICogZWl0aGVyIGhleGFkZWNpbWFsIG9yIGRlY2ltYWwuICovXG4gICAgICAgIHJlZmVyZW5jZSA9IHBhcnNlSW50KGNoYXJhY3RlcnMsIEJBU0VbdHlwZV0pO1xuXG4gICAgICAgIC8qIFRyaWdnZXIgYSB3YXJuaW5nIHdoZW4gdGhlIHBhcnNlZCBudW1iZXJcbiAgICAgICAgICogaXMgcHJvaGliaXRlZCwgYW5kIHJlcGxhY2Ugd2l0aFxuICAgICAgICAgKiByZXBsYWNlbWVudCBjaGFyYWN0ZXIuICovXG4gICAgICAgIGlmIChpc1Byb2hpYml0ZWQocmVmZXJlbmNlKSkge1xuICAgICAgICAgIHdhcm5pbmcoTlVNRVJJQ19QUk9ISUJJVEVELCBkaWZmKTtcblxuICAgICAgICAgIHJlZmVyZW5jZSA9IFJFUExBQ0VNRU5UO1xuICAgICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbiBpbnZhbGlkKSB7XG4gICAgICAgICAgLyogVHJpZ2dlciBhIHdhcm5pbmcgd2hlbiB0aGUgcGFyc2VkIG51bWJlclxuICAgICAgICAgICAqIGlzIGRpc2FsbG93ZWQsIGFuZCByZXBsYWNlIGJ5IGFuXG4gICAgICAgICAgICogYWx0ZXJuYXRpdmUuICovXG4gICAgICAgICAgd2FybmluZyhOVU1FUklDX0RJU0FMTE9XRUQsIGRpZmYpO1xuXG4gICAgICAgICAgcmVmZXJlbmNlID0gaW52YWxpZFtyZWZlcmVuY2VdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qIFBhcnNlIHRoZSBudW1iZXIuICovXG4gICAgICAgICAgb3V0cHV0ID0gRU1QVFk7XG5cbiAgICAgICAgICAvKiBUcmlnZ2VyIGEgd2FybmluZyB3aGVuIHRoZSBwYXJzZWRcbiAgICAgICAgICAgKiBudW1iZXIgc2hvdWxkIG5vdCBiZSB1c2VkLiAqL1xuICAgICAgICAgIGlmIChpc1dhcm5pbmcocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgd2FybmluZyhOVU1FUklDX0RJU0FMTE9XRUQsIGRpZmYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qIFN0cmluZ2lmeSB0aGUgbnVtYmVyLiAqL1xuICAgICAgICAgIGlmIChyZWZlcmVuY2UgPiAweEZGRkYpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZSAtPSAweDEwMDAwO1xuICAgICAgICAgICAgb3V0cHV0ICs9IGZyb21DaGFyQ29kZSgocmVmZXJlbmNlID4+PiAoMTAgJiAweDNGRikpIHwgMHhEODAwKTtcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IDB4REMwMCB8IChyZWZlcmVuY2UgJiAweDNGRik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVmZXJlbmNlID0gb3V0cHV0ICsgZnJvbUNoYXJDb2RlKHJlZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogSWYgd2UgY291bGQgbm90IGZpbmQgYSByZWZlcmVuY2UsIHF1ZXVlIHRoZVxuICAgICAgICogY2hlY2tlZCBjaGFyYWN0ZXJzIChhcyBub3JtYWwgY2hhcmFjdGVycyksXG4gICAgICAgKiBhbmQgbW92ZSB0aGUgcG9pbnRlciB0byB0aGVpciBlbmQuIFRoaXMgaXNcbiAgICAgICAqIHBvc3NpYmxlIGJlY2F1c2Ugd2UgY2FuIGJlIGNlcnRhaW4gbmVpdGhlclxuICAgICAgICogbmV3bGluZXMgbm9yIGFtcGVyc2FuZHMgYXJlIGluY2x1ZGVkLiAqL1xuICAgICAgaWYgKCFyZWZlcmVuY2UpIHtcbiAgICAgICAgY2hhcmFjdGVycyA9IHZhbHVlLnNsaWNlKHN0YXJ0IC0gMSwgZW5kKTtcbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVycztcbiAgICAgICAgY29sdW1uICs9IGNoYXJhY3RlcnMubGVuZ3RoO1xuICAgICAgICBpbmRleCA9IGVuZCAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBGb3VuZCBpdCEgRmlyc3QgZWF0IHRoZSBxdWV1ZWRcbiAgICAgICAgICogY2hhcmFjdGVycyBhcyBub3JtYWwgdGV4dCwgdGhlbiBlYXRcbiAgICAgICAgICogYW4gZW50aXR5LiAqL1xuICAgICAgICBmbHVzaCgpO1xuXG4gICAgICAgIHByZXYgPSBub3coKTtcbiAgICAgICAgaW5kZXggPSBlbmQgLSAxO1xuICAgICAgICBjb2x1bW4gKz0gZW5kIC0gc3RhcnQgKyAxO1xuICAgICAgICByZXN1bHQucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICBuZXh0ID0gbm93KCk7XG4gICAgICAgIG5leHQub2Zmc2V0Kys7XG5cbiAgICAgICAgaWYgKGhhbmRsZVJlZmVyZW5jZSkge1xuICAgICAgICAgIGhhbmRsZVJlZmVyZW5jZS5jYWxsKHJlZmVyZW5jZUNvbnRleHQsIHJlZmVyZW5jZSwge1xuICAgICAgICAgICAgc3RhcnQ6IHByZXYsXG4gICAgICAgICAgICBlbmQ6IG5leHRcbiAgICAgICAgICB9LCB2YWx1ZS5zbGljZShzdGFydCAtIDEsIGVuZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldiA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUmV0dXJuIHRoZSByZWR1Y2VkIG5vZGVzLCBhbmQgYW55IHBvc3NpYmxlIHdhcm5pbmdzLiAqL1xuICByZXR1cm4gcmVzdWx0LmpvaW4oRU1QVFkpO1xuXG4gIC8qIEdldCBjdXJyZW50IHBvc2l0aW9uLiAqL1xuICBmdW5jdGlvbiBub3coKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IGxpbmUsXG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgIG9mZnNldDogaW5kZXggKyAocG9zLm9mZnNldCB8fCAwKVxuICAgIH07XG4gIH1cblxuICAvKiDigJxUaHJvd+KAnSBhIHBhcnNlLWVycm9yOiBhIHdhcm5pbmcuICovXG4gIGZ1bmN0aW9uIHBhcnNlRXJyb3IoY29kZSwgb2Zmc2V0KSB7XG4gICAgdmFyIHBvc2l0aW9uID0gbm93KCk7XG5cbiAgICBwb3NpdGlvbi5jb2x1bW4gKz0gb2Zmc2V0O1xuICAgIHBvc2l0aW9uLm9mZnNldCArPSBvZmZzZXQ7XG5cbiAgICBoYW5kbGVXYXJuaW5nLmNhbGwod2FybmluZ0NvbnRleHQsIE1FU1NBR0VTW2NvZGVdLCBwb3NpdGlvbiwgY29kZSk7XG4gIH1cblxuICAvKiBHZXQgY2hhcmFjdGVyIGF0IHBvc2l0aW9uLiAqL1xuICBmdW5jdGlvbiBhdChwb3NpdGlvbikge1xuICAgIHJldHVybiB2YWx1ZS5jaGFyQXQocG9zaXRpb24pO1xuICB9XG5cbiAgLyogRmx1c2ggYHF1ZXVlYCAobm9ybWFsIHRleHQpLiBNYWNybyBpbnZva2VkIGJlZm9yZVxuICAgKiBlYWNoIGVudGl0eSBhbmQgYXQgdGhlIGVuZCBvZiBgdmFsdWVgLlxuICAgKiBEb2VzIG5vdGhpbmcgd2hlbiBgcXVldWVgIGlzIGVtcHR5LiAqL1xuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHF1ZXVlKTtcblxuICAgICAgaWYgKGhhbmRsZVRleHQpIHtcbiAgICAgICAgaGFuZGxlVGV4dC5jYWxsKHRleHRDb250ZXh0LCBxdWV1ZSwge1xuICAgICAgICAgIHN0YXJ0OiBwcmV2LFxuICAgICAgICAgIGVuZDogbm93KClcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgfVxuICB9XG59XG5cbi8qIENoZWNrIGlmIGBjaGFyYWN0ZXJgIGlzIG91dHNpZGUgdGhlIHBlcm1pc3NpYmxlXG4gKiB1bmljb2RlIHJhbmdlLiAqL1xuZnVuY3Rpb24gaXNQcm9oaWJpdGVkKGNvZGUpIHtcbiAgcmV0dXJuIChjb2RlID49IDB4RDgwMCAmJiBjb2RlIDw9IDB4REZGRikgfHwgKGNvZGUgPiAweDEwRkZGRik7XG59XG5cbi8qIENoZWNrIGlmIGBjaGFyYWN0ZXJgIGlzIGRpc2FsbG93ZWQuICovXG5mdW5jdGlvbiBpc1dhcm5pbmcoY29kZSkge1xuICBpZiAoXG4gICAgKGNvZGUgPj0gMHgwMDAxICYmIGNvZGUgPD0gMHgwMDA4KSB8fFxuICAgIGNvZGUgPT09IDB4MDAwQiB8fFxuICAgIChjb2RlID49IDB4MDAwRCAmJiBjb2RlIDw9IDB4MDAxRikgfHxcbiAgICAoY29kZSA+PSAweDAwN0YgJiYgY29kZSA8PSAweDAwOUYpIHx8XG4gICAgKGNvZGUgPj0gMHhGREQwICYmIGNvZGUgPD0gMHhGREVGKSB8fFxuICAgIChjb2RlICYgMHhGRkZGKSA9PT0gMHhGRkZGIHx8XG4gICAgKGNvZGUgJiAweEZGRkYpID09PSAweEZGRkVcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiQUVsaWdcIjogXCLDhlwiLFxuICBcIkFNUFwiOiBcIiZcIixcbiAgXCJBYWN1dGVcIjogXCLDgVwiLFxuICBcIkFjaXJjXCI6IFwiw4JcIixcbiAgXCJBZ3JhdmVcIjogXCLDgFwiLFxuICBcIkFyaW5nXCI6IFwiw4VcIixcbiAgXCJBdGlsZGVcIjogXCLDg1wiLFxuICBcIkF1bWxcIjogXCLDhFwiLFxuICBcIkNPUFlcIjogXCLCqVwiLFxuICBcIkNjZWRpbFwiOiBcIsOHXCIsXG4gIFwiRVRIXCI6IFwiw5BcIixcbiAgXCJFYWN1dGVcIjogXCLDiVwiLFxuICBcIkVjaXJjXCI6IFwiw4pcIixcbiAgXCJFZ3JhdmVcIjogXCLDiFwiLFxuICBcIkV1bWxcIjogXCLDi1wiLFxuICBcIkdUXCI6IFwiPlwiLFxuICBcIklhY3V0ZVwiOiBcIsONXCIsXG4gIFwiSWNpcmNcIjogXCLDjlwiLFxuICBcIklncmF2ZVwiOiBcIsOMXCIsXG4gIFwiSXVtbFwiOiBcIsOPXCIsXG4gIFwiTFRcIjogXCI8XCIsXG4gIFwiTnRpbGRlXCI6IFwiw5FcIixcbiAgXCJPYWN1dGVcIjogXCLDk1wiLFxuICBcIk9jaXJjXCI6IFwiw5RcIixcbiAgXCJPZ3JhdmVcIjogXCLDklwiLFxuICBcIk9zbGFzaFwiOiBcIsOYXCIsXG4gIFwiT3RpbGRlXCI6IFwiw5VcIixcbiAgXCJPdW1sXCI6IFwiw5ZcIixcbiAgXCJRVU9UXCI6IFwiXFxcIlwiLFxuICBcIlJFR1wiOiBcIsKuXCIsXG4gIFwiVEhPUk5cIjogXCLDnlwiLFxuICBcIlVhY3V0ZVwiOiBcIsOaXCIsXG4gIFwiVWNpcmNcIjogXCLDm1wiLFxuICBcIlVncmF2ZVwiOiBcIsOZXCIsXG4gIFwiVXVtbFwiOiBcIsOcXCIsXG4gIFwiWWFjdXRlXCI6IFwiw51cIixcbiAgXCJhYWN1dGVcIjogXCLDoVwiLFxuICBcImFjaXJjXCI6IFwiw6JcIixcbiAgXCJhY3V0ZVwiOiBcIsK0XCIsXG4gIFwiYWVsaWdcIjogXCLDplwiLFxuICBcImFncmF2ZVwiOiBcIsOgXCIsXG4gIFwiYW1wXCI6IFwiJlwiLFxuICBcImFyaW5nXCI6IFwiw6VcIixcbiAgXCJhdGlsZGVcIjogXCLDo1wiLFxuICBcImF1bWxcIjogXCLDpFwiLFxuICBcImJydmJhclwiOiBcIsKmXCIsXG4gIFwiY2NlZGlsXCI6IFwiw6dcIixcbiAgXCJjZWRpbFwiOiBcIsK4XCIsXG4gIFwiY2VudFwiOiBcIsKiXCIsXG4gIFwiY29weVwiOiBcIsKpXCIsXG4gIFwiY3VycmVuXCI6IFwiwqRcIixcbiAgXCJkZWdcIjogXCLCsFwiLFxuICBcImRpdmlkZVwiOiBcIsO3XCIsXG4gIFwiZWFjdXRlXCI6IFwiw6lcIixcbiAgXCJlY2lyY1wiOiBcIsOqXCIsXG4gIFwiZWdyYXZlXCI6IFwiw6hcIixcbiAgXCJldGhcIjogXCLDsFwiLFxuICBcImV1bWxcIjogXCLDq1wiLFxuICBcImZyYWMxMlwiOiBcIsK9XCIsXG4gIFwiZnJhYzE0XCI6IFwiwrxcIixcbiAgXCJmcmFjMzRcIjogXCLCvlwiLFxuICBcImd0XCI6IFwiPlwiLFxuICBcImlhY3V0ZVwiOiBcIsOtXCIsXG4gIFwiaWNpcmNcIjogXCLDrlwiLFxuICBcImlleGNsXCI6IFwiwqFcIixcbiAgXCJpZ3JhdmVcIjogXCLDrFwiLFxuICBcImlxdWVzdFwiOiBcIsK/XCIsXG4gIFwiaXVtbFwiOiBcIsOvXCIsXG4gIFwibGFxdW9cIjogXCLCq1wiLFxuICBcImx0XCI6IFwiPFwiLFxuICBcIm1hY3JcIjogXCLCr1wiLFxuICBcIm1pY3JvXCI6IFwiwrVcIixcbiAgXCJtaWRkb3RcIjogXCLCt1wiLFxuICBcIm5ic3BcIjogXCLCoFwiLFxuICBcIm5vdFwiOiBcIsKsXCIsXG4gIFwibnRpbGRlXCI6IFwiw7FcIixcbiAgXCJvYWN1dGVcIjogXCLDs1wiLFxuICBcIm9jaXJjXCI6IFwiw7RcIixcbiAgXCJvZ3JhdmVcIjogXCLDslwiLFxuICBcIm9yZGZcIjogXCLCqlwiLFxuICBcIm9yZG1cIjogXCLCulwiLFxuICBcIm9zbGFzaFwiOiBcIsO4XCIsXG4gIFwib3RpbGRlXCI6IFwiw7VcIixcbiAgXCJvdW1sXCI6IFwiw7ZcIixcbiAgXCJwYXJhXCI6IFwiwrZcIixcbiAgXCJwbHVzbW5cIjogXCLCsVwiLFxuICBcInBvdW5kXCI6IFwiwqNcIixcbiAgXCJxdW90XCI6IFwiXFxcIlwiLFxuICBcInJhcXVvXCI6IFwiwrtcIixcbiAgXCJyZWdcIjogXCLCrlwiLFxuICBcInNlY3RcIjogXCLCp1wiLFxuICBcInNoeVwiOiBcIsKtXCIsXG4gIFwic3VwMVwiOiBcIsK5XCIsXG4gIFwic3VwMlwiOiBcIsKyXCIsXG4gIFwic3VwM1wiOiBcIsKzXCIsXG4gIFwic3psaWdcIjogXCLDn1wiLFxuICBcInRob3JuXCI6IFwiw75cIixcbiAgXCJ0aW1lc1wiOiBcIsOXXCIsXG4gIFwidWFjdXRlXCI6IFwiw7pcIixcbiAgXCJ1Y2lyY1wiOiBcIsO7XCIsXG4gIFwidWdyYXZlXCI6IFwiw7lcIixcbiAgXCJ1bWxcIjogXCLCqFwiLFxuICBcInV1bWxcIjogXCLDvFwiLFxuICBcInlhY3V0ZVwiOiBcIsO9XCIsXG4gIFwieWVuXCI6IFwiwqVcIixcbiAgXCJ5dW1sXCI6IFwiw79cIlxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIkFFbGlcIjogXCLDhlwiLFxuICBcIkFFbGlnXCI6IFwiw4ZcIixcbiAgXCJBTVwiOiBcIiZcIixcbiAgXCJBTVBcIjogXCImXCIsXG4gIFwiQWFjdXRcIjogXCLDgVwiLFxuICBcIkFhY3V0ZVwiOiBcIsOBXCIsXG4gIFwiQWJyZXZlXCI6IFwixIJcIixcbiAgXCJBY2lyXCI6IFwiw4JcIixcbiAgXCJBY2lyY1wiOiBcIsOCXCIsXG4gIFwiQWN5XCI6IFwi0JBcIixcbiAgXCJBZnJcIjogXCLwnZSEXCIsXG4gIFwiQWdyYXZcIjogXCLDgFwiLFxuICBcIkFncmF2ZVwiOiBcIsOAXCIsXG4gIFwiQWxwaGFcIjogXCLOkVwiLFxuICBcIkFtYWNyXCI6IFwixIBcIixcbiAgXCJBbmRcIjogXCLiqZNcIixcbiAgXCJBb2dvblwiOiBcIsSEXCIsXG4gIFwiQW9wZlwiOiBcIvCdlLhcIixcbiAgXCJBcHBseUZ1bmN0aW9uXCI6IFwi4oGhXCIsXG4gIFwiQXJpblwiOiBcIsOFXCIsXG4gIFwiQXJpbmdcIjogXCLDhVwiLFxuICBcIkFzY3JcIjogXCLwnZKcXCIsXG4gIFwiQXNzaWduXCI6IFwi4omUXCIsXG4gIFwiQXRpbGRcIjogXCLDg1wiLFxuICBcIkF0aWxkZVwiOiBcIsODXCIsXG4gIFwiQXVtXCI6IFwiw4RcIixcbiAgXCJBdW1sXCI6IFwiw4RcIixcbiAgXCJCYWNrc2xhc2hcIjogXCLiiJZcIixcbiAgXCJCYXJ2XCI6IFwi4qunXCIsXG4gIFwiQmFyd2VkXCI6IFwi4oyGXCIsXG4gIFwiQmN5XCI6IFwi0JFcIixcbiAgXCJCZWNhdXNlXCI6IFwi4oi1XCIsXG4gIFwiQmVybm91bGxpc1wiOiBcIuKErFwiLFxuICBcIkJldGFcIjogXCLOklwiLFxuICBcIkJmclwiOiBcIvCdlIVcIixcbiAgXCJCb3BmXCI6IFwi8J2UuVwiLFxuICBcIkJyZXZlXCI6IFwiy5hcIixcbiAgXCJCc2NyXCI6IFwi4oSsXCIsXG4gIFwiQnVtcGVxXCI6IFwi4omOXCIsXG4gIFwiQ0hjeVwiOiBcItCnXCIsXG4gIFwiQ09QXCI6IFwiwqlcIixcbiAgXCJDT1BZXCI6IFwiwqlcIixcbiAgXCJDYWN1dGVcIjogXCLEhlwiLFxuICBcIkNhcFwiOiBcIuKLklwiLFxuICBcIkNhcGl0YWxEaWZmZXJlbnRpYWxEXCI6IFwi4oWFXCIsXG4gIFwiQ2F5bGV5c1wiOiBcIuKErVwiLFxuICBcIkNjYXJvblwiOiBcIsSMXCIsXG4gIFwiQ2NlZGlcIjogXCLDh1wiLFxuICBcIkNjZWRpbFwiOiBcIsOHXCIsXG4gIFwiQ2NpcmNcIjogXCLEiFwiLFxuICBcIkNjb25pbnRcIjogXCLiiLBcIixcbiAgXCJDZG90XCI6IFwixIpcIixcbiAgXCJDZWRpbGxhXCI6IFwiwrhcIixcbiAgXCJDZW50ZXJEb3RcIjogXCLCt1wiLFxuICBcIkNmclwiOiBcIuKErVwiLFxuICBcIkNoaVwiOiBcIs6nXCIsXG4gIFwiQ2lyY2xlRG90XCI6IFwi4oqZXCIsXG4gIFwiQ2lyY2xlTWludXNcIjogXCLiipZcIixcbiAgXCJDaXJjbGVQbHVzXCI6IFwi4oqVXCIsXG4gIFwiQ2lyY2xlVGltZXNcIjogXCLiipdcIixcbiAgXCJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjogXCLiiLJcIixcbiAgXCJDbG9zZUN1cmx5RG91YmxlUXVvdGVcIjogXCLigJ1cIixcbiAgXCJDbG9zZUN1cmx5UXVvdGVcIjogXCLigJlcIixcbiAgXCJDb2xvblwiOiBcIuKIt1wiLFxuICBcIkNvbG9uZVwiOiBcIuKptFwiLFxuICBcIkNvbmdydWVudFwiOiBcIuKJoVwiLFxuICBcIkNvbmludFwiOiBcIuKIr1wiLFxuICBcIkNvbnRvdXJJbnRlZ3JhbFwiOiBcIuKIrlwiLFxuICBcIkNvcGZcIjogXCLihIJcIixcbiAgXCJDb3Byb2R1Y3RcIjogXCLiiJBcIixcbiAgXCJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsXCI6IFwi4oizXCIsXG4gIFwiQ3Jvc3NcIjogXCLiqK9cIixcbiAgXCJDc2NyXCI6IFwi8J2SnlwiLFxuICBcIkN1cFwiOiBcIuKLk1wiLFxuICBcIkN1cENhcFwiOiBcIuKJjVwiLFxuICBcIkREXCI6IFwi4oWFXCIsXG4gIFwiRERvdHJhaGRcIjogXCLipJFcIixcbiAgXCJESmN5XCI6IFwi0IJcIixcbiAgXCJEU2N5XCI6IFwi0IVcIixcbiAgXCJEWmN5XCI6IFwi0I9cIixcbiAgXCJEYWdnZXJcIjogXCLigKFcIixcbiAgXCJEYXJyXCI6IFwi4oahXCIsXG4gIFwiRGFzaHZcIjogXCLiq6RcIixcbiAgXCJEY2Fyb25cIjogXCLEjlwiLFxuICBcIkRjeVwiOiBcItCUXCIsXG4gIFwiRGVsXCI6IFwi4oiHXCIsXG4gIFwiRGVsdGFcIjogXCLOlFwiLFxuICBcIkRmclwiOiBcIvCdlIdcIixcbiAgXCJEaWFjcml0aWNhbEFjdXRlXCI6IFwiwrRcIixcbiAgXCJEaWFjcml0aWNhbERvdFwiOiBcIsuZXCIsXG4gIFwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZVwiOiBcIsudXCIsXG4gIFwiRGlhY3JpdGljYWxHcmF2ZVwiOiBcImBcIixcbiAgXCJEaWFjcml0aWNhbFRpbGRlXCI6IFwiy5xcIixcbiAgXCJEaWFtb25kXCI6IFwi4ouEXCIsXG4gIFwiRGlmZmVyZW50aWFsRFwiOiBcIuKFhlwiLFxuICBcIkRvcGZcIjogXCLwnZS7XCIsXG4gIFwiRG90XCI6IFwiwqhcIixcbiAgXCJEb3REb3RcIjogXCLig5xcIixcbiAgXCJEb3RFcXVhbFwiOiBcIuKJkFwiLFxuICBcIkRvdWJsZUNvbnRvdXJJbnRlZ3JhbFwiOiBcIuKIr1wiLFxuICBcIkRvdWJsZURvdFwiOiBcIsKoXCIsXG4gIFwiRG91YmxlRG93bkFycm93XCI6IFwi4oeTXCIsXG4gIFwiRG91YmxlTGVmdEFycm93XCI6IFwi4oeQXCIsXG4gIFwiRG91YmxlTGVmdFJpZ2h0QXJyb3dcIjogXCLih5RcIixcbiAgXCJEb3VibGVMZWZ0VGVlXCI6IFwi4qukXCIsXG4gIFwiRG91YmxlTG9uZ0xlZnRBcnJvd1wiOiBcIuKfuFwiLFxuICBcIkRvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvd1wiOiBcIuKfulwiLFxuICBcIkRvdWJsZUxvbmdSaWdodEFycm93XCI6IFwi4p+5XCIsXG4gIFwiRG91YmxlUmlnaHRBcnJvd1wiOiBcIuKHklwiLFxuICBcIkRvdWJsZVJpZ2h0VGVlXCI6IFwi4oqoXCIsXG4gIFwiRG91YmxlVXBBcnJvd1wiOiBcIuKHkVwiLFxuICBcIkRvdWJsZVVwRG93bkFycm93XCI6IFwi4oeVXCIsXG4gIFwiRG91YmxlVmVydGljYWxCYXJcIjogXCLiiKVcIixcbiAgXCJEb3duQXJyb3dcIjogXCLihpNcIixcbiAgXCJEb3duQXJyb3dCYXJcIjogXCLipJNcIixcbiAgXCJEb3duQXJyb3dVcEFycm93XCI6IFwi4oe1XCIsXG4gIFwiRG93bkJyZXZlXCI6IFwizJFcIixcbiAgXCJEb3duTGVmdFJpZ2h0VmVjdG9yXCI6IFwi4qWQXCIsXG4gIFwiRG93bkxlZnRUZWVWZWN0b3JcIjogXCLipZ5cIixcbiAgXCJEb3duTGVmdFZlY3RvclwiOiBcIuKGvVwiLFxuICBcIkRvd25MZWZ0VmVjdG9yQmFyXCI6IFwi4qWWXCIsXG4gIFwiRG93blJpZ2h0VGVlVmVjdG9yXCI6IFwi4qWfXCIsXG4gIFwiRG93blJpZ2h0VmVjdG9yXCI6IFwi4oeBXCIsXG4gIFwiRG93blJpZ2h0VmVjdG9yQmFyXCI6IFwi4qWXXCIsXG4gIFwiRG93blRlZVwiOiBcIuKKpFwiLFxuICBcIkRvd25UZWVBcnJvd1wiOiBcIuKGp1wiLFxuICBcIkRvd25hcnJvd1wiOiBcIuKHk1wiLFxuICBcIkRzY3JcIjogXCLwnZKfXCIsXG4gIFwiRHN0cm9rXCI6IFwixJBcIixcbiAgXCJFTkdcIjogXCLFilwiLFxuICBcIkVUXCI6IFwiw5BcIixcbiAgXCJFVEhcIjogXCLDkFwiLFxuICBcIkVhY3V0XCI6IFwiw4lcIixcbiAgXCJFYWN1dGVcIjogXCLDiVwiLFxuICBcIkVjYXJvblwiOiBcIsSaXCIsXG4gIFwiRWNpclwiOiBcIsOKXCIsXG4gIFwiRWNpcmNcIjogXCLDilwiLFxuICBcIkVjeVwiOiBcItCtXCIsXG4gIFwiRWRvdFwiOiBcIsSWXCIsXG4gIFwiRWZyXCI6IFwi8J2UiFwiLFxuICBcIkVncmF2XCI6IFwiw4hcIixcbiAgXCJFZ3JhdmVcIjogXCLDiFwiLFxuICBcIkVsZW1lbnRcIjogXCLiiIhcIixcbiAgXCJFbWFjclwiOiBcIsSSXCIsXG4gIFwiRW1wdHlTbWFsbFNxdWFyZVwiOiBcIuKXu1wiLFxuICBcIkVtcHR5VmVyeVNtYWxsU3F1YXJlXCI6IFwi4parXCIsXG4gIFwiRW9nb25cIjogXCLEmFwiLFxuICBcIkVvcGZcIjogXCLwnZS8XCIsXG4gIFwiRXBzaWxvblwiOiBcIs6VXCIsXG4gIFwiRXF1YWxcIjogXCLiqbVcIixcbiAgXCJFcXVhbFRpbGRlXCI6IFwi4omCXCIsXG4gIFwiRXF1aWxpYnJpdW1cIjogXCLih4xcIixcbiAgXCJFc2NyXCI6IFwi4oSwXCIsXG4gIFwiRXNpbVwiOiBcIuKps1wiLFxuICBcIkV0YVwiOiBcIs6XXCIsXG4gIFwiRXVtXCI6IFwiw4tcIixcbiAgXCJFdW1sXCI6IFwiw4tcIixcbiAgXCJFeGlzdHNcIjogXCLiiINcIixcbiAgXCJFeHBvbmVudGlhbEVcIjogXCLihYdcIixcbiAgXCJGY3lcIjogXCLQpFwiLFxuICBcIkZmclwiOiBcIvCdlIlcIixcbiAgXCJGaWxsZWRTbWFsbFNxdWFyZVwiOiBcIuKXvFwiLFxuICBcIkZpbGxlZFZlcnlTbWFsbFNxdWFyZVwiOiBcIuKWqlwiLFxuICBcIkZvcGZcIjogXCLwnZS9XCIsXG4gIFwiRm9yQWxsXCI6IFwi4oiAXCIsXG4gIFwiRm91cmllcnRyZlwiOiBcIuKEsVwiLFxuICBcIkZzY3JcIjogXCLihLFcIixcbiAgXCJHSmN5XCI6IFwi0INcIixcbiAgXCJHXCI6IFwiPlwiLFxuICBcIkdUXCI6IFwiPlwiLFxuICBcIkdhbW1hXCI6IFwizpNcIixcbiAgXCJHYW1tYWRcIjogXCLPnFwiLFxuICBcIkdicmV2ZVwiOiBcIsSeXCIsXG4gIFwiR2NlZGlsXCI6IFwixKJcIixcbiAgXCJHY2lyY1wiOiBcIsScXCIsXG4gIFwiR2N5XCI6IFwi0JNcIixcbiAgXCJHZG90XCI6IFwixKBcIixcbiAgXCJHZnJcIjogXCLwnZSKXCIsXG4gIFwiR2dcIjogXCLii5lcIixcbiAgXCJHb3BmXCI6IFwi8J2UvlwiLFxuICBcIkdyZWF0ZXJFcXVhbFwiOiBcIuKJpVwiLFxuICBcIkdyZWF0ZXJFcXVhbExlc3NcIjogXCLii5tcIixcbiAgXCJHcmVhdGVyRnVsbEVxdWFsXCI6IFwi4omnXCIsXG4gIFwiR3JlYXRlckdyZWF0ZXJcIjogXCLiqqJcIixcbiAgXCJHcmVhdGVyTGVzc1wiOiBcIuKJt1wiLFxuICBcIkdyZWF0ZXJTbGFudEVxdWFsXCI6IFwi4qm+XCIsXG4gIFwiR3JlYXRlclRpbGRlXCI6IFwi4omzXCIsXG4gIFwiR3NjclwiOiBcIvCdkqJcIixcbiAgXCJHdFwiOiBcIuKJq1wiLFxuICBcIkhBUkRjeVwiOiBcItCqXCIsXG4gIFwiSGFjZWtcIjogXCLLh1wiLFxuICBcIkhhdFwiOiBcIl5cIixcbiAgXCJIY2lyY1wiOiBcIsSkXCIsXG4gIFwiSGZyXCI6IFwi4oSMXCIsXG4gIFwiSGlsYmVydFNwYWNlXCI6IFwi4oSLXCIsXG4gIFwiSG9wZlwiOiBcIuKEjVwiLFxuICBcIkhvcml6b250YWxMaW5lXCI6IFwi4pSAXCIsXG4gIFwiSHNjclwiOiBcIuKEi1wiLFxuICBcIkhzdHJva1wiOiBcIsSmXCIsXG4gIFwiSHVtcERvd25IdW1wXCI6IFwi4omOXCIsXG4gIFwiSHVtcEVxdWFsXCI6IFwi4omPXCIsXG4gIFwiSUVjeVwiOiBcItCVXCIsXG4gIFwiSUpsaWdcIjogXCLEslwiLFxuICBcIklPY3lcIjogXCLQgVwiLFxuICBcIklhY3V0XCI6IFwiw41cIixcbiAgXCJJYWN1dGVcIjogXCLDjVwiLFxuICBcIkljaXJcIjogXCLDjlwiLFxuICBcIkljaXJjXCI6IFwiw45cIixcbiAgXCJJY3lcIjogXCLQmFwiLFxuICBcIklkb3RcIjogXCLEsFwiLFxuICBcIklmclwiOiBcIuKEkVwiLFxuICBcIklncmF2XCI6IFwiw4xcIixcbiAgXCJJZ3JhdmVcIjogXCLDjFwiLFxuICBcIkltXCI6IFwi4oSRXCIsXG4gIFwiSW1hY3JcIjogXCLEqlwiLFxuICBcIkltYWdpbmFyeUlcIjogXCLihYhcIixcbiAgXCJJbXBsaWVzXCI6IFwi4oeSXCIsXG4gIFwiSW50XCI6IFwi4oisXCIsXG4gIFwiSW50ZWdyYWxcIjogXCLiiKtcIixcbiAgXCJJbnRlcnNlY3Rpb25cIjogXCLii4JcIixcbiAgXCJJbnZpc2libGVDb21tYVwiOiBcIuKBo1wiLFxuICBcIkludmlzaWJsZVRpbWVzXCI6IFwi4oGiXCIsXG4gIFwiSW9nb25cIjogXCLErlwiLFxuICBcIklvcGZcIjogXCLwnZWAXCIsXG4gIFwiSW90YVwiOiBcIs6ZXCIsXG4gIFwiSXNjclwiOiBcIuKEkFwiLFxuICBcIkl0aWxkZVwiOiBcIsSoXCIsXG4gIFwiSXVrY3lcIjogXCLQhlwiLFxuICBcIkl1bVwiOiBcIsOPXCIsXG4gIFwiSXVtbFwiOiBcIsOPXCIsXG4gIFwiSmNpcmNcIjogXCLEtFwiLFxuICBcIkpjeVwiOiBcItCZXCIsXG4gIFwiSmZyXCI6IFwi8J2UjVwiLFxuICBcIkpvcGZcIjogXCLwnZWBXCIsXG4gIFwiSnNjclwiOiBcIvCdkqVcIixcbiAgXCJKc2VyY3lcIjogXCLQiFwiLFxuICBcIkp1a2N5XCI6IFwi0IRcIixcbiAgXCJLSGN5XCI6IFwi0KVcIixcbiAgXCJLSmN5XCI6IFwi0IxcIixcbiAgXCJLYXBwYVwiOiBcIs6aXCIsXG4gIFwiS2NlZGlsXCI6IFwixLZcIixcbiAgXCJLY3lcIjogXCLQmlwiLFxuICBcIktmclwiOiBcIvCdlI5cIixcbiAgXCJLb3BmXCI6IFwi8J2VglwiLFxuICBcIktzY3JcIjogXCLwnZKmXCIsXG4gIFwiTEpjeVwiOiBcItCJXCIsXG4gIFwiTFwiOiBcIjxcIixcbiAgXCJMVFwiOiBcIjxcIixcbiAgXCJMYWN1dGVcIjogXCLEuVwiLFxuICBcIkxhbWJkYVwiOiBcIs6bXCIsXG4gIFwiTGFuZ1wiOiBcIuKfqlwiLFxuICBcIkxhcGxhY2V0cmZcIjogXCLihJJcIixcbiAgXCJMYXJyXCI6IFwi4oaeXCIsXG4gIFwiTGNhcm9uXCI6IFwixL1cIixcbiAgXCJMY2VkaWxcIjogXCLEu1wiLFxuICBcIkxjeVwiOiBcItCbXCIsXG4gIFwiTGVmdEFuZ2xlQnJhY2tldFwiOiBcIuKfqFwiLFxuICBcIkxlZnRBcnJvd1wiOiBcIuKGkFwiLFxuICBcIkxlZnRBcnJvd0JhclwiOiBcIuKHpFwiLFxuICBcIkxlZnRBcnJvd1JpZ2h0QXJyb3dcIjogXCLih4ZcIixcbiAgXCJMZWZ0Q2VpbGluZ1wiOiBcIuKMiFwiLFxuICBcIkxlZnREb3VibGVCcmFja2V0XCI6IFwi4p+mXCIsXG4gIFwiTGVmdERvd25UZWVWZWN0b3JcIjogXCLipaFcIixcbiAgXCJMZWZ0RG93blZlY3RvclwiOiBcIuKHg1wiLFxuICBcIkxlZnREb3duVmVjdG9yQmFyXCI6IFwi4qWZXCIsXG4gIFwiTGVmdEZsb29yXCI6IFwi4oyKXCIsXG4gIFwiTGVmdFJpZ2h0QXJyb3dcIjogXCLihpRcIixcbiAgXCJMZWZ0UmlnaHRWZWN0b3JcIjogXCLipY5cIixcbiAgXCJMZWZ0VGVlXCI6IFwi4oqjXCIsXG4gIFwiTGVmdFRlZUFycm93XCI6IFwi4oakXCIsXG4gIFwiTGVmdFRlZVZlY3RvclwiOiBcIuKlmlwiLFxuICBcIkxlZnRUcmlhbmdsZVwiOiBcIuKKslwiLFxuICBcIkxlZnRUcmlhbmdsZUJhclwiOiBcIuKnj1wiLFxuICBcIkxlZnRUcmlhbmdsZUVxdWFsXCI6IFwi4oq0XCIsXG4gIFwiTGVmdFVwRG93blZlY3RvclwiOiBcIuKlkVwiLFxuICBcIkxlZnRVcFRlZVZlY3RvclwiOiBcIuKloFwiLFxuICBcIkxlZnRVcFZlY3RvclwiOiBcIuKGv1wiLFxuICBcIkxlZnRVcFZlY3RvckJhclwiOiBcIuKlmFwiLFxuICBcIkxlZnRWZWN0b3JcIjogXCLihrxcIixcbiAgXCJMZWZ0VmVjdG9yQmFyXCI6IFwi4qWSXCIsXG4gIFwiTGVmdGFycm93XCI6IFwi4oeQXCIsXG4gIFwiTGVmdHJpZ2h0YXJyb3dcIjogXCLih5RcIixcbiAgXCJMZXNzRXF1YWxHcmVhdGVyXCI6IFwi4ouaXCIsXG4gIFwiTGVzc0Z1bGxFcXVhbFwiOiBcIuKJplwiLFxuICBcIkxlc3NHcmVhdGVyXCI6IFwi4om2XCIsXG4gIFwiTGVzc0xlc3NcIjogXCLiqqFcIixcbiAgXCJMZXNzU2xhbnRFcXVhbFwiOiBcIuKpvVwiLFxuICBcIkxlc3NUaWxkZVwiOiBcIuKJslwiLFxuICBcIkxmclwiOiBcIvCdlI9cIixcbiAgXCJMbFwiOiBcIuKLmFwiLFxuICBcIkxsZWZ0YXJyb3dcIjogXCLih5pcIixcbiAgXCJMbWlkb3RcIjogXCLEv1wiLFxuICBcIkxvbmdMZWZ0QXJyb3dcIjogXCLin7VcIixcbiAgXCJMb25nTGVmdFJpZ2h0QXJyb3dcIjogXCLin7dcIixcbiAgXCJMb25nUmlnaHRBcnJvd1wiOiBcIuKftlwiLFxuICBcIkxvbmdsZWZ0YXJyb3dcIjogXCLin7hcIixcbiAgXCJMb25nbGVmdHJpZ2h0YXJyb3dcIjogXCLin7pcIixcbiAgXCJMb25ncmlnaHRhcnJvd1wiOiBcIuKfuVwiLFxuICBcIkxvcGZcIjogXCLwnZWDXCIsXG4gIFwiTG93ZXJMZWZ0QXJyb3dcIjogXCLihplcIixcbiAgXCJMb3dlclJpZ2h0QXJyb3dcIjogXCLihphcIixcbiAgXCJMc2NyXCI6IFwi4oSSXCIsXG4gIFwiTHNoXCI6IFwi4oawXCIsXG4gIFwiTHN0cm9rXCI6IFwixYFcIixcbiAgXCJMdFwiOiBcIuKJqlwiLFxuICBcIk1hcFwiOiBcIuKkhVwiLFxuICBcIk1jeVwiOiBcItCcXCIsXG4gIFwiTWVkaXVtU3BhY2VcIjogXCLigZ9cIixcbiAgXCJNZWxsaW50cmZcIjogXCLihLNcIixcbiAgXCJNZnJcIjogXCLwnZSQXCIsXG4gIFwiTWludXNQbHVzXCI6IFwi4oiTXCIsXG4gIFwiTW9wZlwiOiBcIvCdlYRcIixcbiAgXCJNc2NyXCI6IFwi4oSzXCIsXG4gIFwiTXVcIjogXCLOnFwiLFxuICBcIk5KY3lcIjogXCLQilwiLFxuICBcIk5hY3V0ZVwiOiBcIsWDXCIsXG4gIFwiTmNhcm9uXCI6IFwixYdcIixcbiAgXCJOY2VkaWxcIjogXCLFhVwiLFxuICBcIk5jeVwiOiBcItCdXCIsXG4gIFwiTmVnYXRpdmVNZWRpdW1TcGFjZVwiOiBcIuKAi1wiLFxuICBcIk5lZ2F0aXZlVGhpY2tTcGFjZVwiOiBcIuKAi1wiLFxuICBcIk5lZ2F0aXZlVGhpblNwYWNlXCI6IFwi4oCLXCIsXG4gIFwiTmVnYXRpdmVWZXJ5VGhpblNwYWNlXCI6IFwi4oCLXCIsXG4gIFwiTmVzdGVkR3JlYXRlckdyZWF0ZXJcIjogXCLiiatcIixcbiAgXCJOZXN0ZWRMZXNzTGVzc1wiOiBcIuKJqlwiLFxuICBcIk5ld0xpbmVcIjogXCJcXG5cIixcbiAgXCJOZnJcIjogXCLwnZSRXCIsXG4gIFwiTm9CcmVha1wiOiBcIuKBoFwiLFxuICBcIk5vbkJyZWFraW5nU3BhY2VcIjogXCLCoFwiLFxuICBcIk5vcGZcIjogXCLihJVcIixcbiAgXCJOb3RcIjogXCLiq6xcIixcbiAgXCJOb3RDb25ncnVlbnRcIjogXCLiiaJcIixcbiAgXCJOb3RDdXBDYXBcIjogXCLiia1cIixcbiAgXCJOb3REb3VibGVWZXJ0aWNhbEJhclwiOiBcIuKIplwiLFxuICBcIk5vdEVsZW1lbnRcIjogXCLiiIlcIixcbiAgXCJOb3RFcXVhbFwiOiBcIuKJoFwiLFxuICBcIk5vdEVxdWFsVGlsZGVcIjogXCLiiYLMuFwiLFxuICBcIk5vdEV4aXN0c1wiOiBcIuKIhFwiLFxuICBcIk5vdEdyZWF0ZXJcIjogXCLiia9cIixcbiAgXCJOb3RHcmVhdGVyRXF1YWxcIjogXCLiibFcIixcbiAgXCJOb3RHcmVhdGVyRnVsbEVxdWFsXCI6IFwi4omnzLhcIixcbiAgXCJOb3RHcmVhdGVyR3JlYXRlclwiOiBcIuKJq8y4XCIsXG4gIFwiTm90R3JlYXRlckxlc3NcIjogXCLiiblcIixcbiAgXCJOb3RHcmVhdGVyU2xhbnRFcXVhbFwiOiBcIuKpvsy4XCIsXG4gIFwiTm90R3JlYXRlclRpbGRlXCI6IFwi4om1XCIsXG4gIFwiTm90SHVtcERvd25IdW1wXCI6IFwi4omOzLhcIixcbiAgXCJOb3RIdW1wRXF1YWxcIjogXCLiiY/MuFwiLFxuICBcIk5vdExlZnRUcmlhbmdsZVwiOiBcIuKLqlwiLFxuICBcIk5vdExlZnRUcmlhbmdsZUJhclwiOiBcIuKnj8y4XCIsXG4gIFwiTm90TGVmdFRyaWFuZ2xlRXF1YWxcIjogXCLii6xcIixcbiAgXCJOb3RMZXNzXCI6IFwi4omuXCIsXG4gIFwiTm90TGVzc0VxdWFsXCI6IFwi4omwXCIsXG4gIFwiTm90TGVzc0dyZWF0ZXJcIjogXCLiibhcIixcbiAgXCJOb3RMZXNzTGVzc1wiOiBcIuKJqsy4XCIsXG4gIFwiTm90TGVzc1NsYW50RXF1YWxcIjogXCLiqb3MuFwiLFxuICBcIk5vdExlc3NUaWxkZVwiOiBcIuKJtFwiLFxuICBcIk5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyXCI6IFwi4qqizLhcIixcbiAgXCJOb3ROZXN0ZWRMZXNzTGVzc1wiOiBcIuKqocy4XCIsXG4gIFwiTm90UHJlY2VkZXNcIjogXCLiioBcIixcbiAgXCJOb3RQcmVjZWRlc0VxdWFsXCI6IFwi4qqvzLhcIixcbiAgXCJOb3RQcmVjZWRlc1NsYW50RXF1YWxcIjogXCLii6BcIixcbiAgXCJOb3RSZXZlcnNlRWxlbWVudFwiOiBcIuKIjFwiLFxuICBcIk5vdFJpZ2h0VHJpYW5nbGVcIjogXCLii6tcIixcbiAgXCJOb3RSaWdodFRyaWFuZ2xlQmFyXCI6IFwi4qeQzLhcIixcbiAgXCJOb3RSaWdodFRyaWFuZ2xlRXF1YWxcIjogXCLii61cIixcbiAgXCJOb3RTcXVhcmVTdWJzZXRcIjogXCLiio/MuFwiLFxuICBcIk5vdFNxdWFyZVN1YnNldEVxdWFsXCI6IFwi4ouiXCIsXG4gIFwiTm90U3F1YXJlU3VwZXJzZXRcIjogXCLiipDMuFwiLFxuICBcIk5vdFNxdWFyZVN1cGVyc2V0RXF1YWxcIjogXCLii6NcIixcbiAgXCJOb3RTdWJzZXRcIjogXCLiioLig5JcIixcbiAgXCJOb3RTdWJzZXRFcXVhbFwiOiBcIuKKiFwiLFxuICBcIk5vdFN1Y2NlZWRzXCI6IFwi4oqBXCIsXG4gIFwiTm90U3VjY2VlZHNFcXVhbFwiOiBcIuKqsMy4XCIsXG4gIFwiTm90U3VjY2VlZHNTbGFudEVxdWFsXCI6IFwi4ouhXCIsXG4gIFwiTm90U3VjY2VlZHNUaWxkZVwiOiBcIuKJv8y4XCIsXG4gIFwiTm90U3VwZXJzZXRcIjogXCLiioPig5JcIixcbiAgXCJOb3RTdXBlcnNldEVxdWFsXCI6IFwi4oqJXCIsXG4gIFwiTm90VGlsZGVcIjogXCLiiYFcIixcbiAgXCJOb3RUaWxkZUVxdWFsXCI6IFwi4omEXCIsXG4gIFwiTm90VGlsZGVGdWxsRXF1YWxcIjogXCLiiYdcIixcbiAgXCJOb3RUaWxkZVRpbGRlXCI6IFwi4omJXCIsXG4gIFwiTm90VmVydGljYWxCYXJcIjogXCLiiKRcIixcbiAgXCJOc2NyXCI6IFwi8J2SqVwiLFxuICBcIk50aWxkXCI6IFwiw5FcIixcbiAgXCJOdGlsZGVcIjogXCLDkVwiLFxuICBcIk51XCI6IFwizp1cIixcbiAgXCJPRWxpZ1wiOiBcIsWSXCIsXG4gIFwiT2FjdXRcIjogXCLDk1wiLFxuICBcIk9hY3V0ZVwiOiBcIsOTXCIsXG4gIFwiT2NpclwiOiBcIsOUXCIsXG4gIFwiT2NpcmNcIjogXCLDlFwiLFxuICBcIk9jeVwiOiBcItCeXCIsXG4gIFwiT2RibGFjXCI6IFwixZBcIixcbiAgXCJPZnJcIjogXCLwnZSSXCIsXG4gIFwiT2dyYXZcIjogXCLDklwiLFxuICBcIk9ncmF2ZVwiOiBcIsOSXCIsXG4gIFwiT21hY3JcIjogXCLFjFwiLFxuICBcIk9tZWdhXCI6IFwizqlcIixcbiAgXCJPbWljcm9uXCI6IFwizp9cIixcbiAgXCJPb3BmXCI6IFwi8J2VhlwiLFxuICBcIk9wZW5DdXJseURvdWJsZVF1b3RlXCI6IFwi4oCcXCIsXG4gIFwiT3BlbkN1cmx5UXVvdGVcIjogXCLigJhcIixcbiAgXCJPclwiOiBcIuKplFwiLFxuICBcIk9zY3JcIjogXCLwnZKqXCIsXG4gIFwiT3NsYXNcIjogXCLDmFwiLFxuICBcIk9zbGFzaFwiOiBcIsOYXCIsXG4gIFwiT3RpbGRcIjogXCLDlVwiLFxuICBcIk90aWxkZVwiOiBcIsOVXCIsXG4gIFwiT3RpbWVzXCI6IFwi4qi3XCIsXG4gIFwiT3VtXCI6IFwiw5ZcIixcbiAgXCJPdW1sXCI6IFwiw5ZcIixcbiAgXCJPdmVyQmFyXCI6IFwi4oC+XCIsXG4gIFwiT3ZlckJyYWNlXCI6IFwi4o+eXCIsXG4gIFwiT3ZlckJyYWNrZXRcIjogXCLijrRcIixcbiAgXCJPdmVyUGFyZW50aGVzaXNcIjogXCLij5xcIixcbiAgXCJQYXJ0aWFsRFwiOiBcIuKIglwiLFxuICBcIlBjeVwiOiBcItCfXCIsXG4gIFwiUGZyXCI6IFwi8J2Uk1wiLFxuICBcIlBoaVwiOiBcIs6mXCIsXG4gIFwiUGlcIjogXCLOoFwiLFxuICBcIlBsdXNNaW51c1wiOiBcIsKxXCIsXG4gIFwiUG9pbmNhcmVwbGFuZVwiOiBcIuKEjFwiLFxuICBcIlBvcGZcIjogXCLihJlcIixcbiAgXCJQclwiOiBcIuKqu1wiLFxuICBcIlByZWNlZGVzXCI6IFwi4om6XCIsXG4gIFwiUHJlY2VkZXNFcXVhbFwiOiBcIuKqr1wiLFxuICBcIlByZWNlZGVzU2xhbnRFcXVhbFwiOiBcIuKJvFwiLFxuICBcIlByZWNlZGVzVGlsZGVcIjogXCLiib5cIixcbiAgXCJQcmltZVwiOiBcIuKAs1wiLFxuICBcIlByb2R1Y3RcIjogXCLiiI9cIixcbiAgXCJQcm9wb3J0aW9uXCI6IFwi4oi3XCIsXG4gIFwiUHJvcG9ydGlvbmFsXCI6IFwi4oidXCIsXG4gIFwiUHNjclwiOiBcIvCdkqtcIixcbiAgXCJQc2lcIjogXCLOqFwiLFxuICBcIlFVT1wiOiBcIlxcXCJcIixcbiAgXCJRVU9UXCI6IFwiXFxcIlwiLFxuICBcIlFmclwiOiBcIvCdlJRcIixcbiAgXCJRb3BmXCI6IFwi4oSaXCIsXG4gIFwiUXNjclwiOiBcIvCdkqxcIixcbiAgXCJSQmFyclwiOiBcIuKkkFwiLFxuICBcIlJFXCI6IFwiwq5cIixcbiAgXCJSRUdcIjogXCLCrlwiLFxuICBcIlJhY3V0ZVwiOiBcIsWUXCIsXG4gIFwiUmFuZ1wiOiBcIuKfq1wiLFxuICBcIlJhcnJcIjogXCLihqBcIixcbiAgXCJSYXJydGxcIjogXCLipJZcIixcbiAgXCJSY2Fyb25cIjogXCLFmFwiLFxuICBcIlJjZWRpbFwiOiBcIsWWXCIsXG4gIFwiUmN5XCI6IFwi0KBcIixcbiAgXCJSZVwiOiBcIuKEnFwiLFxuICBcIlJldmVyc2VFbGVtZW50XCI6IFwi4oiLXCIsXG4gIFwiUmV2ZXJzZUVxdWlsaWJyaXVtXCI6IFwi4oeLXCIsXG4gIFwiUmV2ZXJzZVVwRXF1aWxpYnJpdW1cIjogXCLipa9cIixcbiAgXCJSZnJcIjogXCLihJxcIixcbiAgXCJSaG9cIjogXCLOoVwiLFxuICBcIlJpZ2h0QW5nbGVCcmFja2V0XCI6IFwi4p+pXCIsXG4gIFwiUmlnaHRBcnJvd1wiOiBcIuKGklwiLFxuICBcIlJpZ2h0QXJyb3dCYXJcIjogXCLih6VcIixcbiAgXCJSaWdodEFycm93TGVmdEFycm93XCI6IFwi4oeEXCIsXG4gIFwiUmlnaHRDZWlsaW5nXCI6IFwi4oyJXCIsXG4gIFwiUmlnaHREb3VibGVCcmFja2V0XCI6IFwi4p+nXCIsXG4gIFwiUmlnaHREb3duVGVlVmVjdG9yXCI6IFwi4qWdXCIsXG4gIFwiUmlnaHREb3duVmVjdG9yXCI6IFwi4oeCXCIsXG4gIFwiUmlnaHREb3duVmVjdG9yQmFyXCI6IFwi4qWVXCIsXG4gIFwiUmlnaHRGbG9vclwiOiBcIuKMi1wiLFxuICBcIlJpZ2h0VGVlXCI6IFwi4oqiXCIsXG4gIFwiUmlnaHRUZWVBcnJvd1wiOiBcIuKGplwiLFxuICBcIlJpZ2h0VGVlVmVjdG9yXCI6IFwi4qWbXCIsXG4gIFwiUmlnaHRUcmlhbmdsZVwiOiBcIuKKs1wiLFxuICBcIlJpZ2h0VHJpYW5nbGVCYXJcIjogXCLip5BcIixcbiAgXCJSaWdodFRyaWFuZ2xlRXF1YWxcIjogXCLiirVcIixcbiAgXCJSaWdodFVwRG93blZlY3RvclwiOiBcIuKlj1wiLFxuICBcIlJpZ2h0VXBUZWVWZWN0b3JcIjogXCLipZxcIixcbiAgXCJSaWdodFVwVmVjdG9yXCI6IFwi4oa+XCIsXG4gIFwiUmlnaHRVcFZlY3RvckJhclwiOiBcIuKllFwiLFxuICBcIlJpZ2h0VmVjdG9yXCI6IFwi4oeAXCIsXG4gIFwiUmlnaHRWZWN0b3JCYXJcIjogXCLipZNcIixcbiAgXCJSaWdodGFycm93XCI6IFwi4oeSXCIsXG4gIFwiUm9wZlwiOiBcIuKEnVwiLFxuICBcIlJvdW5kSW1wbGllc1wiOiBcIuKlsFwiLFxuICBcIlJyaWdodGFycm93XCI6IFwi4oebXCIsXG4gIFwiUnNjclwiOiBcIuKEm1wiLFxuICBcIlJzaFwiOiBcIuKGsVwiLFxuICBcIlJ1bGVEZWxheWVkXCI6IFwi4qe0XCIsXG4gIFwiU0hDSGN5XCI6IFwi0KlcIixcbiAgXCJTSGN5XCI6IFwi0KhcIixcbiAgXCJTT0ZUY3lcIjogXCLQrFwiLFxuICBcIlNhY3V0ZVwiOiBcIsWaXCIsXG4gIFwiU2NcIjogXCLiqrxcIixcbiAgXCJTY2Fyb25cIjogXCLFoFwiLFxuICBcIlNjZWRpbFwiOiBcIsWeXCIsXG4gIFwiU2NpcmNcIjogXCLFnFwiLFxuICBcIlNjeVwiOiBcItChXCIsXG4gIFwiU2ZyXCI6IFwi8J2UllwiLFxuICBcIlNob3J0RG93bkFycm93XCI6IFwi4oaTXCIsXG4gIFwiU2hvcnRMZWZ0QXJyb3dcIjogXCLihpBcIixcbiAgXCJTaG9ydFJpZ2h0QXJyb3dcIjogXCLihpJcIixcbiAgXCJTaG9ydFVwQXJyb3dcIjogXCLihpFcIixcbiAgXCJTaWdtYVwiOiBcIs6jXCIsXG4gIFwiU21hbGxDaXJjbGVcIjogXCLiiJhcIixcbiAgXCJTb3BmXCI6IFwi8J2VilwiLFxuICBcIlNxcnRcIjogXCLiiJpcIixcbiAgXCJTcXVhcmVcIjogXCLilqFcIixcbiAgXCJTcXVhcmVJbnRlcnNlY3Rpb25cIjogXCLiipNcIixcbiAgXCJTcXVhcmVTdWJzZXRcIjogXCLiio9cIixcbiAgXCJTcXVhcmVTdWJzZXRFcXVhbFwiOiBcIuKKkVwiLFxuICBcIlNxdWFyZVN1cGVyc2V0XCI6IFwi4oqQXCIsXG4gIFwiU3F1YXJlU3VwZXJzZXRFcXVhbFwiOiBcIuKKklwiLFxuICBcIlNxdWFyZVVuaW9uXCI6IFwi4oqUXCIsXG4gIFwiU3NjclwiOiBcIvCdkq5cIixcbiAgXCJTdGFyXCI6IFwi4ouGXCIsXG4gIFwiU3ViXCI6IFwi4ouQXCIsXG4gIFwiU3Vic2V0XCI6IFwi4ouQXCIsXG4gIFwiU3Vic2V0RXF1YWxcIjogXCLiioZcIixcbiAgXCJTdWNjZWVkc1wiOiBcIuKJu1wiLFxuICBcIlN1Y2NlZWRzRXF1YWxcIjogXCLiqrBcIixcbiAgXCJTdWNjZWVkc1NsYW50RXF1YWxcIjogXCLiib1cIixcbiAgXCJTdWNjZWVkc1RpbGRlXCI6IFwi4om/XCIsXG4gIFwiU3VjaFRoYXRcIjogXCLiiItcIixcbiAgXCJTdW1cIjogXCLiiJFcIixcbiAgXCJTdXBcIjogXCLii5FcIixcbiAgXCJTdXBlcnNldFwiOiBcIuKKg1wiLFxuICBcIlN1cGVyc2V0RXF1YWxcIjogXCLiiodcIixcbiAgXCJTdXBzZXRcIjogXCLii5FcIixcbiAgXCJUSE9SXCI6IFwiw55cIixcbiAgXCJUSE9STlwiOiBcIsOeXCIsXG4gIFwiVFJBREVcIjogXCLihKJcIixcbiAgXCJUU0hjeVwiOiBcItCLXCIsXG4gIFwiVFNjeVwiOiBcItCmXCIsXG4gIFwiVGFiXCI6IFwiXFx0XCIsXG4gIFwiVGF1XCI6IFwizqRcIixcbiAgXCJUY2Fyb25cIjogXCLFpFwiLFxuICBcIlRjZWRpbFwiOiBcIsWiXCIsXG4gIFwiVGN5XCI6IFwi0KJcIixcbiAgXCJUZnJcIjogXCLwnZSXXCIsXG4gIFwiVGhlcmVmb3JlXCI6IFwi4oi0XCIsXG4gIFwiVGhldGFcIjogXCLOmFwiLFxuICBcIlRoaWNrU3BhY2VcIjogXCLigZ/igIpcIixcbiAgXCJUaGluU3BhY2VcIjogXCLigIlcIixcbiAgXCJUaWxkZVwiOiBcIuKIvFwiLFxuICBcIlRpbGRlRXF1YWxcIjogXCLiiYNcIixcbiAgXCJUaWxkZUZ1bGxFcXVhbFwiOiBcIuKJhVwiLFxuICBcIlRpbGRlVGlsZGVcIjogXCLiiYhcIixcbiAgXCJUb3BmXCI6IFwi8J2Vi1wiLFxuICBcIlRyaXBsZURvdFwiOiBcIuKDm1wiLFxuICBcIlRzY3JcIjogXCLwnZKvXCIsXG4gIFwiVHN0cm9rXCI6IFwixaZcIixcbiAgXCJVYWN1dFwiOiBcIsOaXCIsXG4gIFwiVWFjdXRlXCI6IFwiw5pcIixcbiAgXCJVYXJyXCI6IFwi4oafXCIsXG4gIFwiVWFycm9jaXJcIjogXCLipYlcIixcbiAgXCJVYnJjeVwiOiBcItCOXCIsXG4gIFwiVWJyZXZlXCI6IFwixaxcIixcbiAgXCJVY2lyXCI6IFwiw5tcIixcbiAgXCJVY2lyY1wiOiBcIsObXCIsXG4gIFwiVWN5XCI6IFwi0KNcIixcbiAgXCJVZGJsYWNcIjogXCLFsFwiLFxuICBcIlVmclwiOiBcIvCdlJhcIixcbiAgXCJVZ3JhdlwiOiBcIsOZXCIsXG4gIFwiVWdyYXZlXCI6IFwiw5lcIixcbiAgXCJVbWFjclwiOiBcIsWqXCIsXG4gIFwiVW5kZXJCYXJcIjogXCJfXCIsXG4gIFwiVW5kZXJCcmFjZVwiOiBcIuKPn1wiLFxuICBcIlVuZGVyQnJhY2tldFwiOiBcIuKOtVwiLFxuICBcIlVuZGVyUGFyZW50aGVzaXNcIjogXCLij51cIixcbiAgXCJVbmlvblwiOiBcIuKLg1wiLFxuICBcIlVuaW9uUGx1c1wiOiBcIuKKjlwiLFxuICBcIlVvZ29uXCI6IFwixbJcIixcbiAgXCJVb3BmXCI6IFwi8J2VjFwiLFxuICBcIlVwQXJyb3dcIjogXCLihpFcIixcbiAgXCJVcEFycm93QmFyXCI6IFwi4qSSXCIsXG4gIFwiVXBBcnJvd0Rvd25BcnJvd1wiOiBcIuKHhVwiLFxuICBcIlVwRG93bkFycm93XCI6IFwi4oaVXCIsXG4gIFwiVXBFcXVpbGlicml1bVwiOiBcIuKlrlwiLFxuICBcIlVwVGVlXCI6IFwi4oqlXCIsXG4gIFwiVXBUZWVBcnJvd1wiOiBcIuKGpVwiLFxuICBcIlVwYXJyb3dcIjogXCLih5FcIixcbiAgXCJVcGRvd25hcnJvd1wiOiBcIuKHlVwiLFxuICBcIlVwcGVyTGVmdEFycm93XCI6IFwi4oaWXCIsXG4gIFwiVXBwZXJSaWdodEFycm93XCI6IFwi4oaXXCIsXG4gIFwiVXBzaVwiOiBcIs+SXCIsXG4gIFwiVXBzaWxvblwiOiBcIs6lXCIsXG4gIFwiVXJpbmdcIjogXCLFrlwiLFxuICBcIlVzY3JcIjogXCLwnZKwXCIsXG4gIFwiVXRpbGRlXCI6IFwixahcIixcbiAgXCJVdW1cIjogXCLDnFwiLFxuICBcIlV1bWxcIjogXCLDnFwiLFxuICBcIlZEYXNoXCI6IFwi4oqrXCIsXG4gIFwiVmJhclwiOiBcIuKrq1wiLFxuICBcIlZjeVwiOiBcItCSXCIsXG4gIFwiVmRhc2hcIjogXCLiiqlcIixcbiAgXCJWZGFzaGxcIjogXCLiq6ZcIixcbiAgXCJWZWVcIjogXCLii4FcIixcbiAgXCJWZXJiYXJcIjogXCLigJZcIixcbiAgXCJWZXJ0XCI6IFwi4oCWXCIsXG4gIFwiVmVydGljYWxCYXJcIjogXCLiiKNcIixcbiAgXCJWZXJ0aWNhbExpbmVcIjogXCJ8XCIsXG4gIFwiVmVydGljYWxTZXBhcmF0b3JcIjogXCLinZhcIixcbiAgXCJWZXJ0aWNhbFRpbGRlXCI6IFwi4omAXCIsXG4gIFwiVmVyeVRoaW5TcGFjZVwiOiBcIuKAilwiLFxuICBcIlZmclwiOiBcIvCdlJlcIixcbiAgXCJWb3BmXCI6IFwi8J2VjVwiLFxuICBcIlZzY3JcIjogXCLwnZKxXCIsXG4gIFwiVnZkYXNoXCI6IFwi4oqqXCIsXG4gIFwiV2NpcmNcIjogXCLFtFwiLFxuICBcIldlZGdlXCI6IFwi4ouAXCIsXG4gIFwiV2ZyXCI6IFwi8J2UmlwiLFxuICBcIldvcGZcIjogXCLwnZWOXCIsXG4gIFwiV3NjclwiOiBcIvCdkrJcIixcbiAgXCJYZnJcIjogXCLwnZSbXCIsXG4gIFwiWGlcIjogXCLOnlwiLFxuICBcIlhvcGZcIjogXCLwnZWPXCIsXG4gIFwiWHNjclwiOiBcIvCdkrNcIixcbiAgXCJZQWN5XCI6IFwi0K9cIixcbiAgXCJZSWN5XCI6IFwi0IdcIixcbiAgXCJZVWN5XCI6IFwi0K5cIixcbiAgXCJZYWN1dFwiOiBcIsOdXCIsXG4gIFwiWWFjdXRlXCI6IFwiw51cIixcbiAgXCJZY2lyY1wiOiBcIsW2XCIsXG4gIFwiWWN5XCI6IFwi0KtcIixcbiAgXCJZZnJcIjogXCLwnZScXCIsXG4gIFwiWW9wZlwiOiBcIvCdlZBcIixcbiAgXCJZc2NyXCI6IFwi8J2StFwiLFxuICBcIll1bWxcIjogXCLFuFwiLFxuICBcIlpIY3lcIjogXCLQllwiLFxuICBcIlphY3V0ZVwiOiBcIsW5XCIsXG4gIFwiWmNhcm9uXCI6IFwixb1cIixcbiAgXCJaY3lcIjogXCLQl1wiLFxuICBcIlpkb3RcIjogXCLFu1wiLFxuICBcIlplcm9XaWR0aFNwYWNlXCI6IFwi4oCLXCIsXG4gIFwiWmV0YVwiOiBcIs6WXCIsXG4gIFwiWmZyXCI6IFwi4oSoXCIsXG4gIFwiWm9wZlwiOiBcIuKEpFwiLFxuICBcIlpzY3JcIjogXCLwnZK1XCIsXG4gIFwiYWFjdXRcIjogXCLDoVwiLFxuICBcImFhY3V0ZVwiOiBcIsOhXCIsXG4gIFwiYWJyZXZlXCI6IFwixINcIixcbiAgXCJhY1wiOiBcIuKIvlwiLFxuICBcImFjRVwiOiBcIuKIvsyzXCIsXG4gIFwiYWNkXCI6IFwi4oi/XCIsXG4gIFwiYWNpclwiOiBcIsOiXCIsXG4gIFwiYWNpcmNcIjogXCLDolwiLFxuICBcImFjdXRcIjogXCLCtFwiLFxuICBcImFjdXRlXCI6IFwiwrRcIixcbiAgXCJhY3lcIjogXCLQsFwiLFxuICBcImFlbGlcIjogXCLDplwiLFxuICBcImFlbGlnXCI6IFwiw6ZcIixcbiAgXCJhZlwiOiBcIuKBoVwiLFxuICBcImFmclwiOiBcIvCdlJ5cIixcbiAgXCJhZ3JhdlwiOiBcIsOgXCIsXG4gIFwiYWdyYXZlXCI6IFwiw6BcIixcbiAgXCJhbGVmc3ltXCI6IFwi4oS1XCIsXG4gIFwiYWxlcGhcIjogXCLihLVcIixcbiAgXCJhbHBoYVwiOiBcIs6xXCIsXG4gIFwiYW1hY3JcIjogXCLEgVwiLFxuICBcImFtYWxnXCI6IFwi4qi/XCIsXG4gIFwiYW1cIjogXCImXCIsXG4gIFwiYW1wXCI6IFwiJlwiLFxuICBcImFuZFwiOiBcIuKIp1wiLFxuICBcImFuZGFuZFwiOiBcIuKplVwiLFxuICBcImFuZGRcIjogXCLiqZxcIixcbiAgXCJhbmRzbG9wZVwiOiBcIuKpmFwiLFxuICBcImFuZHZcIjogXCLiqZpcIixcbiAgXCJhbmdcIjogXCLiiKBcIixcbiAgXCJhbmdlXCI6IFwi4qakXCIsXG4gIFwiYW5nbGVcIjogXCLiiKBcIixcbiAgXCJhbmdtc2RcIjogXCLiiKFcIixcbiAgXCJhbmdtc2RhYVwiOiBcIuKmqFwiLFxuICBcImFuZ21zZGFiXCI6IFwi4qapXCIsXG4gIFwiYW5nbXNkYWNcIjogXCLipqpcIixcbiAgXCJhbmdtc2RhZFwiOiBcIuKmq1wiLFxuICBcImFuZ21zZGFlXCI6IFwi4qasXCIsXG4gIFwiYW5nbXNkYWZcIjogXCLipq1cIixcbiAgXCJhbmdtc2RhZ1wiOiBcIuKmrlwiLFxuICBcImFuZ21zZGFoXCI6IFwi4qavXCIsXG4gIFwiYW5ncnRcIjogXCLiiJ9cIixcbiAgXCJhbmdydHZiXCI6IFwi4oq+XCIsXG4gIFwiYW5ncnR2YmRcIjogXCLipp1cIixcbiAgXCJhbmdzcGhcIjogXCLiiKJcIixcbiAgXCJhbmdzdFwiOiBcIsOFXCIsXG4gIFwiYW5nemFyclwiOiBcIuKNvFwiLFxuICBcImFvZ29uXCI6IFwixIVcIixcbiAgXCJhb3BmXCI6IFwi8J2VklwiLFxuICBcImFwXCI6IFwi4omIXCIsXG4gIFwiYXBFXCI6IFwi4qmwXCIsXG4gIFwiYXBhY2lyXCI6IFwi4qmvXCIsXG4gIFwiYXBlXCI6IFwi4omKXCIsXG4gIFwiYXBpZFwiOiBcIuKJi1wiLFxuICBcImFwb3NcIjogXCInXCIsXG4gIFwiYXBwcm94XCI6IFwi4omIXCIsXG4gIFwiYXBwcm94ZXFcIjogXCLiiYpcIixcbiAgXCJhcmluXCI6IFwiw6VcIixcbiAgXCJhcmluZ1wiOiBcIsOlXCIsXG4gIFwiYXNjclwiOiBcIvCdkrZcIixcbiAgXCJhc3RcIjogXCIqXCIsXG4gIFwiYXN5bXBcIjogXCLiiYhcIixcbiAgXCJhc3ltcGVxXCI6IFwi4omNXCIsXG4gIFwiYXRpbGRcIjogXCLDo1wiLFxuICBcImF0aWxkZVwiOiBcIsOjXCIsXG4gIFwiYXVtXCI6IFwiw6RcIixcbiAgXCJhdW1sXCI6IFwiw6RcIixcbiAgXCJhd2NvbmludFwiOiBcIuKIs1wiLFxuICBcImF3aW50XCI6IFwi4qiRXCIsXG4gIFwiYk5vdFwiOiBcIuKrrVwiLFxuICBcImJhY2tjb25nXCI6IFwi4omMXCIsXG4gIFwiYmFja2Vwc2lsb25cIjogXCLPtlwiLFxuICBcImJhY2twcmltZVwiOiBcIuKAtVwiLFxuICBcImJhY2tzaW1cIjogXCLiiL1cIixcbiAgXCJiYWNrc2ltZXFcIjogXCLii41cIixcbiAgXCJiYXJ2ZWVcIjogXCLiir1cIixcbiAgXCJiYXJ3ZWRcIjogXCLijIVcIixcbiAgXCJiYXJ3ZWRnZVwiOiBcIuKMhVwiLFxuICBcImJicmtcIjogXCLijrVcIixcbiAgXCJiYnJrdGJya1wiOiBcIuKOtlwiLFxuICBcImJjb25nXCI6IFwi4omMXCIsXG4gIFwiYmN5XCI6IFwi0LFcIixcbiAgXCJiZHF1b1wiOiBcIuKAnlwiLFxuICBcImJlY2F1c1wiOiBcIuKItVwiLFxuICBcImJlY2F1c2VcIjogXCLiiLVcIixcbiAgXCJiZW1wdHl2XCI6IFwi4qawXCIsXG4gIFwiYmVwc2lcIjogXCLPtlwiLFxuICBcImJlcm5vdVwiOiBcIuKErFwiLFxuICBcImJldGFcIjogXCLOslwiLFxuICBcImJldGhcIjogXCLihLZcIixcbiAgXCJiZXR3ZWVuXCI6IFwi4omsXCIsXG4gIFwiYmZyXCI6IFwi8J2Un1wiLFxuICBcImJpZ2NhcFwiOiBcIuKLglwiLFxuICBcImJpZ2NpcmNcIjogXCLil69cIixcbiAgXCJiaWdjdXBcIjogXCLii4NcIixcbiAgXCJiaWdvZG90XCI6IFwi4qiAXCIsXG4gIFwiYmlnb3BsdXNcIjogXCLiqIFcIixcbiAgXCJiaWdvdGltZXNcIjogXCLiqIJcIixcbiAgXCJiaWdzcWN1cFwiOiBcIuKohlwiLFxuICBcImJpZ3N0YXJcIjogXCLimIVcIixcbiAgXCJiaWd0cmlhbmdsZWRvd25cIjogXCLilr1cIixcbiAgXCJiaWd0cmlhbmdsZXVwXCI6IFwi4pazXCIsXG4gIFwiYmlndXBsdXNcIjogXCLiqIRcIixcbiAgXCJiaWd2ZWVcIjogXCLii4FcIixcbiAgXCJiaWd3ZWRnZVwiOiBcIuKLgFwiLFxuICBcImJrYXJvd1wiOiBcIuKkjVwiLFxuICBcImJsYWNrbG96ZW5nZVwiOiBcIuKnq1wiLFxuICBcImJsYWNrc3F1YXJlXCI6IFwi4paqXCIsXG4gIFwiYmxhY2t0cmlhbmdsZVwiOiBcIuKWtFwiLFxuICBcImJsYWNrdHJpYW5nbGVkb3duXCI6IFwi4pa+XCIsXG4gIFwiYmxhY2t0cmlhbmdsZWxlZnRcIjogXCLil4JcIixcbiAgXCJibGFja3RyaWFuZ2xlcmlnaHRcIjogXCLilrhcIixcbiAgXCJibGFua1wiOiBcIuKQo1wiLFxuICBcImJsazEyXCI6IFwi4paSXCIsXG4gIFwiYmxrMTRcIjogXCLilpFcIixcbiAgXCJibGszNFwiOiBcIuKWk1wiLFxuICBcImJsb2NrXCI6IFwi4paIXCIsXG4gIFwiYm5lXCI6IFwiPeKDpVwiLFxuICBcImJuZXF1aXZcIjogXCLiiaHig6VcIixcbiAgXCJibm90XCI6IFwi4oyQXCIsXG4gIFwiYm9wZlwiOiBcIvCdlZNcIixcbiAgXCJib3RcIjogXCLiiqVcIixcbiAgXCJib3R0b21cIjogXCLiiqVcIixcbiAgXCJib3d0aWVcIjogXCLii4hcIixcbiAgXCJib3hETFwiOiBcIuKVl1wiLFxuICBcImJveERSXCI6IFwi4pWUXCIsXG4gIFwiYm94RGxcIjogXCLilZZcIixcbiAgXCJib3hEclwiOiBcIuKVk1wiLFxuICBcImJveEhcIjogXCLilZBcIixcbiAgXCJib3hIRFwiOiBcIuKVplwiLFxuICBcImJveEhVXCI6IFwi4pWpXCIsXG4gIFwiYm94SGRcIjogXCLilaRcIixcbiAgXCJib3hIdVwiOiBcIuKVp1wiLFxuICBcImJveFVMXCI6IFwi4pWdXCIsXG4gIFwiYm94VVJcIjogXCLilZpcIixcbiAgXCJib3hVbFwiOiBcIuKVnFwiLFxuICBcImJveFVyXCI6IFwi4pWZXCIsXG4gIFwiYm94VlwiOiBcIuKVkVwiLFxuICBcImJveFZIXCI6IFwi4pWsXCIsXG4gIFwiYm94VkxcIjogXCLilaNcIixcbiAgXCJib3hWUlwiOiBcIuKVoFwiLFxuICBcImJveFZoXCI6IFwi4pWrXCIsXG4gIFwiYm94VmxcIjogXCLilaJcIixcbiAgXCJib3hWclwiOiBcIuKVn1wiLFxuICBcImJveGJveFwiOiBcIuKniVwiLFxuICBcImJveGRMXCI6IFwi4pWVXCIsXG4gIFwiYm94ZFJcIjogXCLilZJcIixcbiAgXCJib3hkbFwiOiBcIuKUkFwiLFxuICBcImJveGRyXCI6IFwi4pSMXCIsXG4gIFwiYm94aFwiOiBcIuKUgFwiLFxuICBcImJveGhEXCI6IFwi4pWlXCIsXG4gIFwiYm94aFVcIjogXCLilahcIixcbiAgXCJib3hoZFwiOiBcIuKUrFwiLFxuICBcImJveGh1XCI6IFwi4pS0XCIsXG4gIFwiYm94bWludXNcIjogXCLiip9cIixcbiAgXCJib3hwbHVzXCI6IFwi4oqeXCIsXG4gIFwiYm94dGltZXNcIjogXCLiiqBcIixcbiAgXCJib3h1TFwiOiBcIuKVm1wiLFxuICBcImJveHVSXCI6IFwi4pWYXCIsXG4gIFwiYm94dWxcIjogXCLilJhcIixcbiAgXCJib3h1clwiOiBcIuKUlFwiLFxuICBcImJveHZcIjogXCLilIJcIixcbiAgXCJib3h2SFwiOiBcIuKVqlwiLFxuICBcImJveHZMXCI6IFwi4pWhXCIsXG4gIFwiYm94dlJcIjogXCLilZ5cIixcbiAgXCJib3h2aFwiOiBcIuKUvFwiLFxuICBcImJveHZsXCI6IFwi4pSkXCIsXG4gIFwiYm94dnJcIjogXCLilJxcIixcbiAgXCJicHJpbWVcIjogXCLigLVcIixcbiAgXCJicmV2ZVwiOiBcIsuYXCIsXG4gIFwiYnJ2YmFcIjogXCLCplwiLFxuICBcImJydmJhclwiOiBcIsKmXCIsXG4gIFwiYnNjclwiOiBcIvCdkrdcIixcbiAgXCJic2VtaVwiOiBcIuKBj1wiLFxuICBcImJzaW1cIjogXCLiiL1cIixcbiAgXCJic2ltZVwiOiBcIuKLjVwiLFxuICBcImJzb2xcIjogXCJcXFxcXCIsXG4gIFwiYnNvbGJcIjogXCLip4VcIixcbiAgXCJic29saHN1YlwiOiBcIuKfiFwiLFxuICBcImJ1bGxcIjogXCLigKJcIixcbiAgXCJidWxsZXRcIjogXCLigKJcIixcbiAgXCJidW1wXCI6IFwi4omOXCIsXG4gIFwiYnVtcEVcIjogXCLiqq5cIixcbiAgXCJidW1wZVwiOiBcIuKJj1wiLFxuICBcImJ1bXBlcVwiOiBcIuKJj1wiLFxuICBcImNhY3V0ZVwiOiBcIsSHXCIsXG4gIFwiY2FwXCI6IFwi4oipXCIsXG4gIFwiY2FwYW5kXCI6IFwi4qmEXCIsXG4gIFwiY2FwYnJjdXBcIjogXCLiqYlcIixcbiAgXCJjYXBjYXBcIjogXCLiqYtcIixcbiAgXCJjYXBjdXBcIjogXCLiqYdcIixcbiAgXCJjYXBkb3RcIjogXCLiqYBcIixcbiAgXCJjYXBzXCI6IFwi4oip77iAXCIsXG4gIFwiY2FyZXRcIjogXCLigYFcIixcbiAgXCJjYXJvblwiOiBcIsuHXCIsXG4gIFwiY2NhcHNcIjogXCLiqY1cIixcbiAgXCJjY2Fyb25cIjogXCLEjVwiLFxuICBcImNjZWRpXCI6IFwiw6dcIixcbiAgXCJjY2VkaWxcIjogXCLDp1wiLFxuICBcImNjaXJjXCI6IFwixIlcIixcbiAgXCJjY3Vwc1wiOiBcIuKpjFwiLFxuICBcImNjdXBzc21cIjogXCLiqZBcIixcbiAgXCJjZG90XCI6IFwixItcIixcbiAgXCJjZWRpXCI6IFwiwrhcIixcbiAgXCJjZWRpbFwiOiBcIsK4XCIsXG4gIFwiY2VtcHR5dlwiOiBcIuKmslwiLFxuICBcImNlblwiOiBcIsKiXCIsXG4gIFwiY2VudFwiOiBcIsKiXCIsXG4gIFwiY2VudGVyZG90XCI6IFwiwrdcIixcbiAgXCJjZnJcIjogXCLwnZSgXCIsXG4gIFwiY2hjeVwiOiBcItGHXCIsXG4gIFwiY2hlY2tcIjogXCLinJNcIixcbiAgXCJjaGVja21hcmtcIjogXCLinJNcIixcbiAgXCJjaGlcIjogXCLPh1wiLFxuICBcImNpclwiOiBcIuKXi1wiLFxuICBcImNpckVcIjogXCLip4NcIixcbiAgXCJjaXJjXCI6IFwiy4ZcIixcbiAgXCJjaXJjZXFcIjogXCLiiZdcIixcbiAgXCJjaXJjbGVhcnJvd2xlZnRcIjogXCLihrpcIixcbiAgXCJjaXJjbGVhcnJvd3JpZ2h0XCI6IFwi4oa7XCIsXG4gIFwiY2lyY2xlZFJcIjogXCLCrlwiLFxuICBcImNpcmNsZWRTXCI6IFwi4pOIXCIsXG4gIFwiY2lyY2xlZGFzdFwiOiBcIuKKm1wiLFxuICBcImNpcmNsZWRjaXJjXCI6IFwi4oqaXCIsXG4gIFwiY2lyY2xlZGRhc2hcIjogXCLiip1cIixcbiAgXCJjaXJlXCI6IFwi4omXXCIsXG4gIFwiY2lyZm5pbnRcIjogXCLiqJBcIixcbiAgXCJjaXJtaWRcIjogXCLiq69cIixcbiAgXCJjaXJzY2lyXCI6IFwi4qeCXCIsXG4gIFwiY2x1YnNcIjogXCLimaNcIixcbiAgXCJjbHVic3VpdFwiOiBcIuKZo1wiLFxuICBcImNvbG9uXCI6IFwiOlwiLFxuICBcImNvbG9uZVwiOiBcIuKJlFwiLFxuICBcImNvbG9uZXFcIjogXCLiiZRcIixcbiAgXCJjb21tYVwiOiBcIixcIixcbiAgXCJjb21tYXRcIjogXCJAXCIsXG4gIFwiY29tcFwiOiBcIuKIgVwiLFxuICBcImNvbXBmblwiOiBcIuKImFwiLFxuICBcImNvbXBsZW1lbnRcIjogXCLiiIFcIixcbiAgXCJjb21wbGV4ZXNcIjogXCLihIJcIixcbiAgXCJjb25nXCI6IFwi4omFXCIsXG4gIFwiY29uZ2RvdFwiOiBcIuKprVwiLFxuICBcImNvbmludFwiOiBcIuKIrlwiLFxuICBcImNvcGZcIjogXCLwnZWUXCIsXG4gIFwiY29wcm9kXCI6IFwi4oiQXCIsXG4gIFwiY29wXCI6IFwiwqlcIixcbiAgXCJjb3B5XCI6IFwiwqlcIixcbiAgXCJjb3B5c3JcIjogXCLihJdcIixcbiAgXCJjcmFyclwiOiBcIuKGtVwiLFxuICBcImNyb3NzXCI6IFwi4pyXXCIsXG4gIFwiY3NjclwiOiBcIvCdkrhcIixcbiAgXCJjc3ViXCI6IFwi4quPXCIsXG4gIFwiY3N1YmVcIjogXCLiq5FcIixcbiAgXCJjc3VwXCI6IFwi4quQXCIsXG4gIFwiY3N1cGVcIjogXCLiq5JcIixcbiAgXCJjdGRvdFwiOiBcIuKLr1wiLFxuICBcImN1ZGFycmxcIjogXCLipLhcIixcbiAgXCJjdWRhcnJyXCI6IFwi4qS1XCIsXG4gIFwiY3VlcHJcIjogXCLii55cIixcbiAgXCJjdWVzY1wiOiBcIuKLn1wiLFxuICBcImN1bGFyclwiOiBcIuKGtlwiLFxuICBcImN1bGFycnBcIjogXCLipL1cIixcbiAgXCJjdXBcIjogXCLiiKpcIixcbiAgXCJjdXBicmNhcFwiOiBcIuKpiFwiLFxuICBcImN1cGNhcFwiOiBcIuKphlwiLFxuICBcImN1cGN1cFwiOiBcIuKpilwiLFxuICBcImN1cGRvdFwiOiBcIuKKjVwiLFxuICBcImN1cG9yXCI6IFwi4qmFXCIsXG4gIFwiY3Vwc1wiOiBcIuKIqu+4gFwiLFxuICBcImN1cmFyclwiOiBcIuKGt1wiLFxuICBcImN1cmFycm1cIjogXCLipLxcIixcbiAgXCJjdXJseWVxcHJlY1wiOiBcIuKLnlwiLFxuICBcImN1cmx5ZXFzdWNjXCI6IFwi4oufXCIsXG4gIFwiY3VybHl2ZWVcIjogXCLii45cIixcbiAgXCJjdXJseXdlZGdlXCI6IFwi4ouPXCIsXG4gIFwiY3VycmVcIjogXCLCpFwiLFxuICBcImN1cnJlblwiOiBcIsKkXCIsXG4gIFwiY3VydmVhcnJvd2xlZnRcIjogXCLihrZcIixcbiAgXCJjdXJ2ZWFycm93cmlnaHRcIjogXCLihrdcIixcbiAgXCJjdXZlZVwiOiBcIuKLjlwiLFxuICBcImN1d2VkXCI6IFwi4ouPXCIsXG4gIFwiY3djb25pbnRcIjogXCLiiLJcIixcbiAgXCJjd2ludFwiOiBcIuKIsVwiLFxuICBcImN5bGN0eVwiOiBcIuKMrVwiLFxuICBcImRBcnJcIjogXCLih5NcIixcbiAgXCJkSGFyXCI6IFwi4qWlXCIsXG4gIFwiZGFnZ2VyXCI6IFwi4oCgXCIsXG4gIFwiZGFsZXRoXCI6IFwi4oS4XCIsXG4gIFwiZGFyclwiOiBcIuKGk1wiLFxuICBcImRhc2hcIjogXCLigJBcIixcbiAgXCJkYXNodlwiOiBcIuKKo1wiLFxuICBcImRia2Fyb3dcIjogXCLipI9cIixcbiAgXCJkYmxhY1wiOiBcIsudXCIsXG4gIFwiZGNhcm9uXCI6IFwixI9cIixcbiAgXCJkY3lcIjogXCLQtFwiLFxuICBcImRkXCI6IFwi4oWGXCIsXG4gIFwiZGRhZ2dlclwiOiBcIuKAoVwiLFxuICBcImRkYXJyXCI6IFwi4oeKXCIsXG4gIFwiZGRvdHNlcVwiOiBcIuKpt1wiLFxuICBcImRlXCI6IFwiwrBcIixcbiAgXCJkZWdcIjogXCLCsFwiLFxuICBcImRlbHRhXCI6IFwizrRcIixcbiAgXCJkZW1wdHl2XCI6IFwi4qaxXCIsXG4gIFwiZGZpc2h0XCI6IFwi4qW/XCIsXG4gIFwiZGZyXCI6IFwi8J2UoVwiLFxuICBcImRoYXJsXCI6IFwi4oeDXCIsXG4gIFwiZGhhcnJcIjogXCLih4JcIixcbiAgXCJkaWFtXCI6IFwi4ouEXCIsXG4gIFwiZGlhbW9uZFwiOiBcIuKLhFwiLFxuICBcImRpYW1vbmRzdWl0XCI6IFwi4pmmXCIsXG4gIFwiZGlhbXNcIjogXCLimaZcIixcbiAgXCJkaWVcIjogXCLCqFwiLFxuICBcImRpZ2FtbWFcIjogXCLPnVwiLFxuICBcImRpc2luXCI6IFwi4ouyXCIsXG4gIFwiZGl2XCI6IFwiw7dcIixcbiAgXCJkaXZpZFwiOiBcIsO3XCIsXG4gIFwiZGl2aWRlXCI6IFwiw7dcIixcbiAgXCJkaXZpZGVvbnRpbWVzXCI6IFwi4ouHXCIsXG4gIFwiZGl2b254XCI6IFwi4ouHXCIsXG4gIFwiZGpjeVwiOiBcItGSXCIsXG4gIFwiZGxjb3JuXCI6IFwi4oyeXCIsXG4gIFwiZGxjcm9wXCI6IFwi4oyNXCIsXG4gIFwiZG9sbGFyXCI6IFwiJFwiLFxuICBcImRvcGZcIjogXCLwnZWVXCIsXG4gIFwiZG90XCI6IFwiy5lcIixcbiAgXCJkb3RlcVwiOiBcIuKJkFwiLFxuICBcImRvdGVxZG90XCI6IFwi4omRXCIsXG4gIFwiZG90bWludXNcIjogXCLiiLhcIixcbiAgXCJkb3RwbHVzXCI6IFwi4oiUXCIsXG4gIFwiZG90c3F1YXJlXCI6IFwi4oqhXCIsXG4gIFwiZG91YmxlYmFyd2VkZ2VcIjogXCLijIZcIixcbiAgXCJkb3duYXJyb3dcIjogXCLihpNcIixcbiAgXCJkb3duZG93bmFycm93c1wiOiBcIuKHilwiLFxuICBcImRvd25oYXJwb29ubGVmdFwiOiBcIuKHg1wiLFxuICBcImRvd25oYXJwb29ucmlnaHRcIjogXCLih4JcIixcbiAgXCJkcmJrYXJvd1wiOiBcIuKkkFwiLFxuICBcImRyY29yblwiOiBcIuKMn1wiLFxuICBcImRyY3JvcFwiOiBcIuKMjFwiLFxuICBcImRzY3JcIjogXCLwnZK5XCIsXG4gIFwiZHNjeVwiOiBcItGVXCIsXG4gIFwiZHNvbFwiOiBcIuKntlwiLFxuICBcImRzdHJva1wiOiBcIsSRXCIsXG4gIFwiZHRkb3RcIjogXCLii7FcIixcbiAgXCJkdHJpXCI6IFwi4pa/XCIsXG4gIFwiZHRyaWZcIjogXCLilr5cIixcbiAgXCJkdWFyclwiOiBcIuKHtVwiLFxuICBcImR1aGFyXCI6IFwi4qWvXCIsXG4gIFwiZHdhbmdsZVwiOiBcIuKmplwiLFxuICBcImR6Y3lcIjogXCLRn1wiLFxuICBcImR6aWdyYXJyXCI6IFwi4p+/XCIsXG4gIFwiZUREb3RcIjogXCLiqbdcIixcbiAgXCJlRG90XCI6IFwi4omRXCIsXG4gIFwiZWFjdXRcIjogXCLDqVwiLFxuICBcImVhY3V0ZVwiOiBcIsOpXCIsXG4gIFwiZWFzdGVyXCI6IFwi4qmuXCIsXG4gIFwiZWNhcm9uXCI6IFwixJtcIixcbiAgXCJlY2lyXCI6IFwiw6pcIixcbiAgXCJlY2lyY1wiOiBcIsOqXCIsXG4gIFwiZWNvbG9uXCI6IFwi4omVXCIsXG4gIFwiZWN5XCI6IFwi0Y1cIixcbiAgXCJlZG90XCI6IFwixJdcIixcbiAgXCJlZVwiOiBcIuKFh1wiLFxuICBcImVmRG90XCI6IFwi4omSXCIsXG4gIFwiZWZyXCI6IFwi8J2UolwiLFxuICBcImVnXCI6IFwi4qqaXCIsXG4gIFwiZWdyYXZcIjogXCLDqFwiLFxuICBcImVncmF2ZVwiOiBcIsOoXCIsXG4gIFwiZWdzXCI6IFwi4qqWXCIsXG4gIFwiZWdzZG90XCI6IFwi4qqYXCIsXG4gIFwiZWxcIjogXCLiqplcIixcbiAgXCJlbGludGVyc1wiOiBcIuKPp1wiLFxuICBcImVsbFwiOiBcIuKEk1wiLFxuICBcImVsc1wiOiBcIuKqlVwiLFxuICBcImVsc2RvdFwiOiBcIuKql1wiLFxuICBcImVtYWNyXCI6IFwixJNcIixcbiAgXCJlbXB0eVwiOiBcIuKIhVwiLFxuICBcImVtcHR5c2V0XCI6IFwi4oiFXCIsXG4gIFwiZW1wdHl2XCI6IFwi4oiFXCIsXG4gIFwiZW1zcDEzXCI6IFwi4oCEXCIsXG4gIFwiZW1zcDE0XCI6IFwi4oCFXCIsXG4gIFwiZW1zcFwiOiBcIuKAg1wiLFxuICBcImVuZ1wiOiBcIsWLXCIsXG4gIFwiZW5zcFwiOiBcIuKAglwiLFxuICBcImVvZ29uXCI6IFwixJlcIixcbiAgXCJlb3BmXCI6IFwi8J2VllwiLFxuICBcImVwYXJcIjogXCLii5VcIixcbiAgXCJlcGFyc2xcIjogXCLip6NcIixcbiAgXCJlcGx1c1wiOiBcIuKpsVwiLFxuICBcImVwc2lcIjogXCLOtVwiLFxuICBcImVwc2lsb25cIjogXCLOtVwiLFxuICBcImVwc2l2XCI6IFwiz7VcIixcbiAgXCJlcWNpcmNcIjogXCLiiZZcIixcbiAgXCJlcWNvbG9uXCI6IFwi4omVXCIsXG4gIFwiZXFzaW1cIjogXCLiiYJcIixcbiAgXCJlcXNsYW50Z3RyXCI6IFwi4qqWXCIsXG4gIFwiZXFzbGFudGxlc3NcIjogXCLiqpVcIixcbiAgXCJlcXVhbHNcIjogXCI9XCIsXG4gIFwiZXF1ZXN0XCI6IFwi4omfXCIsXG4gIFwiZXF1aXZcIjogXCLiiaFcIixcbiAgXCJlcXVpdkREXCI6IFwi4qm4XCIsXG4gIFwiZXF2cGFyc2xcIjogXCLip6VcIixcbiAgXCJlckRvdFwiOiBcIuKJk1wiLFxuICBcImVyYXJyXCI6IFwi4qWxXCIsXG4gIFwiZXNjclwiOiBcIuKEr1wiLFxuICBcImVzZG90XCI6IFwi4omQXCIsXG4gIFwiZXNpbVwiOiBcIuKJglwiLFxuICBcImV0YVwiOiBcIs63XCIsXG4gIFwiZXRcIjogXCLDsFwiLFxuICBcImV0aFwiOiBcIsOwXCIsXG4gIFwiZXVtXCI6IFwiw6tcIixcbiAgXCJldW1sXCI6IFwiw6tcIixcbiAgXCJldXJvXCI6IFwi4oKsXCIsXG4gIFwiZXhjbFwiOiBcIiFcIixcbiAgXCJleGlzdFwiOiBcIuKIg1wiLFxuICBcImV4cGVjdGF0aW9uXCI6IFwi4oSwXCIsXG4gIFwiZXhwb25lbnRpYWxlXCI6IFwi4oWHXCIsXG4gIFwiZmFsbGluZ2RvdHNlcVwiOiBcIuKJklwiLFxuICBcImZjeVwiOiBcItGEXCIsXG4gIFwiZmVtYWxlXCI6IFwi4pmAXCIsXG4gIFwiZmZpbGlnXCI6IFwi76yDXCIsXG4gIFwiZmZsaWdcIjogXCLvrIBcIixcbiAgXCJmZmxsaWdcIjogXCLvrIRcIixcbiAgXCJmZnJcIjogXCLwnZSjXCIsXG4gIFwiZmlsaWdcIjogXCLvrIFcIixcbiAgXCJmamxpZ1wiOiBcImZqXCIsXG4gIFwiZmxhdFwiOiBcIuKZrVwiLFxuICBcImZsbGlnXCI6IFwi76yCXCIsXG4gIFwiZmx0bnNcIjogXCLilrFcIixcbiAgXCJmbm9mXCI6IFwixpJcIixcbiAgXCJmb3BmXCI6IFwi8J2Vl1wiLFxuICBcImZvcmFsbFwiOiBcIuKIgFwiLFxuICBcImZvcmtcIjogXCLii5RcIixcbiAgXCJmb3JrdlwiOiBcIuKrmVwiLFxuICBcImZwYXJ0aW50XCI6IFwi4qiNXCIsXG4gIFwiZnJhYzFcIjogXCLCvFwiLFxuICBcImZyYWMxMlwiOiBcIsK9XCIsXG4gIFwiZnJhYzEzXCI6IFwi4oWTXCIsXG4gIFwiZnJhYzE0XCI6IFwiwrxcIixcbiAgXCJmcmFjMTVcIjogXCLihZVcIixcbiAgXCJmcmFjMTZcIjogXCLihZlcIixcbiAgXCJmcmFjMThcIjogXCLihZtcIixcbiAgXCJmcmFjMjNcIjogXCLihZRcIixcbiAgXCJmcmFjMjVcIjogXCLihZZcIixcbiAgXCJmcmFjM1wiOiBcIsK+XCIsXG4gIFwiZnJhYzM0XCI6IFwiwr5cIixcbiAgXCJmcmFjMzVcIjogXCLihZdcIixcbiAgXCJmcmFjMzhcIjogXCLihZxcIixcbiAgXCJmcmFjNDVcIjogXCLihZhcIixcbiAgXCJmcmFjNTZcIjogXCLihZpcIixcbiAgXCJmcmFjNThcIjogXCLihZ1cIixcbiAgXCJmcmFjNzhcIjogXCLihZ5cIixcbiAgXCJmcmFzbFwiOiBcIuKBhFwiLFxuICBcImZyb3duXCI6IFwi4oyiXCIsXG4gIFwiZnNjclwiOiBcIvCdkrtcIixcbiAgXCJnRVwiOiBcIuKJp1wiLFxuICBcImdFbFwiOiBcIuKqjFwiLFxuICBcImdhY3V0ZVwiOiBcIse1XCIsXG4gIFwiZ2FtbWFcIjogXCLOs1wiLFxuICBcImdhbW1hZFwiOiBcIs+dXCIsXG4gIFwiZ2FwXCI6IFwi4qqGXCIsXG4gIFwiZ2JyZXZlXCI6IFwixJ9cIixcbiAgXCJnY2lyY1wiOiBcIsSdXCIsXG4gIFwiZ2N5XCI6IFwi0LNcIixcbiAgXCJnZG90XCI6IFwixKFcIixcbiAgXCJnZVwiOiBcIuKJpVwiLFxuICBcImdlbFwiOiBcIuKLm1wiLFxuICBcImdlcVwiOiBcIuKJpVwiLFxuICBcImdlcXFcIjogXCLiiadcIixcbiAgXCJnZXFzbGFudFwiOiBcIuKpvlwiLFxuICBcImdlc1wiOiBcIuKpvlwiLFxuICBcImdlc2NjXCI6IFwi4qqpXCIsXG4gIFwiZ2VzZG90XCI6IFwi4qqAXCIsXG4gIFwiZ2VzZG90b1wiOiBcIuKqglwiLFxuICBcImdlc2RvdG9sXCI6IFwi4qqEXCIsXG4gIFwiZ2VzbFwiOiBcIuKLm++4gFwiLFxuICBcImdlc2xlc1wiOiBcIuKqlFwiLFxuICBcImdmclwiOiBcIvCdlKRcIixcbiAgXCJnZ1wiOiBcIuKJq1wiLFxuICBcImdnZ1wiOiBcIuKLmVwiLFxuICBcImdpbWVsXCI6IFwi4oS3XCIsXG4gIFwiZ2pjeVwiOiBcItGTXCIsXG4gIFwiZ2xcIjogXCLiibdcIixcbiAgXCJnbEVcIjogXCLiqpJcIixcbiAgXCJnbGFcIjogXCLiqqVcIixcbiAgXCJnbGpcIjogXCLiqqRcIixcbiAgXCJnbkVcIjogXCLiialcIixcbiAgXCJnbmFwXCI6IFwi4qqKXCIsXG4gIFwiZ25hcHByb3hcIjogXCLiqopcIixcbiAgXCJnbmVcIjogXCLiqohcIixcbiAgXCJnbmVxXCI6IFwi4qqIXCIsXG4gIFwiZ25lcXFcIjogXCLiialcIixcbiAgXCJnbnNpbVwiOiBcIuKLp1wiLFxuICBcImdvcGZcIjogXCLwnZWYXCIsXG4gIFwiZ3JhdmVcIjogXCJgXCIsXG4gIFwiZ3NjclwiOiBcIuKEilwiLFxuICBcImdzaW1cIjogXCLiibNcIixcbiAgXCJnc2ltZVwiOiBcIuKqjlwiLFxuICBcImdzaW1sXCI6IFwi4qqQXCIsXG4gIFwiZ1wiOiBcIj5cIixcbiAgXCJndFwiOiBcIj5cIixcbiAgXCJndGNjXCI6IFwi4qqnXCIsXG4gIFwiZ3RjaXJcIjogXCLiqbpcIixcbiAgXCJndGRvdFwiOiBcIuKLl1wiLFxuICBcImd0bFBhclwiOiBcIuKmlVwiLFxuICBcImd0cXVlc3RcIjogXCLiqbxcIixcbiAgXCJndHJhcHByb3hcIjogXCLiqoZcIixcbiAgXCJndHJhcnJcIjogXCLipbhcIixcbiAgXCJndHJkb3RcIjogXCLii5dcIixcbiAgXCJndHJlcWxlc3NcIjogXCLii5tcIixcbiAgXCJndHJlcXFsZXNzXCI6IFwi4qqMXCIsXG4gIFwiZ3RybGVzc1wiOiBcIuKJt1wiLFxuICBcImd0cnNpbVwiOiBcIuKJs1wiLFxuICBcImd2ZXJ0bmVxcVwiOiBcIuKJqe+4gFwiLFxuICBcImd2bkVcIjogXCLiianvuIBcIixcbiAgXCJoQXJyXCI6IFwi4oeUXCIsXG4gIFwiaGFpcnNwXCI6IFwi4oCKXCIsXG4gIFwiaGFsZlwiOiBcIsK9XCIsXG4gIFwiaGFtaWx0XCI6IFwi4oSLXCIsXG4gIFwiaGFyZGN5XCI6IFwi0YpcIixcbiAgXCJoYXJyXCI6IFwi4oaUXCIsXG4gIFwiaGFycmNpclwiOiBcIuKliFwiLFxuICBcImhhcnJ3XCI6IFwi4oatXCIsXG4gIFwiaGJhclwiOiBcIuKEj1wiLFxuICBcImhjaXJjXCI6IFwixKVcIixcbiAgXCJoZWFydHNcIjogXCLimaVcIixcbiAgXCJoZWFydHN1aXRcIjogXCLimaVcIixcbiAgXCJoZWxsaXBcIjogXCLigKZcIixcbiAgXCJoZXJjb25cIjogXCLiirlcIixcbiAgXCJoZnJcIjogXCLwnZSlXCIsXG4gIFwiaGtzZWFyb3dcIjogXCLipKVcIixcbiAgXCJoa3N3YXJvd1wiOiBcIuKkplwiLFxuICBcImhvYXJyXCI6IFwi4oe/XCIsXG4gIFwiaG9tdGh0XCI6IFwi4oi7XCIsXG4gIFwiaG9va2xlZnRhcnJvd1wiOiBcIuKGqVwiLFxuICBcImhvb2tyaWdodGFycm93XCI6IFwi4oaqXCIsXG4gIFwiaG9wZlwiOiBcIvCdlZlcIixcbiAgXCJob3JiYXJcIjogXCLigJVcIixcbiAgXCJoc2NyXCI6IFwi8J2SvVwiLFxuICBcImhzbGFzaFwiOiBcIuKEj1wiLFxuICBcImhzdHJva1wiOiBcIsSnXCIsXG4gIFwiaHlidWxsXCI6IFwi4oGDXCIsXG4gIFwiaHlwaGVuXCI6IFwi4oCQXCIsXG4gIFwiaWFjdXRcIjogXCLDrVwiLFxuICBcImlhY3V0ZVwiOiBcIsOtXCIsXG4gIFwiaWNcIjogXCLigaNcIixcbiAgXCJpY2lyXCI6IFwiw65cIixcbiAgXCJpY2lyY1wiOiBcIsOuXCIsXG4gIFwiaWN5XCI6IFwi0LhcIixcbiAgXCJpZWN5XCI6IFwi0LVcIixcbiAgXCJpZXhjXCI6IFwiwqFcIixcbiAgXCJpZXhjbFwiOiBcIsKhXCIsXG4gIFwiaWZmXCI6IFwi4oeUXCIsXG4gIFwiaWZyXCI6IFwi8J2UplwiLFxuICBcImlncmF2XCI6IFwiw6xcIixcbiAgXCJpZ3JhdmVcIjogXCLDrFwiLFxuICBcImlpXCI6IFwi4oWIXCIsXG4gIFwiaWlpaW50XCI6IFwi4qiMXCIsXG4gIFwiaWlpbnRcIjogXCLiiK1cIixcbiAgXCJpaW5maW5cIjogXCLip5xcIixcbiAgXCJpaW90YVwiOiBcIuKEqVwiLFxuICBcImlqbGlnXCI6IFwixLNcIixcbiAgXCJpbWFjclwiOiBcIsSrXCIsXG4gIFwiaW1hZ2VcIjogXCLihJFcIixcbiAgXCJpbWFnbGluZVwiOiBcIuKEkFwiLFxuICBcImltYWdwYXJ0XCI6IFwi4oSRXCIsXG4gIFwiaW1hdGhcIjogXCLEsVwiLFxuICBcImltb2ZcIjogXCLiirdcIixcbiAgXCJpbXBlZFwiOiBcIsa1XCIsXG4gIFwiaW5cIjogXCLiiIhcIixcbiAgXCJpbmNhcmVcIjogXCLihIVcIixcbiAgXCJpbmZpblwiOiBcIuKInlwiLFxuICBcImluZmludGllXCI6IFwi4qedXCIsXG4gIFwiaW5vZG90XCI6IFwixLFcIixcbiAgXCJpbnRcIjogXCLiiKtcIixcbiAgXCJpbnRjYWxcIjogXCLiirpcIixcbiAgXCJpbnRlZ2Vyc1wiOiBcIuKEpFwiLFxuICBcImludGVyY2FsXCI6IFwi4oq6XCIsXG4gIFwiaW50bGFyaGtcIjogXCLiqJdcIixcbiAgXCJpbnRwcm9kXCI6IFwi4qi8XCIsXG4gIFwiaW9jeVwiOiBcItGRXCIsXG4gIFwiaW9nb25cIjogXCLEr1wiLFxuICBcImlvcGZcIjogXCLwnZWaXCIsXG4gIFwiaW90YVwiOiBcIs65XCIsXG4gIFwiaXByb2RcIjogXCLiqLxcIixcbiAgXCJpcXVlc1wiOiBcIsK/XCIsXG4gIFwiaXF1ZXN0XCI6IFwiwr9cIixcbiAgXCJpc2NyXCI6IFwi8J2SvlwiLFxuICBcImlzaW5cIjogXCLiiIhcIixcbiAgXCJpc2luRVwiOiBcIuKLuVwiLFxuICBcImlzaW5kb3RcIjogXCLii7VcIixcbiAgXCJpc2luc1wiOiBcIuKLtFwiLFxuICBcImlzaW5zdlwiOiBcIuKLs1wiLFxuICBcImlzaW52XCI6IFwi4oiIXCIsXG4gIFwiaXRcIjogXCLigaJcIixcbiAgXCJpdGlsZGVcIjogXCLEqVwiLFxuICBcIml1a2N5XCI6IFwi0ZZcIixcbiAgXCJpdW1cIjogXCLDr1wiLFxuICBcIml1bWxcIjogXCLDr1wiLFxuICBcImpjaXJjXCI6IFwixLVcIixcbiAgXCJqY3lcIjogXCLQuVwiLFxuICBcImpmclwiOiBcIvCdlKdcIixcbiAgXCJqbWF0aFwiOiBcIsi3XCIsXG4gIFwiam9wZlwiOiBcIvCdlZtcIixcbiAgXCJqc2NyXCI6IFwi8J2Sv1wiLFxuICBcImpzZXJjeVwiOiBcItGYXCIsXG4gIFwianVrY3lcIjogXCLRlFwiLFxuICBcImthcHBhXCI6IFwizrpcIixcbiAgXCJrYXBwYXZcIjogXCLPsFwiLFxuICBcImtjZWRpbFwiOiBcIsS3XCIsXG4gIFwia2N5XCI6IFwi0LpcIixcbiAgXCJrZnJcIjogXCLwnZSoXCIsXG4gIFwia2dyZWVuXCI6IFwixLhcIixcbiAgXCJraGN5XCI6IFwi0YVcIixcbiAgXCJramN5XCI6IFwi0ZxcIixcbiAgXCJrb3BmXCI6IFwi8J2VnFwiLFxuICBcImtzY3JcIjogXCLwnZOAXCIsXG4gIFwibEFhcnJcIjogXCLih5pcIixcbiAgXCJsQXJyXCI6IFwi4oeQXCIsXG4gIFwibEF0YWlsXCI6IFwi4qSbXCIsXG4gIFwibEJhcnJcIjogXCLipI5cIixcbiAgXCJsRVwiOiBcIuKJplwiLFxuICBcImxFZ1wiOiBcIuKqi1wiLFxuICBcImxIYXJcIjogXCLipaJcIixcbiAgXCJsYWN1dGVcIjogXCLEulwiLFxuICBcImxhZW1wdHl2XCI6IFwi4qa0XCIsXG4gIFwibGFncmFuXCI6IFwi4oSSXCIsXG4gIFwibGFtYmRhXCI6IFwizrtcIixcbiAgXCJsYW5nXCI6IFwi4p+oXCIsXG4gIFwibGFuZ2RcIjogXCLippFcIixcbiAgXCJsYW5nbGVcIjogXCLin6hcIixcbiAgXCJsYXBcIjogXCLiqoVcIixcbiAgXCJsYXF1XCI6IFwiwqtcIixcbiAgXCJsYXF1b1wiOiBcIsKrXCIsXG4gIFwibGFyclwiOiBcIuKGkFwiLFxuICBcImxhcnJiXCI6IFwi4oekXCIsXG4gIFwibGFycmJmc1wiOiBcIuKkn1wiLFxuICBcImxhcnJmc1wiOiBcIuKknVwiLFxuICBcImxhcnJoa1wiOiBcIuKGqVwiLFxuICBcImxhcnJscFwiOiBcIuKGq1wiLFxuICBcImxhcnJwbFwiOiBcIuKkuVwiLFxuICBcImxhcnJzaW1cIjogXCLipbNcIixcbiAgXCJsYXJydGxcIjogXCLihqJcIixcbiAgXCJsYXRcIjogXCLiqqtcIixcbiAgXCJsYXRhaWxcIjogXCLipJlcIixcbiAgXCJsYXRlXCI6IFwi4qqtXCIsXG4gIFwibGF0ZXNcIjogXCLiqq3vuIBcIixcbiAgXCJsYmFyclwiOiBcIuKkjFwiLFxuICBcImxiYnJrXCI6IFwi4p2yXCIsXG4gIFwibGJyYWNlXCI6IFwie1wiLFxuICBcImxicmFja1wiOiBcIltcIixcbiAgXCJsYnJrZVwiOiBcIuKmi1wiLFxuICBcImxicmtzbGRcIjogXCLipo9cIixcbiAgXCJsYnJrc2x1XCI6IFwi4qaNXCIsXG4gIFwibGNhcm9uXCI6IFwixL5cIixcbiAgXCJsY2VkaWxcIjogXCLEvFwiLFxuICBcImxjZWlsXCI6IFwi4oyIXCIsXG4gIFwibGN1YlwiOiBcIntcIixcbiAgXCJsY3lcIjogXCLQu1wiLFxuICBcImxkY2FcIjogXCLipLZcIixcbiAgXCJsZHF1b1wiOiBcIuKAnFwiLFxuICBcImxkcXVvclwiOiBcIuKAnlwiLFxuICBcImxkcmRoYXJcIjogXCLipadcIixcbiAgXCJsZHJ1c2hhclwiOiBcIuKli1wiLFxuICBcImxkc2hcIjogXCLihrJcIixcbiAgXCJsZVwiOiBcIuKJpFwiLFxuICBcImxlZnRhcnJvd1wiOiBcIuKGkFwiLFxuICBcImxlZnRhcnJvd3RhaWxcIjogXCLihqJcIixcbiAgXCJsZWZ0aGFycG9vbmRvd25cIjogXCLihr1cIixcbiAgXCJsZWZ0aGFycG9vbnVwXCI6IFwi4oa8XCIsXG4gIFwibGVmdGxlZnRhcnJvd3NcIjogXCLih4dcIixcbiAgXCJsZWZ0cmlnaHRhcnJvd1wiOiBcIuKGlFwiLFxuICBcImxlZnRyaWdodGFycm93c1wiOiBcIuKHhlwiLFxuICBcImxlZnRyaWdodGhhcnBvb25zXCI6IFwi4oeLXCIsXG4gIFwibGVmdHJpZ2h0c3F1aWdhcnJvd1wiOiBcIuKGrVwiLFxuICBcImxlZnR0aHJlZXRpbWVzXCI6IFwi4ouLXCIsXG4gIFwibGVnXCI6IFwi4ouaXCIsXG4gIFwibGVxXCI6IFwi4omkXCIsXG4gIFwibGVxcVwiOiBcIuKJplwiLFxuICBcImxlcXNsYW50XCI6IFwi4qm9XCIsXG4gIFwibGVzXCI6IFwi4qm9XCIsXG4gIFwibGVzY2NcIjogXCLiqqhcIixcbiAgXCJsZXNkb3RcIjogXCLiqb9cIixcbiAgXCJsZXNkb3RvXCI6IFwi4qqBXCIsXG4gIFwibGVzZG90b3JcIjogXCLiqoNcIixcbiAgXCJsZXNnXCI6IFwi4oua77iAXCIsXG4gIFwibGVzZ2VzXCI6IFwi4qqTXCIsXG4gIFwibGVzc2FwcHJveFwiOiBcIuKqhVwiLFxuICBcImxlc3Nkb3RcIjogXCLii5ZcIixcbiAgXCJsZXNzZXFndHJcIjogXCLii5pcIixcbiAgXCJsZXNzZXFxZ3RyXCI6IFwi4qqLXCIsXG4gIFwibGVzc2d0clwiOiBcIuKJtlwiLFxuICBcImxlc3NzaW1cIjogXCLiibJcIixcbiAgXCJsZmlzaHRcIjogXCLipbxcIixcbiAgXCJsZmxvb3JcIjogXCLijIpcIixcbiAgXCJsZnJcIjogXCLwnZSpXCIsXG4gIFwibGdcIjogXCLiibZcIixcbiAgXCJsZ0VcIjogXCLiqpFcIixcbiAgXCJsaGFyZFwiOiBcIuKGvVwiLFxuICBcImxoYXJ1XCI6IFwi4oa8XCIsXG4gIFwibGhhcnVsXCI6IFwi4qWqXCIsXG4gIFwibGhibGtcIjogXCLiloRcIixcbiAgXCJsamN5XCI6IFwi0ZlcIixcbiAgXCJsbFwiOiBcIuKJqlwiLFxuICBcImxsYXJyXCI6IFwi4oeHXCIsXG4gIFwibGxjb3JuZXJcIjogXCLijJ5cIixcbiAgXCJsbGhhcmRcIjogXCLipatcIixcbiAgXCJsbHRyaVwiOiBcIuKXulwiLFxuICBcImxtaWRvdFwiOiBcIsWAXCIsXG4gIFwibG1vdXN0XCI6IFwi4o6wXCIsXG4gIFwibG1vdXN0YWNoZVwiOiBcIuKOsFwiLFxuICBcImxuRVwiOiBcIuKJqFwiLFxuICBcImxuYXBcIjogXCLiqolcIixcbiAgXCJsbmFwcHJveFwiOiBcIuKqiVwiLFxuICBcImxuZVwiOiBcIuKqh1wiLFxuICBcImxuZXFcIjogXCLiqodcIixcbiAgXCJsbmVxcVwiOiBcIuKJqFwiLFxuICBcImxuc2ltXCI6IFwi4oumXCIsXG4gIFwibG9hbmdcIjogXCLin6xcIixcbiAgXCJsb2FyclwiOiBcIuKHvVwiLFxuICBcImxvYnJrXCI6IFwi4p+mXCIsXG4gIFwibG9uZ2xlZnRhcnJvd1wiOiBcIuKftVwiLFxuICBcImxvbmdsZWZ0cmlnaHRhcnJvd1wiOiBcIuKft1wiLFxuICBcImxvbmdtYXBzdG9cIjogXCLin7xcIixcbiAgXCJsb25ncmlnaHRhcnJvd1wiOiBcIuKftlwiLFxuICBcImxvb3BhcnJvd2xlZnRcIjogXCLihqtcIixcbiAgXCJsb29wYXJyb3dyaWdodFwiOiBcIuKGrFwiLFxuICBcImxvcGFyXCI6IFwi4qaFXCIsXG4gIFwibG9wZlwiOiBcIvCdlZ1cIixcbiAgXCJsb3BsdXNcIjogXCLiqK1cIixcbiAgXCJsb3RpbWVzXCI6IFwi4qi0XCIsXG4gIFwibG93YXN0XCI6IFwi4oiXXCIsXG4gIFwibG93YmFyXCI6IFwiX1wiLFxuICBcImxvelwiOiBcIuKXilwiLFxuICBcImxvemVuZ2VcIjogXCLil4pcIixcbiAgXCJsb3pmXCI6IFwi4qerXCIsXG4gIFwibHBhclwiOiBcIihcIixcbiAgXCJscGFybHRcIjogXCLippNcIixcbiAgXCJscmFyclwiOiBcIuKHhlwiLFxuICBcImxyY29ybmVyXCI6IFwi4oyfXCIsXG4gIFwibHJoYXJcIjogXCLih4tcIixcbiAgXCJscmhhcmRcIjogXCLipa1cIixcbiAgXCJscm1cIjogXCLigI5cIixcbiAgXCJscnRyaVwiOiBcIuKKv1wiLFxuICBcImxzYXF1b1wiOiBcIuKAuVwiLFxuICBcImxzY3JcIjogXCLwnZOBXCIsXG4gIFwibHNoXCI6IFwi4oawXCIsXG4gIFwibHNpbVwiOiBcIuKJslwiLFxuICBcImxzaW1lXCI6IFwi4qqNXCIsXG4gIFwibHNpbWdcIjogXCLiqo9cIixcbiAgXCJsc3FiXCI6IFwiW1wiLFxuICBcImxzcXVvXCI6IFwi4oCYXCIsXG4gIFwibHNxdW9yXCI6IFwi4oCaXCIsXG4gIFwibHN0cm9rXCI6IFwixYJcIixcbiAgXCJsXCI6IFwiPFwiLFxuICBcImx0XCI6IFwiPFwiLFxuICBcImx0Y2NcIjogXCLiqqZcIixcbiAgXCJsdGNpclwiOiBcIuKpuVwiLFxuICBcImx0ZG90XCI6IFwi4ouWXCIsXG4gIFwibHRocmVlXCI6IFwi4ouLXCIsXG4gIFwibHRpbWVzXCI6IFwi4ouJXCIsXG4gIFwibHRsYXJyXCI6IFwi4qW2XCIsXG4gIFwibHRxdWVzdFwiOiBcIuKpu1wiLFxuICBcImx0clBhclwiOiBcIuKmllwiLFxuICBcImx0cmlcIjogXCLil4NcIixcbiAgXCJsdHJpZVwiOiBcIuKKtFwiLFxuICBcImx0cmlmXCI6IFwi4peCXCIsXG4gIFwibHVyZHNoYXJcIjogXCLipYpcIixcbiAgXCJsdXJ1aGFyXCI6IFwi4qWmXCIsXG4gIFwibHZlcnRuZXFxXCI6IFwi4omo77iAXCIsXG4gIFwibHZuRVwiOiBcIuKJqO+4gFwiLFxuICBcIm1ERG90XCI6IFwi4oi6XCIsXG4gIFwibWFjXCI6IFwiwq9cIixcbiAgXCJtYWNyXCI6IFwiwq9cIixcbiAgXCJtYWxlXCI6IFwi4pmCXCIsXG4gIFwibWFsdFwiOiBcIuKcoFwiLFxuICBcIm1hbHRlc2VcIjogXCLinKBcIixcbiAgXCJtYXBcIjogXCLihqZcIixcbiAgXCJtYXBzdG9cIjogXCLihqZcIixcbiAgXCJtYXBzdG9kb3duXCI6IFwi4oanXCIsXG4gIFwibWFwc3RvbGVmdFwiOiBcIuKGpFwiLFxuICBcIm1hcHN0b3VwXCI6IFwi4oalXCIsXG4gIFwibWFya2VyXCI6IFwi4pauXCIsXG4gIFwibWNvbW1hXCI6IFwi4qipXCIsXG4gIFwibWN5XCI6IFwi0LxcIixcbiAgXCJtZGFzaFwiOiBcIuKAlFwiLFxuICBcIm1lYXN1cmVkYW5nbGVcIjogXCLiiKFcIixcbiAgXCJtZnJcIjogXCLwnZSqXCIsXG4gIFwibWhvXCI6IFwi4oSnXCIsXG4gIFwibWljclwiOiBcIsK1XCIsXG4gIFwibWljcm9cIjogXCLCtVwiLFxuICBcIm1pZFwiOiBcIuKIo1wiLFxuICBcIm1pZGFzdFwiOiBcIipcIixcbiAgXCJtaWRjaXJcIjogXCLiq7BcIixcbiAgXCJtaWRkb1wiOiBcIsK3XCIsXG4gIFwibWlkZG90XCI6IFwiwrdcIixcbiAgXCJtaW51c1wiOiBcIuKIklwiLFxuICBcIm1pbnVzYlwiOiBcIuKKn1wiLFxuICBcIm1pbnVzZFwiOiBcIuKIuFwiLFxuICBcIm1pbnVzZHVcIjogXCLiqKpcIixcbiAgXCJtbGNwXCI6IFwi4qubXCIsXG4gIFwibWxkclwiOiBcIuKAplwiLFxuICBcIm1ucGx1c1wiOiBcIuKIk1wiLFxuICBcIm1vZGVsc1wiOiBcIuKKp1wiLFxuICBcIm1vcGZcIjogXCLwnZWeXCIsXG4gIFwibXBcIjogXCLiiJNcIixcbiAgXCJtc2NyXCI6IFwi8J2TglwiLFxuICBcIm1zdHBvc1wiOiBcIuKIvlwiLFxuICBcIm11XCI6IFwizrxcIixcbiAgXCJtdWx0aW1hcFwiOiBcIuKKuFwiLFxuICBcIm11bWFwXCI6IFwi4oq4XCIsXG4gIFwibkdnXCI6IFwi4ouZzLhcIixcbiAgXCJuR3RcIjogXCLiiavig5JcIixcbiAgXCJuR3R2XCI6IFwi4omrzLhcIixcbiAgXCJuTGVmdGFycm93XCI6IFwi4oeNXCIsXG4gIFwibkxlZnRyaWdodGFycm93XCI6IFwi4oeOXCIsXG4gIFwibkxsXCI6IFwi4ouYzLhcIixcbiAgXCJuTHRcIjogXCLiiarig5JcIixcbiAgXCJuTHR2XCI6IFwi4omqzLhcIixcbiAgXCJuUmlnaHRhcnJvd1wiOiBcIuKHj1wiLFxuICBcIm5WRGFzaFwiOiBcIuKKr1wiLFxuICBcIm5WZGFzaFwiOiBcIuKKrlwiLFxuICBcIm5hYmxhXCI6IFwi4oiHXCIsXG4gIFwibmFjdXRlXCI6IFwixYRcIixcbiAgXCJuYW5nXCI6IFwi4oig4oOSXCIsXG4gIFwibmFwXCI6IFwi4omJXCIsXG4gIFwibmFwRVwiOiBcIuKpsMy4XCIsXG4gIFwibmFwaWRcIjogXCLiiYvMuFwiLFxuICBcIm5hcG9zXCI6IFwixYlcIixcbiAgXCJuYXBwcm94XCI6IFwi4omJXCIsXG4gIFwibmF0dXJcIjogXCLima5cIixcbiAgXCJuYXR1cmFsXCI6IFwi4pmuXCIsXG4gIFwibmF0dXJhbHNcIjogXCLihJVcIixcbiAgXCJuYnNcIjogXCLCoFwiLFxuICBcIm5ic3BcIjogXCLCoFwiLFxuICBcIm5idW1wXCI6IFwi4omOzLhcIixcbiAgXCJuYnVtcGVcIjogXCLiiY/MuFwiLFxuICBcIm5jYXBcIjogXCLiqYNcIixcbiAgXCJuY2Fyb25cIjogXCLFiFwiLFxuICBcIm5jZWRpbFwiOiBcIsWGXCIsXG4gIFwibmNvbmdcIjogXCLiiYdcIixcbiAgXCJuY29uZ2RvdFwiOiBcIuKprcy4XCIsXG4gIFwibmN1cFwiOiBcIuKpglwiLFxuICBcIm5jeVwiOiBcItC9XCIsXG4gIFwibmRhc2hcIjogXCLigJNcIixcbiAgXCJuZVwiOiBcIuKJoFwiLFxuICBcIm5lQXJyXCI6IFwi4oeXXCIsXG4gIFwibmVhcmhrXCI6IFwi4qSkXCIsXG4gIFwibmVhcnJcIjogXCLihpdcIixcbiAgXCJuZWFycm93XCI6IFwi4oaXXCIsXG4gIFwibmVkb3RcIjogXCLiiZDMuFwiLFxuICBcIm5lcXVpdlwiOiBcIuKJolwiLFxuICBcIm5lc2VhclwiOiBcIuKkqFwiLFxuICBcIm5lc2ltXCI6IFwi4omCzLhcIixcbiAgXCJuZXhpc3RcIjogXCLiiIRcIixcbiAgXCJuZXhpc3RzXCI6IFwi4oiEXCIsXG4gIFwibmZyXCI6IFwi8J2Uq1wiLFxuICBcIm5nRVwiOiBcIuKJp8y4XCIsXG4gIFwibmdlXCI6IFwi4omxXCIsXG4gIFwibmdlcVwiOiBcIuKJsVwiLFxuICBcIm5nZXFxXCI6IFwi4omnzLhcIixcbiAgXCJuZ2Vxc2xhbnRcIjogXCLiqb7MuFwiLFxuICBcIm5nZXNcIjogXCLiqb7MuFwiLFxuICBcIm5nc2ltXCI6IFwi4om1XCIsXG4gIFwibmd0XCI6IFwi4omvXCIsXG4gIFwibmd0clwiOiBcIuKJr1wiLFxuICBcIm5oQXJyXCI6IFwi4oeOXCIsXG4gIFwibmhhcnJcIjogXCLihq5cIixcbiAgXCJuaHBhclwiOiBcIuKrslwiLFxuICBcIm5pXCI6IFwi4oiLXCIsXG4gIFwibmlzXCI6IFwi4ou8XCIsXG4gIFwibmlzZFwiOiBcIuKLulwiLFxuICBcIm5pdlwiOiBcIuKIi1wiLFxuICBcIm5qY3lcIjogXCLRmlwiLFxuICBcIm5sQXJyXCI6IFwi4oeNXCIsXG4gIFwibmxFXCI6IFwi4ommzLhcIixcbiAgXCJubGFyclwiOiBcIuKGmlwiLFxuICBcIm5sZHJcIjogXCLigKVcIixcbiAgXCJubGVcIjogXCLiibBcIixcbiAgXCJubGVmdGFycm93XCI6IFwi4oaaXCIsXG4gIFwibmxlZnRyaWdodGFycm93XCI6IFwi4oauXCIsXG4gIFwibmxlcVwiOiBcIuKJsFwiLFxuICBcIm5sZXFxXCI6IFwi4ommzLhcIixcbiAgXCJubGVxc2xhbnRcIjogXCLiqb3MuFwiLFxuICBcIm5sZXNcIjogXCLiqb3MuFwiLFxuICBcIm5sZXNzXCI6IFwi4omuXCIsXG4gIFwibmxzaW1cIjogXCLiibRcIixcbiAgXCJubHRcIjogXCLiia5cIixcbiAgXCJubHRyaVwiOiBcIuKLqlwiLFxuICBcIm5sdHJpZVwiOiBcIuKLrFwiLFxuICBcIm5taWRcIjogXCLiiKRcIixcbiAgXCJub3BmXCI6IFwi8J2Vn1wiLFxuICBcIm5vXCI6IFwiwqxcIixcbiAgXCJub3RcIjogXCLCrFwiLFxuICBcIm5vdGluXCI6IFwi4oiJXCIsXG4gIFwibm90aW5FXCI6IFwi4ou5zLhcIixcbiAgXCJub3RpbmRvdFwiOiBcIuKLtcy4XCIsXG4gIFwibm90aW52YVwiOiBcIuKIiVwiLFxuICBcIm5vdGludmJcIjogXCLii7dcIixcbiAgXCJub3RpbnZjXCI6IFwi4ou2XCIsXG4gIFwibm90bmlcIjogXCLiiIxcIixcbiAgXCJub3RuaXZhXCI6IFwi4oiMXCIsXG4gIFwibm90bml2YlwiOiBcIuKLvlwiLFxuICBcIm5vdG5pdmNcIjogXCLii71cIixcbiAgXCJucGFyXCI6IFwi4oimXCIsXG4gIFwibnBhcmFsbGVsXCI6IFwi4oimXCIsXG4gIFwibnBhcnNsXCI6IFwi4qu94oOlXCIsXG4gIFwibnBhcnRcIjogXCLiiILMuFwiLFxuICBcIm5wb2xpbnRcIjogXCLiqJRcIixcbiAgXCJucHJcIjogXCLiioBcIixcbiAgXCJucHJjdWVcIjogXCLii6BcIixcbiAgXCJucHJlXCI6IFwi4qqvzLhcIixcbiAgXCJucHJlY1wiOiBcIuKKgFwiLFxuICBcIm5wcmVjZXFcIjogXCLiqq/MuFwiLFxuICBcIm5yQXJyXCI6IFwi4oePXCIsXG4gIFwibnJhcnJcIjogXCLihptcIixcbiAgXCJucmFycmNcIjogXCLipLPMuFwiLFxuICBcIm5yYXJyd1wiOiBcIuKGncy4XCIsXG4gIFwibnJpZ2h0YXJyb3dcIjogXCLihptcIixcbiAgXCJucnRyaVwiOiBcIuKLq1wiLFxuICBcIm5ydHJpZVwiOiBcIuKLrVwiLFxuICBcIm5zY1wiOiBcIuKKgVwiLFxuICBcIm5zY2N1ZVwiOiBcIuKLoVwiLFxuICBcIm5zY2VcIjogXCLiqrDMuFwiLFxuICBcIm5zY3JcIjogXCLwnZODXCIsXG4gIFwibnNob3J0bWlkXCI6IFwi4oikXCIsXG4gIFwibnNob3J0cGFyYWxsZWxcIjogXCLiiKZcIixcbiAgXCJuc2ltXCI6IFwi4omBXCIsXG4gIFwibnNpbWVcIjogXCLiiYRcIixcbiAgXCJuc2ltZXFcIjogXCLiiYRcIixcbiAgXCJuc21pZFwiOiBcIuKIpFwiLFxuICBcIm5zcGFyXCI6IFwi4oimXCIsXG4gIFwibnNxc3ViZVwiOiBcIuKLolwiLFxuICBcIm5zcXN1cGVcIjogXCLii6NcIixcbiAgXCJuc3ViXCI6IFwi4oqEXCIsXG4gIFwibnN1YkVcIjogXCLiq4XMuFwiLFxuICBcIm5zdWJlXCI6IFwi4oqIXCIsXG4gIFwibnN1YnNldFwiOiBcIuKKguKDklwiLFxuICBcIm5zdWJzZXRlcVwiOiBcIuKKiFwiLFxuICBcIm5zdWJzZXRlcXFcIjogXCLiq4XMuFwiLFxuICBcIm5zdWNjXCI6IFwi4oqBXCIsXG4gIFwibnN1Y2NlcVwiOiBcIuKqsMy4XCIsXG4gIFwibnN1cFwiOiBcIuKKhVwiLFxuICBcIm5zdXBFXCI6IFwi4quGzLhcIixcbiAgXCJuc3VwZVwiOiBcIuKKiVwiLFxuICBcIm5zdXBzZXRcIjogXCLiioPig5JcIixcbiAgXCJuc3Vwc2V0ZXFcIjogXCLiiolcIixcbiAgXCJuc3Vwc2V0ZXFxXCI6IFwi4quGzLhcIixcbiAgXCJudGdsXCI6IFwi4om5XCIsXG4gIFwibnRpbGRcIjogXCLDsVwiLFxuICBcIm50aWxkZVwiOiBcIsOxXCIsXG4gIFwibnRsZ1wiOiBcIuKJuFwiLFxuICBcIm50cmlhbmdsZWxlZnRcIjogXCLii6pcIixcbiAgXCJudHJpYW5nbGVsZWZ0ZXFcIjogXCLii6xcIixcbiAgXCJudHJpYW5nbGVyaWdodFwiOiBcIuKLq1wiLFxuICBcIm50cmlhbmdsZXJpZ2h0ZXFcIjogXCLii61cIixcbiAgXCJudVwiOiBcIs69XCIsXG4gIFwibnVtXCI6IFwiI1wiLFxuICBcIm51bWVyb1wiOiBcIuKEllwiLFxuICBcIm51bXNwXCI6IFwi4oCHXCIsXG4gIFwibnZEYXNoXCI6IFwi4oqtXCIsXG4gIFwibnZIYXJyXCI6IFwi4qSEXCIsXG4gIFwibnZhcFwiOiBcIuKJjeKDklwiLFxuICBcIm52ZGFzaFwiOiBcIuKKrFwiLFxuICBcIm52Z2VcIjogXCLiiaXig5JcIixcbiAgXCJudmd0XCI6IFwiPuKDklwiLFxuICBcIm52aW5maW5cIjogXCLip55cIixcbiAgXCJudmxBcnJcIjogXCLipIJcIixcbiAgXCJudmxlXCI6IFwi4omk4oOSXCIsXG4gIFwibnZsdFwiOiBcIjzig5JcIixcbiAgXCJudmx0cmllXCI6IFwi4oq04oOSXCIsXG4gIFwibnZyQXJyXCI6IFwi4qSDXCIsXG4gIFwibnZydHJpZVwiOiBcIuKKteKDklwiLFxuICBcIm52c2ltXCI6IFwi4oi84oOSXCIsXG4gIFwibndBcnJcIjogXCLih5ZcIixcbiAgXCJud2FyaGtcIjogXCLipKNcIixcbiAgXCJud2FyclwiOiBcIuKGllwiLFxuICBcIm53YXJyb3dcIjogXCLihpZcIixcbiAgXCJud25lYXJcIjogXCLipKdcIixcbiAgXCJvU1wiOiBcIuKTiFwiLFxuICBcIm9hY3V0XCI6IFwiw7NcIixcbiAgXCJvYWN1dGVcIjogXCLDs1wiLFxuICBcIm9hc3RcIjogXCLiiptcIixcbiAgXCJvY2lyXCI6IFwiw7RcIixcbiAgXCJvY2lyY1wiOiBcIsO0XCIsXG4gIFwib2N5XCI6IFwi0L5cIixcbiAgXCJvZGFzaFwiOiBcIuKKnVwiLFxuICBcIm9kYmxhY1wiOiBcIsWRXCIsXG4gIFwib2RpdlwiOiBcIuKouFwiLFxuICBcIm9kb3RcIjogXCLiiplcIixcbiAgXCJvZHNvbGRcIjogXCLiprxcIixcbiAgXCJvZWxpZ1wiOiBcIsWTXCIsXG4gIFwib2ZjaXJcIjogXCLipr9cIixcbiAgXCJvZnJcIjogXCLwnZSsXCIsXG4gIFwib2dvblwiOiBcIsubXCIsXG4gIFwib2dyYXZcIjogXCLDslwiLFxuICBcIm9ncmF2ZVwiOiBcIsOyXCIsXG4gIFwib2d0XCI6IFwi4qeBXCIsXG4gIFwib2hiYXJcIjogXCLiprVcIixcbiAgXCJvaG1cIjogXCLOqVwiLFxuICBcIm9pbnRcIjogXCLiiK5cIixcbiAgXCJvbGFyclwiOiBcIuKGulwiLFxuICBcIm9sY2lyXCI6IFwi4qa+XCIsXG4gIFwib2xjcm9zc1wiOiBcIuKmu1wiLFxuICBcIm9saW5lXCI6IFwi4oC+XCIsXG4gIFwib2x0XCI6IFwi4qeAXCIsXG4gIFwib21hY3JcIjogXCLFjVwiLFxuICBcIm9tZWdhXCI6IFwiz4lcIixcbiAgXCJvbWljcm9uXCI6IFwizr9cIixcbiAgXCJvbWlkXCI6IFwi4qa2XCIsXG4gIFwib21pbnVzXCI6IFwi4oqWXCIsXG4gIFwib29wZlwiOiBcIvCdlaBcIixcbiAgXCJvcGFyXCI6IFwi4qa3XCIsXG4gIFwib3BlcnBcIjogXCLiprlcIixcbiAgXCJvcGx1c1wiOiBcIuKKlVwiLFxuICBcIm9yXCI6IFwi4oioXCIsXG4gIFwib3JhcnJcIjogXCLihrtcIixcbiAgXCJvcmRcIjogXCLCulwiLFxuICBcIm9yZGVyXCI6IFwi4oS0XCIsXG4gIFwib3JkZXJvZlwiOiBcIuKEtFwiLFxuICBcIm9yZGZcIjogXCLCqlwiLFxuICBcIm9yZG1cIjogXCLCulwiLFxuICBcIm9yaWdvZlwiOiBcIuKKtlwiLFxuICBcIm9yb3JcIjogXCLiqZZcIixcbiAgXCJvcnNsb3BlXCI6IFwi4qmXXCIsXG4gIFwib3J2XCI6IFwi4qmbXCIsXG4gIFwib3NjclwiOiBcIuKEtFwiLFxuICBcIm9zbGFzXCI6IFwiw7hcIixcbiAgXCJvc2xhc2hcIjogXCLDuFwiLFxuICBcIm9zb2xcIjogXCLiiphcIixcbiAgXCJvdGlsZFwiOiBcIsO1XCIsXG4gIFwib3RpbGRlXCI6IFwiw7VcIixcbiAgXCJvdGltZXNcIjogXCLiipdcIixcbiAgXCJvdGltZXNhc1wiOiBcIuKotlwiLFxuICBcIm91bVwiOiBcIsO2XCIsXG4gIFwib3VtbFwiOiBcIsO2XCIsXG4gIFwib3ZiYXJcIjogXCLijL1cIixcbiAgXCJwYXJcIjogXCLCtlwiLFxuICBcInBhcmFcIjogXCLCtlwiLFxuICBcInBhcmFsbGVsXCI6IFwi4oilXCIsXG4gIFwicGFyc2ltXCI6IFwi4quzXCIsXG4gIFwicGFyc2xcIjogXCLiq71cIixcbiAgXCJwYXJ0XCI6IFwi4oiCXCIsXG4gIFwicGN5XCI6IFwi0L9cIixcbiAgXCJwZXJjbnRcIjogXCIlXCIsXG4gIFwicGVyaW9kXCI6IFwiLlwiLFxuICBcInBlcm1pbFwiOiBcIuKAsFwiLFxuICBcInBlcnBcIjogXCLiiqVcIixcbiAgXCJwZXJ0ZW5rXCI6IFwi4oCxXCIsXG4gIFwicGZyXCI6IFwi8J2UrVwiLFxuICBcInBoaVwiOiBcIs+GXCIsXG4gIFwicGhpdlwiOiBcIs+VXCIsXG4gIFwicGhtbWF0XCI6IFwi4oSzXCIsXG4gIFwicGhvbmVcIjogXCLimI5cIixcbiAgXCJwaVwiOiBcIs+AXCIsXG4gIFwicGl0Y2hmb3JrXCI6IFwi4ouUXCIsXG4gIFwicGl2XCI6IFwiz5ZcIixcbiAgXCJwbGFuY2tcIjogXCLihI9cIixcbiAgXCJwbGFuY2toXCI6IFwi4oSOXCIsXG4gIFwicGxhbmt2XCI6IFwi4oSPXCIsXG4gIFwicGx1c1wiOiBcIitcIixcbiAgXCJwbHVzYWNpclwiOiBcIuKoo1wiLFxuICBcInBsdXNiXCI6IFwi4oqeXCIsXG4gIFwicGx1c2NpclwiOiBcIuKoolwiLFxuICBcInBsdXNkb1wiOiBcIuKIlFwiLFxuICBcInBsdXNkdVwiOiBcIuKopVwiLFxuICBcInBsdXNlXCI6IFwi4qmyXCIsXG4gIFwicGx1c21cIjogXCLCsVwiLFxuICBcInBsdXNtblwiOiBcIsKxXCIsXG4gIFwicGx1c3NpbVwiOiBcIuKoplwiLFxuICBcInBsdXN0d29cIjogXCLiqKdcIixcbiAgXCJwbVwiOiBcIsKxXCIsXG4gIFwicG9pbnRpbnRcIjogXCLiqJVcIixcbiAgXCJwb3BmXCI6IFwi8J2VoVwiLFxuICBcInBvdW5cIjogXCLCo1wiLFxuICBcInBvdW5kXCI6IFwiwqNcIixcbiAgXCJwclwiOiBcIuKJulwiLFxuICBcInByRVwiOiBcIuKqs1wiLFxuICBcInByYXBcIjogXCLiqrdcIixcbiAgXCJwcmN1ZVwiOiBcIuKJvFwiLFxuICBcInByZVwiOiBcIuKqr1wiLFxuICBcInByZWNcIjogXCLiibpcIixcbiAgXCJwcmVjYXBwcm94XCI6IFwi4qq3XCIsXG4gIFwicHJlY2N1cmx5ZXFcIjogXCLiibxcIixcbiAgXCJwcmVjZXFcIjogXCLiqq9cIixcbiAgXCJwcmVjbmFwcHJveFwiOiBcIuKquVwiLFxuICBcInByZWNuZXFxXCI6IFwi4qq1XCIsXG4gIFwicHJlY25zaW1cIjogXCLii6hcIixcbiAgXCJwcmVjc2ltXCI6IFwi4om+XCIsXG4gIFwicHJpbWVcIjogXCLigLJcIixcbiAgXCJwcmltZXNcIjogXCLihJlcIixcbiAgXCJwcm5FXCI6IFwi4qq1XCIsXG4gIFwicHJuYXBcIjogXCLiqrlcIixcbiAgXCJwcm5zaW1cIjogXCLii6hcIixcbiAgXCJwcm9kXCI6IFwi4oiPXCIsXG4gIFwicHJvZmFsYXJcIjogXCLijK5cIixcbiAgXCJwcm9mbGluZVwiOiBcIuKMklwiLFxuICBcInByb2ZzdXJmXCI6IFwi4oyTXCIsXG4gIFwicHJvcFwiOiBcIuKInVwiLFxuICBcInByb3B0b1wiOiBcIuKInVwiLFxuICBcInByc2ltXCI6IFwi4om+XCIsXG4gIFwicHJ1cmVsXCI6IFwi4oqwXCIsXG4gIFwicHNjclwiOiBcIvCdk4VcIixcbiAgXCJwc2lcIjogXCLPiFwiLFxuICBcInB1bmNzcFwiOiBcIuKAiFwiLFxuICBcInFmclwiOiBcIvCdlK5cIixcbiAgXCJxaW50XCI6IFwi4qiMXCIsXG4gIFwicW9wZlwiOiBcIvCdlaJcIixcbiAgXCJxcHJpbWVcIjogXCLigZdcIixcbiAgXCJxc2NyXCI6IFwi8J2ThlwiLFxuICBcInF1YXRlcm5pb25zXCI6IFwi4oSNXCIsXG4gIFwicXVhdGludFwiOiBcIuKollwiLFxuICBcInF1ZXN0XCI6IFwiP1wiLFxuICBcInF1ZXN0ZXFcIjogXCLiiZ9cIixcbiAgXCJxdW9cIjogXCJcXFwiXCIsXG4gIFwicXVvdFwiOiBcIlxcXCJcIixcbiAgXCJyQWFyclwiOiBcIuKHm1wiLFxuICBcInJBcnJcIjogXCLih5JcIixcbiAgXCJyQXRhaWxcIjogXCLipJxcIixcbiAgXCJyQmFyclwiOiBcIuKkj1wiLFxuICBcInJIYXJcIjogXCLipaRcIixcbiAgXCJyYWNlXCI6IFwi4oi9zLFcIixcbiAgXCJyYWN1dGVcIjogXCLFlVwiLFxuICBcInJhZGljXCI6IFwi4oiaXCIsXG4gIFwicmFlbXB0eXZcIjogXCLiprNcIixcbiAgXCJyYW5nXCI6IFwi4p+pXCIsXG4gIFwicmFuZ2RcIjogXCLippJcIixcbiAgXCJyYW5nZVwiOiBcIuKmpVwiLFxuICBcInJhbmdsZVwiOiBcIuKfqVwiLFxuICBcInJhcXVcIjogXCLCu1wiLFxuICBcInJhcXVvXCI6IFwiwrtcIixcbiAgXCJyYXJyXCI6IFwi4oaSXCIsXG4gIFwicmFycmFwXCI6IFwi4qW1XCIsXG4gIFwicmFycmJcIjogXCLih6VcIixcbiAgXCJyYXJyYmZzXCI6IFwi4qSgXCIsXG4gIFwicmFycmNcIjogXCLipLNcIixcbiAgXCJyYXJyZnNcIjogXCLipJ5cIixcbiAgXCJyYXJyaGtcIjogXCLihqpcIixcbiAgXCJyYXJybHBcIjogXCLihqxcIixcbiAgXCJyYXJycGxcIjogXCLipYVcIixcbiAgXCJyYXJyc2ltXCI6IFwi4qW0XCIsXG4gIFwicmFycnRsXCI6IFwi4oajXCIsXG4gIFwicmFycndcIjogXCLihp1cIixcbiAgXCJyYXRhaWxcIjogXCLipJpcIixcbiAgXCJyYXRpb1wiOiBcIuKItlwiLFxuICBcInJhdGlvbmFsc1wiOiBcIuKEmlwiLFxuICBcInJiYXJyXCI6IFwi4qSNXCIsXG4gIFwicmJicmtcIjogXCLinbNcIixcbiAgXCJyYnJhY2VcIjogXCJ9XCIsXG4gIFwicmJyYWNrXCI6IFwiXVwiLFxuICBcInJicmtlXCI6IFwi4qaMXCIsXG4gIFwicmJya3NsZFwiOiBcIuKmjlwiLFxuICBcInJicmtzbHVcIjogXCLippBcIixcbiAgXCJyY2Fyb25cIjogXCLFmVwiLFxuICBcInJjZWRpbFwiOiBcIsWXXCIsXG4gIFwicmNlaWxcIjogXCLijIlcIixcbiAgXCJyY3ViXCI6IFwifVwiLFxuICBcInJjeVwiOiBcItGAXCIsXG4gIFwicmRjYVwiOiBcIuKkt1wiLFxuICBcInJkbGRoYXJcIjogXCLipalcIixcbiAgXCJyZHF1b1wiOiBcIuKAnVwiLFxuICBcInJkcXVvclwiOiBcIuKAnVwiLFxuICBcInJkc2hcIjogXCLihrNcIixcbiAgXCJyZWFsXCI6IFwi4oScXCIsXG4gIFwicmVhbGluZVwiOiBcIuKEm1wiLFxuICBcInJlYWxwYXJ0XCI6IFwi4oScXCIsXG4gIFwicmVhbHNcIjogXCLihJ1cIixcbiAgXCJyZWN0XCI6IFwi4patXCIsXG4gIFwicmVcIjogXCLCrlwiLFxuICBcInJlZ1wiOiBcIsKuXCIsXG4gIFwicmZpc2h0XCI6IFwi4qW9XCIsXG4gIFwicmZsb29yXCI6IFwi4oyLXCIsXG4gIFwicmZyXCI6IFwi8J2Ur1wiLFxuICBcInJoYXJkXCI6IFwi4oeBXCIsXG4gIFwicmhhcnVcIjogXCLih4BcIixcbiAgXCJyaGFydWxcIjogXCLipaxcIixcbiAgXCJyaG9cIjogXCLPgVwiLFxuICBcInJob3ZcIjogXCLPsVwiLFxuICBcInJpZ2h0YXJyb3dcIjogXCLihpJcIixcbiAgXCJyaWdodGFycm93dGFpbFwiOiBcIuKGo1wiLFxuICBcInJpZ2h0aGFycG9vbmRvd25cIjogXCLih4FcIixcbiAgXCJyaWdodGhhcnBvb251cFwiOiBcIuKHgFwiLFxuICBcInJpZ2h0bGVmdGFycm93c1wiOiBcIuKHhFwiLFxuICBcInJpZ2h0bGVmdGhhcnBvb25zXCI6IFwi4oeMXCIsXG4gIFwicmlnaHRyaWdodGFycm93c1wiOiBcIuKHiVwiLFxuICBcInJpZ2h0c3F1aWdhcnJvd1wiOiBcIuKGnVwiLFxuICBcInJpZ2h0dGhyZWV0aW1lc1wiOiBcIuKLjFwiLFxuICBcInJpbmdcIjogXCLLmlwiLFxuICBcInJpc2luZ2RvdHNlcVwiOiBcIuKJk1wiLFxuICBcInJsYXJyXCI6IFwi4oeEXCIsXG4gIFwicmxoYXJcIjogXCLih4xcIixcbiAgXCJybG1cIjogXCLigI9cIixcbiAgXCJybW91c3RcIjogXCLijrFcIixcbiAgXCJybW91c3RhY2hlXCI6IFwi4o6xXCIsXG4gIFwicm5taWRcIjogXCLiq65cIixcbiAgXCJyb2FuZ1wiOiBcIuKfrVwiLFxuICBcInJvYXJyXCI6IFwi4oe+XCIsXG4gIFwicm9icmtcIjogXCLin6dcIixcbiAgXCJyb3BhclwiOiBcIuKmhlwiLFxuICBcInJvcGZcIjogXCLwnZWjXCIsXG4gIFwicm9wbHVzXCI6IFwi4qiuXCIsXG4gIFwicm90aW1lc1wiOiBcIuKotVwiLFxuICBcInJwYXJcIjogXCIpXCIsXG4gIFwicnBhcmd0XCI6IFwi4qaUXCIsXG4gIFwicnBwb2xpbnRcIjogXCLiqJJcIixcbiAgXCJycmFyclwiOiBcIuKHiVwiLFxuICBcInJzYXF1b1wiOiBcIuKAulwiLFxuICBcInJzY3JcIjogXCLwnZOHXCIsXG4gIFwicnNoXCI6IFwi4oaxXCIsXG4gIFwicnNxYlwiOiBcIl1cIixcbiAgXCJyc3F1b1wiOiBcIuKAmVwiLFxuICBcInJzcXVvclwiOiBcIuKAmVwiLFxuICBcInJ0aHJlZVwiOiBcIuKLjFwiLFxuICBcInJ0aW1lc1wiOiBcIuKLilwiLFxuICBcInJ0cmlcIjogXCLilrlcIixcbiAgXCJydHJpZVwiOiBcIuKKtVwiLFxuICBcInJ0cmlmXCI6IFwi4pa4XCIsXG4gIFwicnRyaWx0cmlcIjogXCLip45cIixcbiAgXCJydWx1aGFyXCI6IFwi4qWoXCIsXG4gIFwicnhcIjogXCLihJ5cIixcbiAgXCJzYWN1dGVcIjogXCLFm1wiLFxuICBcInNicXVvXCI6IFwi4oCaXCIsXG4gIFwic2NcIjogXCLiibtcIixcbiAgXCJzY0VcIjogXCLiqrRcIixcbiAgXCJzY2FwXCI6IFwi4qq4XCIsXG4gIFwic2Nhcm9uXCI6IFwixaFcIixcbiAgXCJzY2N1ZVwiOiBcIuKJvVwiLFxuICBcInNjZVwiOiBcIuKqsFwiLFxuICBcInNjZWRpbFwiOiBcIsWfXCIsXG4gIFwic2NpcmNcIjogXCLFnVwiLFxuICBcInNjbkVcIjogXCLiqrZcIixcbiAgXCJzY25hcFwiOiBcIuKqulwiLFxuICBcInNjbnNpbVwiOiBcIuKLqVwiLFxuICBcInNjcG9saW50XCI6IFwi4qiTXCIsXG4gIFwic2NzaW1cIjogXCLiib9cIixcbiAgXCJzY3lcIjogXCLRgVwiLFxuICBcInNkb3RcIjogXCLii4VcIixcbiAgXCJzZG90YlwiOiBcIuKKoVwiLFxuICBcInNkb3RlXCI6IFwi4qmmXCIsXG4gIFwic2VBcnJcIjogXCLih5hcIixcbiAgXCJzZWFyaGtcIjogXCLipKVcIixcbiAgXCJzZWFyclwiOiBcIuKGmFwiLFxuICBcInNlYXJyb3dcIjogXCLihphcIixcbiAgXCJzZWNcIjogXCLCp1wiLFxuICBcInNlY3RcIjogXCLCp1wiLFxuICBcInNlbWlcIjogXCI7XCIsXG4gIFwic2Vzd2FyXCI6IFwi4qSpXCIsXG4gIFwic2V0bWludXNcIjogXCLiiJZcIixcbiAgXCJzZXRtblwiOiBcIuKIllwiLFxuICBcInNleHRcIjogXCLinLZcIixcbiAgXCJzZnJcIjogXCLwnZSwXCIsXG4gIFwic2Zyb3duXCI6IFwi4oyiXCIsXG4gIFwic2hhcnBcIjogXCLima9cIixcbiAgXCJzaGNoY3lcIjogXCLRiVwiLFxuICBcInNoY3lcIjogXCLRiFwiLFxuICBcInNob3J0bWlkXCI6IFwi4oijXCIsXG4gIFwic2hvcnRwYXJhbGxlbFwiOiBcIuKIpVwiLFxuICBcInNoXCI6IFwiwq1cIixcbiAgXCJzaHlcIjogXCLCrVwiLFxuICBcInNpZ21hXCI6IFwiz4NcIixcbiAgXCJzaWdtYWZcIjogXCLPglwiLFxuICBcInNpZ21hdlwiOiBcIs+CXCIsXG4gIFwic2ltXCI6IFwi4oi8XCIsXG4gIFwic2ltZG90XCI6IFwi4qmqXCIsXG4gIFwic2ltZVwiOiBcIuKJg1wiLFxuICBcInNpbWVxXCI6IFwi4omDXCIsXG4gIFwic2ltZ1wiOiBcIuKqnlwiLFxuICBcInNpbWdFXCI6IFwi4qqgXCIsXG4gIFwic2ltbFwiOiBcIuKqnVwiLFxuICBcInNpbWxFXCI6IFwi4qqfXCIsXG4gIFwic2ltbmVcIjogXCLiiYZcIixcbiAgXCJzaW1wbHVzXCI6IFwi4qikXCIsXG4gIFwic2ltcmFyclwiOiBcIuKlslwiLFxuICBcInNsYXJyXCI6IFwi4oaQXCIsXG4gIFwic21hbGxzZXRtaW51c1wiOiBcIuKIllwiLFxuICBcInNtYXNocFwiOiBcIuKos1wiLFxuICBcInNtZXBhcnNsXCI6IFwi4qekXCIsXG4gIFwic21pZFwiOiBcIuKIo1wiLFxuICBcInNtaWxlXCI6IFwi4oyjXCIsXG4gIFwic210XCI6IFwi4qqqXCIsXG4gIFwic210ZVwiOiBcIuKqrFwiLFxuICBcInNtdGVzXCI6IFwi4qqs77iAXCIsXG4gIFwic29mdGN5XCI6IFwi0YxcIixcbiAgXCJzb2xcIjogXCIvXCIsXG4gIFwic29sYlwiOiBcIuKnhFwiLFxuICBcInNvbGJhclwiOiBcIuKMv1wiLFxuICBcInNvcGZcIjogXCLwnZWkXCIsXG4gIFwic3BhZGVzXCI6IFwi4pmgXCIsXG4gIFwic3BhZGVzdWl0XCI6IFwi4pmgXCIsXG4gIFwic3BhclwiOiBcIuKIpVwiLFxuICBcInNxY2FwXCI6IFwi4oqTXCIsXG4gIFwic3FjYXBzXCI6IFwi4oqT77iAXCIsXG4gIFwic3FjdXBcIjogXCLiipRcIixcbiAgXCJzcWN1cHNcIjogXCLiipTvuIBcIixcbiAgXCJzcXN1YlwiOiBcIuKKj1wiLFxuICBcInNxc3ViZVwiOiBcIuKKkVwiLFxuICBcInNxc3Vic2V0XCI6IFwi4oqPXCIsXG4gIFwic3FzdWJzZXRlcVwiOiBcIuKKkVwiLFxuICBcInNxc3VwXCI6IFwi4oqQXCIsXG4gIFwic3FzdXBlXCI6IFwi4oqSXCIsXG4gIFwic3FzdXBzZXRcIjogXCLiipBcIixcbiAgXCJzcXN1cHNldGVxXCI6IFwi4oqSXCIsXG4gIFwic3F1XCI6IFwi4pahXCIsXG4gIFwic3F1YXJlXCI6IFwi4pahXCIsXG4gIFwic3F1YXJmXCI6IFwi4paqXCIsXG4gIFwic3F1ZlwiOiBcIuKWqlwiLFxuICBcInNyYXJyXCI6IFwi4oaSXCIsXG4gIFwic3NjclwiOiBcIvCdk4hcIixcbiAgXCJzc2V0bW5cIjogXCLiiJZcIixcbiAgXCJzc21pbGVcIjogXCLijKNcIixcbiAgXCJzc3RhcmZcIjogXCLii4ZcIixcbiAgXCJzdGFyXCI6IFwi4piGXCIsXG4gIFwic3RhcmZcIjogXCLimIVcIixcbiAgXCJzdHJhaWdodGVwc2lsb25cIjogXCLPtVwiLFxuICBcInN0cmFpZ2h0cGhpXCI6IFwiz5VcIixcbiAgXCJzdHJuc1wiOiBcIsKvXCIsXG4gIFwic3ViXCI6IFwi4oqCXCIsXG4gIFwic3ViRVwiOiBcIuKrhVwiLFxuICBcInN1YmRvdFwiOiBcIuKqvVwiLFxuICBcInN1YmVcIjogXCLiioZcIixcbiAgXCJzdWJlZG90XCI6IFwi4quDXCIsXG4gIFwic3VibXVsdFwiOiBcIuKrgVwiLFxuICBcInN1Ym5FXCI6IFwi4quLXCIsXG4gIFwic3VibmVcIjogXCLiiopcIixcbiAgXCJzdWJwbHVzXCI6IFwi4qq/XCIsXG4gIFwic3VicmFyclwiOiBcIuKluVwiLFxuICBcInN1YnNldFwiOiBcIuKKglwiLFxuICBcInN1YnNldGVxXCI6IFwi4oqGXCIsXG4gIFwic3Vic2V0ZXFxXCI6IFwi4quFXCIsXG4gIFwic3Vic2V0bmVxXCI6IFwi4oqKXCIsXG4gIFwic3Vic2V0bmVxcVwiOiBcIuKri1wiLFxuICBcInN1YnNpbVwiOiBcIuKrh1wiLFxuICBcInN1YnN1YlwiOiBcIuKrlVwiLFxuICBcInN1YnN1cFwiOiBcIuKrk1wiLFxuICBcInN1Y2NcIjogXCLiibtcIixcbiAgXCJzdWNjYXBwcm94XCI6IFwi4qq4XCIsXG4gIFwic3VjY2N1cmx5ZXFcIjogXCLiib1cIixcbiAgXCJzdWNjZXFcIjogXCLiqrBcIixcbiAgXCJzdWNjbmFwcHJveFwiOiBcIuKqulwiLFxuICBcInN1Y2NuZXFxXCI6IFwi4qq2XCIsXG4gIFwic3VjY25zaW1cIjogXCLii6lcIixcbiAgXCJzdWNjc2ltXCI6IFwi4om/XCIsXG4gIFwic3VtXCI6IFwi4oiRXCIsXG4gIFwic3VuZ1wiOiBcIuKZqlwiLFxuICBcInN1cFwiOiBcIuKKg1wiLFxuICBcInN1cDFcIjogXCLCuVwiLFxuICBcInN1cDJcIjogXCLCslwiLFxuICBcInN1cDNcIjogXCLCs1wiLFxuICBcInN1cEVcIjogXCLiq4ZcIixcbiAgXCJzdXBkb3RcIjogXCLiqr5cIixcbiAgXCJzdXBkc3ViXCI6IFwi4quYXCIsXG4gIFwic3VwZVwiOiBcIuKKh1wiLFxuICBcInN1cGVkb3RcIjogXCLiq4RcIixcbiAgXCJzdXBoc29sXCI6IFwi4p+JXCIsXG4gIFwic3VwaHN1YlwiOiBcIuKrl1wiLFxuICBcInN1cGxhcnJcIjogXCLipbtcIixcbiAgXCJzdXBtdWx0XCI6IFwi4quCXCIsXG4gIFwic3VwbkVcIjogXCLiq4xcIixcbiAgXCJzdXBuZVwiOiBcIuKKi1wiLFxuICBcInN1cHBsdXNcIjogXCLiq4BcIixcbiAgXCJzdXBzZXRcIjogXCLiioNcIixcbiAgXCJzdXBzZXRlcVwiOiBcIuKKh1wiLFxuICBcInN1cHNldGVxcVwiOiBcIuKrhlwiLFxuICBcInN1cHNldG5lcVwiOiBcIuKKi1wiLFxuICBcInN1cHNldG5lcXFcIjogXCLiq4xcIixcbiAgXCJzdXBzaW1cIjogXCLiq4hcIixcbiAgXCJzdXBzdWJcIjogXCLiq5RcIixcbiAgXCJzdXBzdXBcIjogXCLiq5ZcIixcbiAgXCJzd0FyclwiOiBcIuKHmVwiLFxuICBcInN3YXJoa1wiOiBcIuKkplwiLFxuICBcInN3YXJyXCI6IFwi4oaZXCIsXG4gIFwic3dhcnJvd1wiOiBcIuKGmVwiLFxuICBcInN3bndhclwiOiBcIuKkqlwiLFxuICBcInN6bGlcIjogXCLDn1wiLFxuICBcInN6bGlnXCI6IFwiw59cIixcbiAgXCJ0YXJnZXRcIjogXCLijJZcIixcbiAgXCJ0YXVcIjogXCLPhFwiLFxuICBcInRicmtcIjogXCLijrRcIixcbiAgXCJ0Y2Fyb25cIjogXCLFpVwiLFxuICBcInRjZWRpbFwiOiBcIsWjXCIsXG4gIFwidGN5XCI6IFwi0YJcIixcbiAgXCJ0ZG90XCI6IFwi4oObXCIsXG4gIFwidGVscmVjXCI6IFwi4oyVXCIsXG4gIFwidGZyXCI6IFwi8J2UsVwiLFxuICBcInRoZXJlNFwiOiBcIuKItFwiLFxuICBcInRoZXJlZm9yZVwiOiBcIuKItFwiLFxuICBcInRoZXRhXCI6IFwizrhcIixcbiAgXCJ0aGV0YXN5bVwiOiBcIs+RXCIsXG4gIFwidGhldGF2XCI6IFwiz5FcIixcbiAgXCJ0aGlja2FwcHJveFwiOiBcIuKJiFwiLFxuICBcInRoaWNrc2ltXCI6IFwi4oi8XCIsXG4gIFwidGhpbnNwXCI6IFwi4oCJXCIsXG4gIFwidGhrYXBcIjogXCLiiYhcIixcbiAgXCJ0aGtzaW1cIjogXCLiiLxcIixcbiAgXCJ0aG9yXCI6IFwiw75cIixcbiAgXCJ0aG9yblwiOiBcIsO+XCIsXG4gIFwidGlsZGVcIjogXCLLnFwiLFxuICBcInRpbWVcIjogXCLDl1wiLFxuICBcInRpbWVzXCI6IFwiw5dcIixcbiAgXCJ0aW1lc2JcIjogXCLiiqBcIixcbiAgXCJ0aW1lc2JhclwiOiBcIuKosVwiLFxuICBcInRpbWVzZFwiOiBcIuKosFwiLFxuICBcInRpbnRcIjogXCLiiK1cIixcbiAgXCJ0b2VhXCI6IFwi4qSoXCIsXG4gIFwidG9wXCI6IFwi4oqkXCIsXG4gIFwidG9wYm90XCI6IFwi4oy2XCIsXG4gIFwidG9wY2lyXCI6IFwi4quxXCIsXG4gIFwidG9wZlwiOiBcIvCdlaVcIixcbiAgXCJ0b3Bmb3JrXCI6IFwi4quaXCIsXG4gIFwidG9zYVwiOiBcIuKkqVwiLFxuICBcInRwcmltZVwiOiBcIuKAtFwiLFxuICBcInRyYWRlXCI6IFwi4oSiXCIsXG4gIFwidHJpYW5nbGVcIjogXCLilrVcIixcbiAgXCJ0cmlhbmdsZWRvd25cIjogXCLilr9cIixcbiAgXCJ0cmlhbmdsZWxlZnRcIjogXCLil4NcIixcbiAgXCJ0cmlhbmdsZWxlZnRlcVwiOiBcIuKKtFwiLFxuICBcInRyaWFuZ2xlcVwiOiBcIuKJnFwiLFxuICBcInRyaWFuZ2xlcmlnaHRcIjogXCLilrlcIixcbiAgXCJ0cmlhbmdsZXJpZ2h0ZXFcIjogXCLiirVcIixcbiAgXCJ0cmlkb3RcIjogXCLil6xcIixcbiAgXCJ0cmllXCI6IFwi4omcXCIsXG4gIFwidHJpbWludXNcIjogXCLiqLpcIixcbiAgXCJ0cmlwbHVzXCI6IFwi4qi5XCIsXG4gIFwidHJpc2JcIjogXCLip41cIixcbiAgXCJ0cml0aW1lXCI6IFwi4qi7XCIsXG4gIFwidHJwZXppdW1cIjogXCLij6JcIixcbiAgXCJ0c2NyXCI6IFwi8J2TiVwiLFxuICBcInRzY3lcIjogXCLRhlwiLFxuICBcInRzaGN5XCI6IFwi0ZtcIixcbiAgXCJ0c3Ryb2tcIjogXCLFp1wiLFxuICBcInR3aXh0XCI6IFwi4omsXCIsXG4gIFwidHdvaGVhZGxlZnRhcnJvd1wiOiBcIuKGnlwiLFxuICBcInR3b2hlYWRyaWdodGFycm93XCI6IFwi4oagXCIsXG4gIFwidUFyclwiOiBcIuKHkVwiLFxuICBcInVIYXJcIjogXCLipaNcIixcbiAgXCJ1YWN1dFwiOiBcIsO6XCIsXG4gIFwidWFjdXRlXCI6IFwiw7pcIixcbiAgXCJ1YXJyXCI6IFwi4oaRXCIsXG4gIFwidWJyY3lcIjogXCLRnlwiLFxuICBcInVicmV2ZVwiOiBcIsWtXCIsXG4gIFwidWNpclwiOiBcIsO7XCIsXG4gIFwidWNpcmNcIjogXCLDu1wiLFxuICBcInVjeVwiOiBcItGDXCIsXG4gIFwidWRhcnJcIjogXCLih4VcIixcbiAgXCJ1ZGJsYWNcIjogXCLFsVwiLFxuICBcInVkaGFyXCI6IFwi4qWuXCIsXG4gIFwidWZpc2h0XCI6IFwi4qW+XCIsXG4gIFwidWZyXCI6IFwi8J2UslwiLFxuICBcInVncmF2XCI6IFwiw7lcIixcbiAgXCJ1Z3JhdmVcIjogXCLDuVwiLFxuICBcInVoYXJsXCI6IFwi4oa/XCIsXG4gIFwidWhhcnJcIjogXCLihr5cIixcbiAgXCJ1aGJsa1wiOiBcIuKWgFwiLFxuICBcInVsY29yblwiOiBcIuKMnFwiLFxuICBcInVsY29ybmVyXCI6IFwi4oycXCIsXG4gIFwidWxjcm9wXCI6IFwi4oyPXCIsXG4gIFwidWx0cmlcIjogXCLil7hcIixcbiAgXCJ1bWFjclwiOiBcIsWrXCIsXG4gIFwidW1cIjogXCLCqFwiLFxuICBcInVtbFwiOiBcIsKoXCIsXG4gIFwidW9nb25cIjogXCLFs1wiLFxuICBcInVvcGZcIjogXCLwnZWmXCIsXG4gIFwidXBhcnJvd1wiOiBcIuKGkVwiLFxuICBcInVwZG93bmFycm93XCI6IFwi4oaVXCIsXG4gIFwidXBoYXJwb29ubGVmdFwiOiBcIuKGv1wiLFxuICBcInVwaGFycG9vbnJpZ2h0XCI6IFwi4oa+XCIsXG4gIFwidXBsdXNcIjogXCLiio5cIixcbiAgXCJ1cHNpXCI6IFwiz4VcIixcbiAgXCJ1cHNpaFwiOiBcIs+SXCIsXG4gIFwidXBzaWxvblwiOiBcIs+FXCIsXG4gIFwidXB1cGFycm93c1wiOiBcIuKHiFwiLFxuICBcInVyY29yblwiOiBcIuKMnVwiLFxuICBcInVyY29ybmVyXCI6IFwi4oydXCIsXG4gIFwidXJjcm9wXCI6IFwi4oyOXCIsXG4gIFwidXJpbmdcIjogXCLFr1wiLFxuICBcInVydHJpXCI6IFwi4pe5XCIsXG4gIFwidXNjclwiOiBcIvCdk4pcIixcbiAgXCJ1dGRvdFwiOiBcIuKLsFwiLFxuICBcInV0aWxkZVwiOiBcIsWpXCIsXG4gIFwidXRyaVwiOiBcIuKWtVwiLFxuICBcInV0cmlmXCI6IFwi4pa0XCIsXG4gIFwidXVhcnJcIjogXCLih4hcIixcbiAgXCJ1dW1cIjogXCLDvFwiLFxuICBcInV1bWxcIjogXCLDvFwiLFxuICBcInV3YW5nbGVcIjogXCLipqdcIixcbiAgXCJ2QXJyXCI6IFwi4oeVXCIsXG4gIFwidkJhclwiOiBcIuKrqFwiLFxuICBcInZCYXJ2XCI6IFwi4qupXCIsXG4gIFwidkRhc2hcIjogXCLiiqhcIixcbiAgXCJ2YW5ncnRcIjogXCLippxcIixcbiAgXCJ2YXJlcHNpbG9uXCI6IFwiz7VcIixcbiAgXCJ2YXJrYXBwYVwiOiBcIs+wXCIsXG4gIFwidmFybm90aGluZ1wiOiBcIuKIhVwiLFxuICBcInZhcnBoaVwiOiBcIs+VXCIsXG4gIFwidmFycGlcIjogXCLPllwiLFxuICBcInZhcnByb3B0b1wiOiBcIuKInVwiLFxuICBcInZhcnJcIjogXCLihpVcIixcbiAgXCJ2YXJyaG9cIjogXCLPsVwiLFxuICBcInZhcnNpZ21hXCI6IFwiz4JcIixcbiAgXCJ2YXJzdWJzZXRuZXFcIjogXCLiiorvuIBcIixcbiAgXCJ2YXJzdWJzZXRuZXFxXCI6IFwi4quL77iAXCIsXG4gIFwidmFyc3Vwc2V0bmVxXCI6IFwi4oqL77iAXCIsXG4gIFwidmFyc3Vwc2V0bmVxcVwiOiBcIuKrjO+4gFwiLFxuICBcInZhcnRoZXRhXCI6IFwiz5FcIixcbiAgXCJ2YXJ0cmlhbmdsZWxlZnRcIjogXCLiirJcIixcbiAgXCJ2YXJ0cmlhbmdsZXJpZ2h0XCI6IFwi4oqzXCIsXG4gIFwidmN5XCI6IFwi0LJcIixcbiAgXCJ2ZGFzaFwiOiBcIuKKolwiLFxuICBcInZlZVwiOiBcIuKIqFwiLFxuICBcInZlZWJhclwiOiBcIuKKu1wiLFxuICBcInZlZWVxXCI6IFwi4omaXCIsXG4gIFwidmVsbGlwXCI6IFwi4ouuXCIsXG4gIFwidmVyYmFyXCI6IFwifFwiLFxuICBcInZlcnRcIjogXCJ8XCIsXG4gIFwidmZyXCI6IFwi8J2Us1wiLFxuICBcInZsdHJpXCI6IFwi4oqyXCIsXG4gIFwidm5zdWJcIjogXCLiioLig5JcIixcbiAgXCJ2bnN1cFwiOiBcIuKKg+KDklwiLFxuICBcInZvcGZcIjogXCLwnZWnXCIsXG4gIFwidnByb3BcIjogXCLiiJ1cIixcbiAgXCJ2cnRyaVwiOiBcIuKKs1wiLFxuICBcInZzY3JcIjogXCLwnZOLXCIsXG4gIFwidnN1Ym5FXCI6IFwi4quL77iAXCIsXG4gIFwidnN1Ym5lXCI6IFwi4oqK77iAXCIsXG4gIFwidnN1cG5FXCI6IFwi4quM77iAXCIsXG4gIFwidnN1cG5lXCI6IFwi4oqL77iAXCIsXG4gIFwidnppZ3phZ1wiOiBcIuKmmlwiLFxuICBcIndjaXJjXCI6IFwixbVcIixcbiAgXCJ3ZWRiYXJcIjogXCLiqZ9cIixcbiAgXCJ3ZWRnZVwiOiBcIuKIp1wiLFxuICBcIndlZGdlcVwiOiBcIuKJmVwiLFxuICBcIndlaWVycFwiOiBcIuKEmFwiLFxuICBcIndmclwiOiBcIvCdlLRcIixcbiAgXCJ3b3BmXCI6IFwi8J2VqFwiLFxuICBcIndwXCI6IFwi4oSYXCIsXG4gIFwid3JcIjogXCLiiYBcIixcbiAgXCJ3cmVhdGhcIjogXCLiiYBcIixcbiAgXCJ3c2NyXCI6IFwi8J2TjFwiLFxuICBcInhjYXBcIjogXCLii4JcIixcbiAgXCJ4Y2lyY1wiOiBcIuKXr1wiLFxuICBcInhjdXBcIjogXCLii4NcIixcbiAgXCJ4ZHRyaVwiOiBcIuKWvVwiLFxuICBcInhmclwiOiBcIvCdlLVcIixcbiAgXCJ4aEFyclwiOiBcIuKfulwiLFxuICBcInhoYXJyXCI6IFwi4p+3XCIsXG4gIFwieGlcIjogXCLOvlwiLFxuICBcInhsQXJyXCI6IFwi4p+4XCIsXG4gIFwieGxhcnJcIjogXCLin7VcIixcbiAgXCJ4bWFwXCI6IFwi4p+8XCIsXG4gIFwieG5pc1wiOiBcIuKLu1wiLFxuICBcInhvZG90XCI6IFwi4qiAXCIsXG4gIFwieG9wZlwiOiBcIvCdlalcIixcbiAgXCJ4b3BsdXNcIjogXCLiqIFcIixcbiAgXCJ4b3RpbWVcIjogXCLiqIJcIixcbiAgXCJ4ckFyclwiOiBcIuKfuVwiLFxuICBcInhyYXJyXCI6IFwi4p+2XCIsXG4gIFwieHNjclwiOiBcIvCdk41cIixcbiAgXCJ4c3FjdXBcIjogXCLiqIZcIixcbiAgXCJ4dXBsdXNcIjogXCLiqIRcIixcbiAgXCJ4dXRyaVwiOiBcIuKWs1wiLFxuICBcInh2ZWVcIjogXCLii4FcIixcbiAgXCJ4d2VkZ2VcIjogXCLii4BcIixcbiAgXCJ5YWN1dFwiOiBcIsO9XCIsXG4gIFwieWFjdXRlXCI6IFwiw71cIixcbiAgXCJ5YWN5XCI6IFwi0Y9cIixcbiAgXCJ5Y2lyY1wiOiBcIsW3XCIsXG4gIFwieWN5XCI6IFwi0YtcIixcbiAgXCJ5ZVwiOiBcIsKlXCIsXG4gIFwieWVuXCI6IFwiwqVcIixcbiAgXCJ5ZnJcIjogXCLwnZS2XCIsXG4gIFwieWljeVwiOiBcItGXXCIsXG4gIFwieW9wZlwiOiBcIvCdlapcIixcbiAgXCJ5c2NyXCI6IFwi8J2TjlwiLFxuICBcInl1Y3lcIjogXCLRjlwiLFxuICBcInl1bVwiOiBcIsO/XCIsXG4gIFwieXVtbFwiOiBcIsO/XCIsXG4gIFwiemFjdXRlXCI6IFwixbpcIixcbiAgXCJ6Y2Fyb25cIjogXCLFvlwiLFxuICBcInpjeVwiOiBcItC3XCIsXG4gIFwiemRvdFwiOiBcIsW8XCIsXG4gIFwiemVldHJmXCI6IFwi4oSoXCIsXG4gIFwiemV0YVwiOiBcIs62XCIsXG4gIFwiemZyXCI6IFwi8J2Ut1wiLFxuICBcInpoY3lcIjogXCLQtlwiLFxuICBcInppZ3JhcnJcIjogXCLih51cIixcbiAgXCJ6b3BmXCI6IFwi8J2Vq1wiLFxuICBcInpzY3JcIjogXCLwnZOPXCIsXG4gIFwiendqXCI6IFwi4oCNXCIsXG4gIFwiendualwiOiBcIuKAjFwiXG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiMFwiOiBcIu+/vVwiLFxuICBcIjEyOFwiOiBcIuKCrFwiLFxuICBcIjEzMFwiOiBcIuKAmlwiLFxuICBcIjEzMVwiOiBcIsaSXCIsXG4gIFwiMTMyXCI6IFwi4oCeXCIsXG4gIFwiMTMzXCI6IFwi4oCmXCIsXG4gIFwiMTM0XCI6IFwi4oCgXCIsXG4gIFwiMTM1XCI6IFwi4oChXCIsXG4gIFwiMTM2XCI6IFwiy4ZcIixcbiAgXCIxMzdcIjogXCLigLBcIixcbiAgXCIxMzhcIjogXCLFoFwiLFxuICBcIjEzOVwiOiBcIuKAuVwiLFxuICBcIjE0MFwiOiBcIsWSXCIsXG4gIFwiMTQyXCI6IFwixb1cIixcbiAgXCIxNDVcIjogXCLigJhcIixcbiAgXCIxNDZcIjogXCLigJlcIixcbiAgXCIxNDdcIjogXCLigJxcIixcbiAgXCIxNDhcIjogXCLigJ1cIixcbiAgXCIxNDlcIjogXCLigKJcIixcbiAgXCIxNTBcIjogXCLigJNcIixcbiAgXCIxNTFcIjogXCLigJRcIixcbiAgXCIxNTJcIjogXCLLnFwiLFxuICBcIjE1M1wiOiBcIuKEolwiLFxuICBcIjE1NFwiOiBcIsWhXCIsXG4gIFwiMTU1XCI6IFwi4oC6XCIsXG4gIFwiMTU2XCI6IFwixZNcIixcbiAgXCIxNThcIjogXCLFvlwiLFxuICBcIjE1OVwiOiBcIsW4XCJcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFscGhhYmV0aWNhbCA9IHJlcXVpcmUoJ2lzLWFscGhhYmV0aWNhbCcpO1xudmFyIGRlY2ltYWwgPSByZXF1aXJlKCdpcy1kZWNpbWFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYWxwaGFudW1lcmljYWw7XG5cbi8qIENoZWNrIGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY29kZSwgb3IgdGhlIGNoYXJhY3RlclxuICogY29kZSBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyLCBpcyBhbHBoYW51bWVyaWNhbC4gKi9cbmZ1bmN0aW9uIGFscGhhbnVtZXJpY2FsKGNoYXJhY3Rlcikge1xuICByZXR1cm4gYWxwaGFiZXRpY2FsKGNoYXJhY3RlcikgfHwgZGVjaW1hbChjaGFyYWN0ZXIpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhleGFkZWNpbWFsO1xuXG4vKiBDaGVjayBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGNvZGUsIG9yIHRoZSBjaGFyYWN0ZXJcbiAqIGNvZGUgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciwgaXMgaGV4YWRlY2ltYWwuICovXG5mdW5jdGlvbiBoZXhhZGVjaW1hbChjaGFyYWN0ZXIpIHtcbiAgdmFyIGNvZGUgPSB0eXBlb2YgY2hhcmFjdGVyID09PSAnc3RyaW5nJyA/XG4gICAgY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkgOiBjaGFyYWN0ZXI7XG5cbiAgcmV0dXJuIChjb2RlID49IDk3IC8qIGEgKi8gJiYgY29kZSA8PSAxMDIgLyogeiAqLykgfHxcbiAgICAoY29kZSA+PSA2NSAvKiBBICovICYmIGNvZGUgPD0gNzAgLyogWiAqLykgfHxcbiAgICAoY29kZSA+PSA0OCAvKiBBICovICYmIGNvZGUgPD0gNTcgLyogWiAqLyk7XG59XG4iLCIvKiFcbiAqIHJlcGVhdC1zdHJpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3JlcGVhdC1zdHJpbmc+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXN1bHRzIGNhY2hlXG4gKi9cblxudmFyIHJlcyA9ICcnO1xudmFyIGNhY2hlO1xuXG4vKipcbiAqIEV4cG9zZSBgcmVwZWF0YFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVwZWF0O1xuXG4vKipcbiAqIFJlcGVhdCB0aGUgZ2l2ZW4gYHN0cmluZ2AgdGhlIHNwZWNpZmllZCBgbnVtYmVyYFxuICogb2YgdGltZXMuXG4gKlxuICogKipFeGFtcGxlOioqXG4gKlxuICogYGBganNcbiAqIHZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG4gKiByZXBlYXQoJ0EnLCA1KTtcbiAqIC8vPT4gQUFBQUFcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyaW5nYCBUaGUgc3RyaW5nIHRvIHJlcGVhdFxuICogQHBhcmFtIHtOdW1iZXJ9IGBudW1iZXJgIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gUmVwZWF0ZWQgc3RyaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHIsIG51bSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgLy8gY292ZXIgY29tbW9uLCBxdWljayB1c2UgY2FzZXNcbiAgaWYgKG51bSA9PT0gMSkgcmV0dXJuIHN0cjtcbiAgaWYgKG51bSA9PT0gMikgcmV0dXJuIHN0ciArIHN0cjtcblxuICB2YXIgbWF4ID0gc3RyLmxlbmd0aCAqIG51bTtcbiAgaWYgKGNhY2hlICE9PSBzdHIgfHwgdHlwZW9mIGNhY2hlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNhY2hlID0gc3RyO1xuICAgIHJlcyA9ICcnO1xuICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPj0gbWF4KSB7XG4gICAgcmV0dXJuIHJlcy5zdWJzdHIoMCwgbWF4KTtcbiAgfVxuXG4gIHdoaWxlIChtYXggPiByZXMubGVuZ3RoICYmIG51bSA+IDEpIHtcbiAgICBpZiAobnVtICYgMSkge1xuICAgICAgcmVzICs9IHN0cjtcbiAgICB9XG5cbiAgICBudW0gPj49IDE7XG4gICAgc3RyICs9IHN0cjtcbiAgfVxuXG4gIHJlcyArPSBzdHI7XG4gIHJlcyA9IHJlcy5zdWJzdHIoMCwgbWF4KTtcbiAgcmV0dXJuIHJlcztcbn1cbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNiBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSBzdGF0ZS10b2dnbGVcbiAqIEBmaWxlb3ZlcnZpZXcgRW50ZXIvZXhpdCBhIHN0YXRlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBjb21tb25qcyAqL1xuXG4vKiBFeHBvc2UuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc3RhdGUgYHRvZ2dsZXJgOiBhIGZ1bmN0aW9uIHdoaWNoIGludmVyc2VzXG4gKiBgcHJvcGVydHlgIGluIGNvbnRleHQgYmFzZWQgb24gaXRzIGN1cnJlbnQgdmFsdWUuXG4gKiBUaGUgYnkgYHRvZ2dsZXJgIHJldHVybmVkIGZ1bmN0aW9uIHJlc3RvcmVzIHRoYXQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFByb3BlcnR5IHRvIHRvZ2dsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RhdGUgLSBEZWZhdWx0IHN0YXRlLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbY3R4XSAtIENvbnRleHQgb2JqZWN0LlxuICogQHJldHVybiB7RnVuY3Rpb259IC0gRW50ZXIuXG4gKi9cbmZ1bmN0aW9uIGZhY3Rvcnkoa2V5LCBzdGF0ZSwgY3R4KSB7XG4gIC8qKlxuICAgKiBFbnRlciBhIHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBFeGl0IHN0YXRlLlxuICAgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udGV4dCA9IGN0eCB8fCB0aGlzO1xuICAgIHZhciBjdXJyZW50ID0gY29udGV4dFtrZXldO1xuXG4gICAgY29udGV4dFtrZXldID0gIXN0YXRlO1xuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIHN0YXRlIHRvIGl0cyB2YWx1ZSBiZWZvcmUgZW50ZXJpbmcuXG4gICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnRleHRba2V5XSA9IGN1cnJlbnQ7XG4gICAgfTtcbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB0cmltVHJhaWxpbmdMaW5lcztcblxudmFyIGxpbmUgPSAnXFxuJztcblxuLyogUmVtb3ZlIGZpbmFsIG5ld2xpbmUgY2hhcmFjdGVycyBmcm9tIGB2YWx1ZWAuICovXG5mdW5jdGlvbiB0cmltVHJhaWxpbmdMaW5lcyh2YWx1ZSkge1xuICB2YXIgdmFsID0gU3RyaW5nKHZhbHVlKTtcbiAgdmFyIGluZGV4ID0gdmFsLmxlbmd0aDtcblxuICB3aGlsZSAodmFsLmNoYXJBdCgtLWluZGV4KSA9PT0gbGluZSkgeyAvKiBlbXB0eSAqLyB9XG5cbiAgcmV0dXJuIHZhbC5zbGljZSgwLCBpbmRleCArIDEpO1xufVxuIiwiXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0cmltO1xuXG5mdW5jdGlvbiB0cmltKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuXG5leHBvcnRzLmxlZnQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpO1xufTtcblxuZXhwb3J0cy5yaWdodCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59O1xuIiwiLyoqXG4gKiBAYXV0aG9yIFRpdHVzIFdvcm1lclxuICogQGNvcHlyaWdodCAyMDE1IFRpdHVzIFdvcm1lclxuICogQGxpY2Vuc2UgTUlUXG4gKiBAbW9kdWxlIHVuaGVyaXRcbiAqIEBmaWxlb3ZlcnZpZXcgQ3JlYXRlIGEgY3VzdG9tIGNvbnN0cnVjdG9yIHdoaWNoIGNhbiBiZSBtb2RpZmllZFxuICogICB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3JpZ2luYWwgY2xhc3MuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBEZXBlbmRlbmNpZXMuICovXG52YXIgeHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB1bmhlcml0O1xuXG4vKipcbiAqIENyZWF0ZSBhIGN1c3RvbSBjb25zdHJ1Y3RvciB3aGljaCBjYW4gYmUgbW9kaWZpZWRcbiAqIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBTdXBlciAtIFN1cGVyLWNsYXNzLlxuICogQHJldHVybiB7RnVuY3Rpb259IC0gQ29uc3RydWN0b3IgYWN0aW5nIGxpa2UgYFN1cGVyYCxcbiAqICAgd2hpY2ggY2FuIGJlIG1vZGlmaWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbFxuICogICBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gdW5oZXJpdChTdXBlcikge1xuICB2YXIgcmVzdWx0O1xuICB2YXIga2V5O1xuICB2YXIgdmFsdWU7XG5cbiAgaW5oZXJpdHMoT2YsIFN1cGVyKTtcbiAgaW5oZXJpdHMoRnJvbSwgT2YpO1xuXG4gIC8qIENsb25lIHZhbHVlcy4gKi9cbiAgcmVzdWx0ID0gT2YucHJvdG90eXBlO1xuXG4gIGZvciAoa2V5IGluIHJlc3VsdCkge1xuICAgIHZhbHVlID0gcmVzdWx0W2tleV07XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSAnY29uY2F0JyBpbiB2YWx1ZSA/IHZhbHVlLmNvbmNhdCgpIDogeHRlbmQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBPZjtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgYWNjZXB0aW5nIGEgc2luZ2xlIGFyZ3VtZW50LFxuICAgKiB3aGljaCBpdHNlbGYgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gRnJvbShwYXJhbWV0ZXJzKSB7XG4gICAgcmV0dXJuIFN1cGVyLmFwcGx5KHRoaXMsIHBhcmFtZXRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGFjY2VwdGluZyB2YXJpYWRpYyBhcmd1bWVudHMuXG4gICAqL1xuICBmdW5jdGlvbiBPZigpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2YpKSB7XG4gICAgICByZXR1cm4gbmV3IEZyb20oYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB2aXNpdCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtdmlzaXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZW1vdmVQb3NpdGlvbjtcblxuLyogUmVtb3ZlIGBwb3NpdGlvbmBzIGZyb20gYHRyZWVgLiAqL1xuZnVuY3Rpb24gcmVtb3ZlUG9zaXRpb24obm9kZSwgZm9yY2UpIHtcbiAgdmlzaXQobm9kZSwgZm9yY2UgPyBoYXJkIDogc29mdCk7XG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBoYXJkKG5vZGUpIHtcbiAgZGVsZXRlIG5vZGUucG9zaXRpb247XG59XG5cbmZ1bmN0aW9uIHNvZnQobm9kZSkge1xuICBub2RlLnBvc2l0aW9uID0gdW5kZWZpbmVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBFeHBvc2UuICovXG5tb2R1bGUuZXhwb3J0cyA9IHZpc2l0O1xuXG4vKiBWaXNpdC4gKi9cbmZ1bmN0aW9uIHZpc2l0KHRyZWUsIHR5cGUsIHZpc2l0b3IsIHJldmVyc2UpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV2ZXJzZSA9IHZpc2l0b3I7XG4gICAgdmlzaXRvciA9IHR5cGU7XG4gICAgdHlwZSA9IG51bGw7XG4gIH1cblxuICBvbmUodHJlZSk7XG5cbiAgLyogVmlzaXQgYSBzaW5nbGUgbm9kZS4gKi9cbiAgZnVuY3Rpb24gb25lKG5vZGUsIGluZGV4LCBwYXJlbnQpIHtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaW5kZXggPSBpbmRleCB8fCAocGFyZW50ID8gMCA6IG51bGwpO1xuXG4gICAgaWYgKCF0eXBlIHx8IG5vZGUudHlwZSA9PT0gdHlwZSkge1xuICAgICAgcmVzdWx0ID0gdmlzaXRvcihub2RlLCBpbmRleCwgcGFyZW50IHx8IG51bGwpO1xuICAgIH1cblxuICAgIGlmIChub2RlLmNoaWxkcmVuICYmIHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBhbGwobm9kZS5jaGlsZHJlbiwgbm9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qIFZpc2l0IGNoaWxkcmVuIGluIGBwYXJlbnRgLiAqL1xuICBmdW5jdGlvbiBhbGwoY2hpbGRyZW4sIHBhcmVudCkge1xuICAgIHZhciBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMTtcbiAgICB2YXIgbWF4ID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHZhciBtaW4gPSAtMTtcbiAgICB2YXIgaW5kZXggPSAocmV2ZXJzZSA/IG1heCA6IG1pbikgKyBzdGVwO1xuICAgIHZhciBjaGlsZDtcblxuICAgIHdoaWxlIChpbmRleCA+IG1pbiAmJiBpbmRleCA8IG1heCkge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07XG5cbiAgICAgIGlmIChjaGlsZCAmJiBvbmUoY2hpbGQsIGluZGV4LCBwYXJlbnQpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ICs9IHN0ZXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5O1xuXG4vKiBGYWN0b3J5LiAqL1xuZnVuY3Rpb24gZmFjdG9yeShmaWxlKSB7XG4gIHZhciBjb250ZW50cyA9IGluZGljZXMoU3RyaW5nKGZpbGUpKTtcblxuICByZXR1cm4ge1xuICAgIHRvUG9zaXRpb246IG9mZnNldFRvUG9zaXRpb25GYWN0b3J5KGNvbnRlbnRzKSxcbiAgICB0b09mZnNldDogcG9zaXRpb25Ub09mZnNldEZhY3RvcnkoY29udGVudHMpXG4gIH07XG59XG5cbi8qIEZhY3RvcnkgdG8gZ2V0IHRoZSBsaW5lIGFuZCBjb2x1bW4tYmFzZWQgYHBvc2l0aW9uYCBmb3JcbiAqIGBvZmZzZXRgIGluIHRoZSBib3VuZCBpbmRpY2VzLiAqL1xuZnVuY3Rpb24gb2Zmc2V0VG9Qb3NpdGlvbkZhY3RvcnkoaW5kaWNlcykge1xuICByZXR1cm4gb2Zmc2V0VG9Qb3NpdGlvbjtcblxuICAvKiBHZXQgdGhlIGxpbmUgYW5kIGNvbHVtbi1iYXNlZCBgcG9zaXRpb25gIGZvclxuICAgKiBgb2Zmc2V0YCBpbiB0aGUgYm91bmQgaW5kaWNlcy4gKi9cbiAgZnVuY3Rpb24gb2Zmc2V0VG9Qb3NpdGlvbihvZmZzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICB2YXIgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7XG5cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaW5kaWNlc1tpbmRleF0gPiBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiBpbmRleCArIDEsXG4gICAgICAgICAgY29sdW1uOiAob2Zmc2V0IC0gKGluZGljZXNbaW5kZXggLSAxXSB8fCAwKSkgKyAxLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qIEZhY3RvcnkgdG8gZ2V0IHRoZSBgb2Zmc2V0YCBmb3IgYSBsaW5lIGFuZCBjb2x1bW4tYmFzZWRcbiAqIGBwb3NpdGlvbmAgaW4gdGhlIGJvdW5kIGluZGljZXMuICovXG5mdW5jdGlvbiBwb3NpdGlvblRvT2Zmc2V0RmFjdG9yeShpbmRpY2VzKSB7XG4gIHJldHVybiBwb3NpdGlvblRvT2Zmc2V0O1xuXG4gIC8qIEdldCB0aGUgYG9mZnNldGAgZm9yIGEgbGluZSBhbmQgY29sdW1uLWJhc2VkXG4gICAqIGBwb3NpdGlvbmAgaW4gdGhlIGJvdW5kIGluZGljZXMuICovXG4gIGZ1bmN0aW9uIHBvc2l0aW9uVG9PZmZzZXQocG9zaXRpb24pIHtcbiAgICB2YXIgbGluZSA9IHBvc2l0aW9uICYmIHBvc2l0aW9uLmxpbmU7XG4gICAgdmFyIGNvbHVtbiA9IHBvc2l0aW9uICYmIHBvc2l0aW9uLmNvbHVtbjtcblxuICAgIGlmICghaXNOYU4obGluZSkgJiYgIWlzTmFOKGNvbHVtbikgJiYgbGluZSAtIDEgaW4gaW5kaWNlcykge1xuICAgICAgcmV0dXJuICgoaW5kaWNlc1tsaW5lIC0gMl0gfHwgMCkgKyBjb2x1bW4gLSAxKSB8fCAwO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxufVxuXG4vKiBHZXQgaW5kaWNlcyBvZiBsaW5lLWJyZWFrcyBpbiBgdmFsdWVgLiAqL1xuZnVuY3Rpb24gaW5kaWNlcyh2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpbmRleCA9IHZhbHVlLmluZGV4T2YoJ1xcbicpO1xuXG4gIHdoaWxlIChpbmRleCAhPT0gLTEpIHtcbiAgICByZXN1bHQucHVzaChpbmRleCArIDEpO1xuICAgIGluZGV4ID0gdmFsdWUuaW5kZXhPZignXFxuJywgaW5kZXggKyAxKTtcbiAgfVxuXG4gIHJlc3VsdC5wdXNoKHZhbHVlLmxlbmd0aCArIDEpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdW5oZXJpdCA9IHJlcXVpcmUoJ3VuaGVyaXQnKTtcbnZhciB4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJyk7XG52YXIgUGFyc2VyID0gcmVxdWlyZSgnLi9saWIvcGFyc2VyLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG5wYXJzZS5QYXJzZXIgPSBQYXJzZXI7XG5cbmZ1bmN0aW9uIHBhcnNlKG9wdGlvbnMpIHtcbiAgdmFyIExvY2FsID0gdW5oZXJpdChQYXJzZXIpO1xuICBMb2NhbC5wcm90b3R5cGUub3B0aW9ucyA9IHh0ZW5kKExvY2FsLnByb3RvdHlwZS5vcHRpb25zLCB0aGlzLmRhdGEoJ3NldHRpbmdzJyksIG9wdGlvbnMpO1xuICB0aGlzLlBhcnNlciA9IExvY2FsO1xufVxuIl19 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o * * Copyright (c) 2014-2015, Jon Schlinkert. * Licensed under the MIT License. */ 'use strict'; /** * Results cache */ var res = ''; var cache; /** * Expose `repeat` */ module.exports = repeat; /** * Repeat the given `string` the specified `number` * of times. * * **Example:** * * ```js * var repeat = require('repeat-string'); * repeat('A', 5); * //=> AAAAA * ``` * * @param {String} `string` The string to repeat * @param {Number} `number` The number of times to repeat the string * @return {String} Repeated string * @api public */ function repeat(str, num) { if (typeof str !== 'string') { throw new TypeError('expected a string'); } // cover common, quick use cases if (num === 1) return str; if (num === 2) return str + str; var max = str.length * num; if (cache !== str || typeof cache === 'undefined') { cache = str; res = ''; } else if (res.length >= max) { return res.substr(0, max); } while (max > res.length && num > 1) { if (num & 1) { res += str; } num >>= 1; str += str; } res += str; res = res.substr(0, max); return res; } },{}],34:[function(require,module,exports){ 'use strict'; var visit = require('unist-util-visit'); module.exports = getDefinitionFactory; var own = {}.hasOwnProperty; /* Get a definition in `node` by `identifier`. */ function getDefinitionFactory(node, options) { return getterFactory(gather(node, options)); } /* Gather all definitions in `node` */ function gather(node, options) { var cache = {}; if (!node || !node.type) { throw new Error('mdast-util-definitions expected node'); } visit(node, 'definition', options && options.commonmark ? commonmark : normal); return cache; function commonmark(definition) { var id = normalise(definition.identifier); if (!own.call(cache, id)) { cache[id] = definition; } } function normal(definition) { cache[normalise(definition.identifier)] = definition; } } /* Factory to get a node from the given definition-cache. */ function getterFactory(cache) { return getter; /* Get a node from the bound definition-cache. */ function getter(identifier) { var id = identifier && normalise(identifier); return id && own.call(cache, id) ? cache[id] : null; } } function normalise(identifier) { return identifier.toUpperCase(); } },{"unist-util-visit":42}],35:[function(require,module,exports){ 'use strict'; module.exports = returner; try { normalize(''); module.exports = normalize; } catch (err) {} /* Normalize `uri`. */ function normalize(uri) { return encodeURI(decodeURI(uri)); } /* istanbul ignore next - Fallback, return input. */ function returner(uri) { return uri; } },{}],36:[function(require,module,exports){ 'use strict'; module.exports = trimLines; var ws = /[ \t]*\n+[ \t]*/g; var newline = '\n'; function trimLines(value) { return String(value).replace(ws, newline); } },{}],37:[function(require,module,exports){ exports = module.exports = trim; function trim(str){ return str.replace(/^\s*|\s*$/g, ''); } exports.left = function(str){ return str.replace(/^\s*/, ''); }; exports.right = function(str){ return str.replace(/\s*$/, ''); }; },{}],38:[function(require,module,exports){ 'use strict'; var assign = require('object-assign'); module.exports = function u (type, props, value) { if (value == null && (typeof props != 'object' || Array.isArray(props))) { value = props; props = {}; } return assign({}, props, { type: String(type) }, value != null && (Array.isArray(value) ? { children: value } : { value: String(value) })); }; },{"object-assign":39}],39:[function(require,module,exports){ /* object-assign (c) Sindre Sorhus @license MIT */ 'use strict'; /* 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; }; },{}],40:[function(require,module,exports){ 'use strict'; /* Expose. */ module.exports = generated; /* Detect if a node was available in the original document. */ function generated(node) { var position = optional(optional(node).position); var start = optional(position.start); var end = optional(position.end); return !start.line || !start.column || !end.line || !end.column; } /* Return `value` if it’s an object, an empty object * otherwise. */ function optional(value) { return value && typeof value === 'object' ? value : {}; } },{}],41:[function(require,module,exports){ 'use strict'; /* Expose. */ var position = exports; position.start = positionFactory('start'); position.end = positionFactory('end'); /* Factory to get a position at `type`. */ function positionFactory(type) { return pos; /* Get a position in `node` at a bound `type`. */ function pos(node) { var pos = (node && node.position && node.position[type]) || {}; return { line: pos.line || null, column: pos.column || null, offset: isNaN(pos.offset) ? null : pos.offset }; } } },{}],42:[function(require,module,exports){ 'use strict'; /* Expose. */ module.exports = visit; /* Visit. */ function visit(tree, type, visitor, reverse) { if (typeof type === 'function') { reverse = visitor; visitor = type; type = null; } one(tree); /* Visit a single node. */ function one(node, index, parent) { var result; index = index || (parent ? 0 : null); if (!type || node.type === type) { result = visitor(node, index, parent || null); } if (node.children && result !== false) { return all(node.children, node); } return result; } /* Visit children in `parent`. */ function all(children, parent) { var step = reverse ? -1 : 1; var max = children.length; var min = -1; var index = (reverse ? max : min) + step; var child; while (index > min && index < max) { child = children[index]; if (child && one(child, index, parent) === false) { return false; } index += step; } return true; } } },{}],43:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; function extend() { var target = {} for (var i = 0; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } },{}],"remark-rehype":[function(require,module,exports){ 'use strict'; var mdast2hast = require('mdast-util-to-hast'); module.exports = remark2rehype; /* Attacher. * If a destination is given, runs the destination with * the new HAST tree (bridge-mode). * Without destination, returns the HAST tree: further * plug-ins run on that tree (mutate-mode). */ function remark2rehype(destination, options) { if (destination && !destination.process) { options = destination; destination = null; } return destination ? bridge(destination, options) : mutate(options); } /* Bridge-mode. Runs the destination with the new HAST * tree. */ function bridge(destination, options) { return transformer; function transformer(node, file, next) { destination.run(mdast2hast(node, options), file, done); function done(err) { next(err); } } } /* Mutate-mode. Further transformers run on the HAST tree. */ function mutate(options) { return transformer; function transformer(node) { return mdast2hast(node, options); } } },{"mdast-util-to-hast":1}]},{},[]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9hbGwuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9mYWlsc2FmZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2Zvb3Rlci5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Jsb2NrcXVvdGUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9icmVhay5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2NvZGUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9kZWxldGUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9lbXBoYXNpcy5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Zvb3Rub3RlLXJlZmVyZW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Zvb3Rub3RlLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaGVhZGluZy5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2h0bWwuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbWFnZS1yZWZlcmVuY2UuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbWFnZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaW5saW5lLWNvZGUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saW5rLXJlZmVyZW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpbmsuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saXN0LWl0ZW0uanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saXN0LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvcGFyYWdyYXBoLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvcm9vdC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3N0cm9uZy5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RoZW1hdGljLWJyZWFrLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9vbmUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi93cmFwLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvY29sbGFwc2Utd2hpdGUtc3BhY2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L25vZGVfbW9kdWxlcy9kZXRhYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3Qvbm9kZV9tb2R1bGVzL2RldGFiL25vZGVfbW9kdWxlcy9yZXBlYXQtc3RyaW5nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1kZWZpbml0aW9ucy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3Qvbm9kZV9tb2R1bGVzL25vcm1hbGl6ZS11cmkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L25vZGVfbW9kdWxlcy90cmltLWxpbmVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvdHJpbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3Qvbm9kZV9tb2R1bGVzL3VuaXN0LWJ1aWxkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L25vZGVfbW9kdWxlcy91bmlzdC1idWlsZGVyL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1nZW5lcmF0ZWQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXBvc2l0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3Qvbm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIsInJlbWFyay1yZWh5cGUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvaW5kZXguanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBhbGw7XG5cbnZhciB0cmltID0gcmVxdWlyZSgndHJpbScpO1xudmFyIG9uZSA9IHJlcXVpcmUoJy4vb25lJyk7XG5cbi8qIFRyYW5zZm9ybSB0aGUgY2hpbGRyZW4gb2YgYHBhcmVudGAuICovXG5mdW5jdGlvbiBhbGwoaCwgcGFyZW50KSB7XG4gIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXTtcbiAgdmFyIGxlbmd0aCA9IG5vZGVzLmxlbmd0aDtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIHJlc3VsdDtcbiAgdmFyIGhlYWQ7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHQgPSBvbmUoaCwgbm9kZXNbaW5kZXhdLCBwYXJlbnQpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgaWYgKGluZGV4ICYmIG5vZGVzW2luZGV4IC0gMV0udHlwZSA9PT0gJ2JyZWFrJykge1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdHJpbS5sZWZ0KHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBoZWFkID0gcmVzdWx0LmNoaWxkcmVuICYmIHJlc3VsdC5jaGlsZHJlblswXTtcblxuICAgICAgICBpZiAoaGVhZCAmJiBoZWFkLnZhbHVlKSB7XG4gICAgICAgICAgaGVhZC52YWx1ZSA9IHRyaW0ubGVmdChoZWFkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlsc2FmZTtcblxudmFyIHUgPSByZXF1aXJlKCd1bmlzdC1idWlsZGVyJyk7XG52YXIgYWxsID0gcmVxdWlyZSgnLi9hbGwnKTtcblxuLyogUmV0dXJuIHRoZSBjb250ZW50IG9mIGEgcmVmZXJlbmNlIHdpdGhvdXQgZGVmaW5pdGlvblxuICogYXMgbWFya2Rvd24uICovXG5mdW5jdGlvbiBmYWlsc2FmZShoLCBub2RlLCBkZWZpbml0aW9uKSB7XG4gIHZhciBzdWJ0eXBlID0gbm9kZS5yZWZlcmVuY2VUeXBlO1xuXG4gIGlmIChzdWJ0eXBlICE9PSAnY29sbGFwc2VkJyAmJiBzdWJ0eXBlICE9PSAnZnVsbCcgJiYgIWRlZmluaXRpb24pIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnaW1hZ2VSZWZlcmVuY2UnKSB7XG4gICAgICByZXR1cm4gdSgndGV4dCcsICchWycgKyBub2RlLmFsdCArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt1KCd0ZXh0JywgJ1snKV0uY29uY2F0KGFsbChoLCBub2RlKSwgdSgndGV4dCcsICddJykpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhdGVGb290bm90ZXM7XG5cbnZhciB0aGVtYXRpY0JyZWFrID0gcmVxdWlyZSgnLi9oYW5kbGVycy90aGVtYXRpYy1icmVhaycpO1xudmFyIGxpc3QgPSByZXF1aXJlKCcuL2hhbmRsZXJzL2xpc3QnKTtcbnZhciB3cmFwID0gcmVxdWlyZSgnLi93cmFwJyk7XG5cbi8qIFRyYW5zZm9ybSBhbGwgZm9vdG5vdGUgZGVmaW5pdGlvbnMsIGlmIGFueS4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRm9vdG5vdGVzKGgpIHtcbiAgdmFyIGZvb3Rub3RlcyA9IGguZm9vdG5vdGVzO1xuICB2YXIgbGVuZ3RoID0gZm9vdG5vdGVzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIHZhciBsaXN0SXRlbXMgPSBbXTtcbiAgdmFyIGRlZjtcblxuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBkZWYgPSBmb290bm90ZXNbaW5kZXhdO1xuXG4gICAgbGlzdEl0ZW1zW2luZGV4XSA9IHtcbiAgICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgICBkYXRhOiB7aFByb3BlcnRpZXM6IHtpZDogJ2ZuLScgKyBkZWYuaWRlbnRpZmllcn19LFxuICAgICAgY2hpbGRyZW46IGRlZi5jaGlsZHJlbi5jb25jYXQoe1xuICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgIHVybDogJyNmbnJlZi0nICsgZGVmLmlkZW50aWZpZXIsXG4gICAgICAgIGRhdGE6IHtoUHJvcGVydGllczoge2NsYXNzTmFtZTogWydmb290bm90ZS1iYWNrcmVmJ119fSxcbiAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHZhbHVlOiAn4oapJ1xuICAgICAgICB9XVxuICAgICAgfSksXG4gICAgICBwb3NpdGlvbjogZGVmLnBvc2l0aW9uXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBoKG51bGwsICdkaXYnLCB7XG4gICAgY2xhc3NOYW1lOiBbJ2Zvb3Rub3RlcyddXG4gIH0sIHdyYXAoW1xuICAgIHRoZW1hdGljQnJlYWsoaCksXG4gICAgbGlzdChoLCB7XG4gICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICBvcmRlcmVkOiB0cnVlLFxuICAgICAgY2hpbGRyZW46IGxpc3RJdGVtc1xuICAgIH0pXG4gIF0sIHRydWUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBibG9ja3F1b3RlO1xuXG52YXIgd3JhcCA9IHJlcXVpcmUoJy4uL3dyYXAnKTtcbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGEgYmxvY2sgcXVvdGUuICovXG5mdW5jdGlvbiBibG9ja3F1b3RlKGgsIG5vZGUpIHtcbiAgcmV0dXJuIGgobm9kZSwgJ2Jsb2NrcXVvdGUnLCB3cmFwKGFsbChoLCBub2RlKSwgdHJ1ZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhcmRCcmVhaztcblxudmFyIHUgPSByZXF1aXJlKCd1bmlzdC1idWlsZGVyJyk7XG5cbi8qIFRyYW5zZm9ybSBhbiBpbmxpbmUgYnJlYWsuICovXG5mdW5jdGlvbiBoYXJkQnJlYWsoaCwgbm9kZSkge1xuICByZXR1cm4gW2gobm9kZSwgJ2JyJyksIHUoJ3RleHQnLCAnXFxuJyldO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvZGU7XG5cbnZhciBkZXRhYiA9IHJlcXVpcmUoJ2RldGFiJyk7XG52YXIgdSA9IHJlcXVpcmUoJ3VuaXN0LWJ1aWxkZXInKTtcblxuLyogVHJhbnNmb3JtIGEgY29kZSBibG9jay4gKi9cbmZ1bmN0aW9uIGNvZGUoaCwgbm9kZSkge1xuICB2YXIgdmFsdWUgPSBub2RlLnZhbHVlID8gZGV0YWIobm9kZS52YWx1ZSArICdcXG4nKSA6ICcnO1xuICB2YXIgbGFuZyA9IG5vZGUubGFuZyAmJiBub2RlLmxhbmcubWF0Y2goL15bXiBcXHRdKyg/PVsgXFx0XXwkKS8pO1xuICB2YXIgcHJvcHMgPSB7fTtcblxuICBpZiAobGFuZykge1xuICAgIHByb3BzLmNsYXNzTmFtZSA9IFsnbGFuZ3VhZ2UtJyArIGxhbmddO1xuICB9XG5cbiAgcmV0dXJuIGgobm9kZS5wb3NpdGlvbiwgJ3ByZScsIFtcbiAgICBoKG5vZGUsICdjb2RlJywgcHJvcHMsIFt1KCd0ZXh0JywgdmFsdWUpXSlcbiAgXSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWtldGhyb3VnaDtcblxudmFyIGFsbCA9IHJlcXVpcmUoJy4uL2FsbCcpO1xuXG4vKiBUcmFuc2Zvcm0gZGVsZXRpb25zLiAqL1xuZnVuY3Rpb24gc3RyaWtldGhyb3VnaChoLCBub2RlKSB7XG4gIHJldHVybiBoKG5vZGUsICdkZWwnLCBhbGwoaCwgbm9kZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVtcGhhc2lzO1xuXG52YXIgYWxsID0gcmVxdWlyZSgnLi4vYWxsJyk7XG5cbi8qIFRyYW5zZm9ybSBlbXBoYXNpcy4gKi9cbmZ1bmN0aW9uIGVtcGhhc2lzKGgsIG5vZGUpIHtcbiAgcmV0dXJuIGgobm9kZSwgJ2VtJywgYWxsKGgsIG5vZGUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmb290bm90ZVJlZmVyZW5jZTtcblxudmFyIHUgPSByZXF1aXJlKCd1bmlzdC1idWlsZGVyJyk7XG5cbi8qIFRyYW5zZm9ybSBhIHJlZmVyZW5jZSB0byBhIGZvb3Rub3RlLiAqL1xuZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2UoaCwgbm9kZSkge1xuICB2YXIgaWRlbnRpZmllciA9IG5vZGUuaWRlbnRpZmllcjtcblxuICByZXR1cm4gaChub2RlLnBvc2l0aW9uLCAnc3VwJywge2lkOiAnZm5yZWYtJyArIGlkZW50aWZpZXJ9LCBbXG4gICAgaChub2RlLCAnYScsIHtcbiAgICAgIGhyZWY6ICcjZm4tJyArIGlkZW50aWZpZXIsXG4gICAgICBjbGFzc05hbWU6IFsnZm9vdG5vdGUtcmVmJ11cbiAgICB9LCBbdSgndGV4dCcsIGlkZW50aWZpZXIpXSlcbiAgXSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZm9vdG5vdGU7XG5cbnZhciBmb290bm90ZVJlZmVyZW5jZSA9IHJlcXVpcmUoJy4vZm9vdG5vdGUtcmVmZXJlbmNlJyk7XG5cbi8qIFRyYW5zZm9ybSBhbiBpbmxpbmUgZm9vdG5vdGUuICovXG5mdW5jdGlvbiBmb290bm90ZShoLCBub2RlKSB7XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICB2YXIgaWRlbnRpZmllciA9IDE7XG4gIHZhciBmb290bm90ZXMgPSBoLmZvb3Rub3RlcztcbiAgdmFyIGxlbmd0aCA9IGZvb3Rub3Rlcy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWRlbnRpZmllcnNbaW5kZXhdID0gZm9vdG5vdGVzW2luZGV4XS5pZGVudGlmaWVyO1xuICB9XG5cbiAgd2hpbGUgKGlkZW50aWZpZXJzLmluZGV4T2YoU3RyaW5nKGlkZW50aWZpZXIpKSAhPT0gLTEpIHtcbiAgICBpZGVudGlmaWVyKys7XG4gIH1cblxuICBpZGVudGlmaWVyID0gU3RyaW5nKGlkZW50aWZpZXIpO1xuXG4gIGZvb3Rub3Rlcy5wdXNoKHtcbiAgICB0eXBlOiAnZm9vdG5vdGVEZWZpbml0aW9uJyxcbiAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuLFxuICAgIHBvc2l0aW9uOiBub2RlLnBvc2l0aW9uXG4gIH0pO1xuXG4gIHJldHVybiBmb290bm90ZVJlZmVyZW5jZShoLCB7XG4gICAgdHlwZTogJ2Zvb3Rub3RlUmVmZXJlbmNlJyxcbiAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgIHBvc2l0aW9uOiBub2RlLnBvc2l0aW9uXG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhlYWRpbmc7XG5cbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGEgaGVhZGluZy4gKi9cbmZ1bmN0aW9uIGhlYWRpbmcoaCwgbm9kZSkge1xuICByZXR1cm4gaChub2RlLCAnaCcgKyBub2RlLmRlcHRoLCBhbGwoaCwgbm9kZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGh0bWw7XG5cbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xuXG4vKiBSZXR1cm4gZWl0aGVyIGEgYHJhd2Agbm9kZSwgaW4gZGFuZ2Vyb3VzIG1vZGUsIG9yXG4gKiBub3RoaW5nLiAqL1xuZnVuY3Rpb24gaHRtbChoLCBub2RlKSB7XG4gIHJldHVybiBoLmRhbmdlcm91cyA/IGguYXVnbWVudChub2RlLCB1KCdyYXcnLCBub2RlLnZhbHVlKSkgOiBudWxsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGltYWdlUmVmZXJlbmNlO1xuXG52YXIgbm9ybWFsaXplID0gcmVxdWlyZSgnbm9ybWFsaXplLXVyaScpO1xudmFyIGZhaWxzYWZlID0gcmVxdWlyZSgnLi4vZmFpbHNhZmUnKTtcblxuLyogVHJhbnNmb3JtIGEgcmVmZXJlbmNlIHRvIGFuIGltYWdlLiAqL1xuZnVuY3Rpb24gaW1hZ2VSZWZlcmVuY2UoaCwgbm9kZSkge1xuICB2YXIgZGVmID0gaC5kZWZpbml0aW9uKG5vZGUuaWRlbnRpZmllcik7XG4gIHZhciBwcm9wcyA9IHtzcmM6IG5vcm1hbGl6ZSgoZGVmICYmIGRlZi51cmwpIHx8ICcnKSwgYWx0OiBub2RlLmFsdH07XG5cbiAgaWYgKGRlZiAmJiBkZWYudGl0bGUgIT09IG51bGwgJiYgZGVmLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50aXRsZSA9IGRlZi50aXRsZTtcbiAgfVxuXG4gIHJldHVybiBmYWlsc2FmZShoLCBub2RlLCBkZWYpIHx8IGgobm9kZSwgJ2ltZycsIHByb3BzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG5vcm1hbGl6ZSA9IHJlcXVpcmUoJ25vcm1hbGl6ZS11cmknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbWFnZTtcblxuLyogVHJhbnNmb3JtIGFuIGltYWdlLiAqL1xuZnVuY3Rpb24gaW1hZ2UoaCwgbm9kZSkge1xuICB2YXIgcHJvcHMgPSB7c3JjOiBub3JtYWxpemUobm9kZS51cmwpLCBhbHQ6IG5vZGUuYWx0fTtcblxuICBpZiAobm9kZS50aXRsZSAhPT0gbnVsbCAmJiBub2RlLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50aXRsZSA9IG5vZGUudGl0bGU7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCAnaW1nJywgcHJvcHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYmxvY2txdW90ZTogcmVxdWlyZSgnLi9ibG9ja3F1b3RlJyksXG4gIGJyZWFrOiByZXF1aXJlKCcuL2JyZWFrJyksXG4gIGNvZGU6IHJlcXVpcmUoJy4vY29kZScpLFxuICBkZWxldGU6IHJlcXVpcmUoJy4vZGVsZXRlJyksXG4gIGVtcGhhc2lzOiByZXF1aXJlKCcuL2VtcGhhc2lzJyksXG4gIGZvb3Rub3RlUmVmZXJlbmNlOiByZXF1aXJlKCcuL2Zvb3Rub3RlLXJlZmVyZW5jZScpLFxuICBmb290bm90ZTogcmVxdWlyZSgnLi9mb290bm90ZScpLFxuICBoZWFkaW5nOiByZXF1aXJlKCcuL2hlYWRpbmcnKSxcbiAgaHRtbDogcmVxdWlyZSgnLi9odG1sJyksXG4gIGltYWdlUmVmZXJlbmNlOiByZXF1aXJlKCcuL2ltYWdlLXJlZmVyZW5jZScpLFxuICBpbWFnZTogcmVxdWlyZSgnLi9pbWFnZScpLFxuICBpbmxpbmVDb2RlOiByZXF1aXJlKCcuL2lubGluZS1jb2RlJyksXG4gIGxpbmtSZWZlcmVuY2U6IHJlcXVpcmUoJy4vbGluay1yZWZlcmVuY2UnKSxcbiAgbGluazogcmVxdWlyZSgnLi9saW5rJyksXG4gIGxpc3RJdGVtOiByZXF1aXJlKCcuL2xpc3QtaXRlbScpLFxuICBsaXN0OiByZXF1aXJlKCcuL2xpc3QnKSxcbiAgcGFyYWdyYXBoOiByZXF1aXJlKCcuL3BhcmFncmFwaCcpLFxuICByb290OiByZXF1aXJlKCcuL3Jvb3QnKSxcbiAgc3Ryb25nOiByZXF1aXJlKCcuL3N0cm9uZycpLFxuICB0YWJsZTogcmVxdWlyZSgnLi90YWJsZScpLFxuICB0ZXh0OiByZXF1aXJlKCcuL3RleHQnKSxcbiAgdGhlbWF0aWNCcmVhazogcmVxdWlyZSgnLi90aGVtYXRpYy1icmVhaycpLFxuICB5YW1sOiBpZ25vcmUsXG4gIGRlZmluaXRpb246IGlnbm9yZSxcbiAgZm9vdG5vdGVEZWZpbml0aW9uOiBpZ25vcmVcbn07XG5cbi8qIFJldHVybiBub3RoaW5nIGZvciBub2RlcyB3aGljaCBhcmUgaWdub3JlZC4gKi9cbmZ1bmN0aW9uIGlnbm9yZSgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5saW5lQ29kZTtcblxudmFyIGNvbGxhcHNlID0gcmVxdWlyZSgnY29sbGFwc2Utd2hpdGUtc3BhY2UnKTtcbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xuXG4vKiBUcmFuc2Zvcm0gaW5saW5lIGNvZGUuICovXG5mdW5jdGlvbiBpbmxpbmVDb2RlKGgsIG5vZGUpIHtcbiAgcmV0dXJuIGgobm9kZSwgJ2NvZGUnLCBbdSgndGV4dCcsIGNvbGxhcHNlKG5vZGUudmFsdWUpKV0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxpbmtSZWZlcmVuY2U7XG5cbnZhciBub3JtYWxpemUgPSByZXF1aXJlKCdub3JtYWxpemUtdXJpJyk7XG52YXIgZmFpbHNhZmUgPSByZXF1aXJlKCcuLi9mYWlsc2FmZScpO1xudmFyIGFsbCA9IHJlcXVpcmUoJy4uL2FsbCcpO1xuXG4vKiBUcmFuc2Zvcm0gYSByZWZlcmVuY2UgdG8gYSBsaW5rLiAqL1xuZnVuY3Rpb24gbGlua1JlZmVyZW5jZShoLCBub2RlKSB7XG4gIHZhciBkZWYgPSBoLmRlZmluaXRpb24obm9kZS5pZGVudGlmaWVyKTtcbiAgdmFyIHByb3BzID0ge2hyZWY6IG5vcm1hbGl6ZSgoZGVmICYmIGRlZi51cmwpIHx8ICcnKX07XG5cbiAgaWYgKGRlZiAmJiBkZWYudGl0bGUgIT09IG51bGwgJiYgZGVmLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50aXRsZSA9IGRlZi50aXRsZTtcbiAgfVxuXG4gIHJldHVybiBmYWlsc2FmZShoLCBub2RlLCBkZWYpIHx8IGgobm9kZSwgJ2EnLCBwcm9wcywgYWxsKGgsIG5vZGUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG5vcm1hbGl6ZSA9IHJlcXVpcmUoJ25vcm1hbGl6ZS11cmknKTtcbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsaW5rO1xuXG4vKiBUcmFuc2Zvcm0gYSBsaW5rLiAqL1xuZnVuY3Rpb24gbGluayhoLCBub2RlKSB7XG4gIHZhciBwcm9wcyA9IHtocmVmOiBub3JtYWxpemUobm9kZS51cmwpfTtcblxuICBpZiAobm9kZS50aXRsZSAhPT0gbnVsbCAmJiBub2RlLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50aXRsZSA9IG5vZGUudGl0bGU7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCAnYScsIHByb3BzLCBhbGwoaCwgbm9kZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RJdGVtO1xuXG52YXIgdSA9IHJlcXVpcmUoJ3VuaXN0LWJ1aWxkZXInKTtcbnZhciB3cmFwID0gcmVxdWlyZSgnLi4vd3JhcCcpO1xudmFyIGFsbCA9IHJlcXVpcmUoJy4uL2FsbCcpO1xuXG4vKiBUcmFuc2Zvcm0gYSBsaXN0LWl0ZW0uICovXG5mdW5jdGlvbiBsaXN0SXRlbShoLCBub2RlLCBwYXJlbnQpIHtcbiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgdmFyIGhlYWQgPSBjaGlsZHJlblswXTtcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBzaW5nbGUgPSBmYWxzZTtcbiAgdmFyIHJlc3VsdDtcbiAgdmFyIGNvbnRhaW5lcjtcblxuICBpZiAoKCFwYXJlbnQgfHwgIXBhcmVudC5sb29zZSkgJiYgY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGhlYWQudHlwZSA9PT0gJ3BhcmFncmFwaCcpIHtcbiAgICBzaW5nbGUgPSB0cnVlO1xuICB9XG5cbiAgcmVzdWx0ID0gYWxsKGgsIHNpbmdsZSA/IGhlYWQgOiBub2RlKTtcblxuICBpZiAodHlwZW9mIG5vZGUuY2hlY2tlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgaWYgKCFzaW5nbGUgJiYgKCFoZWFkIHx8IGhlYWQudHlwZSAhPT0gJ3BhcmFncmFwaCcpKSB7XG4gICAgICByZXN1bHQudW5zaGlmdChoKG51bGwsICdwJywgW10pKTtcbiAgICB9XG5cbiAgICBjb250YWluZXIgPSBzaW5nbGUgPyByZXN1bHQgOiByZXN1bHRbMF0uY2hpbGRyZW47XG5cbiAgICBpZiAoY29udGFpbmVyLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29udGFpbmVyLnVuc2hpZnQodSgndGV4dCcsICcgJykpO1xuICAgIH1cblxuICAgIGNvbnRhaW5lci51bnNoaWZ0KGgobnVsbCwgJ2lucHV0Jywge1xuICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgIGNoZWNrZWQ6IG5vZGUuY2hlY2tlZCxcbiAgICAgIGRpc2FibGVkOiB0cnVlXG4gICAgfSkpO1xuXG4gICAgLyogQWNjb3JkaW5nIHRvIGdpdGh1Yi1tYXJrZG93bi1jc3MsIHRoaXMgY2xhc3MgaGlkZXMgYnVsbGV0LiAqL1xuICAgIHByb3BzLmNsYXNzTmFtZSA9IFsndGFzay1saXN0LWl0ZW0nXTtcbiAgfVxuXG4gIGlmICghc2luZ2xlICYmIHJlc3VsdC5sZW5ndGggIT09IDApIHtcbiAgICByZXN1bHQgPSB3cmFwKHJlc3VsdCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCAnbGknLCBwcm9wcywgcmVzdWx0KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0O1xuXG52YXIgd3JhcCA9IHJlcXVpcmUoJy4uL3dyYXAnKTtcbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGEgbGlzdC4gKi9cbmZ1bmN0aW9uIGxpc3QoaCwgbm9kZSkge1xuICB2YXIgcHJvcHMgPSB7fTtcbiAgdmFyIG5hbWUgPSBub2RlLm9yZGVyZWQgPyAnb2wnIDogJ3VsJztcblxuICBpZiAodHlwZW9mIG5vZGUuc3RhcnQgPT09ICdudW1iZXInICYmIG5vZGUuc3RhcnQgIT09IDEpIHtcbiAgICBwcm9wcy5zdGFydCA9IG5vZGUuc3RhcnQ7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCBuYW1lLCBwcm9wcywgd3JhcChhbGwoaCwgbm9kZSksIHRydWUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJhZ3JhcGg7XG5cbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGEgcGFyYWdyYXBoLiAqL1xuZnVuY3Rpb24gcGFyYWdyYXBoKGgsIG5vZGUpIHtcbiAgcmV0dXJuIGgobm9kZSwgJ3AnLCBhbGwoaCwgbm9kZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG5cbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xudmFyIHdyYXAgPSByZXF1aXJlKCcuLi93cmFwJyk7XG52YXIgYWxsID0gcmVxdWlyZSgnLi4vYWxsJyk7XG5cbi8qIFRyYW5zZm9ybSBhIGByb290YC4gKi9cbmZ1bmN0aW9uIHJvb3QoaCwgbm9kZSkge1xuICByZXR1cm4gaC5hdWdtZW50KG5vZGUsIHUoJ3Jvb3QnLCB3cmFwKGFsbChoLCBub2RlKSkpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJvbmc7XG5cbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGltcG9ydGFuY2UuICovXG5mdW5jdGlvbiBzdHJvbmcoaCwgbm9kZSkge1xuICByZXR1cm4gaChub2RlLCAnc3Ryb25nJywgYWxsKGgsIG5vZGUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB0YWJsZTtcblxudmFyIHBvc2l0aW9uID0gcmVxdWlyZSgndW5pc3QtdXRpbC1wb3NpdGlvbicpO1xudmFyIHdyYXAgPSByZXF1aXJlKCcuLi93cmFwJyk7XG52YXIgYWxsID0gcmVxdWlyZSgnLi4vYWxsJyk7XG5cbi8qIFRyYW5zZm9ybSBhIHRhYmxlLiAqL1xuZnVuY3Rpb24gdGFibGUoaCwgbm9kZSkge1xuICB2YXIgcm93cyA9IG5vZGUuY2hpbGRyZW47XG4gIHZhciBpbmRleCA9IHJvd3MubGVuZ3RoO1xuICB2YXIgYWxpZ24gPSBub2RlLmFsaWduO1xuICB2YXIgYWxpZ25MZW5ndGggPSBhbGlnbi5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHBvcztcbiAgdmFyIHJvdztcbiAgdmFyIG91dDtcbiAgdmFyIG5hbWU7XG4gIHZhciBjZWxsO1xuXG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgcm93ID0gcm93c1tpbmRleF0uY2hpbGRyZW47XG4gICAgbmFtZSA9IGluZGV4ID09PSAwID8gJ3RoJyA6ICd0ZCc7XG4gICAgcG9zID0gYWxpZ25MZW5ndGg7XG4gICAgb3V0ID0gW107XG5cbiAgICB3aGlsZSAocG9zLS0pIHtcbiAgICAgIGNlbGwgPSByb3dbcG9zXTtcbiAgICAgIG91dFtwb3NdID0gaChjZWxsLCBuYW1lLCB7XG4gICAgICAgIGFsaWduOiBhbGlnbltwb3NdXG4gICAgICB9LCBjZWxsID8gd3JhcChhbGwoaCwgY2VsbCkpIDogW10pO1xuICAgIH1cblxuICAgIHJlc3VsdFtpbmRleF0gPSBoKHJvd3NbaW5kZXhdLCAndHInLCB3cmFwKG91dCwgdHJ1ZSkpO1xuICB9XG5cbiAgcmV0dXJuIGgobm9kZSwgJ3RhYmxlJywgd3JhcChbXG4gICAgaChyZXN1bHRbMF0ucG9zaXRpb24sICd0aGVhZCcsIHdyYXAoW3Jlc3VsdFswXV0sIHRydWUpKSxcbiAgICBoKHtcbiAgICAgIHN0YXJ0OiBwb3NpdGlvbi5zdGFydChyZXN1bHRbMV0pLFxuICAgICAgZW5kOiBwb3NpdGlvbi5lbmQocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSlcbiAgICB9LCAndGJvZHknLCB3cmFwKHJlc3VsdC5zbGljZSgxKSwgdHJ1ZSkpXG4gIF0sIHRydWUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB0ZXh0O1xuXG52YXIgdSA9IHJlcXVpcmUoJ3VuaXN0LWJ1aWxkZXInKTtcbnZhciB0cmltTGluZXMgPSByZXF1aXJlKCd0cmltLWxpbmVzJyk7XG5cbi8qIFRyYW5zZm9ybSB0ZXh0LiAqL1xuZnVuY3Rpb24gdGV4dChoLCBub2RlKSB7XG4gIHJldHVybiBoLmF1Z21lbnQobm9kZSwgdSgndGV4dCcsIHRyaW1MaW5lcyhub2RlLnZhbHVlKSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRoZW1hdGljQnJlYWs7XG5cbi8qIFRyYW5zZm9ybSBhIHRoZW1hdGljIGJyZWFrIC8gaG9yaXpvbnRhbCBydWxlLiAqL1xuZnVuY3Rpb24gdGhlbWF0aWNCcmVhayhoLCBub2RlKSB7XG4gIHJldHVybiBoKG5vZGUsICdocicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRvSEFTVDtcblxudmFyIHh0ZW5kID0gcmVxdWlyZSgneHRlbmQnKTtcbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xudmFyIHZpc2l0ID0gcmVxdWlyZSgndW5pc3QtdXRpbC12aXNpdCcpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZSgndW5pc3QtdXRpbC1wb3NpdGlvbicpO1xudmFyIGdlbmVyYXRlZCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtZ2VuZXJhdGVkJyk7XG52YXIgZGVmaW5pdGlvbnMgPSByZXF1aXJlKCdtZGFzdC11dGlsLWRlZmluaXRpb25zJyk7XG52YXIgb25lID0gcmVxdWlyZSgnLi9vbmUnKTtcbnZhciBmb290ZXIgPSByZXF1aXJlKCcuL2Zvb3RlcicpO1xudmFyIGhhbmRsZXJzID0gcmVxdWlyZSgnLi9oYW5kbGVycycpO1xuXG4vKiBGYWN0b3J5IHRvIHRyYW5zZm9ybS4gKi9cbmZ1bmN0aW9uIGZhY3RvcnkodHJlZSwgb3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZGFuZ2Vyb3VzID0gc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNIVE1MO1xuXG4gIGguZGFuZ2Vyb3VzID0gZGFuZ2Vyb3VzO1xuICBoLmRlZmluaXRpb24gPSBkZWZpbml0aW9ucyh0cmVlLCBzZXR0aW5ncyk7XG4gIGguZm9vdG5vdGVzID0gW107XG4gIGguYXVnbWVudCA9IGF1Z21lbnQ7XG4gIGguaGFuZGxlcnMgPSB4dGVuZChoYW5kbGVycywgKHNldHRpbmdzLmhhbmRsZXJzIHx8IHt9KSk7XG5cbiAgdmlzaXQodHJlZSwgJ2Zvb3Rub3RlRGVmaW5pdGlvbicsIHZpc2l0b3IpO1xuXG4gIHJldHVybiBoO1xuXG4gIC8qIEZpbmFsaXNlIHRoZSBjcmVhdGVkIGByaWdodGAsIGEgSEFTVCBub2RlLCBmcm9tXG4gICAqIGBsZWZ0YCwgYW4gTURBU1Qgbm9kZS4gICAqL1xuICBmdW5jdGlvbiBhdWdtZW50KGxlZnQsIHJpZ2h0KSB7XG4gICAgdmFyIGRhdGE7XG4gICAgdmFyIGN0eDtcblxuICAgIC8qIEhhbmRsZSBgZGF0YS5oTmFtZWAsIGBkYXRhLmhQcm9wZXJ0aWVzLCBgaENoaWxkcmVuYC4gKi9cbiAgICBpZiAobGVmdCAmJiAnZGF0YScgaW4gbGVmdCkge1xuICAgICAgZGF0YSA9IGxlZnQuZGF0YTtcblxuICAgICAgaWYgKHJpZ2h0LnR5cGUgPT09ICdlbGVtZW50JyAmJiBkYXRhLmhOYW1lKSB7XG4gICAgICAgIHJpZ2h0LnRhZ05hbWUgPSBkYXRhLmhOYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHQudHlwZSA9PT0gJ2VsZW1lbnQnICYmIGRhdGEuaFByb3BlcnRpZXMpIHtcbiAgICAgICAgcmlnaHQucHJvcGVydGllcyA9IHh0ZW5kKHJpZ2h0LnByb3BlcnRpZXMsIGRhdGEuaFByb3BlcnRpZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHQuY2hpbGRyZW4gJiYgZGF0YS5oQ2hpbGRyZW4pIHtcbiAgICAgICAgcmlnaHQuY2hpbGRyZW4gPSBkYXRhLmhDaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdHggPSBsZWZ0ICYmIGxlZnQucG9zaXRpb24gPyBsZWZ0IDoge3Bvc2l0aW9uOiBsZWZ0fTtcblxuICAgIGlmICghZ2VuZXJhdGVkKGN0eCkpIHtcbiAgICAgIHJpZ2h0LnBvc2l0aW9uID0ge1xuICAgICAgICBzdGFydDogcG9zaXRpb24uc3RhcnQoY3R4KSxcbiAgICAgICAgZW5kOiBwb3NpdGlvbi5lbmQoY3R4KVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmlnaHQ7XG4gIH1cblxuICAvKiBDcmVhdGUgYW4gZWxlbWVudCBmb3IgYSBgbm9kZWAuICovXG4gIGZ1bmN0aW9uIGgobm9kZSwgdGFnTmFtZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gICAgaWYgKFxuICAgICAgKGNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgY2hpbGRyZW4gPT09IG51bGwpICYmXG4gICAgICB0eXBlb2YgcHJvcHMgPT09ICdvYmplY3QnICYmXG4gICAgICAnbGVuZ3RoJyBpbiBwcm9wc1xuICAgICkge1xuICAgICAgY2hpbGRyZW4gPSBwcm9wcztcbiAgICAgIHByb3BzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGF1Z21lbnQobm9kZSwge1xuICAgICAgdHlwZTogJ2VsZW1lbnQnLFxuICAgICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICAgIHByb3BlcnRpZXM6IHByb3BzIHx8IHt9LFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpdG9yKGRlZmluaXRpb24pIHtcbiAgICBoLmZvb3Rub3Rlcy5wdXNoKGRlZmluaXRpb24pO1xuICB9XG59XG5cbi8qIFRyYW5zZm9ybSBgdHJlZWAsIHdoaWNoIGlzIGFuIE1EQVNUIG5vZGUsIHRvIGEgSEFTVCBub2RlLiAqL1xuZnVuY3Rpb24gdG9IQVNUKHRyZWUsIG9wdGlvbnMpIHtcbiAgdmFyIGggPSBmYWN0b3J5KHRyZWUsIG9wdGlvbnMpO1xuICB2YXIgbm9kZSA9IG9uZShoLCB0cmVlKTtcbiAgdmFyIGZvb3Rub3RlcyA9IGZvb3RlcihoKTtcblxuICBpZiAobm9kZSAmJiBub2RlLmNoaWxkcmVuICYmIGZvb3Rub3Rlcykge1xuICAgIG5vZGUuY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLmNvbmNhdCh1KCd0ZXh0JywgJ1xcbicpLCBmb290bm90ZXMpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gb25lO1xuXG52YXIgdSA9IHJlcXVpcmUoJ3VuaXN0LWJ1aWxkZXInKTtcbnZhciBhbGwgPSByZXF1aXJlKCcuL2FsbCcpO1xuXG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cbi8qIFRyYW5zZm9ybSBhbiB1bmtub3duIG5vZGUuICovXG5mdW5jdGlvbiB1bmtub3duKGgsIG5vZGUpIHtcbiAgaWYgKHRleHQobm9kZSkpIHtcbiAgICByZXR1cm4gaC5hdWdtZW50KG5vZGUsIHUoJ3RleHQnLCBub2RlLnZhbHVlKSk7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCAnZGl2JywgYWxsKGgsIG5vZGUpKTtcbn1cblxuLyogVmlzaXQgYSBub2RlLiAqL1xuZnVuY3Rpb24gb25lKGgsIG5vZGUsIHBhcmVudCkge1xuICB2YXIgdHlwZSA9IG5vZGUgJiYgbm9kZS50eXBlO1xuICB2YXIgZm4gPSBvd24uY2FsbChoLmhhbmRsZXJzLCB0eXBlKSA/IGguaGFuZGxlcnNbdHlwZV0gOiBudWxsO1xuXG4gIC8qIEZhaWwgb24gbm9uLW5vZGVzLiAqL1xuICBpZiAoIXR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG5vZGUsIGdvdCBgJyArIG5vZGUgKyAnYCcpO1xuICB9XG5cbiAgcmV0dXJuICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgPyBmbiA6IHVua25vd24pKGgsIG5vZGUsIHBhcmVudCk7XG59XG5cbi8qIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSByZW5kZXJlcmVkIGEgdGV4dCBub2RlLiAqL1xuZnVuY3Rpb24gdGV4dChub2RlKSB7XG4gIHZhciBkYXRhID0gbm9kZS5kYXRhIHx8IHt9O1xuXG4gIGlmIChvd24uY2FsbChkYXRhLCAnaE5hbWUnKSB8fCBvd24uY2FsbChkYXRhLCAnaFByb3BlcnRpZXMnKSB8fCBvd24uY2FsbChkYXRhLCAnaENoaWxkcmVuJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gJ3ZhbHVlJyBpbiBub2RlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5cbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xuXG4vKiBXcmFwIGBub2Rlc2Agd2l0aCBuZXdsaW5lcyBiZXR3ZWVuIGVhY2ggZW50cnkuXG4gKiBPcHRpb25hbGx5IGFkZHMgbmV3bGluZXMgYXQgdGhlIHN0YXJ0IGFuZCBlbmQuICovXG5mdW5jdGlvbiB3cmFwKG5vZGVzLCBsb29zZSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuXG4gIGlmIChsb29zZSkge1xuICAgIHJlc3VsdC5wdXNoKHUoJ3RleHQnLCAnXFxuJykpO1xuICB9XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoaW5kZXgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHUoJ3RleHQnLCAnXFxuJykpO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKG5vZGVzW2luZGV4XSk7XG4gIH1cblxuICBpZiAobG9vc2UgJiYgbm9kZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgcmVzdWx0LnB1c2godSgndGV4dCcsICdcXG4nKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbGxhcHNlO1xuXG4vKiBjb2xsYXBzZSgnIFxcdFxcbmJhciBcXG5iYXpcXHQnKTsgLy8gJyBiYXIgYmF6ICcgKi9cbmZ1bmN0aW9uIGNvbGxhcHNlKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBkZXRhYjtcblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcblxudmFyIFRBQiA9IDB4MDk7XG52YXIgTEYgPSAweDBBO1xudmFyIENSID0gMHgwRDtcblxuLyogUmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzLCBiZWluZyBzbWFydCBhYm91dCB3aGljaFxuICogY29sdW1uIHRoZSB0YWIgaXMgYXQgYW5kIHdoaWNoIHNpemUgc2hvdWxkIGJlIHVzZWQuICovXG5mdW5jdGlvbiBkZXRhYih2YWx1ZSwgc2l6ZSkge1xuICB2YXIgc3RyaW5nID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgdmFyIGxlbmd0aCA9IHN0cmluZyAmJiB2YWx1ZS5sZW5ndGg7XG4gIHZhciBzdGFydCA9IDA7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgY29sdW1uID0gLTE7XG4gIHZhciB0YWJTaXplID0gc2l6ZSB8fCA0O1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgY29kZTtcbiAgdmFyIGFkZDtcblxuICBpZiAoIXN0cmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcignZGV0YWIgZXhwZWN0ZWQgc3RyaW5nJyk7XG4gIH1cblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNvZGUgPSB2YWx1ZS5jaGFyQ29kZUF0KGluZGV4KTtcblxuICAgIGlmIChjb2RlID09PSBUQUIpIHtcbiAgICAgIGFkZCA9IHRhYlNpemUgLSAoKGNvbHVtbiArIDEpICUgdGFiU2l6ZSk7XG4gICAgICBjb2x1bW4gKz0gYWRkO1xuICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlLnNsaWNlKHN0YXJ0LCBpbmRleCkgKyByZXBlYXQoJyAnLCBhZGQpKTtcbiAgICAgIHN0YXJ0ID0gaW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gTEYgfHwgY29kZSA9PT0gQ1IpIHtcbiAgICAgIGNvbHVtbiA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2x1bW4rKztcbiAgICB9XG4gIH1cblxuICByZXN1bHRzLnB1c2godmFsdWUuc2xpY2Uoc3RhcnQpKTtcblxuICByZXR1cm4gcmVzdWx0cy5qb2luKCcnKTtcbn1cbiIsIi8qIVxuICogcmVwZWF0LXN0cmluZyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvcmVwZWF0LXN0cmluZz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlc3VsdHMgY2FjaGVcbiAqL1xuXG52YXIgcmVzID0gJyc7XG52YXIgY2FjaGU7XG5cbi8qKlxuICogRXhwb3NlIGByZXBlYXRgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXBlYXQ7XG5cbi8qKlxuICogUmVwZWF0IHRoZSBnaXZlbiBgc3RyaW5nYCB0aGUgc3BlY2lmaWVkIGBudW1iZXJgXG4gKiBvZiB0aW1lcy5cbiAqXG4gKiAqKkV4YW1wbGU6KipcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcbiAqIHJlcGVhdCgnQScsIDUpO1xuICogLy89PiBBQUFBQVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJpbmdgIFRoZSBzdHJpbmcgdG8gcmVwZWF0XG4gKiBAcGFyYW0ge051bWJlcn0gYG51bWJlcmAgVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSBSZXBlYXRlZCBzdHJpbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmVwZWF0KHN0ciwgbnVtKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIH1cblxuICAvLyBjb3ZlciBjb21tb24sIHF1aWNrIHVzZSBjYXNlc1xuICBpZiAobnVtID09PSAxKSByZXR1cm4gc3RyO1xuICBpZiAobnVtID09PSAyKSByZXR1cm4gc3RyICsgc3RyO1xuXG4gIHZhciBtYXggPSBzdHIubGVuZ3RoICogbnVtO1xuICBpZiAoY2FjaGUgIT09IHN0ciB8fCB0eXBlb2YgY2FjaGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgY2FjaGUgPSBzdHI7XG4gICAgcmVzID0gJyc7XG4gIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA+PSBtYXgpIHtcbiAgICByZXR1cm4gcmVzLnN1YnN0cigwLCBtYXgpO1xuICB9XG5cbiAgd2hpbGUgKG1heCA+IHJlcy5sZW5ndGggJiYgbnVtID4gMSkge1xuICAgIGlmIChudW0gJiAxKSB7XG4gICAgICByZXMgKz0gc3RyO1xuICAgIH1cblxuICAgIG51bSA+Pj0gMTtcbiAgICBzdHIgKz0gc3RyO1xuICB9XG5cbiAgcmVzICs9IHN0cjtcbiAgcmVzID0gcmVzLnN1YnN0cigwLCBtYXgpO1xuICByZXR1cm4gcmVzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdmlzaXQgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RGVmaW5pdGlvbkZhY3Rvcnk7XG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuLyogR2V0IGEgZGVmaW5pdGlvbiBpbiBgbm9kZWAgYnkgYGlkZW50aWZpZXJgLiAqL1xuZnVuY3Rpb24gZ2V0RGVmaW5pdGlvbkZhY3Rvcnkobm9kZSwgb3B0aW9ucykge1xuICByZXR1cm4gZ2V0dGVyRmFjdG9yeShnYXRoZXIobm9kZSwgb3B0aW9ucykpO1xufVxuXG4vKiBHYXRoZXIgYWxsIGRlZmluaXRpb25zIGluIGBub2RlYCAqL1xuZnVuY3Rpb24gZ2F0aGVyKG5vZGUsIG9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlID0ge307XG5cbiAgaWYgKCFub2RlIHx8ICFub2RlLnR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21kYXN0LXV0aWwtZGVmaW5pdGlvbnMgZXhwZWN0ZWQgbm9kZScpO1xuICB9XG5cbiAgdmlzaXQobm9kZSwgJ2RlZmluaXRpb24nLCBvcHRpb25zICYmIG9wdGlvbnMuY29tbW9ubWFyayA/IGNvbW1vbm1hcmsgOiBub3JtYWwpO1xuXG4gIHJldHVybiBjYWNoZTtcblxuICBmdW5jdGlvbiBjb21tb25tYXJrKGRlZmluaXRpb24pIHtcbiAgICB2YXIgaWQgPSBub3JtYWxpc2UoZGVmaW5pdGlvbi5pZGVudGlmaWVyKTtcbiAgICBpZiAoIW93bi5jYWxsKGNhY2hlLCBpZCkpIHtcbiAgICAgIGNhY2hlW2lkXSA9IGRlZmluaXRpb247XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsKGRlZmluaXRpb24pIHtcbiAgICBjYWNoZVtub3JtYWxpc2UoZGVmaW5pdGlvbi5pZGVudGlmaWVyKV0gPSBkZWZpbml0aW9uO1xuICB9XG59XG5cbi8qIEZhY3RvcnkgdG8gZ2V0IGEgbm9kZSBmcm9tIHRoZSBnaXZlbiBkZWZpbml0aW9uLWNhY2hlLiAqL1xuZnVuY3Rpb24gZ2V0dGVyRmFjdG9yeShjYWNoZSkge1xuICByZXR1cm4gZ2V0dGVyO1xuXG4gIC8qIEdldCBhIG5vZGUgZnJvbSB0aGUgYm91bmQgZGVmaW5pdGlvbi1jYWNoZS4gKi9cbiAgZnVuY3Rpb24gZ2V0dGVyKGlkZW50aWZpZXIpIHtcbiAgICB2YXIgaWQgPSBpZGVudGlmaWVyICYmIG5vcm1hbGlzZShpZGVudGlmaWVyKTtcbiAgICByZXR1cm4gaWQgJiYgb3duLmNhbGwoY2FjaGUsIGlkKSA/IGNhY2hlW2lkXSA6IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXNlKGlkZW50aWZpZXIpIHtcbiAgcmV0dXJuIGlkZW50aWZpZXIudG9VcHBlckNhc2UoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXR1cm5lcjtcblxudHJ5IHtcbiAgbm9ybWFsaXplKCcnKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSBub3JtYWxpemU7XG59IGNhdGNoIChlcnIpIHt9XG5cbi8qIE5vcm1hbGl6ZSBgdXJpYC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZSh1cmkpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShkZWNvZGVVUkkodXJpKSk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gRmFsbGJhY2ssIHJldHVybiBpbnB1dC4gKi9cbmZ1bmN0aW9uIHJldHVybmVyKHVyaSkge1xuICByZXR1cm4gdXJpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRyaW1MaW5lcztcblxudmFyIHdzID0gL1sgXFx0XSpcXG4rWyBcXHRdKi9nO1xudmFyIG5ld2xpbmUgPSAnXFxuJztcblxuZnVuY3Rpb24gdHJpbUxpbmVzKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2Uod3MsIG5ld2xpbmUpO1xufVxuIiwiXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0cmltO1xuXG5mdW5jdGlvbiB0cmltKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuXG5leHBvcnRzLmxlZnQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpO1xufTtcblxuZXhwb3J0cy5yaWdodCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdSAodHlwZSwgcHJvcHMsIHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsICYmICh0eXBlb2YgcHJvcHMgIT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcm9wcykpKSB7XG4gICAgdmFsdWUgPSBwcm9wcztcbiAgICBwcm9wcyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIGFzc2lnbih7fSwgcHJvcHMsIHsgdHlwZTogU3RyaW5nKHR5cGUpIH0sXG4gICAgICAgICAgICAgICAgdmFsdWUgIT0gbnVsbCAmJiAoQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgY2hpbGRyZW46IHZhbHVlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6IFN0cmluZyh2YWx1ZSkgfSkpO1xufTtcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIEV4cG9zZS4gKi9cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhdGVkO1xuXG4vKiBEZXRlY3QgaWYgYSBub2RlIHdhcyBhdmFpbGFibGUgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50LiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVkKG5vZGUpIHtcbiAgdmFyIHBvc2l0aW9uID0gb3B0aW9uYWwob3B0aW9uYWwobm9kZSkucG9zaXRpb24pO1xuICB2YXIgc3RhcnQgPSBvcHRpb25hbChwb3NpdGlvbi5zdGFydCk7XG4gIHZhciBlbmQgPSBvcHRpb25hbChwb3NpdGlvbi5lbmQpO1xuXG4gIHJldHVybiAhc3RhcnQubGluZSB8fCAhc3RhcnQuY29sdW1uIHx8ICFlbmQubGluZSB8fCAhZW5kLmNvbHVtbjtcbn1cblxuLyogUmV0dXJuIGB2YWx1ZWAgaWYgaXTigJlzIGFuIG9iamVjdCwgYW4gZW1wdHkgb2JqZWN0XG4gKiBvdGhlcndpc2UuICovXG5mdW5jdGlvbiBvcHRpb25hbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDoge307XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIEV4cG9zZS4gKi9cbnZhciBwb3NpdGlvbiA9IGV4cG9ydHM7XG5cbnBvc2l0aW9uLnN0YXJ0ID0gcG9zaXRpb25GYWN0b3J5KCdzdGFydCcpO1xucG9zaXRpb24uZW5kID0gcG9zaXRpb25GYWN0b3J5KCdlbmQnKTtcblxuLyogRmFjdG9yeSB0byBnZXQgYSBwb3NpdGlvbiBhdCBgdHlwZWAuICovXG5mdW5jdGlvbiBwb3NpdGlvbkZhY3RvcnkodHlwZSkge1xuICByZXR1cm4gcG9zO1xuXG4gIC8qIEdldCBhIHBvc2l0aW9uIGluIGBub2RlYCBhdCBhIGJvdW5kIGB0eXBlYC4gKi9cbiAgZnVuY3Rpb24gcG9zKG5vZGUpIHtcbiAgICB2YXIgcG9zID0gKG5vZGUgJiYgbm9kZS5wb3NpdGlvbiAmJiBub2RlLnBvc2l0aW9uW3R5cGVdKSB8fCB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBwb3MubGluZSB8fCBudWxsLFxuICAgICAgY29sdW1uOiBwb3MuY29sdW1uIHx8IG51bGwsXG4gICAgICBvZmZzZXQ6IGlzTmFOKHBvcy5vZmZzZXQpID8gbnVsbCA6IHBvcy5vZmZzZXRcbiAgICB9O1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIEV4cG9zZS4gKi9cbm1vZHVsZS5leHBvcnRzID0gdmlzaXQ7XG5cbi8qIFZpc2l0LiAqL1xuZnVuY3Rpb24gdmlzaXQodHJlZSwgdHlwZSwgdmlzaXRvciwgcmV2ZXJzZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXZlcnNlID0gdmlzaXRvcjtcbiAgICB2aXNpdG9yID0gdHlwZTtcbiAgICB0eXBlID0gbnVsbDtcbiAgfVxuXG4gIG9uZSh0cmVlKTtcblxuICAvKiBWaXNpdCBhIHNpbmdsZSBub2RlLiAqL1xuICBmdW5jdGlvbiBvbmUobm9kZSwgaW5kZXgsIHBhcmVudCkge1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICBpbmRleCA9IGluZGV4IHx8IChwYXJlbnQgPyAwIDogbnVsbCk7XG5cbiAgICBpZiAoIXR5cGUgfHwgbm9kZS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXN1bHQgPSB2aXNpdG9yKG5vZGUsIGluZGV4LCBwYXJlbnQgfHwgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgcmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGFsbChub2RlLmNoaWxkcmVuLCBub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyogVmlzaXQgY2hpbGRyZW4gaW4gYHBhcmVudGAuICovXG4gIGZ1bmN0aW9uIGFsbChjaGlsZHJlbiwgcGFyZW50KSB7XG4gICAgdmFyIHN0ZXAgPSByZXZlcnNlID8gLTEgOiAxO1xuICAgIHZhciBtYXggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgdmFyIG1pbiA9IC0xO1xuICAgIHZhciBpbmRleCA9IChyZXZlcnNlID8gbWF4IDogbWluKSArIHN0ZXA7XG4gICAgdmFyIGNoaWxkO1xuXG4gICAgd2hpbGUgKGluZGV4ID4gbWluICYmIGluZGV4IDwgbWF4KSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTtcblxuICAgICAgaWYgKGNoaWxkICYmIG9uZShjaGlsZCwgaW5kZXgsIHBhcmVudCkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggKz0gc3RlcDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIHZhciB0YXJnZXQgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1kYXN0Mmhhc3QgPSByZXF1aXJlKCdtZGFzdC11dGlsLXRvLWhhc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZW1hcmsycmVoeXBlO1xuXG4vKiBBdHRhY2hlci5cbiAqIElmIGEgZGVzdGluYXRpb24gaXMgZ2l2ZW4sIHJ1bnMgdGhlIGRlc3RpbmF0aW9uIHdpdGhcbiAqIHRoZSBuZXcgSEFTVCB0cmVlIChicmlkZ2UtbW9kZSkuXG4gKiBXaXRob3V0IGRlc3RpbmF0aW9uLCByZXR1cm5zIHRoZSBIQVNUIHRyZWU6IGZ1cnRoZXJcbiAqIHBsdWctaW5zIHJ1biBvbiB0aGF0IHRyZWUgKG11dGF0ZS1tb2RlKS4gKi9cbmZ1bmN0aW9uIHJlbWFyazJyZWh5cGUoZGVzdGluYXRpb24sIG9wdGlvbnMpIHtcbiAgaWYgKGRlc3RpbmF0aW9uICYmICFkZXN0aW5hdGlvbi5wcm9jZXNzKSB7XG4gICAgb3B0aW9ucyA9IGRlc3RpbmF0aW9uO1xuICAgIGRlc3RpbmF0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBkZXN0aW5hdGlvbiA/IGJyaWRnZShkZXN0aW5hdGlvbiwgb3B0aW9ucykgOiBtdXRhdGUob3B0aW9ucyk7XG59XG5cbi8qIEJyaWRnZS1tb2RlLiAgUnVucyB0aGUgZGVzdGluYXRpb24gd2l0aCB0aGUgbmV3IEhBU1RcbiAqIHRyZWUuICovXG5mdW5jdGlvbiBicmlkZ2UoZGVzdGluYXRpb24sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyO1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1lcihub2RlLCBmaWxlLCBuZXh0KSB7XG4gICAgZGVzdGluYXRpb24ucnVuKG1kYXN0Mmhhc3Qobm9kZSwgb3B0aW9ucyksIGZpbGUsIGRvbmUpO1xuICAgIGZ1bmN0aW9uIGRvbmUoZXJyKSB7XG4gICAgICBuZXh0KGVycik7XG4gICAgfVxuICB9XG59XG5cbi8qIE11dGF0ZS1tb2RlLiAgRnVydGhlciB0cmFuc2Zvcm1lcnMgcnVuIG9uIHRoZSBIQVNUIHRyZWUuICovXG5mdW5jdGlvbiBtdXRhdGUob3B0aW9ucykge1xuICByZXR1cm4gdHJhbnNmb3JtZXI7XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybWVyKG5vZGUpIHtcbiAgICByZXR1cm4gbWRhc3QyaGFzdChub2RlLCBvcHRpb25zKTtcbiAgfVxufVxuIl19 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o?@[\]^`{|}~]/g var maintainCase = false var replacement = '-' if (typeof string !== 'string') return '' if (!maintainCase) string = string.replace(/[A-Z]+/g, lower) return string.trim() .replace(re, '') .replace(emoji(), '') .replace(whitespace, replacement) } },{"emoji-regex":2}],2:[function(require,module,exports){ module.exports = function() { return /[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g; }; },{}],3:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2016 Titus Wormer * @license MIT * @module hast:util:has-property * @fileoverview Check whether a node has a property. */ 'use strict'; /* eslint-env commonjs */ /* * Methods. */ var has = Object.prototype.hasOwnProperty; /** * Check if `node` has `name`. * * @param {Node?} node - Node to check. * @param {string} name - Property to check. * @return {boolean} - Whether `node` has `name`. */ function hasProperty(node, name) { var props; var value; if ( !node || !name || typeof node !== 'object' || node.type !== 'element' ) { return false; } props = node.properties; value = props && has.call(props, name) && node.properties[name]; return value !== null && value !== undefined && value !== false; } /* * Expose. */ module.exports = hasProperty; },{}],4:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2016 Titus Wormer * @license MIT * @module rehype:lint:util:is-element */ 'use strict'; /* eslint-env commonjs */ /** * Check if a node is a (certain) element. * * @param {*} node - Thing to check. * @param {string|Array.?} [tagNames] - Name of element. * @return {boolean} - Whether a node is a (certain) element. * @throws {Error} - When `tagNames` is given but invalid. */ function isElement(node, tagNames) { var name; if ( !( tagNames === null || tagNames === undefined || typeof tagNames === 'string' || (typeof tagNames === 'object' && tagNames.length) ) ) { throw new Error( 'Expected `string` or `Array.` for ' + '`tagNames`, not `' + tagNames + '`' ); } if ( !node || typeof node !== 'object' || node.type !== 'element' || typeof node.tagName !== 'string' ) { return false; } if (tagNames === null || tagNames === undefined) { return true; } name = node.tagName; if (typeof tagNames === 'string') { return name === tagNames; } return tagNames.indexOf(name) !== -1; } /* * Expose. */ module.exports = isElement; },{}],5:[function(require,module,exports){ /** * @fileoverview * Get the plain-text value of a HAST node. * @longdescription * ## Usage * * ```javascript * var h = require('hastscript'); * var toString = require('hast-util-to-string'); * * toString(h('p', 'Alpha')); * //=> 'Alpha' * toString(h('div', [h('b', 'Bold'), ' and ', h('i', 'italic'), '.'])); * //=> 'Bold and italic.' * ``` * * ## API * * ### `toString(node)` * * Transform a node to string. */ 'use strict'; module.exports = toString; function toString(node) { /* “The concatenation of data of all the Text node descendants * of the context object, in tree order.” */ if ('children' in node) { return all(node); } /* “Context object’s data.” */ return 'value' in node ? node.value : ''; } function one(node) { if (node.type === 'text') { return node.value; } return node.children ? all(node) : ''; } function all(node) { var children = node.children; var length = children.length; var index = -1; var result = []; while (++index < length) { result[index] = one(children[index]); } return result.join(''); } },{}],6:[function(require,module,exports){ 'use strict'; /* Expose. */ module.exports = visit; /* Visit. */ function visit(tree, type, visitor, reverse) { if (typeof type === 'function') { reverse = visitor; visitor = type; type = null; } one(tree); /* Visit a single node. */ function one(node, index, parent) { var result; index = index || (parent ? 0 : null); if (!type || node.type === type) { result = visitor(node, index, parent || null); } if (node.children && result !== false) { return all(node.children, node); } return result; } /* Visit children in `parent`. */ function all(children, parent) { var step = reverse ? -1 : 1; var max = children.length; var min = -1; var index = (reverse ? max : min) + step; var child; while (index > min && index < max) { child = children[index]; if (child && one(child, index, parent) === false) { return false; } index += step; } return true; } } },{}],"rehype-slug":[function(require,module,exports){ 'use strict'; var slugs = require('github-slugger')(); var visit = require('unist-util-visit'); var toString = require('hast-util-to-string'); var is = require('hast-util-is-element'); var has = require('hast-util-has-property'); module.exports = slug; var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; function slug() { return transformer; } function transformer(tree) { slugs.reset(); visit(tree, 'element', function (node) { if (is(node, headings) && !has(node, 'id')) { node.properties.id = slugs.slug(toString(node)); } }); } },{"github-slugger":1,"hast-util-has-property":3,"hast-util-is-element":4,"hast-util-to-string":5,"unist-util-visit":6}]},{},[]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9naXRodWItc2x1Z2dlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9naXRodWItc2x1Z2dlci9ub2RlX21vZHVsZXMvZW1vamktcmVnZXgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGFzdC11dGlsLWhhcy1wcm9wZXJ0eS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXN0LXV0aWwtaXMtZWxlbWVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8tc3RyaW5nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvaW5kZXguanMiLCJyZWh5cGUtc2x1ZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgZW1vamkgPSByZXF1aXJlKCdlbW9qaS1yZWdleCcpXG5cbm1vZHVsZS5leHBvcnRzID0gQmFuYW5hU2x1Z1xuXG5mdW5jdGlvbiBCYW5hbmFTbHVnICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghKHNlbGYgaW5zdGFuY2VvZiBCYW5hbmFTbHVnKSkgcmV0dXJuIG5ldyBCYW5hbmFTbHVnKClcblxuICBzZWxmLnJlc2V0KClcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHVuaXF1ZSBzbHVnLlxuICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBTdHJpbmcgb2YgdGV4dCB0byBzbHVnaWZ5XG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgIEEgdW5pcXVlIHNsdWcgc3RyaW5nXG4gKi9cbkJhbmFuYVNsdWcucHJvdG90eXBlLnNsdWcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBzbHVnID0gc2x1Z2dlcih2YWx1ZSlcbiAgdmFyIG9jY3VycmVuY2VzID0gc2VsZi5vY2N1cnJlbmNlc1tzbHVnXVxuXG4gIGlmIChzZWxmLm9jY3VycmVuY2VzLmhhc093blByb3BlcnR5KHNsdWcpKSB7XG4gICAgb2NjdXJyZW5jZXMrK1xuICB9IGVsc2Uge1xuICAgIG9jY3VycmVuY2VzID0gMFxuICB9XG5cbiAgc2VsZi5vY2N1cnJlbmNlc1tzbHVnXSA9IG9jY3VycmVuY2VzXG5cbiAgaWYgKG9jY3VycmVuY2VzKSB7XG4gICAgc2x1ZyA9IHNsdWcgKyAnLScgKyBvY2N1cnJlbmNlc1xuICB9XG5cbiAgcmV0dXJuIHNsdWdcbn1cblxuLyoqXG4gKiBSZXNldCAtIEZvcmdldCBhbGwgcHJldmlvdXMgc2x1Z3NcbiAqIEByZXR1cm4gdm9pZFxuICovXG5CYW5hbmFTbHVnLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5vY2N1cnJlbmNlcyA9IHt9XG59XG5cbnZhciB3aGl0ZXNwYWNlID0gL1xccy9nXG5cbmZ1bmN0aW9uIGxvd2VyIChzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIHNsdWdnZXIgKHN0cmluZykge1xuICB2YXIgcmUgPSAvW1xcdTIwMDAtXFx1MjA2RlxcdTJFMDAtXFx1MkU3RlxcXFwnIVwiIyQlJigpKissLi86Ozw9Pj9AW1xcXV5ge3x9fl0vZ1xuICB2YXIgbWFpbnRhaW5DYXNlID0gZmFsc2VcbiAgdmFyIHJlcGxhY2VtZW50ID0gJy0nXG5cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSByZXR1cm4gJydcbiAgaWYgKCFtYWludGFpbkNhc2UpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9bQS1aXSsvZywgbG93ZXIpXG4gIHJldHVybiBzdHJpbmcudHJpbSgpXG4gICAgLnJlcGxhY2UocmUsICcnKVxuICAgIC5yZXBsYWNlKGVtb2ppKCksICcnKVxuICAgIC5yZXBsYWNlKHdoaXRlc3BhY2UsIHJlcGxhY2VtZW50KVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIC9bXFx4QTlcXHhBRVxcdTIwM0NcXHUyMDQ5XFx1MjEyMlxcdTIxMzlcXHUyMTk0LVxcdTIxOTlcXHUyMUE5XFx1MjFBQVxcdTIzMUFcXHUyMzFCXFx1MjMyOFxcdTIzQ0ZcXHUyM0U5LVxcdTIzRjNcXHUyM0Y4LVxcdTIzRkFcXHUyNEMyXFx1MjVBQVxcdTI1QUJcXHUyNUI2XFx1MjVDMFxcdTI1RkItXFx1MjVGRVxcdTI2MDAtXFx1MjYwNFxcdTI2MEVcXHUyNjExXFx1MjYxNFxcdTI2MTVcXHUyNjE4XFx1MjYxRFxcdTI2MjBcXHUyNjIyXFx1MjYyM1xcdTI2MjZcXHUyNjJBXFx1MjYyRVxcdTI2MkZcXHUyNjM4LVxcdTI2M0FcXHUyNjQ4LVxcdTI2NTNcXHUyNjYwXFx1MjY2M1xcdTI2NjVcXHUyNjY2XFx1MjY2OFxcdTI2N0JcXHUyNjdGXFx1MjY5Mi1cXHUyNjk0XFx1MjY5NlxcdTI2OTdcXHUyNjk5XFx1MjY5QlxcdTI2OUNcXHUyNkEwXFx1MjZBMVxcdTI2QUFcXHUyNkFCXFx1MjZCMFxcdTI2QjFcXHUyNkJEXFx1MjZCRVxcdTI2QzRcXHUyNkM1XFx1MjZDOFxcdTI2Q0VcXHUyNkNGXFx1MjZEMVxcdTI2RDNcXHUyNkQ0XFx1MjZFOVxcdTI2RUFcXHUyNkYwLVxcdTI2RjVcXHUyNkY3LVxcdTI2RkFcXHUyNkZEXFx1MjcwMlxcdTI3MDVcXHUyNzA4LVxcdTI3MERcXHUyNzBGXFx1MjcxMlxcdTI3MTRcXHUyNzE2XFx1MjcxRFxcdTI3MjFcXHUyNzI4XFx1MjczM1xcdTI3MzRcXHUyNzQ0XFx1Mjc0N1xcdTI3NENcXHUyNzRFXFx1Mjc1My1cXHUyNzU1XFx1Mjc1N1xcdTI3NjNcXHUyNzY0XFx1Mjc5NS1cXHUyNzk3XFx1MjdBMVxcdTI3QjBcXHUyN0JGXFx1MjkzNFxcdTI5MzVcXHUyQjA1LVxcdTJCMDdcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XFx1MzAzMFxcdTMwM0RcXHUzMjk3XFx1MzI5OV18XFx1RDgzQ1tcXHVEQzA0XFx1RENDRlxcdURENzBcXHVERDcxXFx1REQ3RVxcdUREN0ZcXHVERDhFXFx1REQ5MS1cXHVERDlBXFx1REUwMVxcdURFMDJcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIxXFx1REYyNC1cXHVERjkzXFx1REY5NlxcdURGOTdcXHVERjk5LVxcdURGOUJcXHVERjlFLVxcdURGRjBcXHVERkYzLVxcdURGRjVcXHVERkY3LVxcdURGRkZdfFxcdUQ4M0RbXFx1REMwMC1cXHVEQ0ZEXFx1RENGRi1cXHVERDNEXFx1REQ0OS1cXHVERDRFXFx1REQ1MC1cXHVERDY3XFx1REQ2RlxcdURENzBcXHVERDczLVxcdURENzlcXHVERDg3XFx1REQ4QS1cXHVERDhEXFx1REQ5MFxcdUREOTVcXHVERDk2XFx1RERBNVxcdUREQThcXHVEREIxXFx1RERCMlxcdUREQkNcXHVEREMyLVxcdUREQzRcXHVEREQxLVxcdURERDNcXHVERERDLVxcdUREREVcXHVEREUxXFx1RERFM1xcdURERUZcXHVEREYzXFx1RERGQS1cXHVERTRGXFx1REU4MC1cXHVERUM1XFx1REVDQi1cXHVERUQwXFx1REVFMC1cXHVERUU1XFx1REVFOVxcdURFRUJcXHVERUVDXFx1REVGMFxcdURFRjNdfFxcdUQ4M0VbXFx1REQxMC1cXHVERDE4XFx1REQ4MC1cXHVERDg0XFx1RERDMF18XFx1RDgzQ1xcdURERkZcXHVEODNDW1xcdURERTZcXHVEREYyXFx1RERGQ118XFx1RDgzQ1xcdURERkVcXHVEODNDW1xcdURERUFcXHVEREY5XXxcXHVEODNDXFx1RERGRFxcdUQ4M0NcXHVEREYwfFxcdUQ4M0NcXHVEREZDXFx1RDgzQ1tcXHVEREVCXFx1RERGOF18XFx1RDgzQ1xcdURERkJcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVFXFx1RERGM1xcdURERkFdfFxcdUQ4M0NcXHVEREZBXFx1RDgzQ1tcXHVEREU2XFx1RERFQ1xcdURERjJcXHVEREY4XFx1RERGRVxcdURERkZdfFxcdUQ4M0NcXHVEREY5XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERTlcXHVEREVCLVxcdURERURcXHVEREVGLVxcdURERjRcXHVEREY3XFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRl18XFx1RDgzQ1xcdURERjhcXHVEODNDW1xcdURERTYtXFx1RERFQVxcdURERUMtXFx1RERGNFxcdURERjctXFx1RERGOVxcdURERkJcXHVEREZELVxcdURERkZdfFxcdUQ4M0NcXHVEREY3XFx1RDgzQ1tcXHVEREVBXFx1RERGNFxcdURERjhcXHVEREZBXFx1RERGQ118XFx1RDgzQ1xcdURERjZcXHVEODNDXFx1RERFNnxcXHVEODNDXFx1RERGNVxcdUQ4M0NbXFx1RERFNlxcdURERUEtXFx1RERFRFxcdURERjAtXFx1RERGM1xcdURERjctXFx1RERGOVxcdURERkNcXHVEREZFXXxcXHVEODNDXFx1RERGNFxcdUQ4M0NcXHVEREYyfFxcdUQ4M0NcXHVEREYzXFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERUEtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGNFxcdURERjVcXHVEREY3XFx1RERGQVxcdURERkZdfFxcdUQ4M0NcXHVEREYyXFx1RDgzQ1tcXHVEREU2XFx1RERFOC1cXHVEREVEXFx1RERGMC1cXHVEREZGXXxcXHVEODNDXFx1RERGMVxcdUQ4M0NbXFx1RERFNi1cXHVEREU4XFx1RERFRVxcdURERjBcXHVEREY3LVxcdURERkJcXHVEREZFXXxcXHVEODNDXFx1RERGMFxcdUQ4M0NbXFx1RERFQVxcdURERUMtXFx1RERFRVxcdURERjJcXHVEREYzXFx1RERGNVxcdURERjdcXHVEREZDXFx1RERGRVxcdURERkZdfFxcdUQ4M0NcXHVEREVGXFx1RDgzQ1tcXHVEREVBXFx1RERGMlxcdURERjRcXHVEREY1XXxcXHVEODNDXFx1RERFRVxcdUQ4M0NbXFx1RERFOC1cXHVEREVBXFx1RERGMS1cXHVEREY0XFx1RERGNi1cXHVEREY5XXxcXHVEODNDXFx1RERFRFxcdUQ4M0NbXFx1RERGMFxcdURERjJcXHVEREYzXFx1RERGN1xcdURERjlcXHVEREZBXXxcXHVEODNDXFx1RERFQ1xcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUVcXHVEREYxLVxcdURERjNcXHVEREY1LVxcdURERkFcXHVEREZDXFx1RERGRV18XFx1RDgzQ1xcdURERUJcXHVEODNDW1xcdURERUUtXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGN118XFx1RDgzQ1xcdURERUFcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVEXFx1RERGNy1cXHVEREZBXXxcXHVEODNDXFx1RERFOVxcdUQ4M0NbXFx1RERFQVxcdURERUNcXHVEREVGXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGRl18XFx1RDgzQ1xcdURERThcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFOVxcdURERUItXFx1RERFRVxcdURERjAtXFx1RERGNVxcdURERjdcXHVEREZBLVxcdURERkZdfFxcdUQ4M0NcXHVEREU3XFx1RDgzQ1tcXHVEREU2XFx1RERFN1xcdURERTktXFx1RERFRlxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRVxcdURERkZdfFxcdUQ4M0NcXHVEREU2XFx1RDgzQ1tcXHVEREU4LVxcdURERUNcXHVEREVFXFx1RERGMVxcdURERjJcXHVEREY0XFx1RERGNi1cXHVEREZBXFx1RERGQ1xcdURERkRcXHVEREZGXXxbI1xcKjAtOV1cXHUyMEUzL2c7XG59O1xuIiwiLyoqXG4gKiBAYXV0aG9yIFRpdHVzIFdvcm1lclxuICogQGNvcHlyaWdodCAyMDE2IFRpdHVzIFdvcm1lclxuICogQGxpY2Vuc2UgTUlUXG4gKiBAbW9kdWxlIGhhc3Q6dXRpbDpoYXMtcHJvcGVydHlcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciBhIG5vZGUgaGFzIGEgcHJvcGVydHkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbi8qXG4gKiBNZXRob2RzLlxuICovXG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrIGlmIGBub2RlYCBoYXMgYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7Tm9kZT99IG5vZGUgLSBOb2RlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBQcm9wZXJ0eSB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBgbm9kZWAgaGFzIGBuYW1lYC5cbiAqL1xuZnVuY3Rpb24gaGFzUHJvcGVydHkobm9kZSwgbmFtZSkge1xuICAgIHZhciBwcm9wcztcbiAgICB2YXIgdmFsdWU7XG5cbiAgICBpZiAoXG4gICAgICAgICFub2RlIHx8XG4gICAgICAgICFuYW1lIHx8XG4gICAgICAgIHR5cGVvZiBub2RlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBub2RlLnR5cGUgIT09ICdlbGVtZW50J1xuICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvcHMgPSBub2RlLnByb3BlcnRpZXM7XG4gICAgdmFsdWUgPSBwcm9wcyAmJiBoYXMuY2FsbChwcm9wcywgbmFtZSkgJiYgbm9kZS5wcm9wZXJ0aWVzW25hbWVdO1xuXG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlO1xufVxuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUHJvcGVydHk7XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTYgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgcmVoeXBlOmxpbnQ6dXRpbDppcy1lbGVtZW50XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbi8qKlxuICogQ2hlY2sgaWYgYSBub2RlIGlzIGEgKGNlcnRhaW4pIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSBub2RlIC0gVGhpbmcgdG8gY2hlY2suXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheS48c3RyaW5nPj99IFt0YWdOYW1lc10gLSBOYW1lIG9mIGVsZW1lbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFdoZXRoZXIgYSBub2RlIGlzIGEgKGNlcnRhaW4pIGVsZW1lbnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaGVuIGB0YWdOYW1lc2AgaXMgZ2l2ZW4gYnV0IGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlLCB0YWdOYW1lcykge1xuICAgIHZhciBuYW1lO1xuXG4gICAgaWYgKFxuICAgICAgICAhKFxuICAgICAgICAgICAgdGFnTmFtZXMgPT09IG51bGwgfHxcbiAgICAgICAgICAgIHRhZ05hbWVzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0YWdOYW1lcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICh0eXBlb2YgdGFnTmFtZXMgPT09ICdvYmplY3QnICYmIHRhZ05hbWVzLmxlbmd0aClcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnRXhwZWN0ZWQgYHN0cmluZ2Agb3IgYEFycmF5LjxzdHJpbmc+YCBmb3IgJyArXG4gICAgICAgICAgICAnYHRhZ05hbWVzYCwgbm90IGAnICsgdGFnTmFtZXMgKyAnYCdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgICFub2RlIHx8XG4gICAgICAgIHR5cGVvZiBub2RlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBub2RlLnR5cGUgIT09ICdlbGVtZW50JyB8fFxuICAgICAgICB0eXBlb2Ygbm9kZS50YWdOYW1lICE9PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRhZ05hbWVzID09PSBudWxsIHx8IHRhZ05hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbmFtZSA9IG5vZGUudGFnTmFtZTtcblxuICAgIGlmICh0eXBlb2YgdGFnTmFtZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBuYW1lID09PSB0YWdOYW1lcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGFnTmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VsZW1lbnQ7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqICAgR2V0IHRoZSBwbGFpbi10ZXh0IHZhbHVlIG9mIGEgSEFTVCBub2RlLlxuICogQGxvbmdkZXNjcmlwdGlvblxuICogICAjIyBVc2FnZVxuICpcbiAqICAgYGBgamF2YXNjcmlwdFxuICogICB2YXIgaCA9IHJlcXVpcmUoJ2hhc3RzY3JpcHQnKTtcbiAqICAgdmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnaGFzdC11dGlsLXRvLXN0cmluZycpO1xuICpcbiAqICAgdG9TdHJpbmcoaCgncCcsICdBbHBoYScpKTtcbiAqICAgLy89PiAnQWxwaGEnXG4gKiAgIHRvU3RyaW5nKGgoJ2RpdicsIFtoKCdiJywgJ0JvbGQnKSwgJyBhbmQgJywgaCgnaScsICdpdGFsaWMnKSwgJy4nXSkpO1xuICogICAvLz0+ICdCb2xkIGFuZCBpdGFsaWMuJ1xuICogICBgYGBcbiAqXG4gKiAgICMjIEFQSVxuICpcbiAqICAgIyMjIGB0b1N0cmluZyhub2RlKWBcbiAqXG4gKiAgIFRyYW5zZm9ybSBhIG5vZGUgdG8gc3RyaW5nLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcblxuZnVuY3Rpb24gdG9TdHJpbmcobm9kZSkge1xuICAvKiDigJxUaGUgY29uY2F0ZW5hdGlvbiBvZiBkYXRhIG9mIGFsbCB0aGUgVGV4dCBub2RlIGRlc2NlbmRhbnRzXG4gICAqIG9mIHRoZSBjb250ZXh0IG9iamVjdCwgaW4gdHJlZSBvcmRlci7igJ0gKi9cbiAgaWYgKCdjaGlsZHJlbicgaW4gbm9kZSkge1xuICAgIHJldHVybiBhbGwobm9kZSk7XG4gIH1cblxuICAvKiDigJxDb250ZXh0IG9iamVjdOKAmXMgZGF0YS7igJ0gKi9cbiAgcmV0dXJuICd2YWx1ZScgaW4gbm9kZSA/IG5vZGUudmFsdWUgOiAnJztcbn1cblxuZnVuY3Rpb24gb25lKG5vZGUpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gbm9kZS5jaGlsZHJlbiA/IGFsbChub2RlKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBhbGwobm9kZSkge1xuICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICB2YXIgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IG9uZShjaGlsZHJlbltpbmRleF0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB2aXNpdDtcblxuLyogVmlzaXQuICovXG5mdW5jdGlvbiB2aXNpdCh0cmVlLCB0eXBlLCB2aXNpdG9yLCByZXZlcnNlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yO1xuICAgIHZpc2l0b3IgPSB0eXBlO1xuICAgIHR5cGUgPSBudWxsO1xuICB9XG5cbiAgb25lKHRyZWUpO1xuXG4gIC8qIFZpc2l0IGEgc2luZ2xlIG5vZGUuICovXG4gIGZ1bmN0aW9uIG9uZShub2RlLCBpbmRleCwgcGFyZW50KSB7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIGluZGV4ID0gaW5kZXggfHwgKHBhcmVudCA/IDAgOiBudWxsKTtcblxuICAgIGlmICghdHlwZSB8fCBub2RlLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIHJlc3VsdCA9IHZpc2l0b3Iobm9kZSwgaW5kZXgsIHBhcmVudCB8fCBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiByZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gYWxsKG5vZGUuY2hpbGRyZW4sIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiBWaXNpdCBjaGlsZHJlbiBpbiBgcGFyZW50YC4gKi9cbiAgZnVuY3Rpb24gYWxsKGNoaWxkcmVuLCBwYXJlbnQpIHtcbiAgICB2YXIgc3RlcCA9IHJldmVyc2UgPyAtMSA6IDE7XG4gICAgdmFyIG1heCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICB2YXIgbWluID0gLTE7XG4gICAgdmFyIGluZGV4ID0gKHJldmVyc2UgPyBtYXggOiBtaW4pICsgc3RlcDtcbiAgICB2YXIgY2hpbGQ7XG5cbiAgICB3aGlsZSAoaW5kZXggPiBtaW4gJiYgaW5kZXggPCBtYXgpIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICBpZiAoY2hpbGQgJiYgb25lKGNoaWxkLCBpbmRleCwgcGFyZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpbmRleCArPSBzdGVwO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzbHVncyA9IHJlcXVpcmUoJ2dpdGh1Yi1zbHVnZ2VyJykoKTtcbnZhciB2aXNpdCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtdmlzaXQnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJ2hhc3QtdXRpbC10by1zdHJpbmcnKTtcbnZhciBpcyA9IHJlcXVpcmUoJ2hhc3QtdXRpbC1pcy1lbGVtZW50Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnaGFzdC11dGlsLWhhcy1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNsdWc7XG5cbnZhciBoZWFkaW5ncyA9IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXTtcblxuZnVuY3Rpb24gc2x1ZygpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1lcih0cmVlKSB7XG4gIHNsdWdzLnJlc2V0KCk7XG5cbiAgdmlzaXQodHJlZSwgJ2VsZW1lbnQnLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChpcyhub2RlLCBoZWFkaW5ncykgJiYgIWhhcyhub2RlLCAnaWQnKSkge1xuICAgICAgbm9kZS5wcm9wZXJ0aWVzLmlkID0gc2x1Z3Muc2x1Zyh0b1N0cmluZyhub2RlKSk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o?} [tagNames] - Name of element. * @return {boolean} - Whether a node is a (certain) element. * @throws {Error} - When `tagNames` is given but invalid. */ function isElement(node, tagNames) { var name; if ( !( tagNames === null || tagNames === undefined || typeof tagNames === 'string' || (typeof tagNames === 'object' && tagNames.length) ) ) { throw new Error( 'Expected `string` or `Array.` for ' + '`tagNames`, not `' + tagNames + '`' ); } if ( !node || typeof node !== 'object' || node.type !== 'element' || typeof node.tagName !== 'string' ) { return false; } if (tagNames === null || tagNames === undefined) { return true; } name = node.tagName; if (typeof tagNames === 'string') { return name === tagNames; } return tagNames.indexOf(name) !== -1; } /* * Expose. */ module.exports = isElement; },{}],3:[function(require,module,exports){ 'use strict'; /* Expose. */ module.exports = visit; /* Visit. */ function visit(tree, type, visitor, reverse) { if (typeof type === 'function') { reverse = visitor; visitor = type; type = null; } one(tree); /* Visit a single node. */ function one(node, index, parent) { var result; index = index || (parent ? 0 : null); if (!type || node.type === type) { result = visitor(node, index, parent || null); } if (node.children && result !== false) { return all(node.children, node); } return result; } /* Visit children in `parent`. */ function all(children, parent) { var step = reverse ? -1 : 1; var max = children.length; var min = -1; var index = (reverse ? max : min) + step; var child; while (index > min && index < max) { child = children[index]; if (child && one(child, index, parent) === false) { return false; } index += step; } return true; } } },{}],4:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; function extend() { var target = {} for (var i = 0; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } },{}],"rehype-autolink-headings":[function(require,module,exports){ 'use strict'; var xtend = require('xtend'); var visit = require('unist-util-visit'); var has = require('hast-util-has-property'); var is = require('hast-util-is-element'); module.exports = autolink; var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; var methods = {prepend: 'unshift', append: 'push'}; var contentDefaults = { type: 'element', tagName: 'span', properties: {className: ['icon', 'icon-link']} }; function autolink(options) { var settings = options || {}; var props = settings.properties; var behavior = settings.behaviour || settings.behavior || 'prepend'; var content = settings.content || contentDefaults; var fn = behavior === 'wrap' ? wrap : inject; if (behavior !== 'wrap' && !props) { props = {ariaHidden: true}; } if (content && typeof content === 'object' && !('length' in content)) { content = [content]; } return transformer; function transformer(tree) { visit(tree, visitor); } function visitor(node) { if (is(node, headings) && has(node, 'id')) { fn(node); } } function wrap(node) { var child = icon(node); child.children = node.children; node.children = [child]; } function inject(node) { var child = icon(node); child.children = content.concat(); node.children[methods[behavior]](child); } function icon(node) { return { type: 'element', tagName: 'a', properties: xtend(props, {href: '#' + node.properties.id}) }; } } },{"hast-util-has-property":1,"hast-util-is-element":2,"unist-util-visit":3,"xtend":4}]},{},[]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9oYXN0LXV0aWwtaGFzLXByb3BlcnR5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1pcy1lbGVtZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiwicmVoeXBlLWF1dG9saW5rLWhlYWRpbmdzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTYgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgaGFzdDp1dGlsOmhhcy1wcm9wZXJ0eVxuICogQGZpbGVvdmVydmlldyBDaGVjayB3aGV0aGVyIGEgbm9kZSBoYXMgYSBwcm9wZXJ0eS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIE1ldGhvZHMuXG4gKi9cblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYG5vZGVgIGhhcyBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtOb2RlP30gbm9kZSAtIE5vZGUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFByb3BlcnR5IHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBXaGV0aGVyIGBub2RlYCBoYXMgYG5hbWVgLlxuICovXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShub2RlLCBuYW1lKSB7XG4gICAgdmFyIHByb3BzO1xuICAgIHZhciB2YWx1ZTtcblxuICAgIGlmIChcbiAgICAgICAgIW5vZGUgfHxcbiAgICAgICAgIW5hbWUgfHxcbiAgICAgICAgdHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8XG4gICAgICAgIG5vZGUudHlwZSAhPT0gJ2VsZW1lbnQnXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wcyA9IG5vZGUucHJvcGVydGllcztcbiAgICB2YWx1ZSA9IHByb3BzICYmIGhhcy5jYWxsKHByb3BzLCBuYW1lKSAmJiBub2RlLnByb3BlcnRpZXNbbmFtZV07XG5cbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2U7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNQcm9wZXJ0eTtcbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNiBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSByZWh5cGU6bGludDp1dGlsOmlzLWVsZW1lbnRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLyoqXG4gKiBDaGVjayBpZiBhIG5vZGUgaXMgYSAoY2VydGFpbikgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IG5vZGUgLSBUaGluZyB0byBjaGVjay5cbiAqIEBwYXJhbSB7c3RyaW5nfEFycmF5LjxzdHJpbmc+P30gW3RhZ05hbWVzXSAtIE5hbWUgb2YgZWxlbWVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBhIG5vZGUgaXMgYSAoY2VydGFpbikgZWxlbWVudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdoZW4gYHRhZ05hbWVzYCBpcyBnaXZlbiBidXQgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUsIHRhZ05hbWVzKSB7XG4gICAgdmFyIG5hbWU7XG5cbiAgICBpZiAoXG4gICAgICAgICEoXG4gICAgICAgICAgICB0YWdOYW1lcyA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgdGFnTmFtZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdHlwZW9mIHRhZ05hbWVzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHR5cGVvZiB0YWdOYW1lcyA9PT0gJ29iamVjdCcgJiYgdGFnTmFtZXMubGVuZ3RoKVxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdFeHBlY3RlZCBgc3RyaW5nYCBvciBgQXJyYXkuPHN0cmluZz5gIGZvciAnICtcbiAgICAgICAgICAgICdgdGFnTmFtZXNgLCBub3QgYCcgKyB0YWdOYW1lcyArICdgJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgIW5vZGUgfHxcbiAgICAgICAgdHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8XG4gICAgICAgIG5vZGUudHlwZSAhPT0gJ2VsZW1lbnQnIHx8XG4gICAgICAgIHR5cGVvZiBub2RlLnRhZ05hbWUgIT09ICdzdHJpbmcnXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGFnTmFtZXMgPT09IG51bGwgfHwgdGFnTmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBuYW1lID0gbm9kZS50YWdOYW1lO1xuXG4gICAgaWYgKHR5cGVvZiB0YWdOYW1lcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IHRhZ05hbWVzO1xuICAgIH1cblxuICAgIHJldHVybiB0YWdOYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbn1cblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRWxlbWVudDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB2aXNpdDtcblxuLyogVmlzaXQuICovXG5mdW5jdGlvbiB2aXNpdCh0cmVlLCB0eXBlLCB2aXNpdG9yLCByZXZlcnNlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yO1xuICAgIHZpc2l0b3IgPSB0eXBlO1xuICAgIHR5cGUgPSBudWxsO1xuICB9XG5cbiAgb25lKHRyZWUpO1xuXG4gIC8qIFZpc2l0IGEgc2luZ2xlIG5vZGUuICovXG4gIGZ1bmN0aW9uIG9uZShub2RlLCBpbmRleCwgcGFyZW50KSB7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIGluZGV4ID0gaW5kZXggfHwgKHBhcmVudCA/IDAgOiBudWxsKTtcblxuICAgIGlmICghdHlwZSB8fCBub2RlLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIHJlc3VsdCA9IHZpc2l0b3Iobm9kZSwgaW5kZXgsIHBhcmVudCB8fCBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiByZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gYWxsKG5vZGUuY2hpbGRyZW4sIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiBWaXNpdCBjaGlsZHJlbiBpbiBgcGFyZW50YC4gKi9cbiAgZnVuY3Rpb24gYWxsKGNoaWxkcmVuLCBwYXJlbnQpIHtcbiAgICB2YXIgc3RlcCA9IHJldmVyc2UgPyAtMSA6IDE7XG4gICAgdmFyIG1heCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICB2YXIgbWluID0gLTE7XG4gICAgdmFyIGluZGV4ID0gKHJldmVyc2UgPyBtYXggOiBtaW4pICsgc3RlcDtcbiAgICB2YXIgY2hpbGQ7XG5cbiAgICB3aGlsZSAoaW5kZXggPiBtaW4gJiYgaW5kZXggPCBtYXgpIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICBpZiAoY2hpbGQgJiYgb25lKGNoaWxkLCBpbmRleCwgcGFyZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpbmRleCArPSBzdGVwO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgeHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpO1xudmFyIHZpc2l0ID0gcmVxdWlyZSgndW5pc3QtdXRpbC12aXNpdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJ2hhc3QtdXRpbC1oYXMtcHJvcGVydHknKTtcbnZhciBpcyA9IHJlcXVpcmUoJ2hhc3QtdXRpbC1pcy1lbGVtZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXV0b2xpbms7XG5cbnZhciBoZWFkaW5ncyA9IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXTtcbnZhciBtZXRob2RzID0ge3ByZXBlbmQ6ICd1bnNoaWZ0JywgYXBwZW5kOiAncHVzaCd9O1xudmFyIGNvbnRlbnREZWZhdWx0cyA9IHtcbiAgdHlwZTogJ2VsZW1lbnQnLFxuICB0YWdOYW1lOiAnc3BhbicsXG4gIHByb3BlcnRpZXM6IHtjbGFzc05hbWU6IFsnaWNvbicsICdpY29uLWxpbmsnXX1cbn07XG5cbmZ1bmN0aW9uIGF1dG9saW5rKG9wdGlvbnMpIHtcbiAgdmFyIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHByb3BzID0gc2V0dGluZ3MucHJvcGVydGllcztcbiAgdmFyIGJlaGF2aW9yID0gc2V0dGluZ3MuYmVoYXZpb3VyIHx8IHNldHRpbmdzLmJlaGF2aW9yIHx8ICdwcmVwZW5kJztcbiAgdmFyIGNvbnRlbnQgPSBzZXR0aW5ncy5jb250ZW50IHx8IGNvbnRlbnREZWZhdWx0cztcbiAgdmFyIGZuID0gYmVoYXZpb3IgPT09ICd3cmFwJyA/IHdyYXAgOiBpbmplY3Q7XG5cbiAgaWYgKGJlaGF2aW9yICE9PSAnd3JhcCcgJiYgIXByb3BzKSB7XG4gICAgcHJvcHMgPSB7YXJpYUhpZGRlbjogdHJ1ZX07XG4gIH1cblxuICBpZiAoY29udGVudCAmJiB0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgISgnbGVuZ3RoJyBpbiBjb250ZW50KSkge1xuICAgIGNvbnRlbnQgPSBbY29udGVudF07XG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3JtZXI7XG5cbiAgZnVuY3Rpb24gdHJhbnNmb3JtZXIodHJlZSkge1xuICAgIHZpc2l0KHRyZWUsIHZpc2l0b3IpO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaXRvcihub2RlKSB7XG4gICAgaWYgKGlzKG5vZGUsIGhlYWRpbmdzKSAmJiBoYXMobm9kZSwgJ2lkJykpIHtcbiAgICAgIGZuKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAobm9kZSkge1xuICAgIHZhciBjaGlsZCA9IGljb24obm9kZSk7XG4gICAgY2hpbGQuY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIG5vZGUuY2hpbGRyZW4gPSBbY2hpbGRdO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5qZWN0KG5vZGUpIHtcbiAgICB2YXIgY2hpbGQgPSBpY29uKG5vZGUpO1xuICAgIGNoaWxkLmNoaWxkcmVuID0gY29udGVudC5jb25jYXQoKTtcbiAgICBub2RlLmNoaWxkcmVuW21ldGhvZHNbYmVoYXZpb3JdXShjaGlsZCk7XG4gIH1cblxuICBmdW5jdGlvbiBpY29uKG5vZGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2VsZW1lbnQnLFxuICAgICAgdGFnTmFtZTogJ2EnLFxuICAgICAgcHJvcGVydGllczogeHRlbmQocHJvcHMsIHtocmVmOiAnIycgKyBub2RlLnByb3BlcnRpZXMuaWR9KVxuICAgIH07XG4gIH1cbn1cbiJdfQ== require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o` acts as `src`. */ data: null, dateTime: USE_ATTRIBUTE, default: BOOLEAN_VALUE, defer: BOOLEAN_VALUE, dir: null, dirName: null, disabled: USE_ATTRIBUTE | BOOLEAN_VALUE, download: OVERLOADED_BOOLEAN_VALUE, draggable: null, dropzone: SPACE_SEPARATED, encType: null, form: USE_ATTRIBUTE, formAction: USE_ATTRIBUTE, formEncType: USE_ATTRIBUTE, formMethod: USE_ATTRIBUTE, formNoValidate: BOOLEAN_VALUE, formTarget: USE_ATTRIBUTE, frameBorder: USE_ATTRIBUTE, headers: SPACE_SEPARATED, height: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE, hidden: USE_ATTRIBUTE | BOOLEAN_VALUE, high: NUMERIC_VALUE, href: null, hrefLang: null, htmlFor: SPACE_SEPARATED, httpEquiv: SPACE_SEPARATED, id: USE_PROPERTY, inputMode: USE_ATTRIBUTE, /* Web Components */ is: USE_ATTRIBUTE, isMap: BOOLEAN_VALUE, keyParams: USE_ATTRIBUTE, keyType: USE_ATTRIBUTE, kind: null, label: null, lang: null, list: USE_ATTRIBUTE, loop: USE_PROPERTY | BOOLEAN_VALUE, low: NUMERIC_VALUE, manifest: USE_ATTRIBUTE, marginHeight: NUMERIC_VALUE, marginWidth: NUMERIC_VALUE, max: null, maxLength: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE, media: USE_ATTRIBUTE, mediaGroup: null, menu: null, method: null, min: null, minLength: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE, multiple: USE_PROPERTY | BOOLEAN_VALUE, muted: USE_PROPERTY | BOOLEAN_VALUE, name: null, nonce: null, noValidate: BOOLEAN_VALUE, open: BOOLEAN_VALUE, optimum: NUMERIC_VALUE, pattern: null, ping: SPACE_SEPARATED, placeholder: null, /* https://html.spec.whatwg.org/#attr-video-playsinline */ playsInline: BOOLEAN_VALUE, poster: null, preload: null, /* https://html.spec.whatwg.org/#dom-head-profile */ profile: null, radioGroup: null, readOnly: USE_PROPERTY | BOOLEAN_VALUE, /* https://html.spec.whatwg.org/#attr-link-referrerpolicy */ referrerPolicy: null, /* `rel` is `relList` in DOM */ rel: SPACE_SEPARATED | USE_ATTRIBUTE, required: BOOLEAN_VALUE, reversed: BOOLEAN_VALUE, role: USE_ATTRIBUTE, rows: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE, rowSpan: POSITIVE_NUMERIC_VALUE, sandbox: SPACE_SEPARATED, scope: null, scoped: BOOLEAN_VALUE, scrolling: null, seamless: USE_ATTRIBUTE | BOOLEAN_VALUE, selected: USE_PROPERTY | BOOLEAN_VALUE, shape: null, size: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE, sizes: USE_ATTRIBUTE | SPACE_SEPARATED, /* https://html.spec.whatwg.org/#attr-slot */ slot: null, sortable: BOOLEAN_VALUE, sorted: SPACE_SEPARATED, span: POSITIVE_NUMERIC_VALUE, spellCheck: null, src: null, srcDoc: USE_PROPERTY, srcLang: null, srcSet: USE_ATTRIBUTE | COMMA_SEPARATED, start: NUMERIC_VALUE, step: null, style: null, summary: null, tabIndex: NUMERIC_VALUE, target: null, title: null, translate: null, type: null, typeMustMatch: BOOLEAN_VALUE, useMap: null, value: USE_PROPERTY, volume: POSITIVE_NUMERIC_VALUE, width: USE_ATTRIBUTE | NUMERIC_VALUE, wmode: USE_ATTRIBUTE, wrap: null, /* Non-standard Properties. */ /* `autoCapitalize` and `autoCorrect` are supported in * Mobile Safari for keyboard hints. */ autoCapitalize: null, autoCorrect: null, /* `autoSave` allows WebKit/Blink to persist values of * input fields on page reloads */ autoSave: null, /* `itemProp`, `itemScope`, `itemType` are for Microdata * support. See http://schema.org/docs/gs.html */ itemProp: USE_ATTRIBUTE | SPACE_SEPARATED, itemScope: USE_ATTRIBUTE | BOOLEAN_VALUE, itemType: USE_ATTRIBUTE | SPACE_SEPARATED, /* `itemID` and `itemRef` are for Microdata support as well * but only specified in the the WHATWG spec document. * See https://html.spec.whatwg.org/multipage/ * microdata.html#microdata-dom-api */ itemID: USE_ATTRIBUTE, itemRef: USE_ATTRIBUTE | SPACE_SEPARATED, /* `property` is supported for OpenGraph in meta tags. */ property: null, /* `results` show looking glass icon and recent searches * on input search fields in WebKit/Blink */ results: null, /* IE-only attribute that specifies security * restrictions on an iframe as an alternative to the * sandbox attribute on IE < 10 */ security: USE_ATTRIBUTE, /* IE-only attribute that controls focus behavior */ unselectable: USE_ATTRIBUTE, /* Ancient. */ xmlLang: USE_ATTRIBUTE, xmlBase: USE_ATTRIBUTE }; /* Map of properties to attributes. * Names are lower-case properties. * Values are HTML attributes. */ var propertyToAttributeMapping = { xmlbase: 'xml:base', xmllang: 'xml:lang', classname: 'class', htmlfor: 'for', httpequiv: 'http-equiv', acceptcharset: 'accept-charset' }; /* Expand config. */ var information = {}; var property; var name; var config; getPropertyInformation.all = information; for (property in propertyConfig) { name = lower(property); name = propertyToAttributeMapping[name] || name; config = propertyConfig[property]; information[name] = { name: name, propertyName: property, mustUseAttribute: check(config, USE_ATTRIBUTE), mustUseProperty: check(config, USE_PROPERTY), boolean: check(config, BOOLEAN_VALUE), overloadedBoolean: check(config, OVERLOADED_BOOLEAN_VALUE), numeric: check(config, NUMERIC_VALUE), positiveNumeric: check(config, POSITIVE_NUMERIC_VALUE), commaSeparated: check(config, COMMA_SEPARATED), spaceSeparated: check(config, SPACE_SEPARATED) }; } /* Get a config for a property. */ function getPropertyInformation(propertyName) { var insensitive = lower(propertyName); return information[propertyToAttributeMapping[insensitive] || insensitive]; } /* Check a mask. */ function check(value, bitmask) { return (value & bitmask) === bitmask; } /* Lower-case a string. */ function lower(value) { return value.toLowerCase(); } },{}],11:[function(require,module,exports){ 'use strict'; /* Expose. */ module.exports = factory; /* Factory. */ function factory(file) { var contents = indices(String(file)); return { toPosition: offsetToPositionFactory(contents), toOffset: positionToOffsetFactory(contents) }; } /* Factory to get the line and column-based `position` for * `offset` in the bound indices. */ function offsetToPositionFactory(indices) { return offsetToPosition; /* Get the line and column-based `position` for * `offset` in the bound indices. */ function offsetToPosition(offset) { var index = -1; var length = indices.length; if (offset < 0) { return {}; } while (++index < length) { if (indices[index] > offset) { return { line: index + 1, column: (offset - (indices[index - 1] || 0)) + 1, offset: offset }; } } return {}; } } /* Factory to get the `offset` for a line and column-based * `position` in the bound indices. */ function positionToOffsetFactory(indices) { return positionToOffset; /* Get the `offset` for a line and column-based * `position` in the bound indices. */ function positionToOffset(position) { var line = position && position.line; var column = position && position.column; if (!isNaN(line) && !isNaN(column) && line - 1 in indices) { return ((indices[line - 2] || 0) + column - 1) || 0; } return -1; } } /* Get indices of line-breaks in `value`. */ function indices(value) { var result = []; var index = value.indexOf('\n'); while (index !== -1) { result.push(index + 1); index = value.indexOf('\n', index + 1); } result.push(value.length + 1); return result; } },{}],12:[function(require,module,exports){ 'use strict'; var xtend = require('xtend'); var toH = require('hast-to-hyperscript'); var NS = require('web-namespaces'); var zwitch = require('zwitch'); var mapz = require('mapz'); module.exports = transform; var own = {}.hasOwnProperty; var one = zwitch('type'); var all = mapz(one, {key: 'children', indices: false}); var customProps = ['__location', 'childNodes', 'content', 'parentNode', 'namespaceURI']; one.handlers.root = root; one.handlers.element = element; one.handlers.text = text; one.handlers.comment = comment; one.handlers.doctype = doctype; /* Map of tag-names starting new namespaces. */ var namespaces = { math: NS.mathml, svg: NS.svg }; /* Map of attributes with namespaces. */ var attributeSpaces = { 'xlink:actuate': {prefix: 'xlink', name: 'actuate', namespace: NS.xlink}, 'xlink:arcrole': {prefix: 'xlink', name: 'arcrole', namespace: NS.xlink}, 'xlink:href': {prefix: 'xlink', name: 'href', namespace: NS.xlink}, 'xlink:role': {prefix: 'xlink', name: 'role', namespace: NS.xlink}, 'xlink:show': {prefix: 'xlink', name: 'show', namespace: NS.xlink}, 'xlink:title': {prefix: 'xlink', name: 'title', namespace: NS.xlink}, 'xlink:type': {prefix: 'xlink', name: 'type', namespace: NS.xlink}, 'xml:base': {prefix: 'xml', name: 'base', namespace: NS.xml}, 'xml:lang': {prefix: 'xml', name: 'lang', namespace: NS.xml}, 'xml:space': {prefix: 'xml', name: 'space', namespace: NS.xml}, xmlns: {prefix: '', name: 'xmlns', namespace: NS.xmlns}, 'xmlns:xlink': {prefix: 'xmlns', name: 'xlink', namespace: NS.xmlns} }; /* Transform a tree from HAST to Parse5’s AST. */ function transform(tree) { return patch(one(tree), null, NS.html); } function root(node) { var data = node.data || {}; var qs = own.call(data, 'quirksMode') ? Boolean(data.quirksMode) : false; return { nodeName: '#document', mode: qs ? 'quirks' : 'no-quirks', childNodes: all(node) }; } function element(node) { var shallow = xtend(node); shallow.children = []; return toH(function (name, attrs) { var values = []; var content; var value; var key; for (key in attrs) { value = {name: key, value: attrs[key]}; if (own.call(attributeSpaces, key)) { value = xtend(value, attributeSpaces[key]); } values.push(value); } if (name === 'template') { content = transform(shallow.content); delete content.mode; content.nodeName = '#document-fragment'; } return wrap(node, { nodeName: node.tagName, tagName: node.tagName, attrs: values, childNodes: node.children ? all(node) : [] }, content); }, shallow); } function doctype(node) { return wrap(node, { nodeName: '#documentType', name: node.name, publicId: node.public || null, systemId: node.system || null }); } function text(node) { return wrap(node, { nodeName: '#text', value: node.value }); } function comment(node) { return wrap(node, { nodeName: '#comment', data: node.value }); } /* Patch position. */ function wrap(node, ast, content) { if (node.position && node.position.start && node.position.end) { ast.__location = { line: node.position.start.line, col: node.position.start.column, startOffset: node.position.start.offset, endOffset: node.position.end.offset }; } if (content) { ast.content = content; } return ast; } /* Patch a tree recursively, by adding namespaces * and parent references where needed. */ function patch(node, parent, ns) { var location = node.__location; var children = node.childNodes; var name = node.tagName; var replacement = {}; var length; var index; var key; for (key in node) { if (customProps.indexOf(key) === -1) { replacement[key] = node[key]; } } if (own.call(namespaces, name)) { ns = namespaces[name]; } if (own.call(replacement, 'tagName')) { replacement.namespaceURI = ns; } if (children) { replacement.childNodes = children; length = children.length; index = -1; while (++index < length) { children[index] = patch(children[index], replacement, ns); } } if (name === 'template') { replacement.content = patch(node.content, null, ns); } if (parent) { replacement.parentNode = parent; } if (location) { replacement.__location = location; } return replacement; } },{"hast-to-hyperscript":13,"mapz":28,"web-namespaces":47,"xtend":30,"zwitch":48}],13:[function(require,module,exports){ 'use strict'; var trim = require('trim'); var paramCase = require('kebab-case'); var information = require('property-information'); var spaces = require('space-separated-tokens'); var commas = require('comma-separated-tokens'); var nan = require('is-nan'); var is = require('unist-util-is'); module.exports = wrapper; function wrapper(h, node, prefix) { var r; var v; if (typeof h !== 'function') { throw new Error('h is not a function'); } if (!is('element', node)) { throw new Error('Expected element, not `' + node + '`'); } r = react(h); v = vdom(h); if (prefix === null || prefix === undefined) { prefix = r === true || v === true ? 'h-' : false; } return toH(h, node, { prefix: prefix, key: 0, react: r, vdom: v, hyperscript: hyperscript(h) }); } /* Transform a HAST node through a hyperscript interface * to *anything*! */ function toH(h, node, ctx) { var selector = node.tagName; var properties; var attributes; var children; var property; var elements; var length; var index; var value; properties = node.properties; attributes = {}; for (property in properties) { addAttribute(attributes, property, properties[property], ctx); } if (ctx.vdom === true) { selector = selector.toUpperCase(); } if (ctx.hyperscript === true && attributes.id) { selector += '#' + attributes.id; delete attributes.id; } if ((ctx.hyperscript === true || ctx.vdom === true) && attributes.className) { selector += '.' + spaces.parse(attributes.className).join('.'); delete attributes.className; } if (typeof attributes.style === 'string') { /* VDOM expects a `string` style in `attributes` * See https://github.com/Matt-Esch/virtual-dom/blob/947ecf9/ * docs/vnode.md#propertiesstyle-vs-propertiesattributesstyle */ if (ctx.vdom === true) { if (!attributes.attributes) { attributes.attributes = {}; } attributes.attributes.style = attributes.style; delete attributes.style; /* React only accepts `style` as object. */ } else if (ctx.react === true) { attributes.style = parseStyle(attributes.style); } } if (ctx.prefix) { ctx.key++; attributes.key = ctx.prefix + ctx.key; } elements = []; children = node.children || []; length = children.length; index = -1; while (++index < length) { value = children[index]; if (is('element', value)) { elements.push(toH(h, value, ctx)); } else if (is('text', value)) { elements.push(value.value); } } /* Ensure no React warnings are triggered for * void elements having children passed in. */ if (elements.length === 0) { elements = undefined; } return h(selector, attributes, elements); } /* Add `name` and its `value` to `props`. */ function addAttribute(props, name, value, ctx) { var info = information(name) || {}; var subprop; /* Ignore nully, `false`, `NaN`, and falsey known * booleans. */ if ( value === null || value === undefined || value === false || nan(value) || (info.boolean && !value) ) { return; } name = info.name || paramCase(name); if (value !== null && typeof value === 'object' && 'length' in value) { /* Accept `array`. Most props are space-separater. */ value = (info.commaSeparated ? commas : spaces).stringify(value); } /* Treat `true` and truthy known booleans. */ if (info.boolean && ctx.hyperscript === true) { value = ''; } if (info.name !== 'class' && (info.mustUseAttribute || !info.name)) { if (ctx.vdom === true) { subprop = 'attributes'; } else if (ctx.hyperscript === true) { subprop = 'attrs'; } if (subprop) { if (props[subprop] === undefined) { props[subprop] = {}; } props[subprop][name] = value; return; } } props[info.propertyName || name] = value; } /* Check if `h` is `react.createElement`. It doesn’t accept * `class` as an attribute, it must be added through the * `selector`. */ function react(h) { var node = h && h('div'); return Boolean(node && ('_owner' in node || '_store' in node) && node.key === null); } /* Check if `h` is `hyperscript`. It doesn’t accept * `class` as an attribute, it must be added through the * `selector`. */ function hyperscript(h) { return Boolean(h && h.context && h.cleanup); } /** * Check if `h` is `virtual-dom/h`. It’s the only * hyperscript “compatible” interface needing `attributes`. */ function vdom(h) { try { return h('div').type === 'VirtualNode'; } catch (err) { /* Empty */ } /* istanbul ignore next */ return false; } function parseStyle(value) { var result = {}; var declarations = value.split(';'); var length = declarations.length; var index = -1; var declaration; var prop; var pos; while (++index < length) { declaration = declarations[index]; pos = declaration.indexOf(':'); if (pos !== -1) { prop = camelCase(trim(declaration.slice(0, pos))); result[prop] = trim(declaration.slice(pos + 1)); } } return result; } function camelCase(val) { if (val.slice(0, 4) === '-ms-') { val = 'ms-' + val.slice(4); } return val.replace(/-([a-z])/g, replace); } function replace($0, $1) { return $1.toUpperCase(); } },{"comma-separated-tokens":14,"is-nan":16,"kebab-case":23,"property-information":24,"space-separated-tokens":25,"trim":26,"unist-util-is":27}],14:[function(require,module,exports){ arguments[4][5][0].apply(exports,arguments) },{"dup":5,"trim":26}],15:[function(require,module,exports){ 'use strict'; /* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */ module.exports = function isNaN(value) { return value !== value; }; },{}],16:[function(require,module,exports){ 'use strict'; var define = require('define-properties'); var implementation = require('./implementation'); var getPolyfill = require('./polyfill'); var shim = require('./shim'); /* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */ define(implementation, { getPolyfill: getPolyfill, implementation: implementation, shim: shim }); module.exports = implementation; },{"./implementation":15,"./polyfill":21,"./shim":22,"define-properties":17}],17:[function(require,module,exports){ 'use strict'; var keys = require('object-keys'); var foreach = require('foreach'); var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol'; var toStr = Object.prototype.toString; var isFunction = function (fn) { return typeof fn === 'function' && toStr.call(fn) === '[object Function]'; }; var arePropertyDescriptorsSupported = function () { var obj = {}; try { Object.defineProperty(obj, 'x', { enumerable: false, value: obj }); /* eslint-disable no-unused-vars, no-restricted-syntax */ for (var _ in obj) { return false; } /* eslint-enable no-unused-vars, no-restricted-syntax */ return obj.x === obj; } catch (e) { /* this is IE 8. */ return false; } }; var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported(); var defineProperty = function (object, name, value, predicate) { if (name in object && (!isFunction(predicate) || !predicate())) { return; } if (supportsDescriptors) { Object.defineProperty(object, name, { configurable: true, enumerable: false, value: value, writable: true }); } else { object[name] = value; } }; var defineProperties = function (object, map) { var predicates = arguments.length > 2 ? arguments[2] : {}; var props = keys(map); if (hasSymbols) { props = props.concat(Object.getOwnPropertySymbols(map)); } foreach(props, function (name) { defineProperty(object, name, map[name], predicates[name]); }); }; defineProperties.supportsDescriptors = !!supportsDescriptors; module.exports = defineProperties; },{"foreach":18,"object-keys":19}],18:[function(require,module,exports){ var hasOwn = Object.prototype.hasOwnProperty; var toString = Object.prototype.toString; module.exports = function forEach (obj, fn, ctx) { if (toString.call(fn) !== '[object Function]') { throw new TypeError('iterator must be a function'); } var l = obj.length; if (l === +l) { for (var i = 0; i < l; i++) { fn.call(ctx, obj[i], i, obj); } } else { for (var k in obj) { if (hasOwn.call(obj, k)) { fn.call(ctx, obj[k], k, obj); } } } }; },{}],19:[function(require,module,exports){ 'use strict'; // modified from https://github.com/es-shims/es5-shim var has = Object.prototype.hasOwnProperty; var toStr = Object.prototype.toString; var slice = Array.prototype.slice; var isArgs = require('./isArguments'); var isEnumerable = Object.prototype.propertyIsEnumerable; var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); var dontEnums = [ 'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor' ]; var equalsConstructorPrototype = function (o) { var ctor = o.constructor; return ctor && ctor.prototype === o; }; var excludedKeys = { $console: true, $external: true, $frame: true, $frameElement: true, $frames: true, $innerHeight: true, $innerWidth: true, $outerHeight: true, $outerWidth: true, $pageXOffset: true, $pageYOffset: true, $parent: true, $scrollLeft: true, $scrollTop: true, $scrollX: true, $scrollY: true, $self: true, $webkitIndexedDB: true, $webkitStorageInfo: true, $window: true }; var hasAutomationEqualityBug = (function () { /* global window */ if (typeof window === 'undefined') { return false; } for (var k in window) { try { if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { try { equalsConstructorPrototype(window[k]); } catch (e) { return true; } } } catch (e) { return true; } } return false; }()); var equalsConstructorPrototypeIfNotBuggy = function (o) { /* global window */ if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return equalsConstructorPrototype(o); } try { return equalsConstructorPrototype(o); } catch (e) { return false; } }; var keysShim = function keys(object) { var isObject = object !== null && typeof object === 'object'; var isFunction = toStr.call(object) === '[object Function]'; var isArguments = isArgs(object); var isString = isObject && toStr.call(object) === '[object String]'; var theKeys = []; if (!isObject && !isFunction && !isArguments) { throw new TypeError('Object.keys called on a non-object'); } var skipProto = hasProtoEnumBug && isFunction; if (isString && object.length > 0 && !has.call(object, 0)) { for (var i = 0; i < object.length; ++i) { theKeys.push(String(i)); } } if (isArguments && object.length > 0) { for (var j = 0; j < object.length; ++j) { theKeys.push(String(j)); } } else { for (var name in object) { if (!(skipProto && name === 'prototype') && has.call(object, name)) { theKeys.push(String(name)); } } } if (hasDontEnumBug) { var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); for (var k = 0; k < dontEnums.length; ++k) { if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { theKeys.push(dontEnums[k]); } } } return theKeys; }; keysShim.shim = function shimObjectKeys() { if (Object.keys) { var keysWorksWithArguments = (function () { // Safari 5.0 bug return (Object.keys(arguments) || '').length === 2; }(1, 2)); if (!keysWorksWithArguments) { var originalKeys = Object.keys; Object.keys = function keys(object) { if (isArgs(object)) { return originalKeys(slice.call(object)); } else { return originalKeys(object); } }; } } else { Object.keys = keysShim; } return Object.keys || keysShim; }; module.exports = keysShim; },{"./isArguments":20}],20:[function(require,module,exports){ 'use strict'; var toStr = Object.prototype.toString; module.exports = function isArguments(value) { var str = toStr.call(value); var isArgs = str === '[object Arguments]'; if (!isArgs) { isArgs = str !== '[object Array]' && value !== null && typeof value === 'object' && typeof value.length === 'number' && value.length >= 0 && toStr.call(value.callee) === '[object Function]'; } return isArgs; }; },{}],21:[function(require,module,exports){ 'use strict'; var implementation = require('./implementation'); module.exports = function getPolyfill() { if (Number.isNaN && Number.isNaN(NaN) && !Number.isNaN('a')) { return Number.isNaN; } return implementation; }; },{"./implementation":15}],22:[function(require,module,exports){ 'use strict'; var define = require('define-properties'); var getPolyfill = require('./polyfill'); /* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */ module.exports = function shimNumberIsNaN() { var polyfill = getPolyfill(); define(Number, { isNaN: polyfill }, { isNaN: function () { return Number.isNaN !== polyfill; } }); return polyfill; }; },{"./polyfill":21,"define-properties":17}],23:[function(require,module,exports){ 'use strict'; var KEBAB_REGEX = /[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g; var REVERSE_REGEX = /-[a-z\u00E0-\u00F6\u00F8-\u00FE]/g; module.exports = exports = function kebabCase(str) { return str.replace(KEBAB_REGEX, function (match) { return '-' + match.toLowerCase(); }); }; exports.reverse = function (str) { return str.replace(REVERSE_REGEX, function (match) { return match.slice(1).toUpperCase(); }); }; },{}],24:[function(require,module,exports){ arguments[4][10][0].apply(exports,arguments) },{"dup":10}],25:[function(require,module,exports){ arguments[4][8][0].apply(exports,arguments) },{"dup":8,"trim":26}],26:[function(require,module,exports){ arguments[4][6][0].apply(exports,arguments) },{"dup":6}],27:[function(require,module,exports){ 'use strict'; /* eslint-disable max-params */ /* Expose. */ module.exports = is; /* Assert if `test` passes for `node`. * When a `parent` node is known the `index` of node */ function is(test, node, index, parent, context) { var hasParent = parent !== null && parent !== undefined; var hasIndex = index !== null && index !== undefined; var check = convert(test); if ( hasIndex && (typeof index !== 'number' || index < 0 || index === Infinity) ) { throw new Error('Expected positive finite index or child node'); } if (hasParent && (!is(null, parent) || !parent.children)) { throw new Error('Expected parent node'); } if (!node || !node.type || typeof node.type !== 'string') { return false; } if (hasParent !== hasIndex) { throw new Error('Expected both parent and index'); } return Boolean(check.call(context, node, index, parent)); } function convert(test) { if (typeof test === 'string') { return typeFactory(test); } if (test === null || test === undefined) { return ok; } if (typeof test === 'object') { return ('length' in test ? anyFactory : matchesFactory)(test); } if (typeof test === 'function') { return test; } throw new Error('Expected function, string, or object as test'); } function convertAll(tests) { var results = []; var length = tests.length; var index = -1; while (++index < length) { results[index] = convert(tests[index]); } return results; } /* Utility assert each property in `test` is represented * in `node`, and each values are strictly equal. */ function matchesFactory(test) { return matches; function matches(node) { var key; for (key in test) { if (node[key] !== test[key]) { return false; } } return true; } } function anyFactory(tests) { var checks = convertAll(tests); var length = checks.length; return matches; function matches() { var index = -1; while (++index < length) { if (checks[index].apply(this, arguments)) { return true; } } return false; } } /* Utility to convert a string into a function which checks * a given node’s type for said string. */ function typeFactory(test) { return type; function type(node) { return Boolean(node && node.type === test); } } /* Utility to return true. */ function ok() { return true; } },{}],28:[function(require,module,exports){ 'use strict'; var array = require('x-is-array'); module.exports = factory; /* Functional map with sugar. */ function factory(fn, options) { var settings = options || {}; var key = settings.key; var indices = settings.indices; var gapless = settings.gapless; if (typeof settings === 'string') { key = settings; } if (indices == null) { indices = true; } return all; function all(values) { var results = []; var parent = values; var index = -1; var length; var result; if (key) { if (array(values)) { parent = null; } else { values = parent[key]; } } length = values.length; while (++index < length) { if (indices) { result = fn.call(this, values[index], index, parent); } else { result = fn.call(this, values[index], parent); } if (!gapless || result != null) { results.push(result); } } return results; } } },{"x-is-array":29}],29:[function(require,module,exports){ var nativeIsArray = Array.isArray var toString = Object.prototype.toString module.exports = nativeIsArray || isArray function isArray(obj) { return toString.call(obj) === "[object Array]" } },{}],30:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; function extend() { var target = {} for (var i = 0; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } },{}],31:[function(require,module,exports){ module.exports=[ "area", "base", "basefont", "bgsound", "br", "col", "command", "embed", "frame", "hr", "image", "img", "input", "isindex", "keygen", "link", "menuitem", "meta", "nextid", "param", "source", "track", "wbr" ] },{}],32:[function(require,module,exports){ 'use strict'; var DOCUMENT_MODE = require('./html').DOCUMENT_MODE; //Const var VALID_DOCTYPE_NAME = 'html', QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd', QUIRKS_MODE_PUBLIC_ID_PREFIXES = [ '+//silmaril//dtd html pro v0r11 19970101//en', '-//advasoft ltd//dtd html 3.0 aswedit + extensions//en', '-//as//dtd html 3.0 aswedit + extensions//en', '-//ietf//dtd html 2.0 level 1//en', '-//ietf//dtd html 2.0 level 2//en', '-//ietf//dtd html 2.0 strict level 1//en', '-//ietf//dtd html 2.0 strict level 2//en', '-//ietf//dtd html 2.0 strict//en', '-//ietf//dtd html 2.0//en', '-//ietf//dtd html 2.1e//en', '-//ietf//dtd html 3.0//en', '-//ietf//dtd html 3.0//en//', '-//ietf//dtd html 3.2 final//en', '-//ietf//dtd html 3.2//en', '-//ietf//dtd html 3//en', '-//ietf//dtd html level 0//en', '-//ietf//dtd html level 0//en//2.0', '-//ietf//dtd html level 1//en', '-//ietf//dtd html level 1//en//2.0', '-//ietf//dtd html level 2//en', '-//ietf//dtd html level 2//en//2.0', '-//ietf//dtd html level 3//en', '-//ietf//dtd html level 3//en//3.0', '-//ietf//dtd html strict level 0//en', '-//ietf//dtd html strict level 0//en//2.0', '-//ietf//dtd html strict level 1//en', '-//ietf//dtd html strict level 1//en//2.0', '-//ietf//dtd html strict level 2//en', '-//ietf//dtd html strict level 2//en//2.0', '-//ietf//dtd html strict level 3//en', '-//ietf//dtd html strict level 3//en//3.0', '-//ietf//dtd html strict//en', '-//ietf//dtd html strict//en//2.0', '-//ietf//dtd html strict//en//3.0', '-//ietf//dtd html//en', '-//ietf//dtd html//en//2.0', '-//ietf//dtd html//en//3.0', '-//metrius//dtd metrius presentational//en', '-//microsoft//dtd internet explorer 2.0 html strict//en', '-//microsoft//dtd internet explorer 2.0 html//en', '-//microsoft//dtd internet explorer 2.0 tables//en', '-//microsoft//dtd internet explorer 3.0 html strict//en', '-//microsoft//dtd internet explorer 3.0 html//en', '-//microsoft//dtd internet explorer 3.0 tables//en', '-//netscape comm. corp.//dtd html//en', '-//netscape comm. corp.//dtd strict html//en', '-//o\'reilly and associates//dtd html 2.0//en', '-//o\'reilly and associates//dtd html extended 1.0//en', '-//spyglass//dtd html 2.0 extended//en', '-//sq//dtd html 2.0 hotmetal + extensions//en', '-//sun microsystems corp.//dtd hotjava html//en', '-//sun microsystems corp.//dtd hotjava strict html//en', '-//w3c//dtd html 3 1995-03-24//en', '-//w3c//dtd html 3.2 draft//en', '-//w3c//dtd html 3.2 final//en', '-//w3c//dtd html 3.2//en', '-//w3c//dtd html 3.2s draft//en', '-//w3c//dtd html 4.0 frameset//en', '-//w3c//dtd html 4.0 transitional//en', '-//w3c//dtd html experimental 19960712//en', '-//w3c//dtd html experimental 970421//en', '-//w3c//dtd w3 html//en', '-//w3o//dtd w3 html 3.0//en', '-//w3o//dtd w3 html 3.0//en//', '-//webtechs//dtd mozilla html 2.0//en', '-//webtechs//dtd mozilla html//en' ], QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = QUIRKS_MODE_PUBLIC_ID_PREFIXES.concat([ '-//w3c//dtd html 4.01 frameset//', '-//w3c//dtd html 4.01 transitional//' ]), QUIRKS_MODE_PUBLIC_IDS = [ '-//w3o//dtd w3 html strict 3.0//en//', '-/w3c/dtd html 4.0 transitional/en', 'html' ], LIMITED_QUIRKS_PUBLIC_ID_PREFIXES = [ '-//W3C//DTD XHTML 1.0 Frameset//', '-//W3C//DTD XHTML 1.0 Transitional//' ], LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES = LIMITED_QUIRKS_PUBLIC_ID_PREFIXES.concat([ '-//W3C//DTD HTML 4.01 Frameset//', '-//W3C//DTD HTML 4.01 Transitional//' ]); //Utils function enquoteDoctypeId(id) { var quote = id.indexOf('"') !== -1 ? '\'' : '"'; return quote + id + quote; } function hasPrefix(publicId, prefixes) { for (var i = 0; i < prefixes.length; i++) { if (publicId.indexOf(prefixes[i]) === 0) return true; } return false; } //API exports.getDocumentMode = function (name, publicId, systemId) { if (name !== VALID_DOCTYPE_NAME) return DOCUMENT_MODE.QUIRKS; if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID) return DOCUMENT_MODE.QUIRKS; if (publicId !== null) { publicId = publicId.toLowerCase(); if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1) return DOCUMENT_MODE.QUIRKS; var prefixes = systemId === null ? QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES : QUIRKS_MODE_PUBLIC_ID_PREFIXES; if (hasPrefix(publicId, prefixes)) return DOCUMENT_MODE.QUIRKS; prefixes = systemId === null ? LIMITED_QUIRKS_PUBLIC_ID_PREFIXES : LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES; if (hasPrefix(publicId, prefixes)) return DOCUMENT_MODE.LIMITED_QUIRKS; } return DOCUMENT_MODE.NO_QUIRKS; }; exports.serializeContent = function (name, publicId, systemId) { var str = '!DOCTYPE '; if (name) str += name; if (publicId !== null) str += ' PUBLIC ' + enquoteDoctypeId(publicId); else if (systemId !== null) str += ' SYSTEM'; if (systemId !== null) str += ' ' + enquoteDoctypeId(systemId); return str; }; },{"./html":34}],33:[function(require,module,exports){ 'use strict'; var Tokenizer = require('../tokenizer'), HTML = require('./html'); //Aliases var $ = HTML.TAG_NAMES, NS = HTML.NAMESPACES, ATTRS = HTML.ATTRS; //MIME types var MIME_TYPES = { TEXT_HTML: 'text/html', APPLICATION_XML: 'application/xhtml+xml' }; //Attributes var DEFINITION_URL_ATTR = 'definitionurl', ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL', SVG_ATTRS_ADJUSTMENT_MAP = { 'attributename': 'attributeName', 'attributetype': 'attributeType', 'basefrequency': 'baseFrequency', 'baseprofile': 'baseProfile', 'calcmode': 'calcMode', 'clippathunits': 'clipPathUnits', 'diffuseconstant': 'diffuseConstant', 'edgemode': 'edgeMode', 'filterunits': 'filterUnits', 'glyphref': 'glyphRef', 'gradienttransform': 'gradientTransform', 'gradientunits': 'gradientUnits', 'kernelmatrix': 'kernelMatrix', 'kernelunitlength': 'kernelUnitLength', 'keypoints': 'keyPoints', 'keysplines': 'keySplines', 'keytimes': 'keyTimes', 'lengthadjust': 'lengthAdjust', 'limitingconeangle': 'limitingConeAngle', 'markerheight': 'markerHeight', 'markerunits': 'markerUnits', 'markerwidth': 'markerWidth', 'maskcontentunits': 'maskContentUnits', 'maskunits': 'maskUnits', 'numoctaves': 'numOctaves', 'pathlength': 'pathLength', 'patterncontentunits': 'patternContentUnits', 'patterntransform': 'patternTransform', 'patternunits': 'patternUnits', 'pointsatx': 'pointsAtX', 'pointsaty': 'pointsAtY', 'pointsatz': 'pointsAtZ', 'preservealpha': 'preserveAlpha', 'preserveaspectratio': 'preserveAspectRatio', 'primitiveunits': 'primitiveUnits', 'refx': 'refX', 'refy': 'refY', 'repeatcount': 'repeatCount', 'repeatdur': 'repeatDur', 'requiredextensions': 'requiredExtensions', 'requiredfeatures': 'requiredFeatures', 'specularconstant': 'specularConstant', 'specularexponent': 'specularExponent', 'spreadmethod': 'spreadMethod', 'startoffset': 'startOffset', 'stddeviation': 'stdDeviation', 'stitchtiles': 'stitchTiles', 'surfacescale': 'surfaceScale', 'systemlanguage': 'systemLanguage', 'tablevalues': 'tableValues', 'targetx': 'targetX', 'targety': 'targetY', 'textlength': 'textLength', 'viewbox': 'viewBox', 'viewtarget': 'viewTarget', 'xchannelselector': 'xChannelSelector', 'ychannelselector': 'yChannelSelector', 'zoomandpan': 'zoomAndPan' }, XML_ATTRS_ADJUSTMENT_MAP = { 'xlink:actuate': {prefix: 'xlink', name: 'actuate', namespace: NS.XLINK}, 'xlink:arcrole': {prefix: 'xlink', name: 'arcrole', namespace: NS.XLINK}, 'xlink:href': {prefix: 'xlink', name: 'href', namespace: NS.XLINK}, 'xlink:role': {prefix: 'xlink', name: 'role', namespace: NS.XLINK}, 'xlink:show': {prefix: 'xlink', name: 'show', namespace: NS.XLINK}, 'xlink:title': {prefix: 'xlink', name: 'title', namespace: NS.XLINK}, 'xlink:type': {prefix: 'xlink', name: 'type', namespace: NS.XLINK}, 'xml:base': {prefix: 'xml', name: 'base', namespace: NS.XML}, 'xml:lang': {prefix: 'xml', name: 'lang', namespace: NS.XML}, 'xml:space': {prefix: 'xml', name: 'space', namespace: NS.XML}, 'xmlns': {prefix: '', name: 'xmlns', namespace: NS.XMLNS}, 'xmlns:xlink': {prefix: 'xmlns', name: 'xlink', namespace: NS.XMLNS} }; //SVG tag names adjustment map var SVG_TAG_NAMES_ADJUSTMENT_MAP = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = { 'altglyph': 'altGlyph', 'altglyphdef': 'altGlyphDef', 'altglyphitem': 'altGlyphItem', 'animatecolor': 'animateColor', 'animatemotion': 'animateMotion', 'animatetransform': 'animateTransform', 'clippath': 'clipPath', 'feblend': 'feBlend', 'fecolormatrix': 'feColorMatrix', 'fecomponenttransfer': 'feComponentTransfer', 'fecomposite': 'feComposite', 'feconvolvematrix': 'feConvolveMatrix', 'fediffuselighting': 'feDiffuseLighting', 'fedisplacementmap': 'feDisplacementMap', 'fedistantlight': 'feDistantLight', 'feflood': 'feFlood', 'fefunca': 'feFuncA', 'fefuncb': 'feFuncB', 'fefuncg': 'feFuncG', 'fefuncr': 'feFuncR', 'fegaussianblur': 'feGaussianBlur', 'feimage': 'feImage', 'femerge': 'feMerge', 'femergenode': 'feMergeNode', 'femorphology': 'feMorphology', 'feoffset': 'feOffset', 'fepointlight': 'fePointLight', 'fespecularlighting': 'feSpecularLighting', 'fespotlight': 'feSpotLight', 'fetile': 'feTile', 'feturbulence': 'feTurbulence', 'foreignobject': 'foreignObject', 'glyphref': 'glyphRef', 'lineargradient': 'linearGradient', 'radialgradient': 'radialGradient', 'textpath': 'textPath' }; //Tags that causes exit from foreign content var EXITS_FOREIGN_CONTENT = Object.create(null); EXITS_FOREIGN_CONTENT[$.B] = true; EXITS_FOREIGN_CONTENT[$.BIG] = true; EXITS_FOREIGN_CONTENT[$.BLOCKQUOTE] = true; EXITS_FOREIGN_CONTENT[$.BODY] = true; EXITS_FOREIGN_CONTENT[$.BR] = true; EXITS_FOREIGN_CONTENT[$.CENTER] = true; EXITS_FOREIGN_CONTENT[$.CODE] = true; EXITS_FOREIGN_CONTENT[$.DD] = true; EXITS_FOREIGN_CONTENT[$.DIV] = true; EXITS_FOREIGN_CONTENT[$.DL] = true; EXITS_FOREIGN_CONTENT[$.DT] = true; EXITS_FOREIGN_CONTENT[$.EM] = true; EXITS_FOREIGN_CONTENT[$.EMBED] = true; EXITS_FOREIGN_CONTENT[$.H1] = true; EXITS_FOREIGN_CONTENT[$.H2] = true; EXITS_FOREIGN_CONTENT[$.H3] = true; EXITS_FOREIGN_CONTENT[$.H4] = true; EXITS_FOREIGN_CONTENT[$.H5] = true; EXITS_FOREIGN_CONTENT[$.H6] = true; EXITS_FOREIGN_CONTENT[$.HEAD] = true; EXITS_FOREIGN_CONTENT[$.HR] = true; EXITS_FOREIGN_CONTENT[$.I] = true; EXITS_FOREIGN_CONTENT[$.IMG] = true; EXITS_FOREIGN_CONTENT[$.LI] = true; EXITS_FOREIGN_CONTENT[$.LISTING] = true; EXITS_FOREIGN_CONTENT[$.MENU] = true; EXITS_FOREIGN_CONTENT[$.META] = true; EXITS_FOREIGN_CONTENT[$.NOBR] = true; EXITS_FOREIGN_CONTENT[$.OL] = true; EXITS_FOREIGN_CONTENT[$.P] = true; EXITS_FOREIGN_CONTENT[$.PRE] = true; EXITS_FOREIGN_CONTENT[$.RUBY] = true; EXITS_FOREIGN_CONTENT[$.S] = true; EXITS_FOREIGN_CONTENT[$.SMALL] = true; EXITS_FOREIGN_CONTENT[$.SPAN] = true; EXITS_FOREIGN_CONTENT[$.STRONG] = true; EXITS_FOREIGN_CONTENT[$.STRIKE] = true; EXITS_FOREIGN_CONTENT[$.SUB] = true; EXITS_FOREIGN_CONTENT[$.SUP] = true; EXITS_FOREIGN_CONTENT[$.TABLE] = true; EXITS_FOREIGN_CONTENT[$.TT] = true; EXITS_FOREIGN_CONTENT[$.U] = true; EXITS_FOREIGN_CONTENT[$.UL] = true; EXITS_FOREIGN_CONTENT[$.VAR] = true; //Check exit from foreign content exports.causesExit = function (startTagToken) { var tn = startTagToken.tagName; var isFontWithAttrs = tn === $.FONT && (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null || Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null || Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null); return isFontWithAttrs ? true : EXITS_FOREIGN_CONTENT[tn]; }; //Token adjustments exports.adjustTokenMathMLAttrs = function (token) { for (var i = 0; i < token.attrs.length; i++) { if (token.attrs[i].name === DEFINITION_URL_ATTR) { token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR; break; } } }; exports.adjustTokenSVGAttrs = function (token) { for (var i = 0; i < token.attrs.length; i++) { var adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name]; if (adjustedAttrName) token.attrs[i].name = adjustedAttrName; } }; exports.adjustTokenXMLAttrs = function (token) { for (var i = 0; i < token.attrs.length; i++) { var adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name]; if (adjustedAttrEntry) { token.attrs[i].prefix = adjustedAttrEntry.prefix; token.attrs[i].name = adjustedAttrEntry.name; token.attrs[i].namespace = adjustedAttrEntry.namespace; } } }; exports.adjustTokenSVGTagName = function (token) { var adjustedTagName = SVG_TAG_NAMES_ADJUSTMENT_MAP[token.tagName]; if (adjustedTagName) token.tagName = adjustedTagName; }; //Integration points function isMathMLTextIntegrationPoint(tn, ns) { return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT); } function isHtmlIntegrationPoint(tn, ns, attrs) { if (ns === NS.MATHML && tn === $.ANNOTATION_XML) { for (var i = 0; i < attrs.length; i++) { if (attrs[i].name === ATTRS.ENCODING) { var value = attrs[i].value.toLowerCase(); return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML; } } } return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE); } exports.isIntegrationPoint = function (tn, ns, attrs, foreignNS) { if ((!foreignNS || foreignNS === NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs)) return true; if ((!foreignNS || foreignNS === NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns)) return true; return false; }; },{"../tokenizer":42,"./html":34}],34:[function(require,module,exports){ 'use strict'; var NS = exports.NAMESPACES = { HTML: 'http://www.w3.org/1999/xhtml', MATHML: 'http://www.w3.org/1998/Math/MathML', SVG: 'http://www.w3.org/2000/svg', XLINK: 'http://www.w3.org/1999/xlink', XML: 'http://www.w3.org/XML/1998/namespace', XMLNS: 'http://www.w3.org/2000/xmlns/' }; exports.ATTRS = { TYPE: 'type', ACTION: 'action', ENCODING: 'encoding', PROMPT: 'prompt', NAME: 'name', COLOR: 'color', FACE: 'face', SIZE: 'size' }; exports.DOCUMENT_MODE = { NO_QUIRKS: 'no-quirks', QUIRKS: 'quirks', LIMITED_QUIRKS: 'limited-quirks' }; var $ = exports.TAG_NAMES = { A: 'a', ADDRESS: 'address', ANNOTATION_XML: 'annotation-xml', APPLET: 'applet', AREA: 'area', ARTICLE: 'article', ASIDE: 'aside', B: 'b', BASE: 'base', BASEFONT: 'basefont', BGSOUND: 'bgsound', BIG: 'big', BLOCKQUOTE: 'blockquote', BODY: 'body', BR: 'br', BUTTON: 'button', CAPTION: 'caption', CENTER: 'center', CODE: 'code', COL: 'col', COLGROUP: 'colgroup', DD: 'dd', DESC: 'desc', DETAILS: 'details', DIALOG: 'dialog', DIR: 'dir', DIV: 'div', DL: 'dl', DT: 'dt', EM: 'em', EMBED: 'embed', FIELDSET: 'fieldset', FIGCAPTION: 'figcaption', FIGURE: 'figure', FONT: 'font', FOOTER: 'footer', FOREIGN_OBJECT: 'foreignObject', FORM: 'form', FRAME: 'frame', FRAMESET: 'frameset', H1: 'h1', H2: 'h2', H3: 'h3', H4: 'h4', H5: 'h5', H6: 'h6', HEAD: 'head', HEADER: 'header', HGROUP: 'hgroup', HR: 'hr', HTML: 'html', I: 'i', IMG: 'img', IMAGE: 'image', INPUT: 'input', IFRAME: 'iframe', KEYGEN: 'keygen', LABEL: 'label', LI: 'li', LINK: 'link', LISTING: 'listing', MAIN: 'main', MALIGNMARK: 'malignmark', MARQUEE: 'marquee', MATH: 'math', MENU: 'menu', MENUITEM: 'menuitem', META: 'meta', MGLYPH: 'mglyph', MI: 'mi', MO: 'mo', MN: 'mn', MS: 'ms', MTEXT: 'mtext', NAV: 'nav', NOBR: 'nobr', NOFRAMES: 'noframes', NOEMBED: 'noembed', NOSCRIPT: 'noscript', OBJECT: 'object', OL: 'ol', OPTGROUP: 'optgroup', OPTION: 'option', P: 'p', PARAM: 'param', PLAINTEXT: 'plaintext', PRE: 'pre', RB: 'rb', RP: 'rp', RT: 'rt', RTC: 'rtc', RUBY: 'ruby', S: 's', SCRIPT: 'script', SECTION: 'section', SELECT: 'select', SOURCE: 'source', SMALL: 'small', SPAN: 'span', STRIKE: 'strike', STRONG: 'strong', STYLE: 'style', SUB: 'sub', SUMMARY: 'summary', SUP: 'sup', TABLE: 'table', TBODY: 'tbody', TEMPLATE: 'template', TEXTAREA: 'textarea', TFOOT: 'tfoot', TD: 'td', TH: 'th', THEAD: 'thead', TITLE: 'title', TR: 'tr', TRACK: 'track', TT: 'tt', U: 'u', UL: 'ul', SVG: 'svg', VAR: 'var', WBR: 'wbr', XMP: 'xmp' }; var SPECIAL_ELEMENTS = exports.SPECIAL_ELEMENTS = Object.create(null); SPECIAL_ELEMENTS[NS.HTML] = Object.create(null); SPECIAL_ELEMENTS[NS.HTML][$.ADDRESS] = true; SPECIAL_ELEMENTS[NS.HTML][$.APPLET] = true; SPECIAL_ELEMENTS[NS.HTML][$.AREA] = true; SPECIAL_ELEMENTS[NS.HTML][$.ARTICLE] = true; SPECIAL_ELEMENTS[NS.HTML][$.ASIDE] = true; SPECIAL_ELEMENTS[NS.HTML][$.BASE] = true; SPECIAL_ELEMENTS[NS.HTML][$.BASEFONT] = true; SPECIAL_ELEMENTS[NS.HTML][$.BGSOUND] = true; SPECIAL_ELEMENTS[NS.HTML][$.BLOCKQUOTE] = true; SPECIAL_ELEMENTS[NS.HTML][$.BODY] = true; SPECIAL_ELEMENTS[NS.HTML][$.BR] = true; SPECIAL_ELEMENTS[NS.HTML][$.BUTTON] = true; SPECIAL_ELEMENTS[NS.HTML][$.CAPTION] = true; SPECIAL_ELEMENTS[NS.HTML][$.CENTER] = true; SPECIAL_ELEMENTS[NS.HTML][$.COL] = true; SPECIAL_ELEMENTS[NS.HTML][$.COLGROUP] = true; SPECIAL_ELEMENTS[NS.HTML][$.DD] = true; SPECIAL_ELEMENTS[NS.HTML][$.DETAILS] = true; SPECIAL_ELEMENTS[NS.HTML][$.DIR] = true; SPECIAL_ELEMENTS[NS.HTML][$.DIV] = true; SPECIAL_ELEMENTS[NS.HTML][$.DL] = true; SPECIAL_ELEMENTS[NS.HTML][$.DT] = true; SPECIAL_ELEMENTS[NS.HTML][$.EMBED] = true; SPECIAL_ELEMENTS[NS.HTML][$.FIELDSET] = true; SPECIAL_ELEMENTS[NS.HTML][$.FIGCAPTION] = true; SPECIAL_ELEMENTS[NS.HTML][$.FIGURE] = true; SPECIAL_ELEMENTS[NS.HTML][$.FOOTER] = true; SPECIAL_ELEMENTS[NS.HTML][$.FORM] = true; SPECIAL_ELEMENTS[NS.HTML][$.FRAME] = true; SPECIAL_ELEMENTS[NS.HTML][$.FRAMESET] = true; SPECIAL_ELEMENTS[NS.HTML][$.H1] = true; SPECIAL_ELEMENTS[NS.HTML][$.H2] = true; SPECIAL_ELEMENTS[NS.HTML][$.H3] = true; SPECIAL_ELEMENTS[NS.HTML][$.H4] = true; SPECIAL_ELEMENTS[NS.HTML][$.H5] = true; SPECIAL_ELEMENTS[NS.HTML][$.H6] = true; SPECIAL_ELEMENTS[NS.HTML][$.HEAD] = true; SPECIAL_ELEMENTS[NS.HTML][$.HEADER] = true; SPECIAL_ELEMENTS[NS.HTML][$.HGROUP] = true; SPECIAL_ELEMENTS[NS.HTML][$.HR] = true; SPECIAL_ELEMENTS[NS.HTML][$.HTML] = true; SPECIAL_ELEMENTS[NS.HTML][$.IFRAME] = true; SPECIAL_ELEMENTS[NS.HTML][$.IMG] = true; SPECIAL_ELEMENTS[NS.HTML][$.INPUT] = true; SPECIAL_ELEMENTS[NS.HTML][$.LI] = true; SPECIAL_ELEMENTS[NS.HTML][$.LINK] = true; SPECIAL_ELEMENTS[NS.HTML][$.LISTING] = true; SPECIAL_ELEMENTS[NS.HTML][$.MAIN] = true; SPECIAL_ELEMENTS[NS.HTML][$.MARQUEE] = true; SPECIAL_ELEMENTS[NS.HTML][$.MENU] = true; SPECIAL_ELEMENTS[NS.HTML][$.META] = true; SPECIAL_ELEMENTS[NS.HTML][$.NAV] = true; SPECIAL_ELEMENTS[NS.HTML][$.NOEMBED] = true; SPECIAL_ELEMENTS[NS.HTML][$.NOFRAMES] = true; SPECIAL_ELEMENTS[NS.HTML][$.NOSCRIPT] = true; SPECIAL_ELEMENTS[NS.HTML][$.OBJECT] = true; SPECIAL_ELEMENTS[NS.HTML][$.OL] = true; SPECIAL_ELEMENTS[NS.HTML][$.P] = true; SPECIAL_ELEMENTS[NS.HTML][$.PARAM] = true; SPECIAL_ELEMENTS[NS.HTML][$.PLAINTEXT] = true; SPECIAL_ELEMENTS[NS.HTML][$.PRE] = true; SPECIAL_ELEMENTS[NS.HTML][$.SCRIPT] = true; SPECIAL_ELEMENTS[NS.HTML][$.SECTION] = true; SPECIAL_ELEMENTS[NS.HTML][$.SELECT] = true; SPECIAL_ELEMENTS[NS.HTML][$.SOURCE] = true; SPECIAL_ELEMENTS[NS.HTML][$.STYLE] = true; SPECIAL_ELEMENTS[NS.HTML][$.SUMMARY] = true; SPECIAL_ELEMENTS[NS.HTML][$.TABLE] = true; SPECIAL_ELEMENTS[NS.HTML][$.TBODY] = true; SPECIAL_ELEMENTS[NS.HTML][$.TD] = true; SPECIAL_ELEMENTS[NS.HTML][$.TEMPLATE] = true; SPECIAL_ELEMENTS[NS.HTML][$.TEXTAREA] = true; SPECIAL_ELEMENTS[NS.HTML][$.TFOOT] = true; SPECIAL_ELEMENTS[NS.HTML][$.TH] = true; SPECIAL_ELEMENTS[NS.HTML][$.THEAD] = true; SPECIAL_ELEMENTS[NS.HTML][$.TITLE] = true; SPECIAL_ELEMENTS[NS.HTML][$.TR] = true; SPECIAL_ELEMENTS[NS.HTML][$.TRACK] = true; SPECIAL_ELEMENTS[NS.HTML][$.UL] = true; SPECIAL_ELEMENTS[NS.HTML][$.WBR] = true; SPECIAL_ELEMENTS[NS.HTML][$.XMP] = true; SPECIAL_ELEMENTS[NS.MATHML] = Object.create(null); SPECIAL_ELEMENTS[NS.MATHML][$.MI] = true; SPECIAL_ELEMENTS[NS.MATHML][$.MO] = true; SPECIAL_ELEMENTS[NS.MATHML][$.MN] = true; SPECIAL_ELEMENTS[NS.MATHML][$.MS] = true; SPECIAL_ELEMENTS[NS.MATHML][$.MTEXT] = true; SPECIAL_ELEMENTS[NS.MATHML][$.ANNOTATION_XML] = true; SPECIAL_ELEMENTS[NS.SVG] = Object.create(null); SPECIAL_ELEMENTS[NS.SVG][$.TITLE] = true; SPECIAL_ELEMENTS[NS.SVG][$.FOREIGN_OBJECT] = true; SPECIAL_ELEMENTS[NS.SVG][$.DESC] = true; },{}],35:[function(require,module,exports){ 'use strict'; module.exports = function mergeOptions(defaults, options) { options = options || Object.create(null); return [defaults, options].reduce(function (merged, optObj) { Object.keys(optObj).forEach(function (key) { merged[key] = optObj[key]; }); return merged; }, Object.create(null)); }; },{}],36:[function(require,module,exports){ 'use strict'; exports.REPLACEMENT_CHARACTER = '\uFFFD'; exports.CODE_POINTS = { EOF: -1, NULL: 0x00, TABULATION: 0x09, CARRIAGE_RETURN: 0x0D, LINE_FEED: 0x0A, FORM_FEED: 0x0C, SPACE: 0x20, EXCLAMATION_MARK: 0x21, QUOTATION_MARK: 0x22, NUMBER_SIGN: 0x23, AMPERSAND: 0x26, APOSTROPHE: 0x27, HYPHEN_MINUS: 0x2D, SOLIDUS: 0x2F, DIGIT_0: 0x30, DIGIT_9: 0x39, SEMICOLON: 0x3B, LESS_THAN_SIGN: 0x3C, EQUALS_SIGN: 0x3D, GREATER_THAN_SIGN: 0x3E, QUESTION_MARK: 0x3F, LATIN_CAPITAL_A: 0x41, LATIN_CAPITAL_F: 0x46, LATIN_CAPITAL_X: 0x58, LATIN_CAPITAL_Z: 0x5A, GRAVE_ACCENT: 0x60, LATIN_SMALL_A: 0x61, LATIN_SMALL_F: 0x66, LATIN_SMALL_X: 0x78, LATIN_SMALL_Z: 0x7A, REPLACEMENT_CHARACTER: 0xFFFD }; exports.CODE_POINT_SEQUENCES = { DASH_DASH_STRING: [0x2D, 0x2D], //-- DOCTYPE_STRING: [0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45], //DOCTYPE CDATA_START_STRING: [0x5B, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5B], //[CDATA[ CDATA_END_STRING: [0x5D, 0x5D, 0x3E], //]]> SCRIPT_STRING: [0x73, 0x63, 0x72, 0x69, 0x70, 0x74], //script PUBLIC_STRING: [0x50, 0x55, 0x42, 0x4C, 0x49, 0x43], //PUBLIC SYSTEM_STRING: [0x53, 0x59, 0x53, 0x54, 0x45, 0x4D] //SYSTEM }; },{}],37:[function(require,module,exports){ 'use strict'; var OpenElementStack = require('../parser/open_element_stack'), Tokenizer = require('../tokenizer'), HTML = require('../common/html'); //Aliases var $ = HTML.TAG_NAMES; exports.assign = function (parser) { //NOTE: obtain Parser proto this way to avoid module circular references var parserProto = Object.getPrototypeOf(parser), treeAdapter = parser.treeAdapter, attachableElementLocation = null, lastFosterParentingLocation = null, currentToken = null; function setEndLocation(element, closingToken) { var loc = element.__location; if (!loc) return; if (!loc.startTag) { loc.startTag = { line: loc.line, col: loc.col, startOffset: loc.startOffset, endOffset: loc.endOffset }; if (loc.attrs) loc.startTag.attrs = loc.attrs; } if (closingToken.location) { var ctLocation = closingToken.location, tn = treeAdapter.getTagName(element), // NOTE: For cases like

- First 'p' closes without a closing tag and // for cases like

- 'p' closes without a closing tag isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN && tn === closingToken.tagName; if (isClosingEndTag) { loc.endTag = { line: ctLocation.line, col: ctLocation.col, startOffset: ctLocation.startOffset, endOffset: ctLocation.endOffset }; } if (isClosingEndTag) loc.endOffset = ctLocation.endOffset; else loc.endOffset = ctLocation.startOffset; } else if (closingToken.type === Tokenizer.EOF_TOKEN) loc.endOffset = parser.tokenizer.preprocessor.sourcePos; } //NOTE: patch _bootstrap method parser._bootstrap = function (document, fragmentContext) { parserProto._bootstrap.call(this, document, fragmentContext); attachableElementLocation = null; lastFosterParentingLocation = null; currentToken = null; //OpenElementStack parser.openElements.pop = function () { setEndLocation(this.current, currentToken); OpenElementStack.prototype.pop.call(this); }; parser.openElements.popAllUpToHtmlElement = function () { for (var i = this.stackTop; i > 0; i--) setEndLocation(this.items[i], currentToken); OpenElementStack.prototype.popAllUpToHtmlElement.call(this); }; parser.openElements.remove = function (element) { setEndLocation(element, currentToken); OpenElementStack.prototype.remove.call(this, element); }; }; parser._runParsingLoop = function (scriptHandler) { parserProto._runParsingLoop.call(this, scriptHandler); // NOTE: generate location info for elements // that remains on open element stack for (var i = parser.openElements.stackTop; i >= 0; i--) setEndLocation(parser.openElements.items[i], currentToken); }; //Token processing parser._processTokenInForeignContent = function (token) { currentToken = token; parserProto._processTokenInForeignContent.call(this, token); }; parser._processToken = function (token) { currentToken = token; parserProto._processToken.call(this, token); //NOTE: and are never popped from the stack, so we need to updated //their end location explicitly. if (token.type === Tokenizer.END_TAG_TOKEN && (token.tagName === $.HTML || token.tagName === $.BODY && this.openElements.hasInScope($.BODY))) { for (var i = this.openElements.stackTop; i >= 0; i--) { var element = this.openElements.items[i]; if (this.treeAdapter.getTagName(element) === token.tagName) { setEndLocation(element, token); break; } } } }; //Doctype parser._setDocumentType = function (token) { parserProto._setDocumentType.call(this, token); var documentChildren = this.treeAdapter.getChildNodes(this.document), cnLength = documentChildren.length; for (var i = 0; i < cnLength; i++) { var node = documentChildren[i]; if (this.treeAdapter.isDocumentTypeNode(node)) { node.__location = token.location; break; } } }; //Elements parser._attachElementToTree = function (element) { //NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods. //So we will use token location stored in this methods for the element. element.__location = attachableElementLocation || null; attachableElementLocation = null; parserProto._attachElementToTree.call(this, element); }; parser._appendElement = function (token, namespaceURI) { attachableElementLocation = token.location; parserProto._appendElement.call(this, token, namespaceURI); }; parser._insertElement = function (token, namespaceURI) { attachableElementLocation = token.location; parserProto._insertElement.call(this, token, namespaceURI); }; parser._insertTemplate = function (token) { attachableElementLocation = token.location; parserProto._insertTemplate.call(this, token); var tmplContent = this.treeAdapter.getTemplateContent(this.openElements.current); tmplContent.__location = null; }; parser._insertFakeRootElement = function () { parserProto._insertFakeRootElement.call(this); this.openElements.current.__location = null; }; //Comments parser._appendCommentNode = function (token, parent) { parserProto._appendCommentNode.call(this, token, parent); var children = this.treeAdapter.getChildNodes(parent), commentNode = children[children.length - 1]; commentNode.__location = token.location; }; //Text parser._findFosterParentingLocation = function () { //NOTE: store last foster parenting location, so we will be able to find inserted text //in case of foster parenting lastFosterParentingLocation = parserProto._findFosterParentingLocation.call(this); return lastFosterParentingLocation; }; parser._insertCharacters = function (token) { parserProto._insertCharacters.call(this, token); var hasFosterParent = this._shouldFosterParentOnInsertion(), parent = hasFosterParent && lastFosterParentingLocation.parent || this.openElements.currentTmplContent || this.openElements.current, siblings = this.treeAdapter.getChildNodes(parent), textNodeIdx = hasFosterParent && lastFosterParentingLocation.beforeElement ? siblings.indexOf(lastFosterParentingLocation.beforeElement) - 1 : siblings.length - 1, textNode = siblings[textNodeIdx]; //NOTE: if we have location assigned by another token, then just update end position if (textNode.__location) textNode.__location.endOffset = token.location.endOffset; else textNode.__location = token.location; }; }; },{"../common/html":34,"../parser/open_element_stack":41,"../tokenizer":42}],38:[function(require,module,exports){ 'use strict'; var UNICODE = require('../common/unicode'); //Aliases var $ = UNICODE.CODE_POINTS; exports.assign = function (tokenizer) { //NOTE: obtain Tokenizer proto this way to avoid module circular references var tokenizerProto = Object.getPrototypeOf(tokenizer), tokenStartOffset = -1, tokenCol = -1, tokenLine = 1, isEol = false, lineStartPos = 0, col = -1, line = 1; function attachLocationInfo(token) { token.location = { line: tokenLine, col: tokenCol, startOffset: tokenStartOffset, endOffset: -1 }; } //NOTE: patch consumption method to track line/col information tokenizer._consume = function () { var cp = tokenizerProto._consume.call(this); //NOTE: LF should be in the last column of the line if (isEol) { isEol = false; line++; lineStartPos = this.preprocessor.sourcePos; } if (cp === $.LINE_FEED) isEol = true; col = this.preprocessor.sourcePos - lineStartPos + 1; return cp; }; tokenizer._unconsume = function () { tokenizerProto._unconsume.call(this); isEol = false; col = this.preprocessor.sourcePos - lineStartPos + 1; }; //NOTE: patch token creation methods and attach location objects tokenizer._createStartTagToken = function () { tokenizerProto._createStartTagToken.call(this); attachLocationInfo(this.currentToken); }; tokenizer._createEndTagToken = function () { tokenizerProto._createEndTagToken.call(this); attachLocationInfo(this.currentToken); }; tokenizer._createCommentToken = function () { tokenizerProto._createCommentToken.call(this); attachLocationInfo(this.currentToken); }; tokenizer._createDoctypeToken = function (initialName) { tokenizerProto._createDoctypeToken.call(this, initialName); attachLocationInfo(this.currentToken); }; tokenizer._createCharacterToken = function (type, ch) { tokenizerProto._createCharacterToken.call(this, type, ch); attachLocationInfo(this.currentCharacterToken); }; tokenizer._createAttr = function (attrNameFirstCh) { tokenizerProto._createAttr.call(this, attrNameFirstCh); this.currentAttrLocation = { line: line, col: col, startOffset: this.preprocessor.sourcePos, endOffset: -1 }; }; tokenizer._leaveAttrName = function (toState) { tokenizerProto._leaveAttrName.call(this, toState); this._attachCurrentAttrLocationInfo(); }; tokenizer._leaveAttrValue = function (toState) { tokenizerProto._leaveAttrValue.call(this, toState); this._attachCurrentAttrLocationInfo(); }; tokenizer._attachCurrentAttrLocationInfo = function () { this.currentAttrLocation.endOffset = this.preprocessor.sourcePos; if (!this.currentToken.location.attrs) this.currentToken.location.attrs = Object.create(null); this.currentToken.location.attrs[this.currentAttr.name] = this.currentAttrLocation; }; //NOTE: patch token emission methods to determine end location tokenizer._emitCurrentToken = function () { //NOTE: if we have pending character token make it's end location equal to the //current token's start location. if (this.currentCharacterToken) this.currentCharacterToken.location.endOffset = this.currentToken.location.startOffset; this.currentToken.location.endOffset = this.preprocessor.sourcePos + 1; tokenizerProto._emitCurrentToken.call(this); }; tokenizer._emitCurrentCharacterToken = function () { //NOTE: if we have character token and it's location wasn't set in the _emitCurrentToken(), //then set it's location at the current preprocessor position. //We don't need to increment preprocessor position, since character token //emission is always forced by the start of the next character token here. //So, we already have advanced position. if (this.currentCharacterToken && this.currentCharacterToken.location.endOffset === -1) this.currentCharacterToken.location.endOffset = this.preprocessor.sourcePos; tokenizerProto._emitCurrentCharacterToken.call(this); }; //NOTE: patch initial states for each mode to obtain token start position Object.keys(tokenizerProto.MODE) .map(function (modeName) { return tokenizerProto.MODE[modeName]; }) .forEach(function (state) { tokenizer[state] = function (cp) { tokenStartOffset = this.preprocessor.sourcePos; tokenLine = line; tokenCol = col; tokenizerProto[state].call(this, cp); }; }); }; },{"../common/unicode":36}],39:[function(require,module,exports){ 'use strict'; //Const var NOAH_ARK_CAPACITY = 3; //List of formatting elements var FormattingElementList = module.exports = function (treeAdapter) { this.length = 0; this.entries = []; this.treeAdapter = treeAdapter; this.bookmark = null; }; //Entry types FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY'; FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY'; //Noah Ark's condition //OPTIMIZATION: at first we try to find possible candidates for exclusion using //lightweight heuristics without thorough attributes check. FormattingElementList.prototype._getNoahArkConditionCandidates = function (newElement) { var candidates = []; if (this.length >= NOAH_ARK_CAPACITY) { var neAttrsLength = this.treeAdapter.getAttrList(newElement).length, neTagName = this.treeAdapter.getTagName(newElement), neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement); for (var i = this.length - 1; i >= 0; i--) { var entry = this.entries[i]; if (entry.type === FormattingElementList.MARKER_ENTRY) break; var element = entry.element, elementAttrs = this.treeAdapter.getAttrList(element), isCandidate = this.treeAdapter.getTagName(element) === neTagName && this.treeAdapter.getNamespaceURI(element) === neNamespaceURI && elementAttrs.length === neAttrsLength; if (isCandidate) candidates.push({idx: i, attrs: elementAttrs}); } } return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates; }; FormattingElementList.prototype._ensureNoahArkCondition = function (newElement) { var candidates = this._getNoahArkConditionCandidates(newElement), cLength = candidates.length; if (cLength) { var neAttrs = this.treeAdapter.getAttrList(newElement), neAttrsLength = neAttrs.length, neAttrsMap = Object.create(null); //NOTE: build attrs map for the new element so we can perform fast lookups for (var i = 0; i < neAttrsLength; i++) { var neAttr = neAttrs[i]; neAttrsMap[neAttr.name] = neAttr.value; } for (i = 0; i < neAttrsLength; i++) { for (var j = 0; j < cLength; j++) { var cAttr = candidates[j].attrs[i]; if (neAttrsMap[cAttr.name] !== cAttr.value) { candidates.splice(j, 1); cLength--; } if (candidates.length < NOAH_ARK_CAPACITY) return; } } //NOTE: remove bottommost candidates until Noah's Ark condition will not be met for (i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) { this.entries.splice(candidates[i].idx, 1); this.length--; } } }; //Mutations FormattingElementList.prototype.insertMarker = function () { this.entries.push({type: FormattingElementList.MARKER_ENTRY}); this.length++; }; FormattingElementList.prototype.pushElement = function (element, token) { this._ensureNoahArkCondition(element); this.entries.push({ type: FormattingElementList.ELEMENT_ENTRY, element: element, token: token }); this.length++; }; FormattingElementList.prototype.insertElementAfterBookmark = function (element, token) { var bookmarkIdx = this.length - 1; for (; bookmarkIdx >= 0; bookmarkIdx--) { if (this.entries[bookmarkIdx] === this.bookmark) break; } this.entries.splice(bookmarkIdx + 1, 0, { type: FormattingElementList.ELEMENT_ENTRY, element: element, token: token }); this.length++; }; FormattingElementList.prototype.removeEntry = function (entry) { for (var i = this.length - 1; i >= 0; i--) { if (this.entries[i] === entry) { this.entries.splice(i, 1); this.length--; break; } } }; FormattingElementList.prototype.clearToLastMarker = function () { while (this.length) { var entry = this.entries.pop(); this.length--; if (entry.type === FormattingElementList.MARKER_ENTRY) break; } }; //Search FormattingElementList.prototype.getElementEntryInScopeWithTagName = function (tagName) { for (var i = this.length - 1; i >= 0; i--) { var entry = this.entries[i]; if (entry.type === FormattingElementList.MARKER_ENTRY) return null; if (this.treeAdapter.getTagName(entry.element) === tagName) return entry; } return null; }; FormattingElementList.prototype.getElementEntry = function (element) { for (var i = this.length - 1; i >= 0; i--) { var entry = this.entries[i]; if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element === element) return entry; } return null; }; },{}],40:[function(require,module,exports){ 'use strict'; var Tokenizer = require('../tokenizer'), OpenElementStack = require('./open_element_stack'), FormattingElementList = require('./formatting_element_list'), locationInfoMixin = require('../location_info/parser_mixin'), defaultTreeAdapter = require('../tree_adapters/default'), doctype = require('../common/doctype'), foreignContent = require('../common/foreign_content'), mergeOptions = require('../common/merge_options'), UNICODE = require('../common/unicode'), HTML = require('../common/html'); //Aliases var $ = HTML.TAG_NAMES, NS = HTML.NAMESPACES, ATTRS = HTML.ATTRS; var DEFAULT_OPTIONS = { locationInfo: false, treeAdapter: defaultTreeAdapter }; //Misc constants var HIDDEN_INPUT_TYPE = 'hidden'; //Adoption agency loops iteration count var AA_OUTER_LOOP_ITER = 8, AA_INNER_LOOP_ITER = 3; //Insertion modes var INITIAL_MODE = 'INITIAL_MODE', BEFORE_HTML_MODE = 'BEFORE_HTML_MODE', BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE', IN_HEAD_MODE = 'IN_HEAD_MODE', AFTER_HEAD_MODE = 'AFTER_HEAD_MODE', IN_BODY_MODE = 'IN_BODY_MODE', TEXT_MODE = 'TEXT_MODE', IN_TABLE_MODE = 'IN_TABLE_MODE', IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE', IN_CAPTION_MODE = 'IN_CAPTION_MODE', IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE', IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE', IN_ROW_MODE = 'IN_ROW_MODE', IN_CELL_MODE = 'IN_CELL_MODE', IN_SELECT_MODE = 'IN_SELECT_MODE', IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE', IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE', AFTER_BODY_MODE = 'AFTER_BODY_MODE', IN_FRAMESET_MODE = 'IN_FRAMESET_MODE', AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE', AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE', AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE'; //Insertion mode reset map var INSERTION_MODE_RESET_MAP = Object.create(null); INSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE; INSERTION_MODE_RESET_MAP[$.TBODY] = INSERTION_MODE_RESET_MAP[$.THEAD] = INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE; INSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE; INSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE; INSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE; INSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE; INSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE; //Template insertion mode switch map var TEMPLATE_INSERTION_MODE_SWITCH_MAP = Object.create(null); TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE; TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE; TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE; TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE; //Token handlers map for insertion modes var _ = Object.create(null); _[INITIAL_MODE] = Object.create(null); _[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] = _[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode; _[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; _[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode; _[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] = _[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] = _[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode; _[BEFORE_HTML_MODE] = Object.create(null); _[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] = _[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml; _[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; _[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml; _[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml; _[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml; _[BEFORE_HEAD_MODE] = Object.create(null); _[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = _[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead; _[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken; _[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead; _[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead; _[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead; _[IN_HEAD_MODE] = Object.create(null); _[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead; _[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; _[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead; _[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead; _[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead; _[AFTER_HEAD_MODE] = Object.create(null); _[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = _[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead; _[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; _[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead; _[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead; _[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead; _[IN_BODY_MODE] = Object.create(null); _[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; _[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; _[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody; _[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody; _[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[TEXT_MODE] = Object.create(null); _[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = _[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = _[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; _[TEXT_MODE][Tokenizer.COMMENT_TOKEN] = _[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] = _[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken; _[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText; _[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText; _[IN_TABLE_MODE] = Object.create(null); _[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = _[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; _[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable; _[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable; _[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[IN_TABLE_TEXT_MODE] = Object.create(null); _[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText; _[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText; _[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] = _[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] = _[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] = _[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] = _[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText; _[IN_CAPTION_MODE] = Object.create(null); _[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; _[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; _[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption; _[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption; _[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[IN_COLUMN_GROUP_MODE] = Object.create(null); _[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup; _[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; _[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup; _[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup; _[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[IN_TABLE_BODY_MODE] = Object.create(null); _[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = _[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; _[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody; _[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody; _[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[IN_ROW_MODE] = Object.create(null); _[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = _[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable; _[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow; _[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow; _[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[IN_CELL_MODE] = Object.create(null); _[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; _[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; _[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell; _[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell; _[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[IN_SELECT_MODE] = Object.create(null); _[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters; _[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; _[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect; _[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect; _[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[IN_SELECT_IN_TABLE_MODE] = Object.create(null); _[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters; _[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; _[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable; _[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable; _[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody; _[IN_TEMPLATE_MODE] = Object.create(null); _[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody; _[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; _[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate; _[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate; _[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate; _[AFTER_BODY_MODE] = Object.create(null); _[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = _[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody; _[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; _[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement; _[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody; _[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody; _[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing; _[IN_FRAMESET_MODE] = Object.create(null); _[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; _[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset; _[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset; _[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; _[AFTER_FRAMESET_MODE] = Object.create(null); _[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = _[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters; _[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment; _[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset; _[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset; _[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; _[AFTER_AFTER_BODY_MODE] = Object.create(null); _[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody; _[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody; _[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; _[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument; _[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody; _[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody; _[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing; _[AFTER_AFTER_FRAMESET_MODE] = Object.create(null); _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken; _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody; _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument; _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken; _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset; _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken; _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; //Parser var Parser = module.exports = function (options) { this.options = mergeOptions(DEFAULT_OPTIONS, options); this.treeAdapter = this.options.treeAdapter; this.pendingScript = null; if (this.options.locationInfo) locationInfoMixin.assign(this); }; // API Parser.prototype.parse = function (html) { var document = this.treeAdapter.createDocument(); this._bootstrap(document, null); this.tokenizer.write(html, true); this._runParsingLoop(null); return document; }; Parser.prototype.parseFragment = function (html, fragmentContext) { //NOTE: use