Files
phpvms/public/assets/system/js/system-deps.js
T

19316 lines
2.1 MiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/jquery/dist/jquery.js":
/***/ (function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
* jQuery JavaScript Library v3.2.1
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2017-03-20T18:59Z
*/
( function( global, factory ) {
"use strict";
if ( typeof module === "object" && typeof module.exports === "object" ) {
// For CommonJS and CommonJS-like environments where a proper `window`
// is present, execute the factory and get jQuery.
// For environments that do not have a `window` with a `document`
// (such as Node.js), expose a factory as module.exports.
// This accentuates the need for the creation of a real `window`.
// e.g. var jQuery = require("jquery")(window);
// See ticket #14549 for more info.
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
// Pass this if window is not defined yet
} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
// enough that all such attempts are guarded in a try block.
"use strict";
var arr = [];
var document = window.document;
var getProto = Object.getPrototypeOf;
var slice = arr.slice;
var concat = arr.concat;
var push = arr.push;
var indexOf = arr.indexOf;
var class2type = {};
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
var fnToString = hasOwn.toString;
var ObjectFunctionString = fnToString.call( Object );
var support = {};
function DOMEval( code, doc ) {
doc = doc || document;
var script = doc.createElement( "script" );
script.text = code;
doc.head.appendChild( script ).parentNode.removeChild( script );
}
/* global Symbol */
// Defining this global in .eslintrc.json would create a danger of using the global
// unguarded in another place, it seems safer to define global only for this module
var
version = "3.2.1",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
// Need init if jQuery is called (just allow error to be thrown if not included)
return new jQuery.fn.init( selector, context );
},
// Support: Android <=4.0 only
// Make sure we trim BOM and NBSP
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
// Matches dashed string for camelizing
rmsPrefix = /^-ms-/,
rdashAlpha = /-([a-z])/g,
// Used by jQuery.camelCase as callback to replace()
fcamelCase = function( all, letter ) {
return letter.toUpperCase();
};
jQuery.fn = jQuery.prototype = {
// The current version of jQuery being used
jquery: version,
constructor: jQuery,
// The default length of a jQuery object is 0
length: 0,
toArray: function() {
return slice.call( this );
},
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function( num ) {
// Return all the elements in a clean array
if ( num == null ) {
return slice.call( this );
}
// Return just the one element from the set
return num < 0 ? this[ num + this.length ] : this[ num ];
},
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems ) {
// Build a new jQuery matched element set
var ret = jQuery.merge( this.constructor(), elems );
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
// Return the newly-formed element set
return ret;
},
// Execute a callback for every element in the matched set.
each: function( callback ) {
return jQuery.each( this, callback );
},
map: function( callback ) {
return this.pushStack( jQuery.map( this, function( elem, i ) {
return callback.call( elem, i, elem );
} ) );
},
slice: function() {
return this.pushStack( slice.apply( this, arguments ) );
},
first: function() {
return this.eq( 0 );
},
last: function() {
return this.eq( -1 );
},
eq: function( i ) {
var len = this.length,
j = +i + ( i < 0 ? len : 0 );
return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
},
end: function() {
return this.prevObject || this.constructor();
},
// For internal use only.
// Behaves like an Array's method, not like a jQuery method.
push: push,
sort: arr.sort,
splice: arr.splice
};
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[ 0 ] || {},
i = 1,
length = arguments.length,
deep = false;
// Handle a deep copy situation
if ( typeof target === "boolean" ) {
deep = target;
// Skip the boolean and the target
target = arguments[ i ] || {};
i++;
}
// Handle case when target is a string or something (possible in deep copy)
if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
target = {};
}
// Extend jQuery itself if only one argument is passed
if ( i === length ) {
target = this;
i--;
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
if ( ( options = arguments[ i ] ) != null ) {
// Extend the base object
for ( name in options ) {
src = target[ name ];
copy = options[ name ];
// Prevent never-ending loop
if ( target === copy ) {
continue;
}
// Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
( copyIsArray = Array.isArray( copy ) ) ) ) {
if ( copyIsArray ) {
copyIsArray = false;
clone = src && Array.isArray( src ) ? src : [];
} else {
clone = src && jQuery.isPlainObject( src ) ? src : {};
}
// Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
}
}
// Return the modified object
return target;
};
jQuery.extend( {
// Unique for each copy of jQuery on the page
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
// Assume jQuery is ready without the ready module
isReady: true,
error: function( msg ) {
throw new Error( msg );
},
noop: function() {},
isFunction: function( obj ) {
return jQuery.type( obj ) === "function";
},
isWindow: function( obj ) {
return obj != null && obj === obj.window;
},
isNumeric: function( obj ) {
// As of jQuery 3.0, isNumeric is limited to
// strings and numbers (primitives or objects)
// that can be coerced to finite numbers (gh-2662)
var type = jQuery.type( obj );
return ( type === "number" || type === "string" ) &&
// parseFloat NaNs numeric-cast false positives ("")
// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
// subtraction forces infinities to NaN
!isNaN( obj - parseFloat( obj ) );
},
isPlainObject: function( obj ) {
var proto, Ctor;
// Detect obvious negatives
// Use toString instead of jQuery.type to catch host objects
if ( !obj || toString.call( obj ) !== "[object Object]" ) {
return false;
}
proto = getProto( obj );
// Objects with no prototype (e.g., `Object.create( null )`) are plain
if ( !proto ) {
return true;
}
// Objects with prototype are plain iff they were constructed by a global Object function
Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
},
isEmptyObject: function( obj ) {
/* eslint-disable no-unused-vars */
// See https://github.com/eslint/eslint/issues/6125
var name;
for ( name in obj ) {
return false;
}
return true;
},
type: function( obj ) {
if ( obj == null ) {
return obj + "";
}
// Support: Android <=2.3 only (functionish RegExp)
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call( obj ) ] || "object" :
typeof obj;
},
// Evaluates a script in a global context
globalEval: function( code ) {
DOMEval( code );
},
// Convert dashed to camelCase; used by the css and data modules
// Support: IE <=9 - 11, Edge 12 - 13
// Microsoft forgot to hump their vendor prefix (#9572)
camelCase: function( string ) {
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
},
each: function( obj, callback ) {
var length, i = 0;
if ( isArrayLike( obj ) ) {
length = obj.length;
for ( ; i < length; i++ ) {
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
} else {
for ( i in obj ) {
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
}
return obj;
},
// Support: Android <=4.0 only
trim: function( text ) {
return text == null ?
"" :
( text + "" ).replace( rtrim, "" );
},
// results is for internal usage only
makeArray: function( arr, results ) {
var ret = results || [];
if ( arr != null ) {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
[ arr ] : arr
);
} else {
push.call( ret, arr );
}
}
return ret;
},
inArray: function( elem, arr, i ) {
return arr == null ? -1 : indexOf.call( arr, elem, i );
},
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
merge: function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
for ( ; j < len; j++ ) {
first[ i++ ] = second[ j ];
}
first.length = i;
return first;
},
grep: function( elems, callback, invert ) {
var callbackInverse,
matches = [],
i = 0,
length = elems.length,
callbackExpect = !invert;
// Go through the array, only saving the items
// that pass the validator function
for ( ; i < length; i++ ) {
callbackInverse = !callback( elems[ i ], i );
if ( callbackInverse !== callbackExpect ) {
matches.push( elems[ i ] );
}
}
return matches;
},
// arg is for internal usage only
map: function( elems, callback, arg ) {
var length, value,
i = 0,
ret = [];
// Go through the array, translating each of the items to their new values
if ( isArrayLike( elems ) ) {
length = elems.length;
for ( ; i < length; i++ ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret.push( value );
}
}
// Go through every key on the object,
} else {
for ( i in elems ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret.push( value );
}
}
}
// Flatten any nested arrays
return concat.apply( [], ret );
},
// A global GUID counter for objects
guid: 1,
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function( fn, context ) {
var tmp, args, proxy;
if ( typeof context === "string" ) {
tmp = fn[ context ];
context = fn;
fn = tmp;
}
// Quick check to determine if target is callable, in the spec
// this throws a TypeError, but we will just return undefined.
if ( !jQuery.isFunction( fn ) ) {
return undefined;
}
// Simulated bind
args = slice.call( arguments, 2 );
proxy = function() {
return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
};
// Set the guid of unique handler to the same of original handler, so it can be removed
proxy.guid = fn.guid = fn.guid || jQuery.guid++;
return proxy;
},
now: Date.now,
// jQuery.support is not used in Core but other projects attach their
// properties to it so it needs to exist.
support: support
} );
if ( typeof Symbol === "function" ) {
jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
}
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( i, name ) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
} );
function isArrayLike( obj ) {
// Support: real iOS 8.2 only (not reproducible in simulator)
// `in` check used to prevent JIT error (gh-2145)
// hasOwn isn't used here due to false negatives
// regarding Nodelist length in IE
var length = !!obj && "length" in obj && obj.length,
type = jQuery.type( obj );
if ( type === "function" || jQuery.isWindow( obj ) ) {
return false;
}
return type === "array" || length === 0 ||
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
var Sizzle =
/*!
* Sizzle CSS Selector Engine v2.3.3
* https://sizzlejs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2016-08-08
*/
(function( window ) {
var i,
support,
Expr,
getText,
isXML,
tokenize,
compile,
select,
outermostContext,
sortInput,
hasDuplicate,
// Local document vars
setDocument,
document,
docElem,
documentIsHTML,
rbuggyQSA,
rbuggyMatches,
matches,
contains,
// Instance-specific data
expando = "sizzle" + 1 * new Date(),
preferredDoc = window.document,
dirruns = 0,
done = 0,
classCache = createCache(),
tokenCache = createCache(),
compilerCache = createCache(),
sortOrder = function( a, b ) {
if ( a === b ) {
hasDuplicate = true;
}
return 0;
},
// Instance methods
hasOwn = ({}).hasOwnProperty,
arr = [],
pop = arr.pop,
push_native = arr.push,
push = arr.push,
slice = arr.slice,
// Use a stripped-down indexOf as it's faster than native
// https://jsperf.com/thor-indexof-vs-for/5
indexOf = function( list, elem ) {
var i = 0,
len = list.length;
for ( ; i < len; i++ ) {
if ( list[i] === elem ) {
return i;
}
}
return -1;
},
booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
// Regular expressions
// http://www.w3.org/TR/css3-selectors/#whitespace
whitespace = "[\\x20\\t\\r\\n\\f]",
// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
// Operator (capture 2)
"*([*^$|!~]?=)" + whitespace +
// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
"*\\]",
pseudos = ":(" + identifier + ")(?:\\((" +
// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
// 1. quoted (capture 3; capture 4 or capture 5)
"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
// 2. simple (capture 6)
"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
// 3. anything else (capture 2)
".*" +
")\\)|)",
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
rwhitespace = new RegExp( whitespace + "+", "g" ),
rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
rpseudo = new RegExp( pseudos ),
ridentifier = new RegExp( "^" + identifier + "$" ),
matchExpr = {
"ID": new RegExp( "^#(" + identifier + ")" ),
"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
"TAG": new RegExp( "^(" + identifier + "|[*])" ),
"ATTR": new RegExp( "^" + attributes ),
"PSEUDO": new RegExp( "^" + pseudos ),
"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
// For use in libraries implementing .is()
// We use this for POS matching in `select`
"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
},
rinputs = /^(?:input|select|textarea|button)$/i,
rheader = /^h\d$/i,
rnative = /^[^{]+\{\s*\[native \w/,
// Easily-parseable/retrievable ID or TAG or CLASS selectors
rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
rsibling = /[+~]/,
// CSS escapes
// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
funescape = function( _, escaped, escapedWhitespace ) {
var high = "0x" + escaped - 0x10000;
// NaN means non-codepoint
// Support: Firefox<24
// Workaround erroneous numeric interpretation of +"0x"
return high !== high || escapedWhitespace ?
escaped :
high < 0 ?
// BMP codepoint
String.fromCharCode( high + 0x10000 ) :
// Supplemental Plane codepoint (surrogate pair)
String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
},
// CSS string/identifier serialization
// https://drafts.csswg.org/cssom/#common-serializing-idioms
rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
fcssescape = function( ch, asCodePoint ) {
if ( asCodePoint ) {
// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
if ( ch === "\0" ) {
return "\uFFFD";
}
// Control characters and (dependent upon position) numbers get escaped as code points
return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
}
// Other potentially-special ASCII characters get backslash-escaped
return "\\" + ch;
},
// Used for iframes
// See setDocument()
// Removing the function wrapper causes a "Permission Denied"
// error in IE
unloadHandler = function() {
setDocument();
},
disabledAncestor = addCombinator(
function( elem ) {
return elem.disabled === true && ("form" in elem || "label" in elem);
},
{ dir: "parentNode", next: "legend" }
);
// Optimize for push.apply( _, NodeList )
try {
push.apply(
(arr = slice.call( preferredDoc.childNodes )),
preferredDoc.childNodes
);
// Support: Android<4.0
// Detect silently failing push.apply
arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
push = { apply: arr.length ?
// Leverage slice if possible
function( target, els ) {
push_native.apply( target, slice.call(els) );
} :
// Support: IE<9
// Otherwise append directly
function( target, els ) {
var j = target.length,
i = 0;
// Can't trust NodeList.length
while ( (target[j++] = els[i++]) ) {}
target.length = j - 1;
}
};
}
function Sizzle( selector, context, results, seed ) {
var m, i, elem, nid, match, groups, newSelector,
newContext = context && context.ownerDocument,
// nodeType defaults to 9, since context defaults to document
nodeType = context ? context.nodeType : 9;
results = results || [];
// Return early from calls with invalid selector or context
if ( typeof selector !== "string" || !selector ||
nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
return results;
}
// Try to shortcut find operations (as opposed to filters) in HTML documents
if ( !seed ) {
if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
setDocument( context );
}
context = context || document;
if ( documentIsHTML ) {
// If the selector is sufficiently simple, try using a "get*By*" DOM method
// (excepting DocumentFragment context, where the methods don't exist)
if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
// ID selector
if ( (m = match[1]) ) {
// Document context
if ( nodeType === 9 ) {
if ( (elem = context.getElementById( m )) ) {
// Support: IE, Opera, Webkit
// TODO: identify versions
// getElementById can match elements by name instead of ID
if ( elem.id === m ) {
results.push( elem );
return results;
}
} else {
return results;
}
// Element context
} else {
// Support: IE, Opera, Webkit
// TODO: identify versions
// getElementById can match elements by name instead of ID
if ( newContext && (elem = newContext.getElementById( m )) &&
contains( context, elem ) &&
elem.id === m ) {
results.push( elem );
return results;
}
}
// Type selector
} else if ( match[2] ) {
push.apply( results, context.getElementsByTagName( selector ) );
return results;
// Class selector
} else if ( (m = match[3]) && support.getElementsByClassName &&
context.getElementsByClassName ) {
push.apply( results, context.getElementsByClassName( m ) );
return results;
}
}
// Take advantage of querySelectorAll
if ( support.qsa &&
!compilerCache[ selector + " " ] &&
(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
if ( nodeType !== 1 ) {
newContext = context;
newSelector = selector;
// qSA looks outside Element context, which is not what we want
// Thanks to Andrew Dupont for this workaround technique
// Support: IE <=8
// Exclude object elements
} else if ( context.nodeName.toLowerCase() !== "object" ) {
// Capture the context ID, setting it first if necessary
if ( (nid = context.getAttribute( "id" )) ) {
nid = nid.replace( rcssescape, fcssescape );
} else {
context.setAttribute( "id", (nid = expando) );
}
// Prefix every selector in the list
groups = tokenize( selector );
i = groups.length;
while ( i-- ) {
groups[i] = "#" + nid + " " + toSelector( groups[i] );
}
newSelector = groups.join( "," );
// Expand context for sibling selectors
newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
context;
}
if ( newSelector ) {
try {
push.apply( results,
newContext.querySelectorAll( newSelector )
);
return results;
} catch ( qsaError ) {
} finally {
if ( nid === expando ) {
context.removeAttribute( "id" );
}
}
}
}
}
}
// All others
return select( selector.replace( rtrim, "$1" ), context, results, seed );
}
/**
* Create key-value caches of limited size
* @returns {function(string, object)} Returns the Object data after storing it on itself with
* property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
* deleting the oldest entry
*/
function createCache() {
var keys = [];
function cache( key, value ) {
// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
if ( keys.push( key + " " ) > Expr.cacheLength ) {
// Only keep the most recent entries
delete cache[ keys.shift() ];
}
return (cache[ key + " " ] = value);
}
return cache;
}
/**
* Mark a function for special use by Sizzle
* @param {Function} fn The function to mark
*/
function markFunction( fn ) {
fn[ expando ] = true;
return fn;
}
/**
* Support testing using an element
* @param {Function} fn Passed the created element and returns a boolean result
*/
function assert( fn ) {
var el = document.createElement("fieldset");
try {
return !!fn( el );
} catch (e) {
return false;
} finally {
// Remove from its parent by default
if ( el.parentNode ) {
el.parentNode.removeChild( el );
}
// release memory in IE
el = null;
}
}
/**
* Adds the same handler for all of the specified attrs
* @param {String} attrs Pipe-separated list of attributes
* @param {Function} handler The method that will be applied
*/
function addHandle( attrs, handler ) {
var arr = attrs.split("|"),
i = arr.length;
while ( i-- ) {
Expr.attrHandle[ arr[i] ] = handler;
}
}
/**
* Checks document order of two siblings
* @param {Element} a
* @param {Element} b
* @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
*/
function siblingCheck( a, b ) {
var cur = b && a,
diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
a.sourceIndex - b.sourceIndex;
// Use IE sourceIndex if available on both nodes
if ( diff ) {
return diff;
}
// Check if b follows a
if ( cur ) {
while ( (cur = cur.nextSibling) ) {
if ( cur === b ) {
return -1;
}
}
}
return a ? 1 : -1;
}
/**
* Returns a function to use in pseudos for input types
* @param {String} type
*/
function createInputPseudo( type ) {
return function( elem ) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === type;
};
}
/**
* Returns a function to use in pseudos for buttons
* @param {String} type
*/
function createButtonPseudo( type ) {
return function( elem ) {
var name = elem.nodeName.toLowerCase();
return (name === "input" || name === "button") && elem.type === type;
};
}
/**
* Returns a function to use in pseudos for :enabled/:disabled
* @param {Boolean} disabled true for :disabled; false for :enabled
*/
function createDisabledPseudo( disabled ) {
// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
return function( elem ) {
// Only certain elements can match :enabled or :disabled
// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
if ( "form" in elem ) {
// Check for inherited disabledness on relevant non-disabled elements:
// * listed form-associated elements in a disabled fieldset
// https://html.spec.whatwg.org/multipage/forms.html#category-listed
// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
// * option elements in a disabled optgroup
// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
// All such elements have a "form" property.
if ( elem.parentNode && elem.disabled === false ) {
// Option elements defer to a parent optgroup if present
if ( "label" in elem ) {
if ( "label" in elem.parentNode ) {
return elem.parentNode.disabled === disabled;
} else {
return elem.disabled === disabled;
}
}
// Support: IE 6 - 11
// Use the isDisabled shortcut property to check for disabled fieldset ancestors
return elem.isDisabled === disabled ||
// Where there is no isDisabled, check manually
/* jshint -W018 */
elem.isDisabled !== !disabled &&
disabledAncestor( elem ) === disabled;
}
return elem.disabled === disabled;
// Try to winnow out elements that can't be disabled before trusting the disabled property.
// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
// even exist on them, let alone have a boolean value.
} else if ( "label" in elem ) {
return elem.disabled === disabled;
}
// Remaining elements are neither :enabled nor :disabled
return false;
};
}
/**
* Returns a function to use in pseudos for positionals
* @param {Function} fn
*/
function createPositionalPseudo( fn ) {
return markFunction(function( argument ) {
argument = +argument;
return markFunction(function( seed, matches ) {
var j,
matchIndexes = fn( [], seed.length, argument ),
i = matchIndexes.length;
// Match elements found at the specified indexes
while ( i-- ) {
if ( seed[ (j = matchIndexes[i]) ] ) {
seed[j] = !(matches[j] = seed[j]);
}
}
});
});
}
/**
* Checks a node for validity as a Sizzle context
* @param {Element|Object=} context
* @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
*/
function testContext( context ) {
return context && typeof context.getElementsByTagName !== "undefined" && context;
}
// Expose support vars for convenience
support = Sizzle.support = {};
/**
* Detects XML nodes
* @param {Element|Object} elem An element or a document
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
// documentElement is verified for cases where it doesn't yet exist
// (such as loading iframes in IE - #4833)
var documentElement = elem && (elem.ownerDocument || elem).documentElement;
return documentElement ? documentElement.nodeName !== "HTML" : false;
};
/**
* Sets document-related variables once based on the current document
* @param {Element|Object} [doc] An element or document object to use to set the document
* @returns {Object} Returns the current document
*/
setDocument = Sizzle.setDocument = function( node ) {
var hasCompare, subWindow,
doc = node ? node.ownerDocument || node : preferredDoc;
// Return early if doc is invalid or already selected
if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
return document;
}
// Update global variables
document = doc;
docElem = document.documentElement;
documentIsHTML = !isXML( document );
// Support: IE 9-11, Edge
// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
if ( preferredDoc !== document &&
(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
// Support: IE 11, Edge
if ( subWindow.addEventListener ) {
subWindow.addEventListener( "unload", unloadHandler, false );
// Support: IE 9 - 10 only
} else if ( subWindow.attachEvent ) {
subWindow.attachEvent( "onunload", unloadHandler );
}
}
/* Attributes
---------------------------------------------------------------------- */
// Support: IE<8
// Verify that getAttribute really returns attributes and not properties
// (excepting IE8 booleans)
support.attributes = assert(function( el ) {
el.className = "i";
return !el.getAttribute("className");
});
/* getElement(s)By*
---------------------------------------------------------------------- */
// Check if getElementsByTagName("*") returns only elements
support.getElementsByTagName = assert(function( el ) {
el.appendChild( document.createComment("") );
return !el.getElementsByTagName("*").length;
});
// Support: IE<9
support.getElementsByClassName = rnative.test( document.getElementsByClassName );
// Support: IE<10
// Check if getElementById returns elements by name
// The broken getElementById methods don't pick up programmatically-set names,
// so use a roundabout getElementsByName test
support.getById = assert(function( el ) {
docElem.appendChild( el ).id = expando;
return !document.getElementsByName || !document.getElementsByName( expando ).length;
});
// ID filter and find
if ( support.getById ) {
Expr.filter["ID"] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
return elem.getAttribute("id") === attrId;
};
};
Expr.find["ID"] = function( id, context ) {
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
var elem = context.getElementById( id );
return elem ? [ elem ] : [];
}
};
} else {
Expr.filter["ID"] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
var node = typeof elem.getAttributeNode !== "undefined" &&
elem.getAttributeNode("id");
return node && node.value === attrId;
};
};
// Support: IE 6 - 7 only
// getElementById is not reliable as a find shortcut
Expr.find["ID"] = function( id, context ) {
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
var node, i, elems,
elem = context.getElementById( id );
if ( elem ) {
// Verify the id attribute
node = elem.getAttributeNode("id");
if ( node && node.value === id ) {
return [ elem ];
}
// Fall back on getElementsByName
elems = context.getElementsByName( id );
i = 0;
while ( (elem = elems[i++]) ) {
node = elem.getAttributeNode("id");
if ( node && node.value === id ) {
return [ elem ];
}
}
}
return [];
}
};
}
// Tag
Expr.find["TAG"] = support.getElementsByTagName ?
function( tag, context ) {
if ( typeof context.getElementsByTagName !== "undefined" ) {
return context.getElementsByTagName( tag );
// DocumentFragment nodes don't have gEBTN
} else if ( support.qsa ) {
return context.querySelectorAll( tag );
}
} :
function( tag, context ) {
var elem,
tmp = [],
i = 0,
// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
results = context.getElementsByTagName( tag );
// Filter out possible comments
if ( tag === "*" ) {
while ( (elem = results[i++]) ) {
if ( elem.nodeType === 1 ) {
tmp.push( elem );
}
}
return tmp;
}
return results;
};
// Class
Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
return context.getElementsByClassName( className );
}
};
/* QSA/matchesSelector
---------------------------------------------------------------------- */
// QSA and matchesSelector support
// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
rbuggyMatches = [];
// qSa(:focus) reports false when true (Chrome 21)
// We allow this because of a bug in IE8/9 that throws an error
// whenever `document.activeElement` is accessed on an iframe
// So, we allow :focus to pass through QSA all the time to avoid the IE error
// See https://bugs.jquery.com/ticket/13378
rbuggyQSA = [];
if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
// Build QSA regex
// Regex strategy adopted from Diego Perini
assert(function( el ) {
// Select is set to empty string on purpose
// This is to test IE's treatment of not explicitly
// setting a boolean content attribute,
// since its presence should be enough
// https://bugs.jquery.com/ticket/12359
docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
"<select id='" + expando + "-\r\\' msallowcapture=''>" +
"<option selected=''></option></select>";
// Support: IE8, Opera 11-12.16
// Nothing should be selected when empty strings follow ^= or $= or *=
// The test attribute must be unknown in Opera but "safe" for WinRT
// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
if ( el.querySelectorAll("[msallowcapture^='']").length ) {
rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
}
// Support: IE8
// Boolean attributes and "value" are not treated correctly
if ( !el.querySelectorAll("[selected]").length ) {
rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
}
// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
rbuggyQSA.push("~=");
}
// Webkit/Opera - :checked should return selected option elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
// IE8 throws error here and will not see later tests
if ( !el.querySelectorAll(":checked").length ) {
rbuggyQSA.push(":checked");
}
// Support: Safari 8+, iOS 8+
// https://bugs.webkit.org/show_bug.cgi?id=136851
// In-page `selector#id sibling-combinator selector` fails
if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
rbuggyQSA.push(".#.+[+~]");
}
});
assert(function( el ) {
el.innerHTML = "<a href='' disabled='disabled'></a>" +
"<select disabled='disabled'><option/></select>";
// Support: Windows 8 Native Apps
// The type and name attributes are restricted during .innerHTML assignment
var input = document.createElement("input");
input.setAttribute( "type", "hidden" );
el.appendChild( input ).setAttribute( "name", "D" );
// Support: IE8
// Enforce case-sensitivity of name attribute
if ( el.querySelectorAll("[name=d]").length ) {
rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
}
// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
// IE8 throws error here and will not see later tests
if ( el.querySelectorAll(":enabled").length !== 2 ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
// Support: IE9-11+
// IE's :disabled selector does not pick up the children of disabled fieldsets
docElem.appendChild( el ).disabled = true;
if ( el.querySelectorAll(":disabled").length !== 2 ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
// Opera 10-11 does not throw on post-comma invalid pseudos
el.querySelectorAll("*,:x");
rbuggyQSA.push(",.*:");
});
}
if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
docElem.webkitMatchesSelector ||
docElem.mozMatchesSelector ||
docElem.oMatchesSelector ||
docElem.msMatchesSelector) )) ) {
assert(function( el ) {
// Check to see if it's possible to do matchesSelector
// on a disconnected node (IE 9)
support.disconnectedMatch = matches.call( el, "*" );
// This should fail with an exception
// Gecko does not error, returns false instead
matches.call( el, "[s!='']:x" );
rbuggyMatches.push( "!=", pseudos );
});
}
rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
/* Contains
---------------------------------------------------------------------- */
hasCompare = rnative.test( docElem.compareDocumentPosition );
// Element contains another
// Purposefully self-exclusive
// As in, an element does not contain itself
contains = hasCompare || rnative.test( docElem.contains ) ?
function( a, b ) {
var adown = a.nodeType === 9 ? a.documentElement : a,
bup = b && b.parentNode;
return a === bup || !!( bup && bup.nodeType === 1 && (
adown.contains ?
adown.contains( bup ) :
a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
));
} :
function( a, b ) {
if ( b ) {
while ( (b = b.parentNode) ) {
if ( b === a ) {
return true;
}
}
}
return false;
};
/* Sorting
---------------------------------------------------------------------- */
// Document order sorting
sortOrder = hasCompare ?
function( a, b ) {
// Flag for duplicate removal
if ( a === b ) {
hasDuplicate = true;
return 0;
}
// Sort on method existence if only one input has compareDocumentPosition
var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
if ( compare ) {
return compare;
}
// Calculate position if both inputs belong to the same document
compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
a.compareDocumentPosition( b ) :
// Otherwise we know they are disconnected
1;
// Disconnected nodes
if ( compare & 1 ||
(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
// Choose the first element that is related to our preferred document
if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
return -1;
}
if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
return 1;
}
// Maintain original order
return sortInput ?
( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
0;
}
return compare & 4 ? -1 : 1;
} :
function( a, b ) {
// Exit early if the nodes are identical
if ( a === b ) {
hasDuplicate = true;
return 0;
}
var cur,
i = 0,
aup = a.parentNode,
bup = b.parentNode,
ap = [ a ],
bp = [ b ];
// Parentless nodes are either documents or disconnected
if ( !aup || !bup ) {
return a === document ? -1 :
b === document ? 1 :
aup ? -1 :
bup ? 1 :
sortInput ?
( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
0;
// If the nodes are siblings, we can do a quick check
} else if ( aup === bup ) {
return siblingCheck( a, b );
}
// Otherwise we need full lists of their ancestors for comparison
cur = a;
while ( (cur = cur.parentNode) ) {
ap.unshift( cur );
}
cur = b;
while ( (cur = cur.parentNode) ) {
bp.unshift( cur );
}
// Walk down the tree looking for a discrepancy
while ( ap[i] === bp[i] ) {
i++;
}
return i ?
// Do a sibling check if the nodes have a common ancestor
siblingCheck( ap[i], bp[i] ) :
// Otherwise nodes in our document sort first
ap[i] === preferredDoc ? -1 :
bp[i] === preferredDoc ? 1 :
0;
};
return document;
};
Sizzle.matches = function( expr, elements ) {
return Sizzle( expr, null, null, elements );
};
Sizzle.matchesSelector = function( elem, expr ) {
// Set document vars if needed
if ( ( elem.ownerDocument || elem ) !== document ) {
setDocument( elem );
}
// Make sure that attribute selectors are quoted
expr = expr.replace( rattributeQuotes, "='$1']" );
if ( support.matchesSelector && documentIsHTML &&
!compilerCache[ expr + " " ] &&
( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
try {
var ret = matches.call( elem, expr );
// IE 9's matchesSelector returns false on disconnected nodes
if ( ret || support.disconnectedMatch ||
// As well, disconnected nodes are said to be in a document
// fragment in IE 9
elem.document && elem.document.nodeType !== 11 ) {
return ret;
}
} catch (e) {}
}
return Sizzle( expr, document, null, [ elem ] ).length > 0;
};
Sizzle.contains = function( context, elem ) {
// Set document vars if needed
if ( ( context.ownerDocument || context ) !== document ) {
setDocument( context );
}
return contains( context, elem );
};
Sizzle.attr = function( elem, name ) {
// Set document vars if needed
if ( ( elem.ownerDocument || elem ) !== document ) {
setDocument( elem );
}
var fn = Expr.attrHandle[ name.toLowerCase() ],
// Don't get fooled by Object.prototype properties (jQuery #13807)
val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
fn( elem, name, !documentIsHTML ) :
undefined;
return val !== undefined ?
val :
support.attributes || !documentIsHTML ?
elem.getAttribute( name ) :
(val = elem.getAttributeNode(name)) && val.specified ?
val.value :
null;
};
Sizzle.escape = function( sel ) {
return (sel + "").replace( rcssescape, fcssescape );
};
Sizzle.error = function( msg ) {
throw new Error( "Syntax error, unrecognized expression: " + msg );
};
/**
* Document sorting and removing duplicates
* @param {ArrayLike} results
*/
Sizzle.uniqueSort = function( results ) {
var elem,
duplicates = [],
j = 0,
i = 0;
// Unless we *know* we can detect duplicates, assume their presence
hasDuplicate = !support.detectDuplicates;
sortInput = !support.sortStable && results.slice( 0 );
results.sort( sortOrder );
if ( hasDuplicate ) {
while ( (elem = results[i++]) ) {
if ( elem === results[ i ] ) {
j = duplicates.push( i );
}
}
while ( j-- ) {
results.splice( duplicates[ j ], 1 );
}
}
// Clear input after sorting to release objects
// See https://github.com/jquery/sizzle/pull/225
sortInput = null;
return results;
};
/**
* Utility function for retrieving the text value of an array of DOM nodes
* @param {Array|Element} elem
*/
getText = Sizzle.getText = function( elem ) {
var node,
ret = "",
i = 0,
nodeType = elem.nodeType;
if ( !nodeType ) {
// If no nodeType, this is expected to be an array
while ( (node = elem[i++]) ) {
// Do not traverse comment nodes
ret += getText( node );
}
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
// Use textContent for elements
// innerText usage removed for consistency of new lines (jQuery #11153)
if ( typeof elem.textContent === "string" ) {
return elem.textContent;
} else {
// Traverse its children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
ret += getText( elem );
}
}
} else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue;
}
// Do not include comment or processing instruction nodes
return ret;
};
Expr = Sizzle.selectors = {
// Can be adjusted by the user
cacheLength: 50,
createPseudo: markFunction,
match: matchExpr,
attrHandle: {},
find: {},
relative: {
">": { dir: "parentNode", first: true },
" ": { dir: "parentNode" },
"+": { dir: "previousSibling", first: true },
"~": { dir: "previousSibling" }
},
preFilter: {
"ATTR": function( match ) {
match[1] = match[1].replace( runescape, funescape );
// Move the given value to match[3] whether quoted or unquoted
match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
if ( match[2] === "~=" ) {
match[3] = " " + match[3] + " ";
}
return match.slice( 0, 4 );
},
"CHILD": function( match ) {
/* matches from matchExpr["CHILD"]
1 type (only|nth|...)
2 what (child|of-type)
3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
4 xn-component of xn+y argument ([+-]?\d*n|)
5 sign of xn-component
6 x of xn-component
7 sign of y-component
8 y of y-component
*/
match[1] = match[1].toLowerCase();
if ( match[1].slice( 0, 3 ) === "nth" ) {
// nth-* requires argument
if ( !match[3] ) {
Sizzle.error( match[0] );
}
// numeric x and y parameters for Expr.filter.CHILD
// remember that false/true cast respectively to 0/1
match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
// other types prohibit arguments
} else if ( match[3] ) {
Sizzle.error( match[0] );
}
return match;
},
"PSEUDO": function( match ) {
var excess,
unquoted = !match[6] && match[2];
if ( matchExpr["CHILD"].test( match[0] ) ) {
return null;
}
// Accept quoted arguments as-is
if ( match[3] ) {
match[2] = match[4] || match[5] || "";
// Strip excess characters from unquoted arguments
} else if ( unquoted && rpseudo.test( unquoted ) &&
// Get excess from tokenize (recursively)
(excess = tokenize( unquoted, true )) &&
// advance to the next closing parenthesis
(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
// excess is a negative index
match[0] = match[0].slice( 0, excess );
match[2] = unquoted.slice( 0, excess );
}
// Return only captures needed by the pseudo filter method (type and argument)
return match.slice( 0, 3 );
}
},
filter: {
"TAG": function( nodeNameSelector ) {
var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
return nodeNameSelector === "*" ?
function() { return true; } :
function( elem ) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
};
},
"CLASS": function( className ) {
var pattern = classCache[ className + " " ];
return pattern ||
(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
classCache( className, function( elem ) {
return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
});
},
"ATTR": function( name, operator, check ) {
return function( elem ) {
var result = Sizzle.attr( elem, name );
if ( result == null ) {
return operator === "!=";
}
if ( !operator ) {
return true;
}
result += "";
return operator === "=" ? result === check :
operator === "!=" ? result !== check :
operator === "^=" ? check && result.indexOf( check ) === 0 :
operator === "*=" ? check && result.indexOf( check ) > -1 :
operator === "$=" ? check && result.slice( -check.length ) === check :
operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
false;
};
},
"CHILD": function( type, what, argument, first, last ) {
var simple = type.slice( 0, 3 ) !== "nth",
forward = type.slice( -4 ) !== "last",
ofType = what === "of-type";
return first === 1 && last === 0 ?
// Shortcut for :nth-*(n)
function( elem ) {
return !!elem.parentNode;
} :
function( elem, context, xml ) {
var cache, uniqueCache, outerCache, node, nodeIndex, start,
dir = simple !== forward ? "nextSibling" : "previousSibling",
parent = elem.parentNode,
name = ofType && elem.nodeName.toLowerCase(),
useCache = !xml && !ofType,
diff = false;
if ( parent ) {
// :(first|last|only)-(child|of-type)
if ( simple ) {
while ( dir ) {
node = elem;
while ( (node = node[ dir ]) ) {
if ( ofType ?
node.nodeName.toLowerCase() === name :
node.nodeType === 1 ) {
return false;
}
}
// Reverse direction for :only-* (if we haven't yet done so)
start = dir = type === "only" && !start && "nextSibling";
}
return true;
}
start = [ forward ? parent.firstChild : parent.lastChild ];
// non-xml :nth-child(...) stores cache data on `parent`
if ( forward && useCache ) {
// Seek `elem` from a previously-cached index
// ...in a gzip-friendly way
node = parent;
outerCache = node[ expando ] || (node[ expando ] = {});
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
(outerCache[ node.uniqueID ] = {});
cache = uniqueCache[ type ] || [];
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
diff = nodeIndex && cache[ 2 ];
node = nodeIndex && parent.childNodes[ nodeIndex ];
while ( (node = ++nodeIndex && node && node[ dir ] ||
// Fallback to seeking `elem` from the start
(diff = nodeIndex = 0) || start.pop()) ) {
// When found, cache indexes on `parent` and break
if ( node.nodeType === 1 && ++diff && node === elem ) {
uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
break;
}
}
} else {
// Use previously-cached element index if available
if ( useCache ) {
// ...in a gzip-friendly way
node = elem;
outerCache = node[ expando ] || (node[ expando ] = {});
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
(outerCache[ node.uniqueID ] = {});
cache = uniqueCache[ type ] || [];
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
diff = nodeIndex;
}
// xml :nth-child(...)
// or :nth-last-child(...) or :nth(-last)?-of-type(...)
if ( diff === false ) {
// Use the same loop as above to seek `elem` from the start
while ( (node = ++nodeIndex && node && node[ dir ] ||
(diff = nodeIndex = 0) || start.pop()) ) {
if ( ( ofType ?
node.nodeName.toLowerCase() === name :
node.nodeType === 1 ) &&
++diff ) {
// Cache the index of each encountered element
if ( useCache ) {
outerCache = node[ expando ] || (node[ expando ] = {});
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
(outerCache[ node.uniqueID ] = {});
uniqueCache[ type ] = [ dirruns, diff ];
}
if ( node === elem ) {
break;
}
}
}
}
}
// Incorporate the offset, then check against cycle size
diff -= last;
return diff === first || ( diff % first === 0 && diff / first >= 0 );
}
};
},
"PSEUDO": function( pseudo, argument ) {
// pseudo-class names are case-insensitive
// http://www.w3.org/TR/selectors/#pseudo-classes
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
// Remember that setFilters inherits from pseudos
var args,
fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
Sizzle.error( "unsupported pseudo: " + pseudo );
// The user may use createPseudo to indicate that
// arguments are needed to create the filter function
// just as Sizzle does
if ( fn[ expando ] ) {
return fn( argument );
}
// But maintain support for old signatures
if ( fn.length > 1 ) {
args = [ pseudo, pseudo, "", argument ];
return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
markFunction(function( seed, matches ) {
var idx,
matched = fn( seed, argument ),
i = matched.length;
while ( i-- ) {
idx = indexOf( seed, matched[i] );
seed[ idx ] = !( matches[ idx ] = matched[i] );
}
}) :
function( elem ) {
return fn( elem, 0, args );
};
}
return fn;
}
},
pseudos: {
// Potentially complex pseudos
"not": markFunction(function( selector ) {
// Trim the selector passed to compile
// to avoid treating leading and trailing
// spaces as combinators
var input = [],
results = [],
matcher = compile( selector.replace( rtrim, "$1" ) );
return matcher[ expando ] ?
markFunction(function( seed, matches, context, xml ) {
var elem,
unmatched = matcher( seed, null, xml, [] ),
i = seed.length;
// Match elements unmatched by `matcher`
while ( i-- ) {
if ( (elem = unmatched[i]) ) {
seed[i] = !(matches[i] = elem);
}
}
}) :
function( elem, context, xml ) {
input[0] = elem;
matcher( input, null, xml, results );
// Don't keep the element (issue #299)
input[0] = null;
return !results.pop();
};
}),
"has": markFunction(function( selector ) {
return function( elem ) {
return Sizzle( selector, elem ).length > 0;
};
}),
"contains": markFunction(function( text ) {
text = text.replace( runescape, funescape );
return function( elem ) {
return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
};
}),
// "Whether an element is represented by a :lang() selector
// is based solely on the element's language value
// being equal to the identifier C,
// or beginning with the identifier C immediately followed by "-".
// The matching of C against the element's language value is performed case-insensitively.
// The identifier C does not have to be a valid language name."
// http://www.w3.org/TR/selectors/#lang-pseudo
"lang": markFunction( function( lang ) {
// lang value must be a valid identifier
if ( !ridentifier.test(lang || "") ) {
Sizzle.error( "unsupported lang: " + lang );
}
lang = lang.replace( runescape, funescape ).toLowerCase();
return function( elem ) {
var elemLang;
do {
if ( (elemLang = documentIsHTML ?
elem.lang :
elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
elemLang = elemLang.toLowerCase();
return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
}
} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
return false;
};
}),
// Miscellaneous
"target": function( elem ) {
var hash = window.location && window.location.hash;
return hash && hash.slice( 1 ) === elem.id;
},
"root": function( elem ) {
return elem === docElem;
},
"focus": function( elem ) {
return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
},
// Boolean properties
"enabled": createDisabledPseudo( false ),
"disabled": createDisabledPseudo( true ),
"checked": function( elem ) {
// In CSS3, :checked should return both checked and selected elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
var nodeName = elem.nodeName.toLowerCase();
return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
},
"selected": function( elem ) {
// Accessing this property makes selected-by-default
// options in Safari work properly
if ( elem.parentNode ) {
elem.parentNode.selectedIndex;
}
return elem.selected === true;
},
// Contents
"empty": function( elem ) {
// http://www.w3.org/TR/selectors/#empty-pseudo
// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
// but not by others (comment: 8; processing instruction: 7; etc.)
// nodeType < 6 works because attributes (2) do not appear as children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
if ( elem.nodeType < 6 ) {
return false;
}
}
return true;
},
"parent": function( elem ) {
return !Expr.pseudos["empty"]( elem );
},
// Element/input types
"header": function( elem ) {
return rheader.test( elem.nodeName );
},
"input": function( elem ) {
return rinputs.test( elem.nodeName );
},
"button": function( elem ) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === "button" || name === "button";
},
"text": function( elem ) {
var attr;
return elem.nodeName.toLowerCase() === "input" &&
elem.type === "text" &&
// Support: IE<8
// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
},
// Position-in-collection
"first": createPositionalPseudo(function() {
return [ 0 ];
}),
"last": createPositionalPseudo(function( matchIndexes, length ) {
return [ length - 1 ];
}),
"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
return [ argument < 0 ? argument + length : argument ];
}),
"even": createPositionalPseudo(function( matchIndexes, length ) {
var i = 0;
for ( ; i < length; i += 2 ) {
matchIndexes.push( i );
}
return matchIndexes;
}),
"odd": createPositionalPseudo(function( matchIndexes, length ) {
var i = 1;
for ( ; i < length; i += 2 ) {
matchIndexes.push( i );
}
return matchIndexes;
}),
"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
var i = argument < 0 ? argument + length : argument;
for ( ; --i >= 0; ) {
matchIndexes.push( i );
}
return matchIndexes;
}),
"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
var i = argument < 0 ? argument + length : argument;
for ( ; ++i < length; ) {
matchIndexes.push( i );
}
return matchIndexes;
})
}
};
Expr.pseudos["nth"] = Expr.pseudos["eq"];
// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
Expr.pseudos[ i ] = createInputPseudo( i );
}
for ( i in { submit: true, reset: true } ) {
Expr.pseudos[ i ] = createButtonPseudo( i );
}
// Easy API for creating new setFilters
function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();
tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
var matched, match, tokens, type,
soFar, groups, preFilters,
cached = tokenCache[ selector + " " ];
if ( cached ) {
return parseOnly ? 0 : cached.slice( 0 );
}
soFar = selector;
groups = [];
preFilters = Expr.preFilter;
while ( soFar ) {
// Comma and first run
if ( !matched || (match = rcomma.exec( soFar )) ) {
if ( match ) {
// Don't consume trailing commas as valid
soFar = soFar.slice( match[0].length ) || soFar;
}
groups.push( (tokens = []) );
}
matched = false;
// Combinators
if ( (match = rcombinators.exec( soFar )) ) {
matched = match.shift();
tokens.push({
value: matched,
// Cast descendant combinators to space
type: match[0].replace( rtrim, " " )
});
soFar = soFar.slice( matched.length );
}
// Filters
for ( type in Expr.filter ) {
if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
(match = preFilters[ type ]( match ))) ) {
matched = match.shift();
tokens.push({
value: matched,
type: type,
matches: match
});
soFar = soFar.slice( matched.length );
}
}
if ( !matched ) {
break;
}
}
// Return the length of the invalid excess
// if we're just parsing
// Otherwise, throw an error or return tokens
return parseOnly ?
soFar.length :
soFar ?
Sizzle.error( selector ) :
// Cache the tokens
tokenCache( selector, groups ).slice( 0 );
};
function toSelector( tokens ) {
var i = 0,
len = tokens.length,
selector = "";
for ( ; i < len; i++ ) {
selector += tokens[i].value;
}
return selector;
}
function addCombinator( matcher, combinator, base ) {
var dir = combinator.dir,
skip = combinator.next,
key = skip || dir,
checkNonElements = base && key === "parentNode",
doneName = done++;
return combinator.first ?
// Check against closest ancestor/preceding element
function( elem, context, xml ) {
while ( (elem = elem[ dir ]) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
return matcher( elem, context, xml );
}
}
return false;
} :
// Check against all ancestor/preceding elements
function( elem, context, xml ) {
var oldCache, uniqueCache, outerCache,
newCache = [ dirruns, doneName ];
// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
if ( xml ) {
while ( (elem = elem[ dir ]) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
if ( matcher( elem, context, xml ) ) {
return true;
}
}
}
} else {
while ( (elem = elem[ dir ]) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
outerCache = elem[ expando ] || (elem[ expando ] = {});
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
if ( skip && skip === elem.nodeName.toLowerCase() ) {
elem = elem[ dir ] || elem;
} else if ( (oldCache = uniqueCache[ key ]) &&
oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
// Assign to newCache so results back-propagate to previous elements
return (newCache[ 2 ] = oldCache[ 2 ]);
} else {
// Reuse newcache so results back-propagate to previous elements
uniqueCache[ key ] = newCache;
// A match means we're done; a fail means we have to keep checking
if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
return true;
}
}
}
}
}
return false;
};
}
function elementMatcher( matchers ) {
return matchers.length > 1 ?
function( elem, context, xml ) {
var i = matchers.length;
while ( i-- ) {
if ( !matchers[i]( elem, context, xml ) ) {
return false;
}
}
return true;
} :
matchers[0];
}
function multipleContexts( selector, contexts, results ) {
var i = 0,
len = contexts.length;
for ( ; i < len; i++ ) {
Sizzle( selector, contexts[i], results );
}
return results;
}
function condense( unmatched, map, filter, context, xml ) {
var elem,
newUnmatched = [],
i = 0,
len = unmatched.length,
mapped = map != null;
for ( ; i < len; i++ ) {
if ( (elem = unmatched[i]) ) {
if ( !filter || filter( elem, context, xml ) ) {
newUnmatched.push( elem );
if ( mapped ) {
map.push( i );
}
}
}
}
return newUnmatched;
}
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
if ( postFilter && !postFilter[ expando ] ) {
postFilter = setMatcher( postFilter );
}
if ( postFinder && !postFinder[ expando ] ) {
postFinder = setMatcher( postFinder, postSelector );
}
return markFunction(function( seed, results, context, xml ) {
var temp, i, elem,
preMap = [],
postMap = [],
preexisting = results.length,
// Get initial elements from seed or context
elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
// Prefilter to get matcher input, preserving a map for seed-results synchronization
matcherIn = preFilter && ( seed || !selector ) ?
condense( elems, preMap, preFilter, context, xml ) :
elems,
matcherOut = matcher ?
// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
// ...intermediate processing is necessary
[] :
// ...otherwise use results directly
results :
matcherIn;
// Find primary matches
if ( matcher ) {
matcher( matcherIn, matcherOut, context, xml );
}
// Apply postFilter
if ( postFilter ) {
temp = condense( matcherOut, postMap );
postFilter( temp, [], context, xml );
// Un-match failing elements by moving them back to matcherIn
i = temp.length;
while ( i-- ) {
if ( (elem = temp[i]) ) {
matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
}
}
}
if ( seed ) {
if ( postFinder || preFilter ) {
if ( postFinder ) {
// Get the final matcherOut by condensing this intermediate into postFinder contexts
temp = [];
i = matcherOut.length;
while ( i-- ) {
if ( (elem = matcherOut[i]) ) {
// Restore matcherIn since elem is not yet a final match
temp.push( (matcherIn[i] = elem) );
}
}
postFinder( null, (matcherOut = []), temp, xml );
}
// Move matched elements from seed to results to keep them synchronized
i = matcherOut.length;
while ( i-- ) {
if ( (elem = matcherOut[i]) &&
(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
seed[temp] = !(results[temp] = elem);
}
}
}
// Add elements to results, through postFinder if defined
} else {
matcherOut = condense(
matcherOut === results ?
matcherOut.splice( preexisting, matcherOut.length ) :
matcherOut
);
if ( postFinder ) {
postFinder( null, results, matcherOut, xml );
} else {
push.apply( results, matcherOut );
}
}
});
}
function matcherFromTokens( tokens ) {
var checkContext, matcher, j,
len = tokens.length,
leadingRelative = Expr.relative[ tokens[0].type ],
implicitRelative = leadingRelative || Expr.relative[" "],
i = leadingRelative ? 1 : 0,
// The foundational matcher ensures that elements are reachable from top-level context(s)
matchContext = addCombinator( function( elem ) {
return elem === checkContext;
}, implicitRelative, true ),
matchAnyContext = addCombinator( function( elem ) {
return indexOf( checkContext, elem ) > -1;
}, implicitRelative, true ),
matchers = [ function( elem, context, xml ) {
var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
(checkContext = context).nodeType ?
matchContext( elem, context, xml ) :
matchAnyContext( elem, context, xml ) );
// Avoid hanging onto element (issue #299)
checkContext = null;
return ret;
} ];
for ( ; i < len; i++ ) {
if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
} else {
matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
// Return special upon seeing a positional matcher
if ( matcher[ expando ] ) {
// Find the next relative operator (if any) for proper handling
j = ++i;
for ( ; j < len; j++ ) {
if ( Expr.relative[ tokens[j].type ] ) {
break;
}
}
return setMatcher(
i > 1 && elementMatcher( matchers ),
i > 1 && toSelector(
// If the preceding token was a descendant combinator, insert an implicit any-element `*`
tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
).replace( rtrim, "$1" ),
matcher,
i < j && matcherFromTokens( tokens.slice( i, j ) ),
j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
j < len && toSelector( tokens )
);
}
matchers.push( matcher );
}
}
return elementMatcher( matchers );
}
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
var bySet = setMatchers.length > 0,
byElement = elementMatchers.length > 0,
superMatcher = function( seed, context, xml, results, outermost ) {
var elem, j, matcher,
matchedCount = 0,
i = "0",
unmatched = seed && [],
setMatched = [],
contextBackup = outermostContext,
// We must always have either seed elements or outermost context
elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
// Use integer dirruns iff this is the outermost matcher
dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
len = elems.length;
if ( outermost ) {
outermostContext = context === document || context || outermost;
}
// Add elements passing elementMatchers directly to results
// Support: IE<9, Safari
// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
if ( byElement && elem ) {
j = 0;
if ( !context && elem.ownerDocument !== document ) {
setDocument( elem );
xml = !documentIsHTML;
}
while ( (matcher = elementMatchers[j++]) ) {
if ( matcher( elem, context || document, xml) ) {
results.push( elem );
break;
}
}
if ( outermost ) {
dirruns = dirrunsUnique;
}
}
// Track unmatched elements for set filters
if ( bySet ) {
// They will have gone through all possible matchers
if ( (elem = !matcher && elem) ) {
matchedCount--;
}
// Lengthen the array for every element, matched or not
if ( seed ) {
unmatched.push( elem );
}
}
}
// `i` is now the count of elements visited above, and adding it to `matchedCount`
// makes the latter nonnegative.
matchedCount += i;
// Apply set filters to unmatched elements
// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
// no element matchers and no seed.
// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
// case, which will result in a "00" `matchedCount` that differs from `i` but is also
// numerically zero.
if ( bySet && i !== matchedCount ) {
j = 0;
while ( (matcher = setMatchers[j++]) ) {
matcher( unmatched, setMatched, context, xml );
}
if ( seed ) {
// Reintegrate element matches to eliminate the need for sorting
if ( matchedCount > 0 ) {
while ( i-- ) {
if ( !(unmatched[i] || setMatched[i]) ) {
setMatched[i] = pop.call( results );
}
}
}
// Discard index placeholder values to get only actual matches
setMatched = condense( setMatched );
}
// Add matches to results
push.apply( results, setMatched );
// Seedless set matches succeeding multiple successful matchers stipulate sorting
if ( outermost && !seed && setMatched.length > 0 &&
( matchedCount + setMatchers.length ) > 1 ) {
Sizzle.uniqueSort( results );
}
}
// Override manipulation of globals by nested matchers
if ( outermost ) {
dirruns = dirrunsUnique;
outermostContext = contextBackup;
}
return unmatched;
};
return bySet ?
markFunction( superMatcher ) :
superMatcher;
}
compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
var i,
setMatchers = [],
elementMatchers = [],
cached = compilerCache[ selector + " " ];
if ( !cached ) {
// Generate a function of recursive functions that can be used to check each element
if ( !match ) {
match = tokenize( selector );
}
i = match.length;
while ( i-- ) {
cached = matcherFromTokens( match[i] );
if ( cached[ expando ] ) {
setMatchers.push( cached );
} else {
elementMatchers.push( cached );
}
}
// Cache the compiled function
cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
// Save selector and tokenization
cached.selector = selector;
}
return cached;
};
/**
* A low-level selection function that works with Sizzle's compiled
* selector functions
* @param {String|Function} selector A selector or a pre-compiled
* selector function built with Sizzle.compile
* @param {Element} context
* @param {Array} [results]
* @param {Array} [seed] A set of elements to match against
*/
select = Sizzle.select = function( selector, context, results, seed ) {
var i, tokens, token, type, find,
compiled = typeof selector === "function" && selector,
match = !seed && tokenize( (selector = compiled.selector || selector) );
results = results || [];
// Try to minimize operations if there is only one selector in the list and no seed
// (the latter of which guarantees us context)
if ( match.length === 1 ) {
// Reduce context if the leading compound selector is an ID
tokens = match[0] = match[0].slice( 0 );
if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
if ( !context ) {
return results;
// Precompiled matchers will still verify ancestry, so step up a level
} else if ( compiled ) {
context = context.parentNode;
}
selector = selector.slice( tokens.shift().value.length );
}
// Fetch a seed set for right-to-left matching
i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
while ( i-- ) {
token = tokens[i];
// Abort if we hit a combinator
if ( Expr.relative[ (type = token.type) ] ) {
break;
}
if ( (find = Expr.find[ type ]) ) {
// Search, expanding context for leading sibling combinators
if ( (seed = find(
token.matches[0].replace( runescape, funescape ),
rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
)) ) {
// If seed is empty or no tokens remain, we can return early
tokens.splice( i, 1 );
selector = seed.length && toSelector( tokens );
if ( !selector ) {
push.apply( results, seed );
return results;
}
break;
}
}
}
}
// Compile and execute a filtering function if one is not provided
// Provide `match` to avoid retokenization if we modified the selector above
( compiled || compile( selector, match ) )(
seed,
context,
!documentIsHTML,
results,
!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
);
return results;
};
// One-time assignments
// Sort stability
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
support.detectDuplicates = !!hasDuplicate;
// Initialize against the default document
setDocument();
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other*
support.sortDetached = assert(function( el ) {
// Should return 1, but returns 4 (following)
return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
});
// Support: IE<8
// Prevent attribute/property "interpolation"
// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !assert(function( el ) {
el.innerHTML = "<a href='#'></a>";
return el.firstChild.getAttribute("href") === "#" ;
}) ) {
addHandle( "type|href|height|width", function( elem, name, isXML ) {
if ( !isXML ) {
return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
}
});
}
// Support: IE<9
// Use defaultValue in place of getAttribute("value")
if ( !support.attributes || !assert(function( el ) {
el.innerHTML = "<input/>";
el.firstChild.setAttribute( "value", "" );
return el.firstChild.getAttribute( "value" ) === "";
}) ) {
addHandle( "value", function( elem, name, isXML ) {
if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
return elem.defaultValue;
}
});
}
// Support: IE<9
// Use getAttributeNode to fetch booleans when getAttribute lies
if ( !assert(function( el ) {
return el.getAttribute("disabled") == null;
}) ) {
addHandle( booleans, function( elem, name, isXML ) {
var val;
if ( !isXML ) {
return elem[ name ] === true ? name.toLowerCase() :
(val = elem.getAttributeNode( name )) && val.specified ?
val.value :
null;
}
});
}
return Sizzle;
})( window );
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
// Deprecated
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
jQuery.escapeSelector = Sizzle.escape;
var dir = function( elem, dir, until ) {
var matched = [],
truncate = until !== undefined;
while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
if ( elem.nodeType === 1 ) {
if ( truncate && jQuery( elem ).is( until ) ) {
break;
}
matched.push( elem );
}
}
return matched;
};
var siblings = function( n, elem ) {
var matched = [];
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem ) {
matched.push( n );
}
}
return matched;
};
var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
};
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
var risSimple = /^.[^:#\[\.,]*$/;
// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
if ( jQuery.isFunction( qualifier ) ) {
return jQuery.grep( elements, function( elem, i ) {
return !!qualifier.call( elem, i, elem ) !== not;
} );
}
// Single element
if ( qualifier.nodeType ) {
return jQuery.grep( elements, function( elem ) {
return ( elem === qualifier ) !== not;
} );
}
// Arraylike of elements (jQuery, arguments, Array)
if ( typeof qualifier !== "string" ) {
return jQuery.grep( elements, function( elem ) {
return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
} );
}
// Simple selector that can be filtered directly, removing non-Elements
if ( risSimple.test( qualifier ) ) {
return jQuery.filter( qualifier, elements, not );
}
// Complex selector, compare the two sets, removing non-Elements
qualifier = jQuery.filter( qualifier, elements );
return jQuery.grep( elements, function( elem ) {
return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
} );
}
jQuery.filter = function( expr, elems, not ) {
var elem = elems[ 0 ];
if ( not ) {
expr = ":not(" + expr + ")";
}
if ( elems.length === 1 && elem.nodeType === 1 ) {
return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
}
return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
return elem.nodeType === 1;
} ) );
};
jQuery.fn.extend( {
find: function( selector ) {
var i, ret,
len = this.length,
self = this;
if ( typeof selector !== "string" ) {
return this.pushStack( jQuery( selector ).filter( function() {
for ( i = 0; i < len; i++ ) {
if ( jQuery.contains( self[ i ], this ) ) {
return true;
}
}
} ) );
}
ret = this.pushStack( [] );
for ( i = 0; i < len; i++ ) {
jQuery.find( selector, self[ i ], ret );
}
return len > 1 ? jQuery.uniqueSort( ret ) : ret;
},
filter: function( selector ) {
return this.pushStack( winnow( this, selector || [], false ) );
},
not: function( selector ) {
return this.pushStack( winnow( this, selector || [], true ) );
},
is: function( selector ) {
return !!winnow(
this,
// If this is a positional/relative selector, check membership in the returned set
// so $("p:first").is("p:last") won't return true for a doc with two "p".
typeof selector === "string" && rneedsContext.test( selector ) ?
jQuery( selector ) :
selector || [],
false
).length;
}
} );
// Initialize a jQuery object
// A central reference to the root jQuery(document)
var rootjQuery,
// A simple way to check for HTML strings
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
// Strict HTML recognition (#11290: must start with <)
// Shortcut simple #id case for speed
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
init = jQuery.fn.init = function( selector, context, root ) {
var match, elem;
// HANDLE: $(""), $(null), $(undefined), $(false)
if ( !selector ) {
return this;
}
// Method init() accepts an alternate rootjQuery
// so migrate can support jQuery.sub (gh-2101)
root = root || rootjQuery;
// Handle HTML strings
if ( typeof selector === "string" ) {
if ( selector[ 0 ] === "<" &&
selector[ selector.length - 1 ] === ">" &&
selector.length >= 3 ) {
// Assume that strings that start and end with <> are HTML and skip the regex check
match = [ null, selector, null ];
} else {
match = rquickExpr.exec( selector );
}
// Match html or make sure no context is specified for #id
if ( match && ( match[ 1 ] || !context ) ) {
// HANDLE: $(html) -> $(array)
if ( match[ 1 ] ) {
context = context instanceof jQuery ? context[ 0 ] : context;
// Option to run scripts is true for back-compat
// Intentionally let the error be thrown if parseHTML is not present
jQuery.merge( this, jQuery.parseHTML(
match[ 1 ],
context && context.nodeType ? context.ownerDocument || context : document,
true
) );
// HANDLE: $(html, props)
if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
for ( match in context ) {
// Properties of context are called as methods if possible
if ( jQuery.isFunction( this[ match ] ) ) {
this[ match ]( context[ match ] );
// ...and otherwise set as attributes
} else {
this.attr( match, context[ match ] );
}
}
}
return this;
// HANDLE: $(#id)
} else {
elem = document.getElementById( match[ 2 ] );
if ( elem ) {
// Inject the element directly into the jQuery object
this[ 0 ] = elem;
this.length = 1;
}
return this;
}
// HANDLE: $(expr, $(...))
} else if ( !context || context.jquery ) {
return ( context || root ).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return this.constructor( context ).find( selector );
}
// HANDLE: $(DOMElement)
} else if ( selector.nodeType ) {
this[ 0 ] = selector;
this.length = 1;
return this;
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return root.ready !== undefined ?
root.ready( selector ) :
// Execute immediately if ready is not present
selector( jQuery );
}
return jQuery.makeArray( selector, this );
};
// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;
// Initialize central reference
rootjQuery = jQuery( document );
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
// Methods guaranteed to produce a unique set when starting from a unique set
guaranteedUnique = {
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend( {
has: function( target ) {
var targets = jQuery( target, this ),
l = targets.length;
return this.filter( function() {
var i = 0;
for ( ; i < l; i++ ) {
if ( jQuery.contains( this, targets[ i ] ) ) {
return true;
}
}
} );
},
closest: function( selectors, context ) {
var cur,
i = 0,
l = this.length,
matched = [],
targets = typeof selectors !== "string" && jQuery( selectors );
// Positional selectors never match, since there's no _selection_ context
if ( !rneedsContext.test( selectors ) ) {
for ( ; i < l; i++ ) {
for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
// Always skip document fragments
if ( cur.nodeType < 11 && ( targets ?
targets.index( cur ) > -1 :
// Don't pass non-elements to Sizzle
cur.nodeType === 1 &&
jQuery.find.matchesSelector( cur, selectors ) ) ) {
matched.push( cur );
break;
}
}
}
}
return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
},
// Determine the position of an element within the set
index: function( elem ) {
// No argument, return index in parent
if ( !elem ) {
return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
}
// Index in selector
if ( typeof elem === "string" ) {
return indexOf.call( jQuery( elem ), this[ 0 ] );
}
// Locate the position of the desired element
return indexOf.call( this,
// If it receives a jQuery object, the first element is used
elem.jquery ? elem[ 0 ] : elem
);
},
add: function( selector, context ) {
return this.pushStack(
jQuery.uniqueSort(
jQuery.merge( this.get(), jQuery( selector, context ) )
)
);
},
addBack: function( selector ) {
return this.add( selector == null ?
this.prevObject : this.prevObject.filter( selector )
);
}
} );
function sibling( cur, dir ) {
while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
return cur;
}
jQuery.each( {
parent: function( elem ) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function( elem ) {
return dir( elem, "parentNode" );
},
parentsUntil: function( elem, i, until ) {
return dir( elem, "parentNode", until );
},
next: function( elem ) {
return sibling( elem, "nextSibling" );
},
prev: function( elem ) {
return sibling( elem, "previousSibling" );
},
nextAll: function( elem ) {
return dir( elem, "nextSibling" );
},
prevAll: function( elem ) {
return dir( elem, "previousSibling" );
},
nextUntil: function( elem, i, until ) {
return dir( elem, "nextSibling", until );
},
prevUntil: function( elem, i, until ) {
return dir( elem, "previousSibling", until );
},
siblings: function( elem ) {
return siblings( ( elem.parentNode || {} ).firstChild, elem );
},
children: function( elem ) {
return siblings( elem.firstChild );
},
contents: function( elem ) {
if ( nodeName( elem, "iframe" ) ) {
return elem.contentDocument;
}
// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
// Treat the template element as a regular one in browsers that
// don't support it.
if ( nodeName( elem, "template" ) ) {
elem = elem.content || elem;
}
return jQuery.merge( [], elem.childNodes );
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
var matched = jQuery.map( this, fn, until );
if ( name.slice( -5 ) !== "Until" ) {
selector = until;
}
if ( selector && typeof selector === "string" ) {
matched = jQuery.filter( selector, matched );
}
if ( this.length > 1 ) {
// Remove duplicates
if ( !guaranteedUnique[ name ] ) {
jQuery.uniqueSort( matched );
}
// Reverse order for parents* and prev-derivatives
if ( rparentsprev.test( name ) ) {
matched.reverse();
}
}
return this.pushStack( matched );
};
} );
var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
// Convert String-formatted options into Object-formatted ones
function createOptions( options ) {
var object = {};
jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
object[ flag ] = true;
} );
return object;
}
/*
* Create a callback list using the following parameters:
*
* options: an optional list of space-separated options that will change how
* the callback list behaves or a more traditional option object
*
* By default a callback list will act like an event callback list and can be
* "fired" multiple times.
*
* Possible options:
*
* once: will ensure the callback list can only be fired once (like a Deferred)
*
* memory: will keep track of previous values and will call any callback added
* after the list has been fired right away with the latest "memorized"
* values (like a Deferred)
*
* unique: will ensure a callback can only be added once (no duplicate in the list)
*
* stopOnFalse: interrupt callings when a callback returns false
*
*/
jQuery.Callbacks = function( options ) {
// Convert options from String-formatted to Object-formatted if needed
// (we check in cache first)
options = typeof options === "string" ?
createOptions( options ) :
jQuery.extend( {}, options );
var // Flag to know if list is currently firing
firing,
// Last fire value for non-forgettable lists
memory,
// Flag to know if list was already fired
fired,
// Flag to prevent firing
locked,
// Actual callback list
list = [],
// Queue of execution data for repeatable lists
queue = [],
// Index of currently firing callback (modified by add/remove as needed)
firingIndex = -1,
// Fire callbacks
fire = function() {
// Enforce single-firing
locked = locked || options.once;
// Execute callbacks for all pending executions,
// respecting firingIndex overrides and runtime changes
fired = firing = true;
for ( ; queue.length; firingIndex = -1 ) {
memory = queue.shift();
while ( ++firingIndex < list.length ) {
// Run callback and check for early termination
if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
options.stopOnFalse ) {
// Jump to end and forget the data so .add doesn't re-fire
firingIndex = list.length;
memory = false;
}
}
}
// Forget the data if we're done with it
if ( !options.memory ) {
memory = false;
}
firing = false;
// Clean up if we're done firing for good
if ( locked ) {
// Keep an empty list if we have data for future add calls
if ( memory ) {
list = [];
// Otherwise, this object is spent
} else {
list = "";
}
}
},
// Actual Callbacks object
self = {
// Add a callback or a collection of callbacks to the list
add: function() {
if ( list ) {
// If we have memory from a past run, we should fire after adding
if ( memory && !firing ) {
firingIndex = list.length - 1;
queue.push( memory );
}
( function add( args ) {
jQuery.each( args, function( _, arg ) {
if ( jQuery.isFunction( arg ) ) {
if ( !options.unique || !self.has( arg ) ) {
list.push( arg );
}
} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
// Inspect recursively
add( arg );
}
} );
} )( arguments );
if ( memory && !firing ) {
fire();
}
}
return this;
},
// Remove a callback from the list
remove: function() {
jQuery.each( arguments, function( _, arg ) {
var index;
while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
list.splice( index, 1 );
// Handle firing indexes
if ( index <= firingIndex ) {
firingIndex--;
}
}
} );
return this;
},
// Check if a given callback is in the list.
// If no argument is given, return whether or not list has callbacks attached.
has: function( fn ) {
return fn ?
jQuery.inArray( fn, list ) > -1 :
list.length > 0;
},
// Remove all callbacks from the list
empty: function() {
if ( list ) {
list = [];
}
return this;
},
// Disable .fire and .add
// Abort any current/pending executions
// Clear all callbacks and values
disable: function() {
locked = queue = [];
list = memory = "";
return this;
},
disabled: function() {
return !list;
},
// Disable .fire
// Also disable .add unless we have memory (since it would have no effect)
// Abort any pending executions
lock: function() {
locked = queue = [];
if ( !memory && !firing ) {
list = memory = "";
}
return this;
},
locked: function() {
return !!locked;
},
// Call all callbacks with the given context and arguments
fireWith: function( context, args ) {
if ( !locked ) {
args = args || [];
args = [ context, args.slice ? args.slice() : args ];
queue.push( args );
if ( !firing ) {
fire();
}
}
return this;
},
// Call all the callbacks with the given arguments
fire: function() {
self.fireWith( this, arguments );
return this;
},
// To know if the callbacks have already been called at least once
fired: function() {
return !!fired;
}
};
return self;
};
function Identity( v ) {
return v;
}
function Thrower( ex ) {
throw ex;
}
function adoptValue( value, resolve, reject, noValue ) {
var method;
try {
// Check for promise aspect first to privilege synchronous behavior
if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
method.call( value ).done( resolve ).fail( reject );
// Other thenables
} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
method.call( value, resolve, reject );
// Other non-thenables
} else {
// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
// * false: [ value ].slice( 0 ) => resolve( value )
// * true: [ value ].slice( 1 ) => resolve()
resolve.apply( undefined, [ value ].slice( noValue ) );
}
// For Promises/A+, convert exceptions into rejections
// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
// Deferred#then to conditionally suppress rejection.
} catch ( value ) {
// Support: Android 4.0 only
// Strict mode functions invoked without .call/.apply get global-object context
reject.apply( undefined, [ value ] );
}
}
jQuery.extend( {
Deferred: function( func ) {
var tuples = [
// action, add listener, callbacks,
// ... .then handlers, argument index, [final state]
[ "notify", "progress", jQuery.Callbacks( "memory" ),
jQuery.Callbacks( "memory" ), 2 ],
[ "resolve", "done", jQuery.Callbacks( "once memory" ),
jQuery.Callbacks( "once memory" ), 0, "resolved" ],
[ "reject", "fail", jQuery.Callbacks( "once memory" ),
jQuery.Callbacks( "once memory" ), 1, "rejected" ]
],
state = "pending",
promise = {
state: function() {
return state;
},
always: function() {
deferred.done( arguments ).fail( arguments );
return this;
},
"catch": function( fn ) {
return promise.then( null, fn );
},
// Keep pipe for back-compat
pipe: function( /* fnDone, fnFail, fnProgress */ ) {
var fns = arguments;
return jQuery.Deferred( function( newDefer ) {
jQuery.each( tuples, function( i, tuple ) {
// Map tuples (progress, done, fail) to arguments (done, fail, progress)
var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
// deferred.progress(function() { bind to newDefer or newDefer.notify })
// deferred.done(function() { bind to newDefer or newDefer.resolve })
// deferred.fail(function() { bind to newDefer or newDefer.reject })
deferred[ tuple[ 1 ] ]( function() {
var returned = fn && fn.apply( this, arguments );
if ( returned && jQuery.isFunction( returned.promise ) ) {
returned.promise()
.progress( newDefer.notify )
.done( newDefer.resolve )
.fail( newDefer.reject );
} else {
newDefer[ tuple[ 0 ] + "With" ](
this,
fn ? [ returned ] : arguments
);
}
} );
} );
fns = null;
} ).promise();
},
then: function( onFulfilled, onRejected, onProgress ) {
var maxDepth = 0;
function resolve( depth, deferred, handler, special ) {
return function() {
var that = this,
args = arguments,
mightThrow = function() {
var returned, then;
// Support: Promises/A+ section 2.3.3.3.3
// https://promisesaplus.com/#point-59
// Ignore double-resolution attempts
if ( depth < maxDepth ) {
return;
}
returned = handler.apply( that, args );
// Support: Promises/A+ section 2.3.1
// https://promisesaplus.com/#point-48
if ( returned === deferred.promise() ) {
throw new TypeError( "Thenable self-resolution" );
}
// Support: Promises/A+ sections 2.3.3.1, 3.5
// https://promisesaplus.com/#point-54
// https://promisesaplus.com/#point-75
// Retrieve `then` only once
then = returned &&
// Support: Promises/A+ section 2.3.4
// https://promisesaplus.com/#point-64
// Only check objects and functions for thenability
( typeof returned === "object" ||
typeof returned === "function" ) &&
returned.then;
// Handle a returned thenable
if ( jQuery.isFunction( then ) ) {
// Special processors (notify) just wait for resolution
if ( special ) {
then.call(
returned,
resolve( maxDepth, deferred, Identity, special ),
resolve( maxDepth, deferred, Thrower, special )
);
// Normal processors (resolve) also hook into progress
} else {
// ...and disregard older resolution values
maxDepth++;
then.call(
returned,
resolve( maxDepth, deferred, Identity, special ),
resolve( maxDepth, deferred, Thrower, special ),
resolve( maxDepth, deferred, Identity,
deferred.notifyWith )
);
}
// Handle all other returned values
} else {
// Only substitute handlers pass on context
// and multiple values (non-spec behavior)
if ( handler !== Identity ) {
that = undefined;
args = [ returned ];
}
// Process the value(s)
// Default process is resolve
( special || deferred.resolveWith )( that, args );
}
},
// Only normal processors (resolve) catch and reject exceptions
process = special ?
mightThrow :
function() {
try {
mightThrow();
} catch ( e ) {
if ( jQuery.Deferred.exceptionHook ) {
jQuery.Deferred.exceptionHook( e,
process.stackTrace );
}
// Support: Promises/A+ section 2.3.3.3.4.1
// https://promisesaplus.com/#point-61
// Ignore post-resolution exceptions
if ( depth + 1 >= maxDepth ) {
// Only substitute handlers pass on context
// and multiple values (non-spec behavior)
if ( handler !== Thrower ) {
that = undefined;
args = [ e ];
}
deferred.rejectWith( that, args );
}
}
};
// Support: Promises/A+ section 2.3.3.3.1
// https://promisesaplus.com/#point-57
// Re-resolve promises immediately to dodge false rejection from
// subsequent errors
if ( depth ) {
process();
} else {
// Call an optional hook to record the stack, in case of exception
// since it's otherwise lost when execution goes async
if ( jQuery.Deferred.getStackHook ) {
process.stackTrace = jQuery.Deferred.getStackHook();
}
window.setTimeout( process );
}
};
}
return jQuery.Deferred( function( newDefer ) {
// progress_handlers.add( ... )
tuples[ 0 ][ 3 ].add(
resolve(
0,
newDefer,
jQuery.isFunction( onProgress ) ?
onProgress :
Identity,
newDefer.notifyWith
)
);
// fulfilled_handlers.add( ... )
tuples[ 1 ][ 3 ].add(
resolve(
0,
newDefer,
jQuery.isFunction( onFulfilled ) ?
onFulfilled :
Identity
)
);
// rejected_handlers.add( ... )
tuples[ 2 ][ 3 ].add(
resolve(
0,
newDefer,
jQuery.isFunction( onRejected ) ?
onRejected :
Thrower
)
);
} ).promise();
},
// Get a promise for this deferred
// If obj is provided, the promise aspect is added to the object
promise: function( obj ) {
return obj != null ? jQuery.extend( obj, promise ) : promise;
}
},
deferred = {};
// Add list-specific methods
jQuery.each( tuples, function( i, tuple ) {
var list = tuple[ 2 ],
stateString = tuple[ 5 ];
// promise.progress = list.add
// promise.done = list.add
// promise.fail = list.add
promise[ tuple[ 1 ] ] = list.add;
// Handle state
if ( stateString ) {
list.add(
function() {
// state = "resolved" (i.e., fulfilled)
// state = "rejected"
state = stateString;
},
// rejected_callbacks.disable
// fulfilled_callbacks.disable
tuples[ 3 - i ][ 2 ].disable,
// progress_callbacks.lock
tuples[ 0 ][ 2 ].lock
);
}
// progress_handlers.fire
// fulfilled_handlers.fire
// rejected_handlers.fire
list.add( tuple[ 3 ].fire );
// deferred.notify = function() { deferred.notifyWith(...) }
// deferred.resolve = function() { deferred.resolveWith(...) }
// deferred.reject = function() { deferred.rejectWith(...) }
deferred[ tuple[ 0 ] ] = function() {
deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
return this;
};
// deferred.notifyWith = list.fireWith
// deferred.resolveWith = list.fireWith
// deferred.rejectWith = list.fireWith
deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
} );
// Make the deferred a promise
promise.promise( deferred );
// Call given func if any
if ( func ) {
func.call( deferred, deferred );
}
// All done!
return deferred;
},
// Deferred helper
when: function( singleValue ) {
var
// count of uncompleted subordinates
remaining = arguments.length,
// count of unprocessed arguments
i = remaining,
// subordinate fulfillment data
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
// the master Deferred
master = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
return function( value ) {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
master.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
if ( master.state() === "pending" ||
jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
return master.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
}
return master.promise();
}
} );
// These usually indicate a programmer mistake during development,
// warn about them ASAP rather than swallowing them by default.
var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
jQuery.Deferred.exceptionHook = function( error, stack ) {
// Support: IE 8 - 9 only
// Console exists when dev tools are open, which can happen at any time
if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
}
};
jQuery.readyException = function( error ) {
window.setTimeout( function() {
throw error;
} );
};
// The deferred used on DOM ready
var readyList = jQuery.Deferred();
jQuery.fn.ready = function( fn ) {
readyList
.then( fn )
// Wrap jQuery.readyException in a function so that the lookup
// happens at the time of error handling instead of callback
// registration.
.catch( function( error ) {
jQuery.readyException( error );
} );
return this;
};
jQuery.extend( {
// Is the DOM ready to be used? Set to true once it occurs.
isReady: false,
// A counter to track how many items to wait for before
// the ready event fires. See #6781
readyWait: 1,
// Handle when the DOM is ready
ready: function( wait ) {
// Abort if there are pending holds or we're already ready
if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
return;
}
// Remember that the DOM is ready
jQuery.isReady = true;
// If a normal DOM Ready event fired, decrement, and wait if need be
if ( wait !== true && --jQuery.readyWait > 0 ) {
return;
}
// If there are functions bound, to execute
readyList.resolveWith( document, [ jQuery ] );
}
} );
jQuery.ready.then = readyList.then;
// The ready event handler and self cleanup method
function completed() {
document.removeEventListener( "DOMContentLoaded", completed );
window.removeEventListener( "load", completed );
jQuery.ready();
}
// Catch cases where $(document).ready() is called
// after the browser event has already occurred.
// Support: IE <=9 - 10 only
// Older IE sometimes signals "interactive" too soon
if ( document.readyState === "complete" ||
( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
window.setTimeout( jQuery.ready );
} else {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", completed );
// A fallback to window.onload, that will always work
window.addEventListener( "load", completed );
}
// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
var i = 0,
len = elems.length,
bulk = key == null;
// Sets many values
if ( jQuery.type( key ) === "object" ) {
chainable = true;
for ( i in key ) {
access( elems, fn, i, key[ i ], true, emptyGet, raw );
}
// Sets one value
} else if ( value !== undefined ) {
chainable = true;
if ( !jQuery.isFunction( value ) ) {
raw = true;
}
if ( bulk ) {
// Bulk operations run against the entire set
if ( raw ) {
fn.call( elems, value );
fn = null;
// ...except when executing function values
} else {
bulk = fn;
fn = function( elem, key, value ) {
return bulk.call( jQuery( elem ), value );
};
}
}
if ( fn ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
value :
value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
}
if ( chainable ) {
return elems;
}
// Gets
if ( bulk ) {
return fn.call( elems );
}
return len ? fn( elems[ 0 ], key ) : emptyGet;
};
var acceptData = function( owner ) {
// Accepts only:
// - Node
// - Node.ELEMENT_NODE
// - Node.DOCUMENT_NODE
// - Object
// - Any
return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
};
function Data() {
this.expando = jQuery.expando + Data.uid++;
}
Data.uid = 1;
Data.prototype = {
cache: function( owner ) {
// Check if the owner object already has a cache
var value = owner[ this.expando ];
// If not, create one
if ( !value ) {
value = {};
// We can accept data for non-element nodes in modern browsers,
// but we should not, see #8335.
// Always return an empty object.
if ( acceptData( owner ) ) {
// If it is a node unlikely to be stringify-ed or looped over
// use plain assignment
if ( owner.nodeType ) {
owner[ this.expando ] = value;
// Otherwise secure it in a non-enumerable property
// configurable must be true to allow the property to be
// deleted when data is removed
} else {
Object.defineProperty( owner, this.expando, {
value: value,
configurable: true
} );
}
}
}
return value;
},
set: function( owner, data, value ) {
var prop,
cache = this.cache( owner );
// Handle: [ owner, key, value ] args
// Always use camelCase key (gh-2257)
if ( typeof data === "string" ) {
cache[ jQuery.camelCase( data ) ] = value;
// Handle: [ owner, { properties } ] args
} else {
// Copy the properties one-by-one to the cache object
for ( prop in data ) {
cache[ jQuery.camelCase( prop ) ] = data[ prop ];
}
}
return cache;
},
get: function( owner, key ) {
return key === undefined ?
this.cache( owner ) :
// Always use camelCase key (gh-2257)
owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
},
access: function( owner, key, value ) {
// In cases where either:
//
// 1. No key was specified
// 2. A string key was specified, but no value provided
//
// Take the "read" path and allow the get method to determine
// which value to return, respectively either:
//
// 1. The entire cache object
// 2. The data stored at the key
//
if ( key === undefined ||
( ( key && typeof key === "string" ) && value === undefined ) ) {
return this.get( owner, key );
}
// When the key is not a string, or both a key and value
// are specified, set or extend (existing objects) with either:
//
// 1. An object of properties
// 2. A key and value
//
this.set( owner, key, value );
// Since the "set" path can have two possible entry points
// return the expected data based on which path was taken[*]
return value !== undefined ? value : key;
},
remove: function( owner, key ) {
var i,
cache = owner[ this.expando ];
if ( cache === undefined ) {
return;
}
if ( key !== undefined ) {
// Support array or space separated string of keys
if ( Array.isArray( key ) ) {
// If key is an array of keys...
// We always set camelCase keys, so remove that.
key = key.map( jQuery.camelCase );
} else {
key = jQuery.camelCase( key );
// If a key with the spaces exists, use it.
// Otherwise, create an array by matching non-whitespace
key = key in cache ?
[ key ] :
( key.match( rnothtmlwhite ) || [] );
}
i = key.length;
while ( i-- ) {
delete cache[ key[ i ] ];
}
}
// Remove the expando if there's no more data
if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
// Support: Chrome <=35 - 45
// Webkit & Blink performance suffers when deleting properties
// from DOM nodes, so set to undefined instead
// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
if ( owner.nodeType ) {
owner[ this.expando ] = undefined;
} else {
delete owner[ this.expando ];
}
}
},
hasData: function( owner ) {
var cache = owner[ this.expando ];
return cache !== undefined && !jQuery.isEmptyObject( cache );
}
};
var dataPriv = new Data();
var dataUser = new Data();
// Implementation Summary
//
// 1. Enforce API surface and semantic compatibility with 1.9.x branch
// 2. Improve the module's maintainability by reducing the storage
// paths to a single mechanism.
// 3. Use the same single mechanism to support "private" and "user" data.
// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
// 5. Avoid exposing implementation details on user objects (eg. expando properties)
// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
rmultiDash = /[A-Z]/g;
function getData( data ) {
if ( data === "true" ) {
return true;
}
if ( data === "false" ) {
return false;
}
if ( data === "null" ) {
return null;
}
// Only convert to a number if it doesn't change the string
if ( data === +data + "" ) {
return +data;
}
if ( rbrace.test( data ) ) {
return JSON.parse( data );
}
return data;
}
function dataAttr( elem, key, data ) {
var name;
// If nothing was found internally, try to fetch any
// data from the HTML5 data-* attribute
if ( data === undefined && elem.nodeType === 1 ) {
name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
data = elem.getAttribute( name );
if ( typeof data === "string" ) {
try {
data = getData( data );
} catch ( e ) {}
// Make sure we set the data so it isn't changed later
dataUser.set( elem, key, data );
} else {
data = undefined;
}
}
return data;
}
jQuery.extend( {
hasData: function( elem ) {
return dataUser.hasData( elem ) || dataPriv.hasData( elem );
},
data: function( elem, name, data ) {
return dataUser.access( elem, name, data );
},
removeData: function( elem, name ) {
dataUser.remove( elem, name );
},
// TODO: Now that all calls to _data and _removeData have been replaced
// with direct calls to dataPriv methods, these can be deprecated.
_data: function( elem, name, data ) {
return dataPriv.access( elem, name, data );
},
_removeData: function( elem, name ) {
dataPriv.remove( elem, name );
}
} );
jQuery.fn.extend( {
data: function( key, value ) {
var i, name, data,
elem = this[ 0 ],
attrs = elem && elem.attributes;
// Gets all values
if ( key === undefined ) {
if ( this.length ) {
data = dataUser.get( elem );
if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
i = attrs.length;
while ( i-- ) {
// Support: IE 11 only
// The attrs elements can be null (#14894)
if ( attrs[ i ] ) {
name = attrs[ i ].name;
if ( name.indexOf( "data-" ) === 0 ) {
name = jQuery.camelCase( name.slice( 5 ) );
dataAttr( elem, name, data[ name ] );
}
}
}
dataPriv.set( elem, "hasDataAttrs", true );
}
}
return data;
}
// Sets multiple values
if ( typeof key === "object" ) {
return this.each( function() {
dataUser.set( this, key );
} );
}
return access( this, function( value ) {
var data;
// The calling jQuery object (element matches) is not empty
// (and therefore has an element appears at this[ 0 ]) and the
// `value` parameter was not undefined. An empty jQuery object
// will result in `undefined` for elem = this[ 0 ] which will
// throw an exception if an attempt to read a data cache is made.
if ( elem && value === undefined ) {
// Attempt to get data from the cache
// The key will always be camelCased in Data
data = dataUser.get( elem, key );
if ( data !== undefined ) {
return data;
}
// Attempt to "discover" the data in
// HTML5 custom data-* attrs
data = dataAttr( elem, key );
if ( data !== undefined ) {
return data;
}
// We tried really hard, but the data doesn't exist.
return;
}
// Set the data...
this.each( function() {
// We always store the camelCased key
dataUser.set( this, key, value );
} );
}, null, value, arguments.length > 1, null, true );
},
removeData: function( key ) {
return this.each( function() {
dataUser.remove( this, key );
} );
}
} );
jQuery.extend( {
queue: function( elem, type, data ) {
var queue;
if ( elem ) {
type = ( type || "fx" ) + "queue";
queue = dataPriv.get( elem, type );
// Speed up dequeue by getting out quickly if this is just a lookup
if ( data ) {
if ( !queue || Array.isArray( data ) ) {
queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
} else {
queue.push( data );
}
}
return queue || [];
}
},
dequeue: function( elem, type ) {
type = type || "fx";
var queue = jQuery.queue( elem, type ),
startLength = queue.length,
fn = queue.shift(),
hooks = jQuery._queueHooks( elem, type ),
next = function() {
jQuery.dequeue( elem, type );
};
// If the fx queue is dequeued, always remove the progress sentinel
if ( fn === "inprogress" ) {
fn = queue.shift();
startLength--;
}
if ( fn ) {
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if ( type === "fx" ) {
queue.unshift( "inprogress" );
}
// Clear up the last queue stop function
delete hooks.stop;
fn.call( elem, next, hooks );
}
if ( !startLength && hooks ) {
hooks.empty.fire();
}
},
// Not public - generate a queueHooks object, or return the current one
_queueHooks: function( elem, type ) {
var key = type + "queueHooks";
return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
empty: jQuery.Callbacks( "once memory" ).add( function() {
dataPriv.remove( elem, [ type + "queue", key ] );
} )
} );
}
} );
jQuery.fn.extend( {
queue: function( type, data ) {
var setter = 2;
if ( typeof type !== "string" ) {
data = type;
type = "fx";
setter--;
}
if ( arguments.length < setter ) {
return jQuery.queue( this[ 0 ], type );
}
return data === undefined ?
this :
this.each( function() {
var queue = jQuery.queue( this, type, data );
// Ensure a hooks for this queue
jQuery._queueHooks( this, type );
if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
jQuery.dequeue( this, type );
}
} );
},
dequeue: function( type ) {
return this.each( function() {
jQuery.dequeue( this, type );
} );
},
clearQueue: function( type ) {
return this.queue( type || "fx", [] );
},
// Get a promise resolved when queues of a certain type
// are emptied (fx is the type by default)
promise: function( type, obj ) {
var tmp,
count = 1,
defer = jQuery.Deferred(),
elements = this,
i = this.length,
resolve = function() {
if ( !( --count ) ) {
defer.resolveWith( elements, [ elements ] );
}
};
if ( typeof type !== "string" ) {
obj = type;
type = undefined;
}
type = type || "fx";
while ( i-- ) {
tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
if ( tmp && tmp.empty ) {
count++;
tmp.empty.add( resolve );
}
}
resolve();
return defer.promise( obj );
}
} );
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
var isHiddenWithinTree = function( elem, el ) {
// isHiddenWithinTree might be called from jQuery#filter function;
// in that case, element will be second argument
elem = el || elem;
// Inline style trumps all
return elem.style.display === "none" ||
elem.style.display === "" &&
// Otherwise, check computed style
// Support: Firefox <=43 - 45
// Disconnected elements can have computed display: none, so first confirm that elem is
// in the document.
jQuery.contains( elem.ownerDocument, elem ) &&
jQuery.css( elem, "display" ) === "none";
};
var swap = function( elem, options, callback, args ) {
var ret, name,
old = {};
// Remember the old values, and insert the new ones
for ( name in options ) {
old[ name ] = elem.style[ name ];
elem.style[ name ] = options[ name ];
}
ret = callback.apply( elem, args || [] );
// Revert the old values
for ( name in options ) {
elem.style[ name ] = old[ name ];
}
return ret;
};
function adjustCSS( elem, prop, valueParts, tween ) {
var adjusted,
scale = 1,
maxIterations = 20,
currentValue = tween ?
function() {
return tween.cur();
} :
function() {
return jQuery.css( elem, prop, "" );
},
initial = currentValue(),
unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
// Starting value computation is required for potential unit mismatches
initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
rcssNum.exec( jQuery.css( elem, prop ) );
if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
// Trust units reported by jQuery.css
unit = unit || initialInUnit[ 3 ];
// Make sure we update the tween properties later on
valueParts = valueParts || [];
// Iteratively approximate from a nonzero starting point
initialInUnit = +initial || 1;
do {
// If previous iteration zeroed out, double until we get *something*.
// Use string for doubling so we don't accidentally see scale as unchanged below
scale = scale || ".5";
// Adjust and apply
initialInUnit = initialInUnit / scale;
jQuery.style( elem, prop, initialInUnit + unit );
// Update scale, tolerating zero or NaN from tween.cur()
// Break the loop if scale is unchanged or perfect, or if we've just had enough.
} while (
scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
);
}
if ( valueParts ) {
initialInUnit = +initialInUnit || +initial || 0;
// Apply relative offset (+=/-=) if specified
adjusted = valueParts[ 1 ] ?
initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+valueParts[ 2 ];
if ( tween ) {
tween.unit = unit;
tween.start = initialInUnit;
tween.end = adjusted;
}
}
return adjusted;
}
var defaultDisplayMap = {};
function getDefaultDisplay( elem ) {
var temp,
doc = elem.ownerDocument,
nodeName = elem.nodeName,
display = defaultDisplayMap[ nodeName ];
if ( display ) {
return display;
}
temp = doc.body.appendChild( doc.createElement( nodeName ) );
display = jQuery.css( temp, "display" );
temp.parentNode.removeChild( temp );
if ( display === "none" ) {
display = "block";
}
defaultDisplayMap[ nodeName ] = display;
return display;
}
function showHide( elements, show ) {
var display, elem,
values = [],
index = 0,
length = elements.length;
// Determine new display value for elements that need to change
for ( ; index < length; index++ ) {
elem = elements[ index ];
if ( !elem.style ) {
continue;
}
display = elem.style.display;
if ( show ) {
// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
// check is required in this first loop unless we have a nonempty display value (either
// inline or about-to-be-restored)
if ( display === "none" ) {
values[ index ] = dataPriv.get( elem, "display" ) || null;
if ( !values[ index ] ) {
elem.style.display = "";
}
}
if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
values[ index ] = getDefaultDisplay( elem );
}
} else {
if ( display !== "none" ) {
values[ index ] = "none";
// Remember what we're overwriting
dataPriv.set( elem, "display", display );
}
}
}
// Set the display of the elements in a second loop to avoid constant reflow
for ( index = 0; index < length; index++ ) {
if ( values[ index ] != null ) {
elements[ index ].style.display = values[ index ];
}
}
return elements;
}
jQuery.fn.extend( {
show: function() {
return showHide( this, true );
},
hide: function() {
return showHide( this );
},
toggle: function( state ) {
if ( typeof state === "boolean" ) {
return state ? this.show() : this.hide();
}
return this.each( function() {
if ( isHiddenWithinTree( this ) ) {
jQuery( this ).show();
} else {
jQuery( this ).hide();
}
} );
}
} );
var rcheckableType = ( /^(?:checkbox|radio)$/i );
var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
var rscriptType = ( /^$|\/(?:java|ecma)script/i );
// We have to close these tags to support XHTML (#13200)
var wrapMap = {
// Support: IE <=9 only
option: [ 1, "<select multiple='multiple'>", "</select>" ],
// XHTML parsers do not magically insert elements in the
// same way that tag soup parsers do. So we cannot shorten
// this by omitting <tbody> or other required elements.
thead: [ 1, "<table>", "</table>" ],
col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
tr: [ 2, "<table><tbody>", "</tbody></table>" ],
td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
_default: [ 0, "", "" ]
};
// Support: IE <=9 only
wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
function getAll( context, tag ) {
// Support: IE <=9 - 11 only
// Use typeof to avoid zero-argument method invocation on host objects (#15151)
var ret;
if ( typeof context.getElementsByTagName !== "undefined" ) {
ret = context.getElementsByTagName( tag || "*" );
} else if ( typeof context.querySelectorAll !== "undefined" ) {
ret = context.querySelectorAll( tag || "*" );
} else {
ret = [];
}
if ( tag === undefined || tag && nodeName( context, tag ) ) {
return jQuery.merge( [ context ], ret );
}
return ret;
}
// Mark scripts as having already been evaluated
function setGlobalEval( elems, refElements ) {
var i = 0,
l = elems.length;
for ( ; i < l; i++ ) {
dataPriv.set(
elems[ i ],
"globalEval",
!refElements || dataPriv.get( refElements[ i ], "globalEval" )
);
}
}
var rhtml = /<|&#?\w+;/;
function buildFragment( elems, context, scripts, selection, ignored ) {
var elem, tmp, tag, wrap, contains, j,
fragment = context.createDocumentFragment(),
nodes = [],
i = 0,
l = elems.length;
for ( ; i < l; i++ ) {
elem = elems[ i ];
if ( elem || elem === 0 ) {
// Add nodes directly
if ( jQuery.type( elem ) === "object" ) {
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
// Convert non-html into a text node
} else if ( !rhtml.test( elem ) ) {
nodes.push( context.createTextNode( elem ) );
// Convert html into DOM nodes
} else {
tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
// Deserialize a standard representation
tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
wrap = wrapMap[ tag ] || wrapMap._default;
tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
// Descend through wrappers to the right content
j = wrap[ 0 ];
while ( j-- ) {
tmp = tmp.lastChild;
}
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
jQuery.merge( nodes, tmp.childNodes );
// Remember the top-level container
tmp = fragment.firstChild;
// Ensure the created nodes are orphaned (#12392)
tmp.textContent = "";
}
}
}
// Remove wrapper from fragment
fragment.textContent = "";
i = 0;
while ( ( elem = nodes[ i++ ] ) ) {
// Skip elements already in the context collection (trac-4087)
if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
if ( ignored ) {
ignored.push( elem );
}
continue;
}
contains = jQuery.contains( elem.ownerDocument, elem );
// Append to fragment
tmp = getAll( fragment.appendChild( elem ), "script" );
// Preserve script evaluation history
if ( contains ) {
setGlobalEval( tmp );
}
// Capture executables
if ( scripts ) {
j = 0;
while ( ( elem = tmp[ j++ ] ) ) {
if ( rscriptType.test( elem.type || "" ) ) {
scripts.push( elem );
}
}
}
}
return fragment;
}
( function() {
var fragment = document.createDocumentFragment(),
div = fragment.appendChild( document.createElement( "div" ) ),
input = document.createElement( "input" );
// Support: Android 4.0 - 4.3 only
// Check state lost if the name is set (#11217)
// Support: Windows Web Apps (WWA)
// `name` and `type` must use .setAttribute for WWA (#14901)
input.setAttribute( "type", "radio" );
input.setAttribute( "checked", "checked" );
input.setAttribute( "name", "t" );
div.appendChild( input );
// Support: Android <=4.1 only
// Older WebKit doesn't clone checked state correctly in fragments
support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
// Support: IE <=11 only
// Make sure textarea (and checkbox) defaultValue is properly cloned
div.innerHTML = "<textarea>x</textarea>";
support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
} )();
var documentElement = document.documentElement;
var
rkeyEvent = /^key/,
rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
}
function returnFalse() {
return false;
}
// Support: IE <=9 only
// See #13393 for more info
function safeActiveElement() {
try {
return document.activeElement;
} catch ( err ) { }
}
function on( elem, types, selector, data, fn, one ) {
var origFn, type;
// Types can be a map of types/handlers
if ( typeof types === "object" ) {
// ( types-Object, selector, data )
if ( typeof selector !== "string" ) {
// ( types-Object, data )
data = data || selector;
selector = undefined;
}
for ( type in types ) {
on( elem, type, selector, data, types[ type ], one );
}
return elem;
}
if ( data == null && fn == null ) {
// ( types, fn )
fn = selector;
data = selector = undefined;
} else if ( fn == null ) {
if ( typeof selector === "string" ) {
// ( types, selector, fn )
fn = data;
data = undefined;
} else {
// ( types, data, fn )
fn = data;
data = selector;
selector = undefined;
}
}
if ( fn === false ) {
fn = returnFalse;
} else if ( !fn ) {
return elem;
}
if ( one === 1 ) {
origFn = fn;
fn = function( event ) {
// Can use an empty set, since event contains the info
jQuery().off( event );
return origFn.apply( this, arguments );
};
// Use same guid so caller can remove using origFn
fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
}
return elem.each( function() {
jQuery.event.add( this, types, fn, data, selector );
} );
}
/*
* Helper functions for managing events -- not part of the public interface.
* Props to Dean Edwards' addEvent library for many of the ideas.
*/
jQuery.event = {
global: {},
add: function( elem, types, handler, data, selector ) {
var handleObjIn, eventHandle, tmp,
events, t, handleObj,
special, handlers, type, namespaces, origType,
elemData = dataPriv.get( elem );
// Don't attach events to noData or text/comment nodes (but allow plain objects)
if ( !elemData ) {
return;
}
// Caller can pass in an object of custom data in lieu of the handler
if ( handler.handler ) {
handleObjIn = handler;
handler = handleObjIn.handler;
selector = handleObjIn.selector;
}
// Ensure that invalid selectors throw exceptions at attach time
// Evaluate against documentElement in case elem is a non-element node (e.g., document)
if ( selector ) {
jQuery.find.matchesSelector( documentElement, selector );
}
// Make sure that the handler has a unique ID, used to find/remove it later
if ( !handler.guid ) {
handler.guid = jQuery.guid++;
}
// Init the element's event structure and main handler, if this is the first
if ( !( events = elemData.events ) ) {
events = elemData.events = {};
}
if ( !( eventHandle = elemData.handle ) ) {
eventHandle = elemData.handle = function( e ) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
jQuery.event.dispatch.apply( elem, arguments ) : undefined;
};
}
// Handle multiple events separated by a space
types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
tmp = rtypenamespace.exec( types[ t ] ) || [];
type = origType = tmp[ 1 ];
namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
// There *must* be a type, no attaching namespace-only handlers
if ( !type ) {
continue;
}
// If event changes its type, use the special event handlers for the changed type
special = jQuery.event.special[ type ] || {};
// If selector defined, determine special event api type, otherwise given type
type = ( selector ? special.delegateType : special.bindType ) || type;
// Update special based on newly reset type
special = jQuery.event.special[ type ] || {};
// handleObj is passed to all event handlers
handleObj = jQuery.extend( {
type: type,
origType: origType,
data: data,
handler: handler,
guid: handler.guid,
selector: selector,
needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
namespace: namespaces.join( "." )
}, handleObjIn );
// Init the event handler queue if we're the first
if ( !( handlers = events[ type ] ) ) {
handlers = events[ type ] = [];
handlers.delegateCount = 0;
// Only use addEventListener if the special events handler returns false
if ( !special.setup ||
special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
if ( elem.addEventListener ) {
elem.addEventListener( type, eventHandle );
}
}
}
if ( special.add ) {
special.add.call( elem, handleObj );
if ( !handleObj.handler.guid ) {
handleObj.handler.guid = handler.guid;
}
}
// Add to the element's handler list, delegates in front
if ( selector ) {
handlers.splice( handlers.delegateCount++, 0, handleObj );
} else {
handlers.push( handleObj );
}
// Keep track of which events have ever been used, for event optimization
jQuery.event.global[ type ] = true;
}
},
// Detach an event or set of events from an element
remove: function( elem, types, handler, selector, mappedTypes ) {
var j, origCount, tmp,
events, t, handleObj,
special, handlers, type, namespaces, origType,
elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
if ( !elemData || !( events = elemData.events ) ) {
return;
}
// Once for each type.namespace in types; type may be omitted
types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
tmp = rtypenamespace.exec( types[ t ] ) || [];
type = origType = tmp[ 1 ];
namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
// Unbind all events (on this namespace, if provided) for the element
if ( !type ) {
for ( type in events ) {
jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
}
continue;
}
special = jQuery.event.special[ type ] || {};
type = ( selector ? special.delegateType : special.bindType ) || type;
handlers = events[ type ] || [];
tmp = tmp[ 2 ] &&
new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
// Remove matching events
origCount = j = handlers.length;
while ( j-- ) {
handleObj = handlers[ j ];
if ( ( mappedTypes || origType === handleObj.origType ) &&
( !handler || handler.guid === handleObj.guid ) &&
( !tmp || tmp.test( handleObj.namespace ) ) &&
( !selector || selector === handleObj.selector ||
selector === "**" && handleObj.selector ) ) {
handlers.splice( j, 1 );
if ( handleObj.selector ) {
handlers.delegateCount--;
}
if ( special.remove ) {
special.remove.call( elem, handleObj );
}
}
}
// Remove generic event handler if we removed something and no more handlers exist
// (avoids potential for endless recursion during removal of special event handlers)
if ( origCount && !handlers.length ) {
if ( !special.teardown ||
special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
jQuery.removeEvent( elem, type, elemData.handle );
}
delete events[ type ];
}
}
// Remove data and the expando if it's no longer used
if ( jQuery.isEmptyObject( events ) ) {
dataPriv.remove( elem, "handle events" );
}
},
dispatch: function( nativeEvent ) {
// Make a writable jQuery.Event from the native event object
var event = jQuery.event.fix( nativeEvent );
var i, j, ret, matched, handleObj, handlerQueue,
args = new Array( arguments.length ),
handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
args[ 0 ] = event;
for ( i = 1; i < arguments.length; i++ ) {
args[ i ] = arguments[ i ];
}
event.delegateTarget = this;
// Call the preDispatch hook for the mapped type, and let it bail if desired
if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
return;
}
// Determine handlers
handlerQueue = jQuery.event.handlers.call( this, event, handlers );
// Run delegates first; they may want to stop propagation beneath us
i = 0;
while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
event.currentTarget = matched.elem;
j = 0;
while ( ( handleObj = matched.handlers[ j++ ] ) &&
!event.isImmediatePropagationStopped() ) {
// Triggered event must either 1) have no namespace, or 2) have namespace(s)
// a subset or equal to those in the bound event (both can have no namespace).
if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
event.handleObj = handleObj;
event.data = handleObj.data;
ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
handleObj.handler ).apply( matched.elem, args );
if ( ret !== undefined ) {
if ( ( event.result = ret ) === false ) {
event.preventDefault();
event.stopPropagation();
}
}
}
}
}
// Call the postDispatch hook for the mapped type
if ( special.postDispatch ) {
special.postDispatch.call( this, event );
}
return event.result;
},
handlers: function( event, handlers ) {
var i, handleObj, sel, matchedHandlers, matchedSelectors,
handlerQueue = [],
delegateCount = handlers.delegateCount,
cur = event.target;
// Find delegate handlers
if ( delegateCount &&
// Support: IE <=9
// Black-hole SVG <use> instance trees (trac-13180)
cur.nodeType &&
// Support: Firefox <=42
// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
// Support: IE 11 only
// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
!( event.type === "click" && event.button >= 1 ) ) {
for ( ; cur !== this; cur = cur.parentNode || this ) {
// Don't check non-elements (#13208)
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
matchedHandlers = [];
matchedSelectors = {};
for ( i = 0; i < delegateCount; i++ ) {
handleObj = handlers[ i ];
// Don't conflict with Object.prototype properties (#13203)
sel = handleObj.selector + " ";
if ( matchedSelectors[ sel ] === undefined ) {
matchedSelectors[ sel ] = handleObj.needsContext ?
jQuery( sel, this ).index( cur ) > -1 :
jQuery.find( sel, this, null, [ cur ] ).length;
}
if ( matchedSelectors[ sel ] ) {
matchedHandlers.push( handleObj );
}
}
if ( matchedHandlers.length ) {
handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
}
}
}
}
// Add the remaining (directly-bound) handlers
cur = this;
if ( delegateCount < handlers.length ) {
handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
}
return handlerQueue;
},
addProp: function( name, hook ) {
Object.defineProperty( jQuery.Event.prototype, name, {
enumerable: true,
configurable: true,
get: jQuery.isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
return this.originalEvent[ name ];
}
},
set: function( value ) {
Object.defineProperty( this, name, {
enumerable: true,
configurable: true,
writable: true,
value: value
} );
}
} );
},
fix: function( originalEvent ) {
return originalEvent[ jQuery.expando ] ?
originalEvent :
new jQuery.Event( originalEvent );
},
special: {
load: {
// Prevent triggered image.load events from bubbling to window.load
noBubble: true
},
focus: {
// Fire native event if possible so blur/focus sequence is correct
trigger: function() {
if ( this !== safeActiveElement() && this.focus ) {
this.focus();
return false;
}
},
delegateType: "focusin"
},
blur: {
trigger: function() {
if ( this === safeActiveElement() && this.blur ) {
this.blur();
return false;
}
},
delegateType: "focusout"
},
click: {
// For checkbox, fire native event so checked state will be right
trigger: function() {
if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
this.click();
return false;
}
},
// For cross-browser consistency, don't fire native .click() on links
_default: function( event ) {
return nodeName( event.target, "a" );
}
},
beforeunload: {
postDispatch: function( event ) {
// Support: Firefox 20+
// Firefox doesn't alert if the returnValue field is not set.
if ( event.result !== undefined && event.originalEvent ) {
event.originalEvent.returnValue = event.result;
}
}
}
}
};
jQuery.removeEvent = function( elem, type, handle ) {
// This "if" is needed for plain objects
if ( elem.removeEventListener ) {
elem.removeEventListener( type, handle );
}
};
jQuery.Event = function( src, props ) {
// Allow instantiation without the 'new' keyword
if ( !( this instanceof jQuery.Event ) ) {
return new jQuery.Event( src, props );
}
// Event object
if ( src && src.type ) {
this.originalEvent = src;
this.type = src.type;
// Events bubbling up the document may have been marked as prevented
// by a handler lower down the tree; reflect the correct value.
this.isDefaultPrevented = src.defaultPrevented ||
src.defaultPrevented === undefined &&
// Support: Android <=2.3 only
src.returnValue === false ?
returnTrue :
returnFalse;
// Create target properties
// Support: Safari <=6 - 7 only
// Target should not be a text node (#504, #13143)
this.target = ( src.target && src.target.nodeType === 3 ) ?
src.target.parentNode :
src.target;
this.currentTarget = src.currentTarget;
this.relatedTarget = src.relatedTarget;
// Event type
} else {
this.type = src;
}
// Put explicitly provided properties onto the event object
if ( props ) {
jQuery.extend( this, props );
}
// Create a timestamp if incoming event doesn't have one
this.timeStamp = src && src.timeStamp || jQuery.now();
// Mark it as fixed
this[ jQuery.expando ] = true;
};
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
constructor: jQuery.Event,
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse,
isSimulated: false,
preventDefault: function() {
var e = this.originalEvent;
this.isDefaultPrevented = returnTrue;
if ( e && !this.isSimulated ) {
e.preventDefault();
}
},
stopPropagation: function() {
var e = this.originalEvent;
this.isPropagationStopped = returnTrue;
if ( e && !this.isSimulated ) {
e.stopPropagation();
}
},
stopImmediatePropagation: function() {
var e = this.originalEvent;
this.isImmediatePropagationStopped = returnTrue;
if ( e && !this.isSimulated ) {
e.stopImmediatePropagation();
}
this.stopPropagation();
}
};
// Includes all common event props including KeyEvent and MouseEvent specific props
jQuery.each( {
altKey: true,
bubbles: true,
cancelable: true,
changedTouches: true,
ctrlKey: true,
detail: true,
eventPhase: true,
metaKey: true,
pageX: true,
pageY: true,
shiftKey: true,
view: true,
"char": true,
charCode: true,
key: true,
keyCode: true,
button: true,
buttons: true,
clientX: true,
clientY: true,
offsetX: true,
offsetY: true,
pointerId: true,
pointerType: true,
screenX: true,
screenY: true,
targetTouches: true,
toElement: true,
touches: true,
which: function( event ) {
var button = event.button;
// Add which for key events
if ( event.which == null && rkeyEvent.test( event.type ) ) {
return event.charCode != null ? event.charCode : event.keyCode;
}
// Add which for click: 1 === left; 2 === middle; 3 === right
if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
if ( button & 1 ) {
return 1;
}
if ( button & 2 ) {
return 3;
}
if ( button & 4 ) {
return 2;
}
return 0;
}
return event.which;
}
}, jQuery.event.addProp );
// Create mouseenter/leave events using mouseover/out and event-time checks
// so that event delegation works in jQuery.
// Do the same for pointerenter/pointerleave and pointerover/pointerout
//
// Support: Safari 7 only
// Safari sends mouseenter too often; see:
// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
// for the description of the bug (it existed in older Chrome versions as well).
jQuery.each( {
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
pointerleave: "pointerout"
}, function( orig, fix ) {
jQuery.event.special[ orig ] = {
delegateType: fix,
bindType: fix,
handle: function( event ) {
var ret,
target = this,
related = event.relatedTarget,
handleObj = event.handleObj;
// For mouseenter/leave call the handler if related is outside the target.
// NB: No relatedTarget if the mouse left/entered the browser window
if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
event.type = handleObj.origType;
ret = handleObj.handler.apply( this, arguments );
event.type = fix;
}
return ret;
}
};
} );
jQuery.fn.extend( {
on: function( types, selector, data, fn ) {
return on( this, types, selector, data, fn );
},
one: function( types, selector, data, fn ) {
return on( this, types, selector, data, fn, 1 );
},
off: function( types, selector, fn ) {
var handleObj, type;
if ( types && types.preventDefault && types.handleObj ) {
// ( event ) dispatched jQuery.Event
handleObj = types.handleObj;
jQuery( types.delegateTarget ).off(
handleObj.namespace ?
handleObj.origType + "." + handleObj.namespace :
handleObj.origType,
handleObj.selector,
handleObj.handler
);
return this;
}
if ( typeof types === "object" ) {
// ( types-object [, selector] )
for ( type in types ) {
this.off( type, selector, types[ type ] );
}
return this;
}
if ( selector === false || typeof selector === "function" ) {
// ( types [, fn] )
fn = selector;
selector = undefined;
}
if ( fn === false ) {
fn = returnFalse;
}
return this.each( function() {
jQuery.event.remove( this, types, fn, selector );
} );
}
} );
var
/* eslint-disable max-len */
// See https://github.com/eslint/eslint/issues/3229
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
/* eslint-enable */
// Support: IE <=10 - 11, Edge 12 - 13
// In IE/Edge using regex groups here causes severe slowdowns.
// See https://connect.microsoft.com/IE/feedback/details/1736512/
rnoInnerhtml = /<script|<style|<link/i,
// checked="checked" or checked
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
rscriptTypeMasked = /^true\/(.*)/,
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
// Prefer a tbody over its parent table for containing new rows
function manipulationTarget( elem, content ) {
if ( nodeName( elem, "table" ) &&
nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
return jQuery( ">tbody", elem )[ 0 ] || elem;
}
return elem;
}
// Replace/restore the type attribute of script elements for safe DOM manipulation
function disableScript( elem ) {
elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
return elem;
}
function restoreScript( elem ) {
var match = rscriptTypeMasked.exec( elem.type );
if ( match ) {
elem.type = match[ 1 ];
} else {
elem.removeAttribute( "type" );
}
return elem;
}
function cloneCopyEvent( src, dest ) {
var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
if ( dest.nodeType !== 1 ) {
return;
}
// 1. Copy private data: events, handlers, etc.
if ( dataPriv.hasData( src ) ) {
pdataOld = dataPriv.access( src );
pdataCur = dataPriv.set( dest, pdataOld );
events = pdataOld.events;
if ( events ) {
delete pdataCur.handle;
pdataCur.events = {};
for ( type in events ) {
for ( i = 0, l = events[ type ].length; i < l; i++ ) {
jQuery.event.add( dest, type, events[ type ][ i ] );
}
}
}
}
// 2. Copy user data
if ( dataUser.hasData( src ) ) {
udataOld = dataUser.access( src );
udataCur = jQuery.extend( {}, udataOld );
dataUser.set( dest, udataCur );
}
}
// Fix IE bugs, see support tests
function fixInput( src, dest ) {
var nodeName = dest.nodeName.toLowerCase();
// Fails to persist the checked state of a cloned checkbox or radio button.
if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
dest.checked = src.checked;
// Fails to return the selected option to the default selected state when cloning options
} else if ( nodeName === "input" || nodeName === "textarea" ) {
dest.defaultValue = src.defaultValue;
}
}
function domManip( collection, args, callback, ignored ) {
// Flatten any nested arrays
args = concat.apply( [], args );
var fragment, first, scripts, hasScripts, node, doc,
i = 0,
l = collection.length,
iNoClone = l - 1,
value = args[ 0 ],
isFunction = jQuery.isFunction( value );
// We can't cloneNode fragments that contain checked, in WebKit
if ( isFunction ||
( l > 1 && typeof value === "string" &&
!support.checkClone && rchecked.test( value ) ) ) {
return collection.each( function( index ) {
var self = collection.eq( index );
if ( isFunction ) {
args[ 0 ] = value.call( this, index, self.html() );
}
domManip( self, args, callback, ignored );
} );
}
if ( l ) {
fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
first = fragment.firstChild;
if ( fragment.childNodes.length === 1 ) {
fragment = first;
}
// Require either new content or an interest in ignored elements to invoke the callback
if ( first || ignored ) {
scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
hasScripts = scripts.length;
// Use the original fragment for the last item
// instead of the first because it can end up
// being emptied incorrectly in certain situations (#8070).
for ( ; i < l; i++ ) {
node = fragment;
if ( i !== iNoClone ) {
node = jQuery.clone( node, true, true );
// Keep references to cloned scripts for later restoration
if ( hasScripts ) {
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
jQuery.merge( scripts, getAll( node, "script" ) );
}
}
callback.call( collection[ i ], node, i );
}
if ( hasScripts ) {
doc = scripts[ scripts.length - 1 ].ownerDocument;
// Reenable scripts
jQuery.map( scripts, restoreScript );
// Evaluate executable scripts on first document insertion
for ( i = 0; i < hasScripts; i++ ) {
node = scripts[ i ];
if ( rscriptType.test( node.type || "" ) &&
!dataPriv.access( node, "globalEval" ) &&
jQuery.contains( doc, node ) ) {
if ( node.src ) {
// Optional AJAX dependency, but won't run scripts if not present
if ( jQuery._evalUrl ) {
jQuery._evalUrl( node.src );
}
} else {
DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
}
}
}
}
}
}
return collection;
}
function remove( elem, selector, keepData ) {
var node,
nodes = selector ? jQuery.filter( selector, elem ) : elem,
i = 0;
for ( ; ( node = nodes[ i ] ) != null; i++ ) {
if ( !keepData && node.nodeType === 1 ) {
jQuery.cleanData( getAll( node ) );
}
if ( node.parentNode ) {
if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
setGlobalEval( getAll( node, "script" ) );
}
node.parentNode.removeChild( node );
}
}
return elem;
}
jQuery.extend( {
htmlPrefilter: function( html ) {
return html.replace( rxhtmlTag, "<$1></$2>" );
},
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
var i, l, srcElements, destElements,
clone = elem.cloneNode( true ),
inPage = jQuery.contains( elem.ownerDocument, elem );
// Fix IE cloning issues
if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
!jQuery.isXMLDoc( elem ) ) {
// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
destElements = getAll( clone );
srcElements = getAll( elem );
for ( i = 0, l = srcElements.length; i < l; i++ ) {
fixInput( srcElements[ i ], destElements[ i ] );
}
}
// Copy the events from the original to the clone
if ( dataAndEvents ) {
if ( deepDataAndEvents ) {
srcElements = srcElements || getAll( elem );
destElements = destElements || getAll( clone );
for ( i = 0, l = srcElements.length; i < l; i++ ) {
cloneCopyEvent( srcElements[ i ], destElements[ i ] );
}
} else {
cloneCopyEvent( elem, clone );
}
}
// Preserve script evaluation history
destElements = getAll( clone, "script" );
if ( destElements.length > 0 ) {
setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
}
// Return the cloned set
return clone;
},
cleanData: function( elems ) {
var data, elem, type,
special = jQuery.event.special,
i = 0;
for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
if ( acceptData( elem ) ) {
if ( ( data = elem[ dataPriv.expando ] ) ) {
if ( data.events ) {
for ( type in data.events ) {
if ( special[ type ] ) {
jQuery.event.remove( elem, type );
// This is a shortcut to avoid jQuery.event.remove's overhead
} else {
jQuery.removeEvent( elem, type, data.handle );
}
}
}
// Support: Chrome <=35 - 45+
// Assign undefined instead of using delete, see Data#remove
elem[ dataPriv.expando ] = undefined;
}
if ( elem[ dataUser.expando ] ) {
// Support: Chrome <=35 - 45+
// Assign undefined instead of using delete, see Data#remove
elem[ dataUser.expando ] = undefined;
}
}
}
}
} );
jQuery.fn.extend( {
detach: function( selector ) {
return remove( this, selector, true );
},
remove: function( selector ) {
return remove( this, selector );
},
text: function( value ) {
return access( this, function( value ) {
return value === undefined ?
jQuery.text( this ) :
this.empty().each( function() {
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
this.textContent = value;
}
} );
}, null, value, arguments.length );
},
append: function() {
return domManip( this, arguments, function( elem ) {
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
var target = manipulationTarget( this, elem );
target.appendChild( elem );
}
} );
},
prepend: function() {
return domManip( this, arguments, function( elem ) {
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
var target = manipulationTarget( this, elem );
target.insertBefore( elem, target.firstChild );
}
} );
},
before: function() {
return domManip( this, arguments, function( elem ) {
if ( this.parentNode ) {
this.parentNode.insertBefore( elem, this );
}
} );
},
after: function() {
return domManip( this, arguments, function( elem ) {
if ( this.parentNode ) {
this.parentNode.insertBefore( elem, this.nextSibling );
}
} );
},
empty: function() {
var elem,
i = 0;
for ( ; ( elem = this[ i ] ) != null; i++ ) {
if ( elem.nodeType === 1 ) {
// Prevent memory leaks
jQuery.cleanData( getAll( elem, false ) );
// Remove any remaining nodes
elem.textContent = "";
}
}
return this;
},
clone: function( dataAndEvents, deepDataAndEvents ) {
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
return this.map( function() {
return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
} );
},
html: function( value ) {
return access( this, function( value ) {
var elem = this[ 0 ] || {},
i = 0,
l = this.length;
if ( value === undefined && elem.nodeType === 1 ) {
return elem.innerHTML;
}
// See if we can take a shortcut and just use innerHTML
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
value = jQuery.htmlPrefilter( value );
try {
for ( ; i < l; i++ ) {
elem = this[ i ] || {};
// Remove element nodes and prevent memory leaks
if ( elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem, false ) );
elem.innerHTML = value;
}
}
elem = 0;
// If using innerHTML throws an exception, use the fallback method
} catch ( e ) {}
}
if ( elem ) {
this.empty().append( value );
}
}, null, value, arguments.length );
},
replaceWith: function() {
var ignored = [];
// Make the changes, replacing each non-ignored context element with the new content
return domManip( this, arguments, function( elem ) {
var parent = this.parentNode;
if ( jQuery.inArray( this, ignored ) < 0 ) {
jQuery.cleanData( getAll( this ) );
if ( parent ) {
parent.replaceChild( elem, this );
}
}
// Force callback invocation
}, ignored );
}
} );
jQuery.each( {
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function( name, original ) {
jQuery.fn[ name ] = function( selector ) {
var elems,
ret = [],
insert = jQuery( selector ),
last = insert.length - 1,
i = 0;
for ( ; i <= last; i++ ) {
elems = i === last ? this : this.clone( true );
jQuery( insert[ i ] )[ original ]( elems );
// Support: Android <=4.0 only, PhantomJS 1 only
// .get() because push.apply(_, arraylike) throws on ancient WebKit
push.apply( ret, elems.get() );
}
return this.pushStack( ret );
};
} );
var rmargin = ( /^margin/ );
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
var getStyles = function( elem ) {
// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
// IE throws on elements created in popups
// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
var view = elem.ownerDocument.defaultView;
if ( !view || !view.opener ) {
view = window;
}
return view.getComputedStyle( elem );
};
( function() {
// Executing both pixelPosition & boxSizingReliable tests require only one layout
// so they're executed at the same time to save the second computation.
function computeStyleTests() {
// This is a singleton, we need to execute it only once
if ( !div ) {
return;
}
div.style.cssText =
"box-sizing:border-box;" +
"position:relative;display:block;" +
"margin:auto;border:1px;padding:1px;" +
"top:1%;width:50%";
div.innerHTML = "";
documentElement.appendChild( container );
var divStyle = window.getComputedStyle( div );
pixelPositionVal = divStyle.top !== "1%";
// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
reliableMarginLeftVal = divStyle.marginLeft === "2px";
boxSizingReliableVal = divStyle.width === "4px";
// Support: Android 4.0 - 4.3 only
// Some styles come back with percentage values, even though they shouldn't
div.style.marginRight = "50%";
pixelMarginRightVal = divStyle.marginRight === "4px";
documentElement.removeChild( container );
// Nullify the div so it wouldn't be stored in the memory and
// it will also be a sign that checks already performed
div = null;
}
var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
container = document.createElement( "div" ),
div = document.createElement( "div" );
// Finish early in limited (non-browser) environments
if ( !div.style ) {
return;
}
// Support: IE <=9 - 11 only
// Style of cloned element affects source element cloned (#8908)
div.style.backgroundClip = "content-box";
div.cloneNode( true ).style.backgroundClip = "";
support.clearCloneStyle = div.style.backgroundClip === "content-box";
container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
"padding:0;margin-top:1px;position:absolute";
container.appendChild( div );
jQuery.extend( support, {
pixelPosition: function() {
computeStyleTests();
return pixelPositionVal;
},
boxSizingReliable: function() {
computeStyleTests();
return boxSizingReliableVal;
},
pixelMarginRight: function() {
computeStyleTests();
return pixelMarginRightVal;
},
reliableMarginLeft: function() {
computeStyleTests();
return reliableMarginLeftVal;
}
} );
} )();
function curCSS( elem, name, computed ) {
var width, minWidth, maxWidth, ret,
// Support: Firefox 51+
// Retrieving style before computed somehow
// fixes an issue with getting wrong values
// on detached elements
style = elem.style;
computed = computed || getStyles( elem );
// getPropertyValue is needed for:
// .css('filter') (IE 9 only, #12537)
// .css('--customProperty) (#3144)
if ( computed ) {
ret = computed.getPropertyValue( name ) || computed[ name ];
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
ret = jQuery.style( elem, name );
}
// A tribute to the "awesome hack by Dean Edwards"
// Android Browser returns percentage for some values,
// but width seems to be reliably pixels.
// This is against the CSSOM draft spec:
// https://drafts.csswg.org/cssom/#resolved-values
if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
// Remember the original values
width = style.width;
minWidth = style.minWidth;
maxWidth = style.maxWidth;
// Put in the new values to get a computed value out
style.minWidth = style.maxWidth = style.width = ret;
ret = computed.width;
// Revert the changed values
style.width = width;
style.minWidth = minWidth;
style.maxWidth = maxWidth;
}
}
return ret !== undefined ?
// Support: IE <=9 - 11 only
// IE returns zIndex value as an integer.
ret + "" :
ret;
}
function addGetHookIf( conditionFn, hookFn ) {
// Define the hook, we'll check on the first run if it's really needed.
return {
get: function() {
if ( conditionFn() ) {
// Hook not needed (or it's not possible to use it due
// to missing dependency), remove it.
delete this.get;
return;
}
// Hook needed; redefine it so that the support test is not executed again.
return ( this.get = hookFn ).apply( this, arguments );
}
};
}
var
// Swappable if display is none or starts with table
// except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
letterSpacing: "0",
fontWeight: "400"
},
cssPrefixes = [ "Webkit", "Moz", "ms" ],
emptyStyle = document.createElement( "div" ).style;
// Return a css property mapped to a potentially vendor prefixed property
function vendorPropName( name ) {
// Shortcut for names that are not vendor prefixed
if ( name in emptyStyle ) {
return name;
}
// Check for vendor prefixed names
var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
i = cssPrefixes.length;
while ( i-- ) {
name = cssPrefixes[ i ] + capName;
if ( name in emptyStyle ) {
return name;
}
}
}
// Return a property mapped along what jQuery.cssProps suggests or to
// a vendor prefixed property.
function finalPropName( name ) {
var ret = jQuery.cssProps[ name ];
if ( !ret ) {
ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
}
return ret;
}
function setPositiveNumber( elem, value, subtract ) {
// Any relative (+/-) values have already been
// normalized at this point
var matches = rcssNum.exec( value );
return matches ?
// Guard against undefined "subtract", e.g., when used as in cssHooks
Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
value;
}
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
var i,
val = 0;
// If we already have the right measurement, avoid augmentation
if ( extra === ( isBorderBox ? "border" : "content" ) ) {
i = 4;
// Otherwise initialize for horizontal or vertical properties
} else {
i = name === "width" ? 1 : 0;
}
for ( ; i < 4; i += 2 ) {
// Both box models exclude margin, so add it if we want it
if ( extra === "margin" ) {
val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
}
if ( isBorderBox ) {
// border-box includes padding, so remove it if we want content
if ( extra === "content" ) {
val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
}
// At this point, extra isn't border nor margin, so remove border
if ( extra !== "margin" ) {
val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
}
} else {
// At this point, extra isn't content, so add padding
val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
// At this point, extra isn't content nor padding, so add border
if ( extra !== "padding" ) {
val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
}
}
}
return val;
}
function getWidthOrHeight( elem, name, extra ) {
// Start with computed style
var valueIsBorderBox,
styles = getStyles( elem ),
val = curCSS( elem, name, styles ),
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
// Computed unit is not pixels. Stop here and return.
if ( rnumnonpx.test( val ) ) {
return val;
}
// Check for style in case a browser which returns unreliable values
// for getComputedStyle silently falls back to the reliable elem.style
valueIsBorderBox = isBorderBox &&
( support.boxSizingReliable() || val === elem.style[ name ] );
// Fall back to offsetWidth/Height when value is "auto"
// This happens for inline elements with no explicit setting (gh-3571)
if ( val === "auto" ) {
val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
}
// Normalize "", auto, and prepare for extra
val = parseFloat( val ) || 0;
// Use the active box-sizing model to add/subtract irrelevant styles
return ( val +
augmentWidthOrHeight(
elem,
name,
extra || ( isBorderBox ? "border" : "content" ),
valueIsBorderBox,
styles
)
) + "px";
}
jQuery.extend( {
// Add in style property hooks for overriding the default
// behavior of getting and setting a style property
cssHooks: {
opacity: {
get: function( elem, computed ) {
if ( computed ) {
// We should always get a number back from opacity
var ret = curCSS( elem, "opacity" );
return ret === "" ? "1" : ret;
}
}
}
},
// Don't automatically add "px" to these possibly-unitless properties
cssNumber: {
"animationIterationCount": true,
"columnCount": true,
"fillOpacity": true,
"flexGrow": true,
"flexShrink": true,
"fontWeight": true,
"lineHeight": true,
"opacity": true,
"order": true,
"orphans": true,
"widows": true,
"zIndex": true,
"zoom": true
},
// Add in properties whose names you wish to fix before
// setting or getting the value
cssProps: {
"float": "cssFloat"
},
// Get and set the style property on a DOM Node
style: function( elem, name, value, extra ) {
// Don't set styles on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
return;
}
// Make sure that we're working with the right name
var ret, type, hooks,
origName = jQuery.camelCase( name ),
isCustomProp = rcustomProp.test( name ),
style = elem.style;
// Make sure that we're working with the right name. We don't
// want to query the value if it is a CSS custom property
// since they are user-defined.
if ( !isCustomProp ) {
name = finalPropName( origName );
}
// Gets hook for the prefixed version, then unprefixed version
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
// Check if we're setting a value
if ( value !== undefined ) {
type = typeof value;
// Convert "+=" or "-=" to relative numbers (#7345)
if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
value = adjustCSS( elem, name, ret );
// Fixes bug #9237
type = "number";
}
// Make sure that null and NaN values aren't set (#7116)
if ( value == null || value !== value ) {
return;
}
// If a number was passed in, add the unit (except for certain CSS properties)
if ( type === "number" ) {
value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
}
// background-* props affect original clone's values
if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
style[ name ] = "inherit";
}
// If a hook was provided, use that value, otherwise just set the specified value
if ( !hooks || !( "set" in hooks ) ||
( value = hooks.set( elem, value, extra ) ) !== undefined ) {
if ( isCustomProp ) {
style.setProperty( name, value );
} else {
style[ name ] = value;
}
}
} else {
// If a hook was provided get the non-computed value from there
if ( hooks && "get" in hooks &&
( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
return ret;
}
// Otherwise just get the value from the style object
return style[ name ];
}
},
css: function( elem, name, extra, styles ) {
var val, num, hooks,
origName = jQuery.camelCase( name ),
isCustomProp = rcustomProp.test( name );
// Make sure that we're working with the right name. We don't
// want to modify the value if it is a CSS custom property
// since they are user-defined.
if ( !isCustomProp ) {
name = finalPropName( origName );
}
// Try prefixed name followed by the unprefixed name
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
// If a hook was provided get the computed value from there
if ( hooks && "get" in hooks ) {
val = hooks.get( elem, true, extra );
}
// Otherwise, if a way to get the computed value exists, use that
if ( val === undefined ) {
val = curCSS( elem, name, styles );
}
// Convert "normal" to computed value
if ( val === "normal" && name in cssNormalTransform ) {
val = cssNormalTransform[ name ];
}
// Make numeric if forced or a qualifier was provided and val looks numeric
if ( extra === "" || extra ) {
num = parseFloat( val );
return extra === true || isFinite( num ) ? num || 0 : val;
}
return val;
}
} );
jQuery.each( [ "height", "width" ], function( i, name ) {
jQuery.cssHooks[ name ] = {
get: function( elem, computed, extra ) {
if ( computed ) {
// Certain elements can have dimension info if we invisibly show them
// but it must have a current display style that would benefit
return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
// Support: Safari 8+
// Table columns in Safari have non-zero offsetWidth & zero
// getBoundingClientRect().width unless display is changed.
// Support: IE <=11 only
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
swap( elem, cssShow, function() {
return getWidthOrHeight( elem, name, extra );
} ) :
getWidthOrHeight( elem, name, extra );
}
},
set: function( elem, value, extra ) {
var matches,
styles = extra && getStyles( elem ),
subtract = extra && augmentWidthOrHeight(
elem,
name,
extra,
jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
styles
);
// Convert to pixels if value adjustment is needed
if ( subtract && ( matches = rcssNum.exec( value ) ) &&
( matches[ 3 ] || "px" ) !== "px" ) {
elem.style[ name ] = value;
value = jQuery.css( elem, name );
}
return setPositiveNumber( elem, value, subtract );
}
};
} );
jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
function( elem, computed ) {
if ( computed ) {
return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
elem.getBoundingClientRect().left -
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
) + "px";
}
}
);
// These hooks are used by animate to expand properties
jQuery.each( {
margin: "",
padding: "",
border: "Width"
}, function( prefix, suffix ) {
jQuery.cssHooks[ prefix + suffix ] = {
expand: function( value ) {
var i = 0,
expanded = {},
// Assumes a single number if not a string
parts = typeof value === "string" ? value.split( " " ) : [ value ];
for ( ; i < 4; i++ ) {
expanded[ prefix + cssExpand[ i ] + suffix ] =
parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
}
return expanded;
}
};
if ( !rmargin.test( prefix ) ) {
jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
}
} );
jQuery.fn.extend( {
css: function( name, value ) {
return access( this, function( elem, name, value ) {
var styles, len,
map = {},
i = 0;
if ( Array.isArray( name ) ) {
styles = getStyles( elem );
len = name.length;
for ( ; i < len; i++ ) {
map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
}
return map;
}
return value !== undefined ?
jQuery.style( elem, name, value ) :
jQuery.css( elem, name );
}, name, value, arguments.length > 1 );
}
} );
function Tween( elem, options, prop, end, easing ) {
return new Tween.prototype.init( elem, options, prop, end, easing );
}
jQuery.Tween = Tween;
Tween.prototype = {
constructor: Tween,
init: function( elem, options, prop, end, easing, unit ) {
this.elem = elem;
this.prop = prop;
this.easing = easing || jQuery.easing._default;
this.options = options;
this.start = this.now = this.cur();
this.end = end;
this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
},
cur: function() {
var hooks = Tween.propHooks[ this.prop ];
return hooks && hooks.get ?
hooks.get( this ) :
Tween.propHooks._default.get( this );
},
run: function( percent ) {
var eased,
hooks = Tween.propHooks[ this.prop ];
if ( this.options.duration ) {
this.pos = eased = jQuery.easing[ this.easing ](
percent, this.options.duration * percent, 0, 1, this.options.duration
);
} else {
this.pos = eased = percent;
}
this.now = ( this.end - this.start ) * eased + this.start;
if ( this.options.step ) {
this.options.step.call( this.elem, this.now, this );
}
if ( hooks && hooks.set ) {
hooks.set( this );
} else {
Tween.propHooks._default.set( this );
}
return this;
}
};
Tween.prototype.init.prototype = Tween.prototype;
Tween.propHooks = {
_default: {
get: function( tween ) {
var result;
// Use a property on the element directly when it is not a DOM element,
// or when there is no matching style property that exists.
if ( tween.elem.nodeType !== 1 ||
tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
return tween.elem[ tween.prop ];
}
// Passing an empty string as a 3rd parameter to .css will automatically
// attempt a parseFloat and fallback to a string if the parse fails.
// Simple values such as "10px" are parsed to Float;
// complex values such as "rotate(1rad)" are returned as-is.
result = jQuery.css( tween.elem, tween.prop, "" );
// Empty strings, null, undefined and "auto" are converted to 0.
return !result || result === "auto" ? 0 : result;
},
set: function( tween ) {
// Use step hook for back compat.
// Use cssHook if its there.
// Use .style if available and use plain properties where available.
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 &&
( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
jQuery.cssHooks[ tween.prop ] ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
tween.elem[ tween.prop ] = tween.now;
}
}
}
};
// Support: IE <=9 only
// Panic based approach to setting things on disconnected nodes
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
set: function( tween ) {
if ( tween.elem.nodeType && tween.elem.parentNode ) {
tween.elem[ tween.prop ] = tween.now;
}
}
};
jQuery.easing = {
linear: function( p ) {
return p;
},
swing: function( p ) {
return 0.5 - Math.cos( p * Math.PI ) / 2;
},
_default: "swing"
};
jQuery.fx = Tween.prototype.init;
// Back compat <1.8 extension point
jQuery.fx.step = {};
var
fxNow, inProgress,
rfxtypes = /^(?:toggle|show|hide)$/,
rrun = /queueHooks$/;
function schedule() {
if ( inProgress ) {
if ( document.hidden === false && window.requestAnimationFrame ) {
window.requestAnimationFrame( schedule );
} else {
window.setTimeout( schedule, jQuery.fx.interval );
}
jQuery.fx.tick();
}
}
// Animations created synchronously will run synchronously
function createFxNow() {
window.setTimeout( function() {
fxNow = undefined;
} );
return ( fxNow = jQuery.now() );
}
// Generate parameters to create a standard animation
function genFx( type, includeWidth ) {
var which,
i = 0,
attrs = { height: type };
// If we include width, step value is 1 to do all cssExpand values,
// otherwise step value is 2 to skip over Left and Right
includeWidth = includeWidth ? 1 : 0;
for ( ; i < 4; i += 2 - includeWidth ) {
which = cssExpand[ i ];
attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
}
if ( includeWidth ) {
attrs.opacity = attrs.width = type;
}
return attrs;
}
function createTween( value, prop, animation ) {
var tween,
collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
index = 0,
length = collection.length;
for ( ; index < length; index++ ) {
if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
// We're done with this property
return tween;
}
}
}
function defaultPrefilter( elem, props, opts ) {
var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
isBox = "width" in props || "height" in props,
anim = this,
orig = {},
style = elem.style,
hidden = elem.nodeType && isHiddenWithinTree( elem ),
dataShow = dataPriv.get( elem, "fxshow" );
// Queue-skipping animations hijack the fx hooks
if ( !opts.queue ) {
hooks = jQuery._queueHooks( elem, "fx" );
if ( hooks.unqueued == null ) {
hooks.unqueued = 0;
oldfire = hooks.empty.fire;
hooks.empty.fire = function() {
if ( !hooks.unqueued ) {
oldfire();
}
};
}
hooks.unqueued++;
anim.always( function() {
// Ensure the complete handler is called before this completes
anim.always( function() {
hooks.unqueued--;
if ( !jQuery.queue( elem, "fx" ).length ) {
hooks.empty.fire();
}
} );
} );
}
// Detect show/hide animations
for ( prop in props ) {
value = props[ prop ];
if ( rfxtypes.test( value ) ) {
delete props[ prop ];
toggle = toggle || value === "toggle";
if ( value === ( hidden ? "hide" : "show" ) ) {
// Pretend to be hidden if this is a "show" and
// there is still data from a stopped show/hide
if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
hidden = true;
// Ignore all other no-op show/hide data
} else {
continue;
}
}
orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
}
}
// Bail out if this is a no-op like .hide().hide()
propTween = !jQuery.isEmptyObject( props );
if ( !propTween && jQuery.isEmptyObject( orig ) ) {
return;
}
// Restrict "overflow" and "display" styles during box animations
if ( isBox && elem.nodeType === 1 ) {
// Support: IE <=9 - 11, Edge 12 - 13
// Record all 3 overflow attributes because IE does not infer the shorthand
// from identically-valued overflowX and overflowY
opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
// Identify a display type, preferring old show/hide data over the CSS cascade
restoreDisplay = dataShow && dataShow.display;
if ( restoreDisplay == null ) {
restoreDisplay = dataPriv.get( elem, "display" );
}
display = jQuery.css( elem, "display" );
if ( display === "none" ) {
if ( restoreDisplay ) {
display = restoreDisplay;
} else {
// Get nonempty value(s) by temporarily forcing visibility
showHide( [ elem ], true );
restoreDisplay = elem.style.display || restoreDisplay;
display = jQuery.css( elem, "display" );
showHide( [ elem ] );
}
}
// Animate inline elements as inline-block
if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
if ( jQuery.css( elem, "float" ) === "none" ) {
// Restore the original display value at the end of pure show/hide animations
if ( !propTween ) {
anim.done( function() {
style.display = restoreDisplay;
} );
if ( restoreDisplay == null ) {
display = style.display;
restoreDisplay = display === "none" ? "" : display;
}
}
style.display = "inline-block";
}
}
}
if ( opts.overflow ) {
style.overflow = "hidden";
anim.always( function() {
style.overflow = opts.overflow[ 0 ];
style.overflowX = opts.overflow[ 1 ];
style.overflowY = opts.overflow[ 2 ];
} );
}
// Implement show/hide animations
propTween = false;
for ( prop in orig ) {
// General show/hide setup for this element animation
if ( !propTween ) {
if ( dataShow ) {
if ( "hidden" in dataShow ) {
hidden = dataShow.hidden;
}
} else {
dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
}
// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
if ( toggle ) {
dataShow.hidden = !hidden;
}
// Show elements before animating them
if ( hidden ) {
showHide( [ elem ], true );
}
/* eslint-disable no-loop-func */
anim.done( function() {
/* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
showHide( [ elem ] );
}
dataPriv.remove( elem, "fxshow" );
for ( prop in orig ) {
jQuery.style( elem, prop, orig[ prop ] );
}
} );
}
// Per-property setup
propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
if ( !( prop in dataShow ) ) {
dataShow[ prop ] = propTween.start;
if ( hidden ) {
propTween.end = propTween.start;
propTween.start = 0;
}
}
}
}
function propFilter( props, specialEasing ) {
var index, name, easing, value, hooks;
// camelCase, specialEasing and expand cssHook pass
for ( index in props ) {
name = jQuery.camelCase( index );
easing = specialEasing[ name ];
value = props[ index ];
if ( Array.isArray( value ) ) {
easing = value[ 1 ];
value = props[ index ] = value[ 0 ];
}
if ( index !== name ) {
props[ name ] = value;
delete props[ index ];
}
hooks = jQuery.cssHooks[ name ];
if ( hooks && "expand" in hooks ) {
value = hooks.expand( value );
delete props[ name ];
// Not quite $.extend, this won't overwrite existing keys.
// Reusing 'index' because we have the correct "name"
for ( index in value ) {
if ( !( index in props ) ) {
props[ index ] = value[ index ];
specialEasing[ index ] = easing;
}
}
} else {
specialEasing[ name ] = easing;
}
}
}
function Animation( elem, properties, options ) {
var result,
stopped,
index = 0,
length = Animation.prefilters.length,
deferred = jQuery.Deferred().always( function() {
// Don't match elem in the :animated selector
delete tick.elem;
} ),
tick = function() {
if ( stopped ) {
return false;
}
var currentTime = fxNow || createFxNow(),
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
// Support: Android 2.3 only
// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
temp = remaining / animation.duration || 0,
percent = 1 - temp,
index = 0,
length = animation.tweens.length;
for ( ; index < length; index++ ) {
animation.tweens[ index ].run( percent );
}
deferred.notifyWith( elem, [ animation, percent, remaining ] );
// If there's more to do, yield
if ( percent < 1 && length ) {
return remaining;
}
// If this was an empty animation, synthesize a final progress notification
if ( !length ) {
deferred.notifyWith( elem, [ animation, 1, 0 ] );
}
// Resolve the animation and report its conclusion
deferred.resolveWith( elem, [ animation ] );
return false;
},
animation = deferred.promise( {
elem: elem,
props: jQuery.extend( {}, properties ),
opts: jQuery.extend( true, {
specialEasing: {},
easing: jQuery.easing._default
}, options ),
originalProperties: properties,
originalOptions: options,
startTime: fxNow || createFxNow(),
duration: options.duration,
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
stop: function( gotoEnd ) {
var index = 0,
// If we are going to the end, we want to run all the tweens
// otherwise we skip this part
length = gotoEnd ? animation.tweens.length : 0;
if ( stopped ) {
return this;
}
stopped = true;
for ( ; index < length; index++ ) {
animation.tweens[ index ].run( 1 );
}
// Resolve when we played the last frame; otherwise, reject
if ( gotoEnd ) {
deferred.notifyWith( elem, [ animation, 1, 0 ] );
deferred.resolveWith( elem, [ animation, gotoEnd ] );
} else {
deferred.rejectWith( elem, [ animation, gotoEnd ] );
}
return this;
}
} ),
props = animation.props;
propFilter( props, animation.opts.specialEasing );
for ( ; index < length; index++ ) {
result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
if ( result ) {
if ( jQuery.isFunction( result.stop ) ) {
jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
jQuery.proxy( result.stop, result );
}
return result;
}
}
jQuery.map( props, createTween, animation );
if ( jQuery.isFunction( animation.opts.start ) ) {
animation.opts.start.call( elem, animation );
}
// Attach callbacks from options
animation
.progress( animation.opts.progress )
.done( animation.opts.done, animation.opts.complete )
.fail( animation.opts.fail )
.always( animation.opts.always );
jQuery.fx.timer(
jQuery.extend( tick, {
elem: elem,
anim: animation,
queue: animation.opts.queue
} )
);
return animation;
}
jQuery.Animation = jQuery.extend( Animation, {
tweeners: {
"*": [ function( prop, value ) {
var tween = this.createTween( prop, value );
adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
return tween;
} ]
},
tweener: function( props, callback ) {
if ( jQuery.isFunction( props ) ) {
callback = props;
props = [ "*" ];
} else {
props = props.match( rnothtmlwhite );
}
var prop,
index = 0,
length = props.length;
for ( ; index < length; index++ ) {
prop = props[ index ];
Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
Animation.tweeners[ prop ].unshift( callback );
}
},
prefilters: [ defaultPrefilter ],
prefilter: function( callback, prepend ) {
if ( prepend ) {
Animation.prefilters.unshift( callback );
} else {
Animation.prefilters.push( callback );
}
}
} );
jQuery.speed = function( speed, easing, fn ) {
var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
complete: fn || !fn && easing ||
jQuery.isFunction( speed ) && speed,
duration: speed,
easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
};
// Go to the end state if fx are off
if ( jQuery.fx.off ) {
opt.duration = 0;
} else {
if ( typeof opt.duration !== "number" ) {
if ( opt.duration in jQuery.fx.speeds ) {
opt.duration = jQuery.fx.speeds[ opt.duration ];
} else {
opt.duration = jQuery.fx.speeds._default;
}
}
}
// Normalize opt.queue - true/undefined/null -> "fx"
if ( opt.queue == null || opt.queue === true ) {
opt.queue = "fx";
}
// Queueing
opt.old = opt.complete;
opt.complete = function() {
if ( jQuery.isFunction( opt.old ) ) {
opt.old.call( this );
}
if ( opt.queue ) {
jQuery.dequeue( this, opt.queue );
}
};
return opt;
};
jQuery.fn.extend( {
fadeTo: function( speed, to, easing, callback ) {
// Show any hidden elements after setting opacity to 0
return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
// Animate to the value specified
.end().animate( { opacity: to }, speed, easing, callback );
},
animate: function( prop, speed, easing, callback ) {
var empty = jQuery.isEmptyObject( prop ),
optall = jQuery.speed( speed, easing, callback ),
doAnimation = function() {
// Operate on a copy of prop so per-property easing won't be lost
var anim = Animation( this, jQuery.extend( {}, prop ), optall );
// Empty animations, or finishing resolves immediately
if ( empty || dataPriv.get( this, "finish" ) ) {
anim.stop( true );
}
};
doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
this.queue( optall.queue, doAnimation );
},
stop: function( type, clearQueue, gotoEnd ) {
var stopQueue = function( hooks ) {
var stop = hooks.stop;
delete hooks.stop;
stop( gotoEnd );
};
if ( typeof type !== "string" ) {
gotoEnd = clearQueue;
clearQueue = type;
type = undefined;
}
if ( clearQueue && type !== false ) {
this.queue( type || "fx", [] );
}
return this.each( function() {
var dequeue = true,
index = type != null && type + "queueHooks",
timers = jQuery.timers,
data = dataPriv.get( this );
if ( index ) {
if ( data[ index ] && data[ index ].stop ) {
stopQueue( data[ index ] );
}
} else {
for ( index in data ) {
if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
stopQueue( data[ index ] );
}
}
}
for ( index = timers.length; index--; ) {
if ( timers[ index ].elem === this &&
( type == null || timers[ index ].queue === type ) ) {
timers[ index ].anim.stop( gotoEnd );
dequeue = false;
timers.splice( index, 1 );
}
}
// Start the next in the queue if the last step wasn't forced.
// Timers currently will call their complete callbacks, which
// will dequeue but only if they were gotoEnd.
if ( dequeue || !gotoEnd ) {
jQuery.dequeue( this, type );
}
} );
},
finish: function( type ) {
if ( type !== false ) {
type = type || "fx";
}
return this.each( function() {
var index,
data = dataPriv.get( this ),
queue = data[ type + "queue" ],
hooks = data[ type + "queueHooks" ],
timers = jQuery.timers,
length = queue ? queue.length : 0;
// Enable finishing flag on private data
data.finish = true;
// Empty the queue first
jQuery.queue( this, type, [] );
if ( hooks && hooks.stop ) {
hooks.stop.call( this, true );
}
// Look for any active animations, and finish them
for ( index = timers.length; index--; ) {
if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
timers[ index ].anim.stop( true );
timers.splice( index, 1 );
}
}
// Look for any animations in the old queue and finish them
for ( index = 0; index < length; index++ ) {
if ( queue[ index ] && queue[ index ].finish ) {
queue[ index ].finish.call( this );
}
}
// Turn off finishing flag
delete data.finish;
} );
}
} );
jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
var cssFn = jQuery.fn[ name ];
jQuery.fn[ name ] = function( speed, easing, callback ) {
return speed == null || typeof speed === "boolean" ?
cssFn.apply( this, arguments ) :
this.animate( genFx( name, true ), speed, easing, callback );
};
} );
// Generate shortcuts for custom animations
jQuery.each( {
slideDown: genFx( "show" ),
slideUp: genFx( "hide" ),
slideToggle: genFx( "toggle" ),
fadeIn: { opacity: "show" },
fadeOut: { opacity: "hide" },
fadeToggle: { opacity: "toggle" }
}, function( name, props ) {
jQuery.fn[ name ] = function( speed, easing, callback ) {
return this.animate( props, speed, easing, callback );
};
} );
jQuery.timers = [];
jQuery.fx.tick = function() {
var timer,
i = 0,
timers = jQuery.timers;
fxNow = jQuery.now();
for ( ; i < timers.length; i++ ) {
timer = timers[ i ];
// Run the timer and safely remove it when done (allowing for external removal)
if ( !timer() && timers[ i ] === timer ) {
timers.splice( i--, 1 );
}
}
if ( !timers.length ) {
jQuery.fx.stop();
}
fxNow = undefined;
};
jQuery.fx.timer = function( timer ) {
jQuery.timers.push( timer );
jQuery.fx.start();
};
jQuery.fx.interval = 13;
jQuery.fx.start = function() {
if ( inProgress ) {
return;
}
inProgress = true;
schedule();
};
jQuery.fx.stop = function() {
inProgress = null;
};
jQuery.fx.speeds = {
slow: 600,
fast: 200,
// Default speed
_default: 400
};
// Based off of the plugin by Clint Helfers, with permission.
// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
jQuery.fn.delay = function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
type = type || "fx";
return this.queue( type, function( next, hooks ) {
var timeout = window.setTimeout( next, time );
hooks.stop = function() {
window.clearTimeout( timeout );
};
} );
};
( function() {
var input = document.createElement( "input" ),
select = document.createElement( "select" ),
opt = select.appendChild( document.createElement( "option" ) );
input.type = "checkbox";
// Support: Android <=4.3 only
// Default value for a checkbox should be "on"
support.checkOn = input.value !== "";
// Support: IE <=11 only
// Must access selectedIndex to make default options select
support.optSelected = opt.selected;
// Support: IE <=11 only
// An input loses its value after becoming a radio
input = document.createElement( "input" );
input.value = "t";
input.type = "radio";
support.radioValue = input.value === "t";
} )();
var boolHook,
attrHandle = jQuery.expr.attrHandle;
jQuery.fn.extend( {
attr: function( name, value ) {
return access( this, jQuery.attr, name, value, arguments.length > 1 );
},
removeAttr: function( name ) {
return this.each( function() {
jQuery.removeAttr( this, name );
} );
}
} );
jQuery.extend( {
attr: function( elem, name, value ) {
var ret, hooks,
nType = elem.nodeType;
// Don't get/set attributes on text, comment and attribute nodes
if ( nType === 3 || nType === 8 || nType === 2 ) {
return;
}
// Fallback to prop when attributes are not supported
if ( typeof elem.getAttribute === "undefined" ) {
return jQuery.prop( elem, name, value );
}
// Attribute hooks are determined by the lowercase version
// Grab necessary hook if one is defined
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
}
if ( value !== undefined ) {
if ( value === null ) {
jQuery.removeAttr( elem, name );
return;
}
if ( hooks && "set" in hooks &&
( ret = hooks.set( elem, value, name ) ) !== undefined ) {
return ret;
}
elem.setAttribute( name, value + "" );
return value;
}
if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
return ret;
}
ret = jQuery.find.attr( elem, name );
// Non-existent attributes return null, we normalize to undefined
return ret == null ? undefined : ret;
},
attrHooks: {
type: {
set: function( elem, value ) {
if ( !support.radioValue && value === "radio" &&
nodeName( elem, "input" ) ) {
var val = elem.value;
elem.setAttribute( "type", value );
if ( val ) {
elem.value = val;
}
return value;
}
}
}
},
removeAttr: function( elem, value ) {
var name,
i = 0,
// Attribute names can contain non-HTML whitespace characters
// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
attrNames = value && value.match( rnothtmlwhite );
if ( attrNames && elem.nodeType === 1 ) {
while ( ( name = attrNames[ i++ ] ) ) {
elem.removeAttribute( name );
}
}
}
} );
// Hooks for boolean attributes
boolHook = {
set: function( elem, value, name ) {
if ( value === false ) {
// Remove boolean attributes when set to false
jQuery.removeAttr( elem, name );
} else {
elem.setAttribute( name, name );
}
return name;
}
};
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
var getter = attrHandle[ name ] || jQuery.find.attr;
attrHandle[ name ] = function( elem, name, isXML ) {
var ret, handle,
lowercaseName = name.toLowerCase();
if ( !isXML ) {
// Avoid an infinite loop by temporarily removing this function from the getter
handle = attrHandle[ lowercaseName ];
attrHandle[ lowercaseName ] = ret;
ret = getter( elem, name, isXML ) != null ?
lowercaseName :
null;
attrHandle[ lowercaseName ] = handle;
}
return ret;
};
} );
var rfocusable = /^(?:input|select|textarea|button)$/i,
rclickable = /^(?:a|area)$/i;
jQuery.fn.extend( {
prop: function( name, value ) {
return access( this, jQuery.prop, name, value, arguments.length > 1 );
},
removeProp: function( name ) {
return this.each( function() {
delete this[ jQuery.propFix[ name ] || name ];
} );
}
} );
jQuery.extend( {
prop: function( elem, name, value ) {
var ret, hooks,
nType = elem.nodeType;
// Don't get/set properties on text, comment and attribute nodes
if ( nType === 3 || nType === 8 || nType === 2 ) {
return;
}
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
// Fix name and attach hooks
name = jQuery.propFix[ name ] || name;
hooks = jQuery.propHooks[ name ];
}
if ( value !== undefined ) {
if ( hooks && "set" in hooks &&
( ret = hooks.set( elem, value, name ) ) !== undefined ) {
return ret;
}
return ( elem[ name ] = value );
}
if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
return ret;
}
return elem[ name ];
},
propHooks: {
tabIndex: {
get: function( elem ) {
// Support: IE <=9 - 11 only
// elem.tabIndex doesn't always return the
// correct value when it hasn't been explicitly set
// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
// Use proper attribute retrieval(#12072)
var tabindex = jQuery.find.attr( elem, "tabindex" );
if ( tabindex ) {
return parseInt( tabindex, 10 );
}
if (
rfocusable.test( elem.nodeName ) ||
rclickable.test( elem.nodeName ) &&
elem.href
) {
return 0;
}
return -1;
}
}
},
propFix: {
"for": "htmlFor",
"class": "className"
}
} );
// Support: IE <=11 only
// Accessing the selectedIndex property
// forces the browser to respect setting selected
// on the option
// The getter ensures a default option is selected
// when in an optgroup
// eslint rule "no-unused-expressions" is disabled for this code
// since it considers such accessions noop
if ( !support.optSelected ) {
jQuery.propHooks.selected = {
get: function( elem ) {
/* eslint no-unused-expressions: "off" */
var parent = elem.parentNode;
if ( parent && parent.parentNode ) {
parent.parentNode.selectedIndex;
}
return null;
},
set: function( elem ) {
/* eslint no-unused-expressions: "off" */
var parent = elem.parentNode;
if ( parent ) {
parent.selectedIndex;
if ( parent.parentNode ) {
parent.parentNode.selectedIndex;
}
}
}
};
}
jQuery.each( [
"tabIndex",
"readOnly",
"maxLength",
"cellSpacing",
"cellPadding",
"rowSpan",
"colSpan",
"useMap",
"frameBorder",
"contentEditable"
], function() {
jQuery.propFix[ this.toLowerCase() ] = this;
} );
// Strip and collapse whitespace according to HTML spec
// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
function stripAndCollapse( value ) {
var tokens = value.match( rnothtmlwhite ) || [];
return tokens.join( " " );
}
function getClass( elem ) {
return elem.getAttribute && elem.getAttribute( "class" ) || "";
}
jQuery.fn.extend( {
addClass: function( value ) {
var classes, elem, cur, curValue, clazz, j, finalValue,
i = 0;
if ( jQuery.isFunction( value ) ) {
return this.each( function( j ) {
jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
} );
}
if ( typeof value === "string" && value ) {
classes = value.match( rnothtmlwhite ) || [];
while ( ( elem = this[ i++ ] ) ) {
curValue = getClass( elem );
cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) {
j = 0;
while ( ( clazz = classes[ j++ ] ) ) {
if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
cur += clazz + " ";
}
}
// Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue );
}
}
}
}
return this;
},
removeClass: function( value ) {
var classes, elem, cur, curValue, clazz, j, finalValue,
i = 0;
if ( jQuery.isFunction( value ) ) {
return this.each( function( j ) {
jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
} );
}
if ( !arguments.length ) {
return this.attr( "class", "" );
}
if ( typeof value === "string" && value ) {
classes = value.match( rnothtmlwhite ) || [];
while ( ( elem = this[ i++ ] ) ) {
curValue = getClass( elem );
// This expression is here for better compressibility (see addClass)
cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) {
j = 0;
while ( ( clazz = classes[ j++ ] ) ) {
// Remove *all* instances
while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
cur = cur.replace( " " + clazz + " ", " " );
}
}
// Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue );
}
}
}
}
return this;
},
toggleClass: function( value, stateVal ) {
var type = typeof value;
if ( typeof stateVal === "boolean" && type === "string" ) {
return stateVal ? this.addClass( value ) : this.removeClass( value );
}
if ( jQuery.isFunction( value ) ) {
return this.each( function( i ) {
jQuery( this ).toggleClass(
value.call( this, i, getClass( this ), stateVal ),
stateVal
);
} );
}
return this.each( function() {
var className, i, self, classNames;
if ( type === "string" ) {
// Toggle individual class names
i = 0;
self = jQuery( this );
classNames = value.match( rnothtmlwhite ) || [];
while ( ( className = classNames[ i++ ] ) ) {
// Check each className given, space separated list
if ( self.hasClass( className ) ) {
self.removeClass( className );
} else {
self.addClass( className );
}
}
// Toggle whole class name
} else if ( value === undefined || type === "boolean" ) {
className = getClass( this );
if ( className ) {
// Store className if set
dataPriv.set( this, "__className__", className );
}
// If the element has a class name or if we're passed `false`,
// then remove the whole classname (if there was one, the above saved it).
// Otherwise bring back whatever was previously saved (if anything),
// falling back to the empty string if nothing was stored.
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
"" :
dataPriv.get( this, "__className__" ) || ""
);
}
}
} );
},
hasClass: function( selector ) {
var className, elem,
i = 0;
className = " " + selector + " ";
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
return true;
}
}
return false;
}
} );
var rreturn = /\r/g;
jQuery.fn.extend( {
val: function( value ) {
var hooks, ret, isFunction,
elem = this[ 0 ];
if ( !arguments.length ) {
if ( elem ) {
hooks = jQuery.valHooks[ elem.type ] ||
jQuery.valHooks[ elem.nodeName.toLowerCase() ];
if ( hooks &&
"get" in hooks &&
( ret = hooks.get( elem, "value" ) ) !== undefined
) {
return ret;
}
ret = elem.value;
// Handle most common string cases
if ( typeof ret === "string" ) {
return ret.replace( rreturn, "" );
}
// Handle cases where value is null/undef or number
return ret == null ? "" : ret;
}
return;
}
isFunction = jQuery.isFunction( value );
return this.each( function( i ) {
var val;
if ( this.nodeType !== 1 ) {
return;
}
if ( isFunction ) {
val = value.call( this, i, jQuery( this ).val() );
} else {
val = value;
}
// Treat null/undefined as ""; convert numbers to string
if ( val == null ) {
val = "";
} else if ( typeof val === "number" ) {
val += "";
} else if ( Array.isArray( val ) ) {
val = jQuery.map( val, function( value ) {
return value == null ? "" : value + "";
} );
}
hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
// If set returns undefined, fall back to normal setting
if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
this.value = val;
}
} );
}
} );
jQuery.extend( {
valHooks: {
option: {
get: function( elem ) {
var val = jQuery.find.attr( elem, "value" );
return val != null ?
val :
// Support: IE <=10 - 11 only
// option.text throws exceptions (#14686, #14858)
// Strip and collapse whitespace
// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
stripAndCollapse( jQuery.text( elem ) );
}
},
select: {
get: function( elem ) {
var value, option, i,
options = elem.options,
index = elem.selectedIndex,
one = elem.type === "select-one",
values = one ? null : [],
max = one ? index + 1 : options.length;
if ( index < 0 ) {
i = max;
} else {
i = one ? index : 0;
}
// Loop through all the selected options
for ( ; i < max; i++ ) {
option = options[ i ];
// Support: IE <=9 only
// IE8-9 doesn't update selected after form reset (#2551)
if ( ( option.selected || i === index ) &&
// Don't return options that are disabled or in a disabled optgroup
!option.disabled &&
( !option.parentNode.disabled ||
!nodeName( option.parentNode, "optgroup" ) ) ) {
// Get the specific value for the option
value = jQuery( option ).val();
// We don't need an array for one selects
if ( one ) {
return value;
}
// Multi-Selects return an array
values.push( value );
}
}
return values;
},
set: function( elem, value ) {
var optionSet, option,
options = elem.options,
values = jQuery.makeArray( value ),
i = options.length;
while ( i-- ) {
option = options[ i ];
/* eslint-disable no-cond-assign */
if ( option.selected =
jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
) {
optionSet = true;
}
/* eslint-enable no-cond-assign */
}
// Force browsers to behave consistently when non-matching value is set
if ( !optionSet ) {
elem.selectedIndex = -1;
}
return values;
}
}
}
} );
// Radios and checkboxes getter/setter
jQuery.each( [ "radio", "checkbox" ], function() {
jQuery.valHooks[ this ] = {
set: function( elem, value ) {
if ( Array.isArray( value ) ) {
return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
}
}
};
if ( !support.checkOn ) {
jQuery.valHooks[ this ].get = function( elem ) {
return elem.getAttribute( "value" ) === null ? "on" : elem.value;
};
}
} );
// Return jQuery for attributes-only inclusion
var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
jQuery.extend( jQuery.event, {
trigger: function( event, data, elem, onlyHandlers ) {
var i, cur, tmp, bubbleType, ontype, handle, special,
eventPath = [ elem || document ],
type = hasOwn.call( event, "type" ) ? event.type : event,
namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
cur = tmp = elem = elem || document;
// Don't do events on text and comment nodes
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}
// focus/blur morphs to focusin/out; ensure we're not firing them right now
if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
return;
}
if ( type.indexOf( "." ) > -1 ) {
// Namespaced trigger; create a regexp to match event type in handle()
namespaces = type.split( "." );
type = namespaces.shift();
namespaces.sort();
}
ontype = type.indexOf( ":" ) < 0 && "on" + type;
// Caller can pass in a jQuery.Event object, Object, or just an event type string
event = event[ jQuery.expando ] ?
event :
new jQuery.Event( type, typeof event === "object" && event );
// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
event.isTrigger = onlyHandlers ? 2 : 3;
event.namespace = namespaces.join( "." );
event.rnamespace = event.namespace ?
new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
null;
// Clean up the event in case it is being reused
event.result = undefined;
if ( !event.target ) {
event.target = elem;
}
// Clone any incoming data and prepend the event, creating the handler arg list
data = data == null ?
[ event ] :
jQuery.makeArray( data, [ event ] );
// Allow special events to draw outside the lines
special = jQuery.event.special[ type ] || {};
if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
return;
}
// Determine event propagation path in advance, per W3C events spec (#9951)
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
bubbleType = special.delegateType || type;
if ( !rfocusMorph.test( bubbleType + type ) ) {
cur = cur.parentNode;
}
for ( ; cur; cur = cur.parentNode ) {
eventPath.push( cur );
tmp = cur;
}
// Only add window if we got to document (e.g., not plain obj or detached DOM)
if ( tmp === ( elem.ownerDocument || document ) ) {
eventPath.push( tmp.defaultView || tmp.parentWindow || window );
}
}
// Fire handlers on the event path
i = 0;
while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
event.type = i > 1 ?
bubbleType :
special.bindType || type;
// jQuery handler
handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
}
// Native handler
handle = ontype && cur[ ontype ];
if ( handle && handle.apply && acceptData( cur ) ) {
event.result = handle.apply( cur, data );
if ( event.result === false ) {
event.preventDefault();
}
}
}
event.type = type;
// If nobody prevented the default action, do it now
if ( !onlyHandlers && !event.isDefaultPrevented() ) {
if ( ( !special._default ||
special._default.apply( eventPath.pop(), data ) === false ) &&
acceptData( elem ) ) {
// Call a native DOM method on the target with the same name as the event.
// Don't do default actions on window, that's where global variables be (#6170)
if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
// Don't re-trigger an onFOO event when we call its FOO() method
tmp = elem[ ontype ];
if ( tmp ) {
elem[ ontype ] = null;
}
// Prevent re-triggering of the same event, since we already bubbled it above
jQuery.event.triggered = type;
elem[ type ]();
jQuery.event.triggered = undefined;
if ( tmp ) {
elem[ ontype ] = tmp;
}
}
}
}
return event.result;
},
// Piggyback on a donor event to simulate a different one
// Used only for `focus(in | out)` events
simulate: function( type, elem, event ) {
var e = jQuery.extend(
new jQuery.Event(),
event,
{
type: type,
isSimulated: true
}
);
jQuery.event.trigger( e, null, elem );
}
} );
jQuery.fn.extend( {
trigger: function( type, data ) {
return this.each( function() {
jQuery.event.trigger( type, data, this );
} );
},
triggerHandler: function( type, data ) {
var elem = this[ 0 ];
if ( elem ) {
return jQuery.event.trigger( type, data, elem, true );
}
}
} );
jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( i, name ) {
// Handle event binding
jQuery.fn[ name ] = function( data, fn ) {
return arguments.length > 0 ?
this.on( name, null, data, fn ) :
this.trigger( name );
};
} );
jQuery.fn.extend( {
hover: function( fnOver, fnOut ) {
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}
} );
support.focusin = "onfocusin" in window;
// Support: Firefox <=44
// Firefox doesn't have focus(in | out) events
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
//
// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
// focus(in | out) events fire after focus & blur events,
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
if ( !support.focusin ) {
jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
// Attach a single capturing handler on the document while someone wants focusin/focusout
var handler = function( event ) {
jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
};
jQuery.event.special[ fix ] = {
setup: function() {
var doc = this.ownerDocument || this,
attaches = dataPriv.access( doc, fix );
if ( !attaches ) {
doc.addEventListener( orig, handler, true );
}
dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
},
teardown: function() {
var doc = this.ownerDocument || this,
attaches = dataPriv.access( doc, fix ) - 1;
if ( !attaches ) {
doc.removeEventListener( orig, handler, true );
dataPriv.remove( doc, fix );
} else {
dataPriv.access( doc, fix, attaches );
}
}
};
} );
}
var location = window.location;
var nonce = jQuery.now();
var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
var xml;
if ( !data || typeof data !== "string" ) {
return null;
}
// Support: IE 9 - 11 only
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
} catch ( e ) {
xml = undefined;
}
if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
jQuery.error( "Invalid XML: " + data );
}
return xml;
};
var
rbracket = /\[\]$/,
rCRLF = /\r?\n/g,
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
rsubmittable = /^(?:input|select|textarea|keygen)/i;
function buildParams( prefix, obj, traditional, add ) {
var name;
if ( Array.isArray( obj ) ) {
// Serialize array item.
jQuery.each( obj, function( i, v ) {
if ( traditional || rbracket.test( prefix ) ) {
// Treat each array item as a scalar.
add( prefix, v );
} else {
// Item is non-scalar (array or object), encode its numeric index.
buildParams(
prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
v,
traditional,
add
);
}
} );
} else if ( !traditional && jQuery.type( obj ) === "object" ) {
// Serialize object item.
for ( name in obj ) {
buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
}
} else {
// Serialize scalar item.
add( prefix, obj );
}
}
// Serialize an array of form elements or a set of
// key/values into a query string
jQuery.param = function( a, traditional ) {
var prefix,
s = [],
add = function( key, valueOrFunction ) {
// If value is a function, invoke it and use its return value
var value = jQuery.isFunction( valueOrFunction ) ?
valueOrFunction() :
valueOrFunction;
s[ s.length ] = encodeURIComponent( key ) + "=" +
encodeURIComponent( value == null ? "" : value );
};
// If an array was passed in, assume that it is an array of form elements.
if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
// Serialize the form elements
jQuery.each( a, function() {
add( this.name, this.value );
} );
} else {
// If traditional, encode the "old" way (the way 1.3.2 or older
// did it), otherwise encode params recursively.
for ( prefix in a ) {
buildParams( prefix, a[ prefix ], traditional, add );
}
}
// Return the resulting serialization
return s.join( "&" );
};
jQuery.fn.extend( {
serialize: function() {
return jQuery.param( this.serializeArray() );
},
serializeArray: function() {
return this.map( function() {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
} )
.filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
} )
.map( function( i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
return null;
}
if ( Array.isArray( val ) ) {
return jQuery.map( val, function( val ) {
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
} );
}
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
} ).get();
}
} );
var
r20 = /%20/g,
rhash = /#.*$/,
rantiCache = /([?&])_=[^&]*/,
rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
// #7653, #8125, #8152: local protocol detection
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
/* Prefilters
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
* 2) These are called:
* - BEFORE asking for a transport
* - AFTER param serialization (s.data is a string if s.processData is true)
* 3) key is the dataType
* 4) the catchall symbol "*" can be used
* 5) execution will start with transport dataType and THEN continue down to "*" if needed
*/
prefilters = {},
/* Transports bindings
* 1) key is the dataType
* 2) the catchall symbol "*" can be used
* 3) selection will start with transport dataType and THEN go to "*" if needed
*/
transports = {},
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
allTypes = "*/".concat( "*" ),
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
// dataTypeExpression is optional and defaults to "*"
return function( dataTypeExpression, func ) {
if ( typeof dataTypeExpression !== "string" ) {
func = dataTypeExpression;
dataTypeExpression = "*";
}
var dataType,
i = 0,
dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
if ( jQuery.isFunction( func ) ) {
// For each dataType in the dataTypeExpression
while ( ( dataType = dataTypes[ i++ ] ) ) {
// Prepend if requested
if ( dataType[ 0 ] === "+" ) {
dataType = dataType.slice( 1 ) || "*";
( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
// Otherwise append
} else {
( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
}
}
}
};
}
// Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
var inspected = {},
seekingTransport = ( structure === transports );
function inspect( dataType ) {
var selected;
inspected[ dataType ] = true;
jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
if ( typeof dataTypeOrTransport === "string" &&
!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
options.dataTypes.unshift( dataTypeOrTransport );
inspect( dataTypeOrTransport );
return false;
} else if ( seekingTransport ) {
return !( selected = dataTypeOrTransport );
}
} );
return selected;
}
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
}
// A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend( target, src ) {
var key, deep,
flatOptions = jQuery.ajaxSettings.flatOptions || {};
for ( key in src ) {
if ( src[ key ] !== undefined ) {
( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
}
}
if ( deep ) {
jQuery.extend( true, target, deep );
}
return target;
}
/* Handles responses to an ajax request:
* - finds the right dataType (mediates between content-type and expected dataType)
* - returns the corresponding response
*/
function ajaxHandleResponses( s, jqXHR, responses ) {
var ct, type, finalDataType, firstDataType,
contents = s.contents,
dataTypes = s.dataTypes;
// Remove auto dataType and get content-type in the process
while ( dataTypes[ 0 ] === "*" ) {
dataTypes.shift();
if ( ct === undefined ) {
ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
}
}
// Check if we're dealing with a known content-type
if ( ct ) {
for ( type in contents ) {
if ( contents[ type ] && contents[ type ].test( ct ) ) {
dataTypes.unshift( type );
break;
}
}
}
// Check to see if we have a response for the expected dataType
if ( dataTypes[ 0 ] in responses ) {
finalDataType = dataTypes[ 0 ];
} else {
// Try convertible dataTypes
for ( type in responses ) {
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
finalDataType = type;
break;
}
if ( !firstDataType ) {
firstDataType = type;
}
}
// Or just use first one
finalDataType = finalDataType || firstDataType;
}
// If we found a dataType
// We add the dataType to the list if needed
// and return the corresponding response
if ( finalDataType ) {
if ( finalDataType !== dataTypes[ 0 ] ) {
dataTypes.unshift( finalDataType );
}
return responses[ finalDataType ];
}
}
/* Chain conversions given the request and the original response
* Also sets the responseXXX fields on the jqXHR instance
*/
function ajaxConvert( s, response, jqXHR, isSuccess ) {
var conv2, current, conv, tmp, prev,
converters = {},
// Work with a copy of dataTypes in case we need to modify it for conversion
dataTypes = s.dataTypes.slice();
// Create converters map with lowercased keys
if ( dataTypes[ 1 ] ) {
for ( conv in s.converters ) {
converters[ conv.toLowerCase() ] = s.converters[ conv ];
}
}
current = dataTypes.shift();
// Convert to each sequential dataType
while ( current ) {
if ( s.responseFields[ current ] ) {
jqXHR[ s.responseFields[ current ] ] = response;
}
// Apply the dataFilter if provided
if ( !prev && isSuccess && s.dataFilter ) {
response = s.dataFilter( response, s.dataType );
}
prev = current;
current = dataTypes.shift();
if ( current ) {
// There's only work to do if current dataType is non-auto
if ( current === "*" ) {
current = prev;
// Convert response if prev dataType is non-auto and differs from current
} else if ( prev !== "*" && prev !== current ) {
// Seek a direct converter
conv = converters[ prev + " " + current ] || converters[ "* " + current ];
// If none found, seek a pair
if ( !conv ) {
for ( conv2 in converters ) {
// If conv2 outputs current
tmp = conv2.split( " " );
if ( tmp[ 1 ] === current ) {
// If prev can be converted to accepted input
conv = converters[ prev + " " + tmp[ 0 ] ] ||
converters[ "* " + tmp[ 0 ] ];
if ( conv ) {
// Condense equivalence converters
if ( conv === true ) {
conv = converters[ conv2 ];
// Otherwise, insert the intermediate dataType
} else if ( converters[ conv2 ] !== true ) {
current = tmp[ 0 ];
dataTypes.unshift( tmp[ 1 ] );
}
break;
}
}
}
}
// Apply converter (if not an equivalence)
if ( conv !== true ) {
// Unless errors are allowed to bubble, catch and return them
if ( conv && s.throws ) {
response = conv( response );
} else {
try {
response = conv( response );
} catch ( e ) {
return {
state: "parsererror",
error: conv ? e : "No conversion from " + prev + " to " + current
};
}
}
}
}
}
}
return { state: "success", data: response };
}
jQuery.extend( {
// Counter for holding the number of active queries
active: 0,
// Last-Modified header cache for next request
lastModified: {},
etag: {},
ajaxSettings: {
url: location.href,
type: "GET",
isLocal: rlocalProtocol.test( location.protocol ),
global: true,
processData: true,
async: true,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
/*
timeout: 0,
data: null,
dataType: null,
username: null,
password: null,
cache: null,
throws: false,
traditional: false,
headers: {},
*/
accepts: {
"*": allTypes,
text: "text/plain",
html: "text/html",
xml: "application/xml, text/xml",
json: "application/json, text/javascript"
},
contents: {
xml: /\bxml\b/,
html: /\bhtml/,
json: /\bjson\b/
},
responseFields: {
xml: "responseXML",
text: "responseText",
json: "responseJSON"
},
// Data converters
// Keys separate source (or catchall "*") and destination types with a single space
converters: {
// Convert anything to text
"* text": String,
// Text to html (true = no transformation)
"text html": true,
// Evaluate text as a json expression
"text json": JSON.parse,
// Parse text as xml
"text xml": jQuery.parseXML
},
// For options that shouldn't be deep extended:
// you can add your own custom options here if
// and when you create one that shouldn't be
// deep extended (see ajaxExtend)
flatOptions: {
url: true,
context: true
}
},
// Creates a full fledged settings object into target
// with both ajaxSettings and settings fields.
// If target is omitted, writes into ajaxSettings.
ajaxSetup: function( target, settings ) {
return settings ?
// Building a settings object
ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
// Extending ajaxSettings
ajaxExtend( jQuery.ajaxSettings, target );
},
ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
ajaxTransport: addToPrefiltersOrTransports( transports ),
// Main method
ajax: function( url, options ) {
// If url is an object, simulate pre-1.5 signature
if ( typeof url === "object" ) {
options = url;
url = undefined;
}
// Force options to be an object
options = options || {};
var transport,
// URL without anti-cache param
cacheURL,
// Response headers
responseHeadersString,
responseHeaders,
// timeout handle
timeoutTimer,
// Url cleanup var
urlAnchor,
// Request state (becomes false upon send and true upon completion)
completed,
// To know if global events are to be dispatched
fireGlobals,
// Loop variable
i,
// uncached part of the url
uncached,
// Create the final options object
s = jQuery.ajaxSetup( {}, options ),
// Callbacks context
callbackContext = s.context || s,
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
jQuery( callbackContext ) :
jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
completeDeferred = jQuery.Callbacks( "once memory" ),
// Status-dependent callbacks
statusCode = s.statusCode || {},
// Headers (they are sent all at once)
requestHeaders = {},
requestHeadersNames = {},
// Default abort message
strAbort = "canceled",
// Fake xhr
jqXHR = {
readyState: 0,
// Builds headers hashtable if needed
getResponseHeader: function( key ) {
var match;
if ( completed ) {
if ( !responseHeaders ) {
responseHeaders = {};
while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
}
}
match = responseHeaders[ key.toLowerCase() ];
}
return match == null ? null : match;
},
// Raw string
getAllResponseHeaders: function() {
return completed ? responseHeadersString : null;
},
// Caches the header
setRequestHeader: function( name, value ) {
if ( completed == null ) {
name = requestHeadersNames[ name.toLowerCase() ] =
requestHeadersNames[ name.toLowerCase() ] || name;
requestHeaders[ name ] = value;
}
return this;
},
// Overrides response content-type header
overrideMimeType: function( type ) {
if ( completed == null ) {
s.mimeType = type;
}
return this;
},
// Status-dependent callbacks
statusCode: function( map ) {
var code;
if ( map ) {
if ( completed ) {
// Execute the appropriate callbacks
jqXHR.always( map[ jqXHR.status ] );
} else {
// Lazy-add the new callbacks in a way that preserves old ones
for ( code in map ) {
statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
}
}
}
return this;
},
// Cancel the request
abort: function( statusText ) {
var finalText = statusText || strAbort;
if ( transport ) {
transport.abort( finalText );
}
done( 0, finalText );
return this;
}
};
// Attach deferreds
deferred.promise( jqXHR );
// Add protocol if not provided (prefilters might expect it)
// Handle falsy url in the settings object (#10093: consistency with old signature)
// We also use the url parameter if available
s.url = ( ( url || s.url || location.href ) + "" )
.replace( rprotocol, location.protocol + "//" );
// Alias method option to type as per ticket #12004
s.type = options.method || options.type || s.method || s.type;
// Extract dataTypes list
s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
// A cross-domain request is in order when the origin doesn't match the current origin.
if ( s.crossDomain == null ) {
urlAnchor = document.createElement( "a" );
// Support: IE <=8 - 11, Edge 12 - 13
// IE throws exception on accessing the href property if url is malformed,
// e.g. http://example.com:80x/
try {
urlAnchor.href = s.url;
// Support: IE <=8 - 11 only
// Anchor's host property isn't correctly set when s.url is relative
urlAnchor.href = urlAnchor.href;
s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
urlAnchor.protocol + "//" + urlAnchor.host;
} catch ( e ) {
// If there is an error parsing the URL, assume it is crossDomain,
// it can be rejected by the transport if it is invalid
s.crossDomain = true;
}
}
// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
s.data = jQuery.param( s.data, s.traditional );
}
// Apply prefilters
inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
// If request was aborted inside a prefilter, stop there
if ( completed ) {
return jqXHR;
}
// We can fire global events as of now if asked to
// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
fireGlobals = jQuery.event && s.global;
// Watch for a new set of requests
if ( fireGlobals && jQuery.active++ === 0 ) {
jQuery.event.trigger( "ajaxStart" );
}
// Uppercase the type
s.type = s.type.toUpperCase();
// Determine if request has content
s.hasContent = !rnoContent.test( s.type );
// Save the URL in case we're toying with the If-Modified-Since
// and/or If-None-Match header later on
// Remove hash to simplify url manipulation
cacheURL = s.url.replace( rhash, "" );
// More options handling for requests with no content
if ( !s.hasContent ) {
// Remember the hash so we can put it back
uncached = s.url.slice( cacheURL.length );
// If data is available, append data to url
if ( s.data ) {
cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
// #9682: remove data so that it's not used in an eventual retry
delete s.data;
}
// Add or update anti-cache param if needed
if ( s.cache === false ) {
cacheURL = cacheURL.replace( rantiCache, "$1" );
uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
}
// Put hash and anti-cache on the URL that will be requested (gh-1732)
s.url = cacheURL + uncached;
// Change '%20' to '+' if this is encoded form body content (gh-2658)
} else if ( s.data && s.processData &&
( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
s.data = s.data.replace( r20, "+" );
}
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if ( s.ifModified ) {
if ( jQuery.lastModified[ cacheURL ] ) {
jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
}
if ( jQuery.etag[ cacheURL ] ) {
jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
}
}
// Set the correct header, if data is being sent
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
jqXHR.setRequestHeader( "Content-Type", s.contentType );
}
// Set the Accepts header for the server, depending on the dataType
jqXHR.setRequestHeader(
"Accept",
s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
s.accepts[ s.dataTypes[ 0 ] ] +
( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
s.accepts[ "*" ]
);
// Check for headers option
for ( i in s.headers ) {
jqXHR.setRequestHeader( i, s.headers[ i ] );
}
// Allow custom headers/mimetypes and early abort
if ( s.beforeSend &&
( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
// Abort if not done already and return
return jqXHR.abort();
}
// Aborting is no longer a cancellation
strAbort = "abort";
// Install callbacks on deferreds
completeDeferred.add( s.complete );
jqXHR.done( s.success );
jqXHR.fail( s.error );
// Get transport
transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
// If no transport, we auto-abort
if ( !transport ) {
done( -1, "No Transport" );
} else {
jqXHR.readyState = 1;
// Send global event
if ( fireGlobals ) {
globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
}
// If request was aborted inside ajaxSend, stop there
if ( completed ) {
return jqXHR;
}
// Timeout
if ( s.async && s.timeout > 0 ) {
timeoutTimer = window.setTimeout( function() {
jqXHR.abort( "timeout" );
}, s.timeout );
}
try {
completed = false;
transport.send( requestHeaders, done );
} catch ( e ) {
// Rethrow post-completion exceptions
if ( completed ) {
throw e;
}
// Propagate others as results
done( -1, e );
}
}
// Callback for when everything is done
function done( status, nativeStatusText, responses, headers ) {
var isSuccess, success, error, response, modified,
statusText = nativeStatusText;
// Ignore repeat invocations
if ( completed ) {
return;
}
completed = true;
// Clear timeout if it exists
if ( timeoutTimer ) {
window.clearTimeout( timeoutTimer );
}
// Dereference transport for early garbage collection
// (no matter how long the jqXHR object will be used)
transport = undefined;
// Cache response headers
responseHeadersString = headers || "";
// Set readyState
jqXHR.readyState = status > 0 ? 4 : 0;
// Determine if successful
isSuccess = status >= 200 && status < 300 || status === 304;
// Get response data
if ( responses ) {
response = ajaxHandleResponses( s, jqXHR, responses );
}
// Convert no matter what (that way responseXXX fields are always set)
response = ajaxConvert( s, response, jqXHR, isSuccess );
// If successful, handle type chaining
if ( isSuccess ) {
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if ( s.ifModified ) {
modified = jqXHR.getResponseHeader( "Last-Modified" );
if ( modified ) {
jQuery.lastModified[ cacheURL ] = modified;
}
modified = jqXHR.getResponseHeader( "etag" );
if ( modified ) {
jQuery.etag[ cacheURL ] = modified;
}
}
// if no content
if ( status === 204 || s.type === "HEAD" ) {
statusText = "nocontent";
// if not modified
} else if ( status === 304 ) {
statusText = "notmodified";
// If we have data, let's convert it
} else {
statusText = response.state;
success = response.data;
error = response.error;
isSuccess = !error;
}
} else {
// Extract error from statusText and normalize for non-aborts
error = statusText;
if ( status || !statusText ) {
statusText = "error";
if ( status < 0 ) {
status = 0;
}
}
}
// Set data for the fake xhr object
jqXHR.status = status;
jqXHR.statusText = ( nativeStatusText || statusText ) + "";
// Success/Error
if ( isSuccess ) {
deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
} else {
deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
}
// Status-dependent callbacks
jqXHR.statusCode( statusCode );
statusCode = undefined;
if ( fireGlobals ) {
globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
[ jqXHR, s, isSuccess ? success : error ] );
}
// Complete
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
if ( fireGlobals ) {
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
// Handle the global AJAX counter
if ( !( --jQuery.active ) ) {
jQuery.event.trigger( "ajaxStop" );
}
}
}
return jqXHR;
},
getJSON: function( url, data, callback ) {
return jQuery.get( url, data, callback, "json" );
},
getScript: function( url, callback ) {
return jQuery.get( url, undefined, callback, "script" );
}
} );
jQuery.each( [ "get", "post" ], function( i, method ) {
jQuery[ method ] = function( url, data, callback, type ) {
// Shift arguments if data argument was omitted
if ( jQuery.isFunction( data ) ) {
type = type || callback;
callback = data;
data = undefined;
}
// The url can be an options object (which then must have .url)
return jQuery.ajax( jQuery.extend( {
url: url,
type: method,
dataType: type,
data: data,
success: callback
}, jQuery.isPlainObject( url ) && url ) );
};
} );
jQuery._evalUrl = function( url ) {
return jQuery.ajax( {
url: url,
// Make this explicit, since user can override this through ajaxSetup (#11264)
type: "GET",
dataType: "script",
cache: true,
async: false,
global: false,
"throws": true
} );
};
jQuery.fn.extend( {
wrapAll: function( html ) {
var wrap;
if ( this[ 0 ] ) {
if ( jQuery.isFunction( html ) ) {
html = html.call( this[ 0 ] );
}
// The elements to wrap the target around
wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
if ( this[ 0 ].parentNode ) {
wrap.insertBefore( this[ 0 ] );
}
wrap.map( function() {
var elem = this;
while ( elem.firstElementChild ) {
elem = elem.firstElementChild;
}
return elem;
} ).append( this );
}
return this;
},
wrapInner: function( html ) {
if ( jQuery.isFunction( html ) ) {
return this.each( function( i ) {
jQuery( this ).wrapInner( html.call( this, i ) );
} );
}
return this.each( function() {
var self = jQuery( this ),
contents = self.contents();
if ( contents.length ) {
contents.wrapAll( html );
} else {
self.append( html );
}
} );
},
wrap: function( html ) {
var isFunction = jQuery.isFunction( html );
return this.each( function( i ) {
jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
} );
},
unwrap: function( selector ) {
this.parent( selector ).not( "body" ).each( function() {
jQuery( this ).replaceWith( this.childNodes );
} );
return this;
}
} );
jQuery.expr.pseudos.hidden = function( elem ) {
return !jQuery.expr.pseudos.visible( elem );
};
jQuery.expr.pseudos.visible = function( elem ) {
return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};
jQuery.ajaxSettings.xhr = function() {
try {
return new window.XMLHttpRequest();
} catch ( e ) {}
};
var xhrSuccessStatus = {
// File protocol always yields status code 0, assume 200
0: 200,
// Support: IE <=9 only
// #1450: sometimes IE returns 1223 when it should be 204
1223: 204
},
xhrSupported = jQuery.ajaxSettings.xhr();
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
support.ajax = xhrSupported = !!xhrSupported;
jQuery.ajaxTransport( function( options ) {
var callback, errorCallback;
// Cross domain only allowed if supported through XMLHttpRequest
if ( support.cors || xhrSupported && !options.crossDomain ) {
return {
send: function( headers, complete ) {
var i,
xhr = options.xhr();
xhr.open(
options.type,
options.url,
options.async,
options.username,
options.password
);
// Apply custom fields if provided
if ( options.xhrFields ) {
for ( i in options.xhrFields ) {
xhr[ i ] = options.xhrFields[ i ];
}
}
// Override mime type if needed
if ( options.mimeType && xhr.overrideMimeType ) {
xhr.overrideMimeType( options.mimeType );
}
// X-Requested-With header
// For cross-domain requests, seeing as conditions for a preflight are
// akin to a jigsaw puzzle, we simply never set it to be sure.
// (it can always be set on a per-request basis or even using ajaxSetup)
// For same-domain requests, won't change header if already provided.
if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
headers[ "X-Requested-With" ] = "XMLHttpRequest";
}
// Set headers
for ( i in headers ) {
xhr.setRequestHeader( i, headers[ i ] );
}
// Callback
callback = function( type ) {
return function() {
if ( callback ) {
callback = errorCallback = xhr.onload =
xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
if ( type === "abort" ) {
xhr.abort();
} else if ( type === "error" ) {
// Support: IE <=9 only
// On a manual native abort, IE9 throws
// errors on any property access that is not readyState
if ( typeof xhr.status !== "number" ) {
complete( 0, "error" );
} else {
complete(
// File: protocol always yields status 0; see #8605, #14207
xhr.status,
xhr.statusText
);
}
} else {
complete(
xhrSuccessStatus[ xhr.status ] || xhr.status,
xhr.statusText,
// Support: IE <=9 only
// IE9 has no XHR2 but throws on binary (trac-11426)
// For XHR2 non-text, let the caller handle it (gh-2498)
( xhr.responseType || "text" ) !== "text" ||
typeof xhr.responseText !== "string" ?
{ binary: xhr.response } :
{ text: xhr.responseText },
xhr.getAllResponseHeaders()
);
}
}
};
};
// Listen to events
xhr.onload = callback();
errorCallback = xhr.onerror = callback( "error" );
// Support: IE 9 only
// Use onreadystatechange to replace onabort
// to handle uncaught aborts
if ( xhr.onabort !== undefined ) {
xhr.onabort = errorCallback;
} else {
xhr.onreadystatechange = function() {
// Check readyState before timeout as it changes
if ( xhr.readyState === 4 ) {
// Allow onerror to be called first,
// but that will not handle a native abort
// Also, save errorCallback to a variable
// as xhr.onerror cannot be accessed
window.setTimeout( function() {
if ( callback ) {
errorCallback();
}
} );
}
};
}
// Create the abort callback
callback = callback( "abort" );
try {
// Do send the request (this may raise an exception)
xhr.send( options.hasContent && options.data || null );
} catch ( e ) {
// #14683: Only rethrow if this hasn't been notified as an error yet
if ( callback ) {
throw e;
}
}
},
abort: function() {
if ( callback ) {
callback();
}
}
};
}
} );
// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
jQuery.ajaxPrefilter( function( s ) {
if ( s.crossDomain ) {
s.contents.script = false;
}
} );
// Install script dataType
jQuery.ajaxSetup( {
accepts: {
script: "text/javascript, application/javascript, " +
"application/ecmascript, application/x-ecmascript"
},
contents: {
script: /\b(?:java|ecma)script\b/
},
converters: {
"text script": function( text ) {
jQuery.globalEval( text );
return text;
}
}
} );
// Handle cache's special case and crossDomain
jQuery.ajaxPrefilter( "script", function( s ) {
if ( s.cache === undefined ) {
s.cache = false;
}
if ( s.crossDomain ) {
s.type = "GET";
}
} );
// Bind script tag hack transport
jQuery.ajaxTransport( "script", function( s ) {
// This transport only deals with cross domain requests
if ( s.crossDomain ) {
var script, callback;
return {
send: function( _, complete ) {
script = jQuery( "<script>" ).prop( {
charset: s.scriptCharset,
src: s.url
} ).on(
"load error",
callback = function( evt ) {
script.remove();
callback = null;
if ( evt ) {
complete( evt.type === "error" ? 404 : 200, evt.type );
}
}
);
// Use native DOM manipulation to avoid our domManip AJAX trickery
document.head.appendChild( script[ 0 ] );
},
abort: function() {
if ( callback ) {
callback();
}
}
};
}
} );
var oldCallbacks = [],
rjsonp = /(=)\?(?=&|$)|\?\?/;
// Default jsonp settings
jQuery.ajaxSetup( {
jsonp: "callback",
jsonpCallback: function() {
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
this[ callback ] = true;
return callback;
}
} );
// Detect, normalize options and install callbacks for jsonp requests
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
var callbackName, overwritten, responseContainer,
jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
"url" :
typeof s.data === "string" &&
( s.contentType || "" )
.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
rjsonp.test( s.data ) && "data"
);
// Handle iff the expected data type is "jsonp" or we have a parameter to set
if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
// Get callback name, remembering preexisting value associated with it
callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
s.jsonpCallback() :
s.jsonpCallback;
// Insert callback into url or form data
if ( jsonProp ) {
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
} else if ( s.jsonp !== false ) {
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
}
// Use data converter to retrieve json after script execution
s.converters[ "script json" ] = function() {
if ( !responseContainer ) {
jQuery.error( callbackName + " was not called" );
}
return responseContainer[ 0 ];
};
// Force json dataType
s.dataTypes[ 0 ] = "json";
// Install callback
overwritten = window[ callbackName ];
window[ callbackName ] = function() {
responseContainer = arguments;
};
// Clean-up function (fires after converters)
jqXHR.always( function() {
// If previous value didn't exist - remove it
if ( overwritten === undefined ) {
jQuery( window ).removeProp( callbackName );
// Otherwise restore preexisting value
} else {
window[ callbackName ] = overwritten;
}
// Save back as free
if ( s[ callbackName ] ) {
// Make sure that re-using the options doesn't screw things around
s.jsonpCallback = originalSettings.jsonpCallback;
// Save the callback name for future use
oldCallbacks.push( callbackName );
}
// Call if it was a function and we have a response
if ( responseContainer && jQuery.isFunction( overwritten ) ) {
overwritten( responseContainer[ 0 ] );
}
responseContainer = overwritten = undefined;
} );
// Delegate to script
return "script";
}
} );
// Support: Safari 8 only
// In Safari 8 documents created via document.implementation.createHTMLDocument
// collapse sibling forms: the second one becomes a child of the first one.
// Because of that, this security measure has to be disabled in Safari 8.
// https://bugs.webkit.org/show_bug.cgi?id=137337
support.createHTMLDocument = ( function() {
var body = document.implementation.createHTMLDocument( "" ).body;
body.innerHTML = "<form></form><form></form>";
return body.childNodes.length === 2;
} )();
// Argument "data" should be string of html
// context (optional): If specified, the fragment will be created in this context,
// defaults to document
// keepScripts (optional): If true, will include scripts passed in the html string
jQuery.parseHTML = function( data, context, keepScripts ) {
if ( typeof data !== "string" ) {
return [];
}
if ( typeof context === "boolean" ) {
keepScripts = context;
context = false;
}
var base, parsed, scripts;
if ( !context ) {
// Stop scripts or inline event handlers from being executed immediately
// by using document.implementation
if ( support.createHTMLDocument ) {
context = document.implementation.createHTMLDocument( "" );
// Set the base href for the created document
// so any parsed elements with URLs
// are based on the document's URL (gh-2965)
base = context.createElement( "base" );
base.href = document.location.href;
context.head.appendChild( base );
} else {
context = document;
}
}
parsed = rsingleTag.exec( data );
scripts = !keepScripts && [];
// Single tag
if ( parsed ) {
return [ context.createElement( parsed[ 1 ] ) ];
}
parsed = buildFragment( [ data ], context, scripts );
if ( scripts && scripts.length ) {
jQuery( scripts ).remove();
}
return jQuery.merge( [], parsed.childNodes );
};
/**
* Load a url into a page
*/
jQuery.fn.load = function( url, params, callback ) {
var selector, type, response,
self = this,
off = url.indexOf( " " );
if ( off > -1 ) {
selector = stripAndCollapse( url.slice( off ) );
url = url.slice( 0, off );
}
// If it's a function
if ( jQuery.isFunction( params ) ) {
// We assume that it's the callback
callback = params;
params = undefined;
// Otherwise, build a param string
} else if ( params && typeof params === "object" ) {
type = "POST";
}
// If we have elements to modify, make the request
if ( self.length > 0 ) {
jQuery.ajax( {
url: url,
// If "type" variable is undefined, then "GET" method will be used.
// Make value of this field explicit since
// user can override it through ajaxSetup method
type: type || "GET",
dataType: "html",
data: params
} ).done( function( responseText ) {
// Save response for use in complete callback
response = arguments;
self.html( selector ?
// If a selector was specified, locate the right elements in a dummy div
// Exclude scripts to avoid IE 'Permission Denied' errors
jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
// Otherwise use the full result
responseText );
// If the request succeeds, this function gets "data", "status", "jqXHR"
// but they are ignored because response was set above.
// If it fails, this function gets "jqXHR", "status", "error"
} ).always( callback && function( jqXHR, status ) {
self.each( function() {
callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
} );
} );
}
return this;
};
// Attach a bunch of functions for handling common AJAX events
jQuery.each( [
"ajaxStart",
"ajaxStop",
"ajaxComplete",
"ajaxError",
"ajaxSuccess",
"ajaxSend"
], function( i, type ) {
jQuery.fn[ type ] = function( fn ) {
return this.on( type, fn );
};
} );
jQuery.expr.pseudos.animated = function( elem ) {
return jQuery.grep( jQuery.timers, function( fn ) {
return elem === fn.elem;
} ).length;
};
jQuery.offset = {
setOffset: function( elem, options, i ) {
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
position = jQuery.css( elem, "position" ),
curElem = jQuery( elem ),
props = {};
// Set position first, in-case top/left are set even on static elem
if ( position === "static" ) {
elem.style.position = "relative";
}
curOffset = curElem.offset();
curCSSTop = jQuery.css( elem, "top" );
curCSSLeft = jQuery.css( elem, "left" );
calculatePosition = ( position === "absolute" || position === "fixed" ) &&
( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
// Need to be able to calculate position if either
// top or left is auto and position is either absolute or fixed
if ( calculatePosition ) {
curPosition = curElem.position();
curTop = curPosition.top;
curLeft = curPosition.left;
} else {
curTop = parseFloat( curCSSTop ) || 0;
curLeft = parseFloat( curCSSLeft ) || 0;
}
if ( jQuery.isFunction( options ) ) {
// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
}
if ( options.top != null ) {
props.top = ( options.top - curOffset.top ) + curTop;
}
if ( options.left != null ) {
props.left = ( options.left - curOffset.left ) + curLeft;
}
if ( "using" in options ) {
options.using.call( elem, props );
} else {
curElem.css( props );
}
}
};
jQuery.fn.extend( {
offset: function( options ) {
// Preserve chaining for setter
if ( arguments.length ) {
return options === undefined ?
this :
this.each( function( i ) {
jQuery.offset.setOffset( this, options, i );
} );
}
var doc, docElem, rect, win,
elem = this[ 0 ];
if ( !elem ) {
return;
}
// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
// Support: IE <=11 only
// Running getBoundingClientRect on a
// disconnected node in IE throws an error
if ( !elem.getClientRects().length ) {
return { top: 0, left: 0 };
}
rect = elem.getBoundingClientRect();
doc = elem.ownerDocument;
docElem = doc.documentElement;
win = doc.defaultView;
return {
top: rect.top + win.pageYOffset - docElem.clientTop,
left: rect.left + win.pageXOffset - docElem.clientLeft
};
},
position: function() {
if ( !this[ 0 ] ) {
return;
}
var offsetParent, offset,
elem = this[ 0 ],
parentOffset = { top: 0, left: 0 };
// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
// because it is its only offset parent
if ( jQuery.css( elem, "position" ) === "fixed" ) {
// Assume getBoundingClientRect is there when computed position is fixed
offset = elem.getBoundingClientRect();
} else {
// Get *real* offsetParent
offsetParent = this.offsetParent();
// Get correct offsets
offset = this.offset();
if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
parentOffset = offsetParent.offset();
}
// Add offsetParent borders
parentOffset = {
top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
};
}
// Subtract parent offsets and element margins
return {
top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
};
},
// This method will return documentElement in the following cases:
// 1) For the element inside the iframe without offsetParent, this method will return
// documentElement of the parent window
// 2) For the hidden or detached element
// 3) For body or html element, i.e. in case of the html node - it will return itself
//
// but those exceptions were never presented as a real life use-cases
// and might be considered as more preferable results.
//
// This logic, however, is not guaranteed and can change at any point in the future
offsetParent: function() {
return this.map( function() {
var offsetParent = this.offsetParent;
while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
offsetParent = offsetParent.offsetParent;
}
return offsetParent || documentElement;
} );
}
} );
// Create scrollLeft and scrollTop methods
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
var top = "pageYOffset" === prop;
jQuery.fn[ method ] = function( val ) {
return access( this, function( elem, method, val ) {
// Coalesce documents and windows
var win;
if ( jQuery.isWindow( elem ) ) {
win = elem;
} else if ( elem.nodeType === 9 ) {
win = elem.defaultView;
}
if ( val === undefined ) {
return win ? win[ prop ] : elem[ method ];
}
if ( win ) {
win.scrollTo(
!top ? val : win.pageXOffset,
top ? val : win.pageYOffset
);
} else {
elem[ method ] = val;
}
}, method, val, arguments.length );
};
} );
// Support: Safari <=7 - 9.1, Chrome <=37 - 49
// Add the top/left cssHooks using jQuery.fn.position
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
// getComputedStyle returns percent when specified for top/left/bottom/right;
// rather than make the css module depend on the offset module, just check for it here
jQuery.each( [ "top", "left" ], function( i, prop ) {
jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
function( elem, computed ) {
if ( computed ) {
computed = curCSS( elem, prop );
// If curCSS returns percentage, fallback to offset
return rnumnonpx.test( computed ) ?
jQuery( elem ).position()[ prop ] + "px" :
computed;
}
}
);
} );
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
return access( this, function( elem, type, value ) {
var doc;
if ( jQuery.isWindow( elem ) ) {
// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
return funcName.indexOf( "outer" ) === 0 ?
elem[ "inner" + name ] :
elem.document.documentElement[ "client" + name ];
}
// Get document width or height
if ( elem.nodeType === 9 ) {
doc = elem.documentElement;
// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
// whichever is greatest
return Math.max(
elem.body[ "scroll" + name ], doc[ "scroll" + name ],
elem.body[ "offset" + name ], doc[ "offset" + name ],
doc[ "client" + name ]
);
}
return value === undefined ?
// Get width or height on the element, requesting but not forcing parseFloat
jQuery.css( elem, type, extra ) :
// Set width or height on the element
jQuery.style( elem, type, value, extra );
}, type, chainable ? margin : undefined, chainable );
};
} );
} );
jQuery.fn.extend( {
bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
},
unbind: function( types, fn ) {
return this.off( types, null, fn );
},
delegate: function( selector, types, data, fn ) {
return this.on( types, selector, data, fn );
},
undelegate: function( selector, types, fn ) {
// ( namespace ) or ( selector, types [, fn] )
return arguments.length === 1 ?
this.off( selector, "**" ) :
this.off( types, selector || "**", fn );
}
} );
jQuery.holdReady = function( hold ) {
if ( hold ) {
jQuery.readyWait++;
} else {
jQuery.ready( true );
}
};
jQuery.isArray = Array.isArray;
jQuery.parseJSON = JSON.parse;
jQuery.nodeName = nodeName;
// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.
// Note that for maximum portability, libraries that are not jQuery should
// declare themselves as anonymous modules, and avoid setting a global if an
// AMD loader is present. jQuery is a special case. For more information, see
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
if ( true ) {
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {
return jQuery;
}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
}
var
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$;
jQuery.noConflict = function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
}
if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
}
return jQuery;
};
// Expose jQuery and $ identifiers, even in AMD
// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( !noGlobal ) {
window.jQuery = window.$ = jQuery;
}
return jQuery;
} );
/***/ }),
/***/ "./node_modules/webpack/buildin/global.js":
/***/ (function(module, exports) {
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || Function("return this")() || (1,eval)("this");
} catch(e) {
// This works if the window reference is available
if(typeof window === "object")
g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/***/ "./public/assets/admin/vendor/sass/paper-dashboard.scss":
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ "./public/assets/frontend/sass/now-ui-kit.scss":
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ "./public/assets/vendor/leaflet-ajax/dist/leaflet.ajax.min.js":
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(global) {var require;var require;var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
!function e(t, n, r) {
function a(i, s) {
if (!n[i]) {
if (!t[i]) {
var l = "function" == typeof require && require;if (!s && l) return require(i, !0);if (o) return o(i, !0);var u = new Error("Cannot find module '" + i + "'");throw u.code = "MODULE_NOT_FOUND", u;
}var c = n[i] = { exports: {} };t[i][0].call(c.exports, function (e) {
var n = t[i][1][e];return a(n ? n : e);
}, c, c.exports, e, t, n, r);
}return n[i].exports;
}for (var o = "function" == typeof require && require, i = 0; i < r.length; i++) {
a(r[i]);
}return a;
}({ 1: [function (e, t, n) {
"use strict";
function r() {}function a(e) {
if ("function" != typeof e) throw new TypeError("resolver must be a function");this.state = j, this.queue = [], this.outcome = void 0, e !== r && l(this, e);
}function o(e, t, n) {
this.promise = e, "function" == typeof t && (this.onFulfilled = t, this.callFulfilled = this.otherCallFulfilled), "function" == typeof n && (this.onRejected = n, this.callRejected = this.otherCallRejected);
}function i(e, t, n) {
p(function () {
var r;try {
r = t(n);
} catch (a) {
return v.reject(e, a);
}r === e ? v.reject(e, new TypeError("Cannot resolve promise with itself")) : v.resolve(e, r);
});
}function s(e) {
var t = e && e.then;return e && "object" == (typeof e === "undefined" ? "undefined" : _typeof(e)) && "function" == typeof t ? function () {
t.apply(e, arguments);
} : void 0;
}function l(e, t) {
function n(t) {
o || (o = !0, v.reject(e, t));
}function r(t) {
o || (o = !0, v.resolve(e, t));
}function a() {
t(r, n);
}var o = !1,
i = u(a);"error" === i.status && n(i.value);
}function u(e, t) {
var n = {};try {
n.value = e(t), n.status = "success";
} catch (r) {
n.status = "error", n.value = r;
}return n;
}function c(e) {
return e instanceof this ? e : v.resolve(new this(r), e);
}function f(e) {
var t = new this(r);return v.reject(t, e);
}function d(e) {
function t(e, t) {
function r(e) {
i[t] = e, ++s !== a || o || (o = !0, v.resolve(u, i));
}n.resolve(e).then(r, function (e) {
o || (o = !0, v.reject(u, e));
});
}var n = this;if ("[object Array]" !== Object.prototype.toString.call(e)) return this.reject(new TypeError("must be an array"));var a = e.length,
o = !1;if (!a) return this.resolve([]);for (var i = new Array(a), s = 0, l = -1, u = new this(r); ++l < a;) {
t(e[l], l);
}return u;
}function h(e) {
function t(e) {
n.resolve(e).then(function (e) {
o || (o = !0, v.resolve(s, e));
}, function (e) {
o || (o = !0, v.reject(s, e));
});
}var n = this;if ("[object Array]" !== Object.prototype.toString.call(e)) return this.reject(new TypeError("must be an array"));var a = e.length,
o = !1;if (!a) return this.resolve([]);for (var i = -1, s = new this(r); ++i < a;) {
t(e[i]);
}return s;
}var p = e("immediate"),
v = {},
y = ["REJECTED"],
m = ["FULFILLED"],
j = ["PENDING"];t.exports = n = a, a.prototype["catch"] = function (e) {
return this.then(null, e);
}, a.prototype.then = function (e, t) {
if ("function" != typeof e && this.state === m || "function" != typeof t && this.state === y) return this;var n = new this.constructor(r);if (this.state !== j) {
var a = this.state === m ? e : t;i(n, a, this.outcome);
} else this.queue.push(new o(n, e, t));return n;
}, o.prototype.callFulfilled = function (e) {
v.resolve(this.promise, e);
}, o.prototype.otherCallFulfilled = function (e) {
i(this.promise, this.onFulfilled, e);
}, o.prototype.callRejected = function (e) {
v.reject(this.promise, e);
}, o.prototype.otherCallRejected = function (e) {
i(this.promise, this.onRejected, e);
}, v.resolve = function (e, t) {
var n = u(s, t);if ("error" === n.status) return v.reject(e, n.value);var r = n.value;if (r) l(e, r);else {
e.state = m, e.outcome = t;for (var a = -1, o = e.queue.length; ++a < o;) {
e.queue[a].callFulfilled(t);
}
}return e;
}, v.reject = function (e, t) {
e.state = y, e.outcome = t;for (var n = -1, r = e.queue.length; ++n < r;) {
e.queue[n].callRejected(t);
}return e;
}, n.resolve = c, n.reject = f, n.all = d, n.race = h;
}, { immediate: 2 }], 2: [function (e, t, n) {
(function (e) {
"use strict";
function n() {
c = !0;for (var e, t, n = f.length; n;) {
for (t = f, f = [], e = -1; ++e < n;) {
t[e]();
}n = f.length;
}c = !1;
}function r(e) {
1 !== f.push(e) || c || a();
}var a,
o = e.MutationObserver || e.WebKitMutationObserver;if (o) {
var i = 0,
s = new o(n),
l = e.document.createTextNode("");s.observe(l, { characterData: !0 }), a = function a() {
l.data = i = ++i % 2;
};
} else if (e.setImmediate || "undefined" == typeof e.MessageChannel) a = "document" in e && "onreadystatechange" in e.document.createElement("script") ? function () {
var t = e.document.createElement("script");t.onreadystatechange = function () {
n(), t.onreadystatechange = null, t.parentNode.removeChild(t), t = null;
}, e.document.documentElement.appendChild(t);
} : function () {
setTimeout(n, 0);
};else {
var u = new e.MessageChannel();u.port1.onmessage = n, a = function a() {
u.port2.postMessage(0);
};
}var c,
f = [];t.exports = r;
}).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {});
}, {}], 3: [function (e, t, n) {
(function (n) {
"use strict";
var r = e("./jsonp"),
a = e("lie");t.exports = function (e, t) {
if (t = t || {}, t.jsonp) return r(e, t);var o,
i,
s = new a(function (r, a) {
i = a, void 0 === n.XMLHttpRequest && a("XMLHttpRequest is not supported");var s;o = new n.XMLHttpRequest(), o.open("GET", e), t.headers && Object.keys(t.headers).forEach(function (e) {
o.setRequestHeader(e, t.headers[e]);
}), o.onreadystatechange = function () {
4 === o.readyState && (o.status < 400 && t.local || 200 === o.status ? (n.JSON ? s = JSON.parse(o.responseText) : a(new Error("JSON is not supported")), r(s)) : a(o.status ? o.statusText : "Attempted cross origin request without CORS enabled"));
}, o.send();
});return s["catch"](function (e) {
return o.abort(), e;
}), s.abort = i, s;
};
}).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {});
}, { "./jsonp": 5, lie: 1 }], 4: [function (e, t, n) {
(function (t) {
"use strict";
var n = t.L || e("leaflet"),
r = e("lie"),
a = e("./ajax");n.GeoJSON.AJAX = n.GeoJSON.extend({ defaultAJAXparams: { dataType: "json", callbackParam: "callback", local: !1, middleware: function middleware(e) {
return e;
} }, initialize: function initialize(e, t) {
this.urls = [], e && ("string" == typeof e ? this.urls.push(e) : "function" == typeof e.pop ? this.urls = this.urls.concat(e) : (t = e, e = void 0));var a = n.Util.extend({}, this.defaultAJAXparams);for (var o in t) {
this.defaultAJAXparams.hasOwnProperty(o) && (a[o] = t[o]);
}this.ajaxParams = a, this._layers = {}, n.Util.setOptions(this, t), this.on("data:loaded", function () {
this.filter && this.refilter(this.filter);
}, this);var i = this;this.urls.length > 0 && new r(function (e) {
e();
}).then(function () {
i.addUrl();
});
}, clearLayers: function clearLayers() {
return this.urls = [], n.GeoJSON.prototype.clearLayers.call(this), this;
}, addUrl: function addUrl(e) {
var t = this;e && ("string" == typeof e ? t.urls.push(e) : "function" == typeof e.pop && (t.urls = t.urls.concat(e)));var r = t.urls.length,
o = 0;t.fire("data:loading"), t.urls.forEach(function (e) {
"json" === t.ajaxParams.dataType.toLowerCase() ? a(e, t.ajaxParams).then(function (e) {
var n = t.ajaxParams.middleware(e);t.addData(n), t.fire("data:progress", n);
}, function (e) {
t.fire("data:progress", { error: e });
}) : "jsonp" === t.ajaxParams.dataType.toLowerCase() && n.Util.jsonp(e, t.ajaxParams).then(function (e) {
var n = t.ajaxParams.middleware(e);t.addData(n), t.fire("data:progress", n);
}, function (e) {
t.fire("data:progress", { error: e });
});
}), t.on("data:progress", function () {
++o === r && t.fire("data:loaded");
});
}, refresh: function refresh(e) {
e = e || this.urls, this.clearLayers(), this.addUrl(e);
}, refilter: function refilter(e) {
"function" != typeof e ? (this.filter = !1, this.eachLayer(function (e) {
e.setStyle({ stroke: !0, clickable: !0 });
})) : (this.filter = e, this.eachLayer(function (t) {
e(t.feature) ? t.setStyle({ stroke: !0, clickable: !0 }) : t.setStyle({ stroke: !1, clickable: !1 });
}));
} }), n.Util.Promise = r, n.Util.ajax = a, n.Util.jsonp = e("./jsonp"), n.geoJson.ajax = function (e, t) {
return new n.GeoJSON.AJAX(e, t);
};
}).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {});
}, { "./ajax": 3, "./jsonp": 5, leaflet: void 0, lie: 1 }], 5: [function (e, t, n) {
(function (n) {
"use strict";
var r = n.L || e("leaflet"),
a = e("lie");t.exports = function (e, t) {
t = t || {};var o,
i,
s,
l,
u = document.getElementsByTagName("head")[0],
c = r.DomUtil.create("script", "", u),
f = new a(function (r, a) {
l = a;var f = t.cbParam || "callback";t.callbackName ? o = t.callbackName : (s = "_" + ("" + Math.random()).slice(2), o = "_leafletJSONPcallbacks." + s), c.type = "text/javascript", s && (n._leafletJSONPcallbacks || (n._leafletJSONPcallbacks = { length: 0 }), n._leafletJSONPcallbacks.length++, n._leafletJSONPcallbacks[s] = function (e) {
u.removeChild(c), delete n._leafletJSONPcallbacks[s], n._leafletJSONPcallbacks.length--, n._leafletJSONPcallbacks.length || delete n._leafletJSONPcallbacks, r(e);
}), i = -1 === e.indexOf("?") ? e + "?" + f + "=" + o : e + "&" + f + "=" + o, c.src = i;
}).then(null, function (e) {
return u.removeChild(c), delete r.Util.ajax.cb[s], e;
});return f.abort = l, f;
};
}).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {});
}, { leaflet: void 0, lie: 1 }] }, {}, [4]);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__("./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./public/assets/vendor/leaflet-plugins/leaflet.geodesic.js":
/***/ (function(module, exports, __webpack_require__) {
"use strict";
// This file is part of Leaflet.Geodesic.
// Copyright (C) 2017 Henry Thasler
// based on code by Chris Veness Copyright (C) 2014 https://github.com/chrisveness/geodesy
//
// Leaflet.Geodesic is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Leaflet.Geodesic is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Leaflet.Geodesic. If not, see <http://www.gnu.org/licenses/>.
/** Extend Number object with method to convert numeric degrees to radians */
if (typeof Number.prototype.toRadians === "undefined") {
Number.prototype.toRadians = function () {
return this * Math.PI / 180;
};
}
/** Extend Number object with method to convert radians to numeric (signed) degrees */
if (typeof Number.prototype.toDegrees === "undefined") {
Number.prototype.toDegrees = function () {
return this * 180 / Math.PI;
};
}
var INTERSECT_LNG = 179.999; // Lng used for intersection and wrap around on map edges
L.Geodesic = L.Polyline.extend({
options: {
color: "blue",
steps: 10,
dash: 1,
wrap: true
},
initialize: function initialize(latlngs, options) {
this.options = this._merge_options(this.options, options);
this.datum = {};
this.datum.ellipsoid = {
a: 6378137,
b: 6356752.3142,
f: 1 / 298.257223563 // WGS-84
};this._latlngs = this.options.dash < 1 ? this._generate_GeodesicDashed(latlngs) : this._generate_Geodesic(latlngs);
L.Polyline.prototype.initialize.call(this, this._latlngs, this.options);
},
setLatLngs: function setLatLngs(latlngs) {
this._latlngs = this.options.dash < 1 ? this._generate_GeodesicDashed(latlngs) : this._generate_Geodesic(latlngs);
L.Polyline.prototype.setLatLngs.call(this, this._latlngs);
},
/**
* Calculates some statistic values of current geodesic multipolyline
* @returns (Object} Object with several properties (e.g. overall distance)
*/
getStats: function getStats() {
var obj = {
distance: 0,
points: 0,
polygons: this._latlngs.length
},
poly = void 0,
points = void 0;
for (poly = 0; poly < this._latlngs.length; poly++) {
obj.points += this._latlngs[poly].length;
for (points = 0; points < this._latlngs[poly].length - 1; points++) {
obj.distance += this._vincenty_inverse(this._latlngs[poly][points], this._latlngs[poly][points + 1]).distance;
}
}
return obj;
},
/**
* Creates geodesic lines from geoJson. Replaces all current features of this instance.
* Supports LineString, MultiLineString and Polygon
* @param {Object} geojson - geosjon as object.
*/
geoJson: function geoJson(geojson) {
var normalized = L.GeoJSON.asFeature(geojson);
var features = normalized.type === "FeatureCollection" ? normalized.features : [normalized];
this._latlngs = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = features[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var feature = _step.value;
var geometry = feature.type === "Feature" ? feature.geometry : feature,
coords = geometry.coordinates;
switch (geometry.type) {
case "LineString":
this._latlngs.push(this._generate_Geodesic([L.GeoJSON.coordsToLatLngs(coords, 0)]));
break;
case "MultiLineString":
case "Polygon":
this._latlngs.push(this._generate_Geodesic(L.GeoJSON.coordsToLatLngs(coords, 1)));
break;
case "Point":
case "MultiPoint":
console.log("Dude, points can't be drawn as geodesic lines...");
break;
default:
console.log("Drawing " + geometry.type + " as a geodesic is not supported. Skipping...");
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
L.Polyline.prototype.setLatLngs.call(this, this._latlngs);
},
/**
* Creates a great circle. Replaces all current lines.
* @param {Object} center - geographic position
* @param {number} radius - radius of the circle in metres
*/
createCircle: function createCircle(center, radius) {
var polylineIndex = 0;
var prev = {
lat: 0,
lng: 0,
brg: 0
};
var step = void 0;
this._latlngs = [];
this._latlngs[polylineIndex] = [];
var direct = this._vincenty_direct(L.latLng(center), 0, radius, this.options.wrap);
prev = L.latLng(direct.lat, direct.lng);
this._latlngs[polylineIndex].push(prev);
for (step = 1; step <= this.options.steps;) {
direct = this._vincenty_direct(L.latLng(center), 360 / this.options.steps * step, radius, this.options.wrap);
var gp = L.latLng(direct.lat, direct.lng);
if (Math.abs(gp.lng - prev.lng) > 180) {
var inverse = this._vincenty_inverse(prev, gp);
var sec = this._intersection(prev, inverse.initialBearing, {
lat: -89,
lng: gp.lng - prev.lng > 0 ? -INTERSECT_LNG : INTERSECT_LNG
}, 0);
if (sec) {
this._latlngs[polylineIndex].push(L.latLng(sec.lat, sec.lng));
polylineIndex++;
this._latlngs[polylineIndex] = [];
prev = L.latLng(sec.lat, -sec.lng);
this._latlngs[polylineIndex].push(prev);
} else {
polylineIndex++;
this._latlngs[polylineIndex] = [];
this._latlngs[polylineIndex].push(gp);
prev = gp;
step++;
}
} else {
this._latlngs[polylineIndex].push(gp);
prev = gp;
step++;
}
}
L.Polyline.prototype.setLatLngs.call(this, this._latlngs);
},
/**
* Creates a geodesic Polyline from given coordinates
* @param {Object} latlngs - One or more polylines as an array. See Leaflet doc about Polyline
* @returns (Object} An array of arrays of geographical points.
*/
_generate_Geodesic: function _generate_Geodesic(latlngs) {
var _geo = [],
_geocnt = 0,
s = void 0,
poly = void 0,
points = void 0,
pointA = void 0,
pointB = void 0;
for (poly = 0; poly < latlngs.length; poly++) {
_geo[_geocnt] = [];
for (points = 0; points < latlngs[poly].length - 1; points++) {
pointA = L.latLng(latlngs[poly][points]);
pointB = L.latLng(latlngs[poly][points + 1]);
if (pointA.equals(pointB)) {
continue;
}
var inverse = this._vincenty_inverse(pointA, pointB);
var prev = pointA;
_geo[_geocnt].push(prev);
for (s = 1; s <= this.options.steps;) {
var direct = this._vincenty_direct(pointA, inverse.initialBearing, inverse.distance / this.options.steps * s, this.options.wrap);
var gp = L.latLng(direct.lat, direct.lng);
if (Math.abs(gp.lng - prev.lng) > 180) {
var sec = this._intersection(pointA, inverse.initialBearing, {
lat: -89,
lng: gp.lng - prev.lng > 0 ? -INTERSECT_LNG : INTERSECT_LNG
}, 0);
if (sec) {
_geo[_geocnt].push(L.latLng(sec.lat, sec.lng));
_geocnt++;
_geo[_geocnt] = [];
prev = L.latLng(sec.lat, -sec.lng);
_geo[_geocnt].push(prev);
} else {
_geocnt++;
_geo[_geocnt] = [];
_geo[_geocnt].push(gp);
prev = gp;
s++;
}
} else {
_geo[_geocnt].push(gp);
prev = gp;
s++;
}
}
}
_geocnt++;
}
return _geo;
},
/**
* Creates a dashed geodesic Polyline from given coordinates - under work
* @param {Object} latlngs - One or more polylines as an array. See Leaflet doc about Polyline
* @returns (Object} An array of arrays of geographical points.
*/
_generate_GeodesicDashed: function _generate_GeodesicDashed(latlngs) {
var _geo = [],
_geocnt = 0,
s = void 0,
poly = void 0,
points = void 0;
// _geo = latlngs; // bypass
for (poly = 0; poly < latlngs.length; poly++) {
_geo[_geocnt] = [];
for (points = 0; points < latlngs[poly].length - 1; points++) {
var inverse = this._vincenty_inverse(L.latLng(latlngs[poly][points]), L.latLng(latlngs[poly][points + 1]));
var prev = L.latLng(latlngs[poly][points]);
_geo[_geocnt].push(prev);
for (s = 1; s <= this.options.steps;) {
var direct = this._vincenty_direct(L.latLng(latlngs[poly][points]), inverse.initialBearing, inverse.distance / this.options.steps * s - inverse.distance / this.options.steps * (1 - this.options.dash), this.options.wrap);
var gp = L.latLng(direct.lat, direct.lng);
if (Math.abs(gp.lng - prev.lng) > 180) {
var sec = this._intersection(L.latLng(latlngs[poly][points]), inverse.initialBearing, {
lat: -89,
lng: gp.lng - prev.lng > 0 ? -INTERSECT_LNG : INTERSECT_LNG
}, 0);
if (sec) {
_geo[_geocnt].push(L.latLng(sec.lat, sec.lng));
_geocnt++;
_geo[_geocnt] = [];
prev = L.latLng(sec.lat, -sec.lng);
_geo[_geocnt].push(prev);
} else {
_geocnt++;
_geo[_geocnt] = [];
_geo[_geocnt].push(gp);
prev = gp;
s++;
}
} else {
_geo[_geocnt].push(gp);
_geocnt++;
var direct2 = this._vincenty_direct(L.latLng(latlngs[poly][points]), inverse.initialBearing, inverse.distance / this.options.steps * s, this.options.wrap);
_geo[_geocnt] = [];
_geo[_geocnt].push(L.latLng(direct2.lat, direct2.lng));
s++;
}
}
}
_geocnt++;
}
return _geo;
},
/**
* Vincenty direct calculation.
* based on the work of Chris Veness (https://github.com/chrisveness/geodesy)
*
* @private
* @param {number} initialBearing - Initial bearing in degrees from north.
* @param {number} distance - Distance along bearing in metres.
* @returns (Object} Object including point (destination point), finalBearing.
*/
_vincenty_direct: function _vincenty_direct(p1, initialBearing, distance, wrap) {
var φ1 = p1.lat.toRadians(),
λ1 = p1.lng.toRadians();
var α1 = initialBearing.toRadians();
var s = distance;
var a = this.datum.ellipsoid.a,
b = this.datum.ellipsoid.b,
f = this.datum.ellipsoid.f;
var sinα1 = Math.sin(α1);
var cosα1 = Math.cos(α1);
var tanU1 = (1 - f) * Math.tan(φ1),
cosU1 = 1 / Math.sqrt(1 + tanU1 * tanU1),
sinU1 = tanU1 * cosU1;
var σ1 = Math.atan2(tanU1, cosα1);
var sinα = cosU1 * sinα1;
var cosSqα = 1 - sinα * sinα;
var uSq = cosSqα * (a * a - b * b) / (b * b);
var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
var σ = s / (b * A),
σʹ,
iterations = 0;
do {
var cos2σM = Math.cos(2 * σ1 + σ);
var sinσ = Math.sin(σ);
var cosσ = Math.cos(σ);
var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM * cos2σM) - B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM * cos2σM)));
σʹ = σ;
σ = s / (b * A) + Δσ;
} while (Math.abs(σ - σʹ) > 1e-12 && ++iterations);
var x = sinU1 * sinσ - cosU1 * cosσ * cosα1;
var φ2 = Math.atan2(sinU1 * cosσ + cosU1 * sinσ * cosα1, (1 - f) * Math.sqrt(sinα * sinα + x * x));
var λ = Math.atan2(sinσ * sinα1, cosU1 * cosσ - sinU1 * sinσ * cosα1);
var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));
var L = λ - (1 - C) * f * sinα * (σ + C * sinσ * (cos2σM + C * cosσ * (-1 + 2 * cos2σM * cos2σM)));
if (wrap) var λ2 = (λ1 + L + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180...+180
else var λ2 = λ1 + L; // do not normalize
var revAz = Math.atan2(sinα, -x);
return {
lat: φ2.toDegrees(),
lng: λ2.toDegrees(),
finalBearing: revAz.toDegrees()
};
},
/**
* Vincenty inverse calculation.
* based on the work of Chris Veness (https://github.com/chrisveness/geodesy)
*
* @private
* @param {LatLng} p1 - Latitude/longitude of start point.
* @param {LatLng} p2 - Latitude/longitude of destination point.
* @returns {Object} Object including distance, initialBearing, finalBearing.
* @throws {Error} If formula failed to converge.
*/
_vincenty_inverse: function _vincenty_inverse(p1, p2) {
var φ1 = p1.lat.toRadians(),
λ1 = p1.lng.toRadians();
var φ2 = p2.lat.toRadians(),
λ2 = p2.lng.toRadians();
var a = this.datum.ellipsoid.a,
b = this.datum.ellipsoid.b,
f = this.datum.ellipsoid.f;
var L = λ2 - λ1;
var tanU1 = (1 - f) * Math.tan(φ1),
cosU1 = 1 / Math.sqrt(1 + tanU1 * tanU1),
sinU1 = tanU1 * cosU1;
var tanU2 = (1 - f) * Math.tan(φ2),
cosU2 = 1 / Math.sqrt(1 + tanU2 * tanU2),
sinU2 = tanU2 * cosU2;
var λ = L,
λʹ,
iterations = 0;
do {
var sinλ = Math.sin(λ),
cosλ = Math.cos(λ);
var sinSqσ = cosU2 * sinλ * (cosU2 * sinλ) + (cosU1 * sinU2 - sinU1 * cosU2 * cosλ) * (cosU1 * sinU2 - sinU1 * cosU2 * cosλ);
var sinσ = Math.sqrt(sinSqσ);
if (sinσ == 0) return 0; // co-incident points
var cosσ = sinU1 * sinU2 + cosU1 * cosU2 * cosλ;
var σ = Math.atan2(sinσ, cosσ);
var sinα = cosU1 * cosU2 * sinλ / sinσ;
var cosSqα = 1 - sinα * sinα;
var cos2σM = cosσ - 2 * sinU1 * sinU2 / cosSqα;
if (isNaN(cos2σM)) cos2σM = 0; // equatorial line: cosSqα=0 (§6)
var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));
λʹ = λ;
λ = L + (1 - C) * f * sinα * (σ + C * sinσ * (cos2σM + C * cosσ * (-1 + 2 * cos2σM * cos2σM)));
} while (Math.abs(λ - λʹ) > 1e-12 && ++iterations < 100);
if (iterations >= 100) {
console.log("Formula failed to converge. Altering target position.");
return this._vincenty_inverse(p1, {
lat: p2.lat,
lng: p2.lng - 0.01
});
// throw new Error('Formula failed to converge');
}
var uSq = cosSqα * (a * a - b * b) / (b * b);
var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM * cos2σM) - B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM * cos2σM)));
var s = b * A * (σ - Δσ);
var fwdAz = Math.atan2(cosU2 * sinλ, cosU1 * sinU2 - sinU1 * cosU2 * cosλ);
var revAz = Math.atan2(cosU1 * sinλ, -sinU1 * cosU2 + cosU1 * sinU2 * cosλ);
s = Number(s.toFixed(3)); // round to 1mm precision
return {
distance: s,
initialBearing: fwdAz.toDegrees(),
finalBearing: revAz.toDegrees()
};
},
/**
* Returns the point of intersection of two paths defined by point and bearing.
* based on the work of Chris Veness (https://github.com/chrisveness/geodesy)
*
* @param {LatLon} p1 - First point.
* @param {number} brng1 - Initial bearing from first point.
* @param {LatLon} p2 - Second point.
* @param {number} brng2 - Initial bearing from second point.
* @returns {Object} containing lat/lng information of intersection.
*
* @example
* var p1 = LatLon(51.8853, 0.2545), brng1 = 108.55;
* var p2 = LatLon(49.0034, 2.5735), brng2 = 32.44;
* var pInt = LatLon.intersection(p1, brng1, p2, brng2); // pInt.toString(): 50.9078°N, 4.5084°E
*/
_intersection: function _intersection(p1, brng1, p2, brng2) {
// see http://williams.best.vwh.net/avform.htm#Intersection
var φ1 = p1.lat.toRadians(),
λ1 = p1.lng.toRadians();
var φ2 = p2.lat.toRadians(),
λ2 = p2.lng.toRadians();
var θ13 = Number(brng1).toRadians(),
θ23 = Number(brng2).toRadians();
var Δφ = φ2 - φ1,
Δλ = λ2 - λ1;
var δ12 = 2 * Math.asin(Math.sqrt(Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2)));
if (δ12 == 0) return null;
// initial/final bearings between points
var θ1 = Math.acos((Math.sin(φ2) - Math.sin(φ1) * Math.cos(δ12)) / (Math.sin(δ12) * Math.cos(φ1)));
if (isNaN(θ1)) θ1 = 0; // protect against rounding
var θ2 = Math.acos((Math.sin(φ1) - Math.sin(φ2) * Math.cos(δ12)) / (Math.sin(δ12) * Math.cos(φ2)));
if (Math.sin(λ2 - λ1) > 0) {
var θ12 = θ1;
var θ21 = 2 * Math.PI - θ2;
} else {
var θ12 = 2 * Math.PI - θ1;
var θ21 = θ2;
}
var α1 = (θ13 - θ12 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 2-1-3
var α2 = (θ21 - θ23 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 1-2-3
if (Math.sin(α1) == 0 && Math.sin(α2) == 0) return null; // infinite intersections
if (Math.sin(α1) * Math.sin(α2) < 0) return null; // ambiguous intersection
//α1 = Math.abs(α1);
//α2 = Math.abs(α2);
// ... Ed Williams takes abs of α1/α2, but seems to break calculation?
var α3 = Math.acos(-Math.cos(α1) * Math.cos(α2) + Math.sin(α1) * Math.sin(α2) * Math.cos(δ12));
var δ13 = Math.atan2(Math.sin(δ12) * Math.sin(α1) * Math.sin(α2), Math.cos(α2) + Math.cos(α1) * Math.cos(α3));
var φ3 = Math.asin(Math.sin(φ1) * Math.cos(δ13) + Math.cos(φ1) * Math.sin(δ13) * Math.cos(θ13));
var Δλ13 = Math.atan2(Math.sin(θ13) * Math.sin(δ13) * Math.cos(φ1), Math.cos(δ13) - Math.sin(φ1) * Math.sin(φ3));
var λ3 = λ1 + Δλ13;
λ3 = (λ3 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180..+180º
return {
lat: φ3.toDegrees(),
lng: λ3.toDegrees()
};
},
/**
* Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1
* @param obj1
* @param obj2
* @returns obj3 a new object based on obj1 and obj2
*/
_merge_options: function _merge_options(obj1, obj2) {
var obj3 = {};
for (var attrname in obj1) {
obj3[attrname] = obj1[attrname];
}
for (var _attrname in obj2) {
obj3[_attrname] = obj2[_attrname];
}
return obj3;
}
});
L.geodesic = function (latlngs, options) {
return new L.Geodesic(latlngs, options);
};
/***/ }),
/***/ "./public/assets/vendor/leaflet-plugins/leaflet.rotatedMarker.js":
/***/ (function(module, exports) {
(function () {
// save these original methods before they are overwritten
var proto_initIcon = L.Marker.prototype._initIcon;
var proto_setPos = L.Marker.prototype._setPos;
var oldIE = L.DomUtil.TRANSFORM === 'msTransform';
L.Marker.addInitHook(function () {
var iconOptions = this.options.icon && this.options.icon.options;
var iconAnchor = iconOptions && this.options.icon.options.iconAnchor;
if (iconAnchor) {
iconAnchor = iconAnchor[0] + 'px ' + iconAnchor[1] + 'px';
}
this.options.rotationOrigin = this.options.rotationOrigin || iconAnchor || 'center bottom';
this.options.rotationAngle = this.options.rotationAngle || 0;
// Ensure marker keeps rotated during dragging
this.on('drag', function (e) {
e.target._applyRotation();
});
});
L.Marker.include({
_initIcon: function _initIcon() {
proto_initIcon.call(this);
},
_setPos: function _setPos(pos) {
proto_setPos.call(this, pos);
this._applyRotation();
},
_applyRotation: function _applyRotation() {
if (this.options.rotationAngle) {
this._icon.style[L.DomUtil.TRANSFORM + 'Origin'] = this.options.rotationOrigin;
if (oldIE) {
// for IE 9, use the 2D rotation
this._icon.style[L.DomUtil.TRANSFORM] = 'rotate(' + this.options.rotationAngle + 'deg)';
} else {
// for modern browsers, prefer the 3D accelerated version
this._icon.style[L.DomUtil.TRANSFORM] += ' rotateZ(' + this.options.rotationAngle + 'deg)';
}
}
},
setRotationAngle: function setRotationAngle(angle) {
this.options.rotationAngle = angle;
this.update();
return this;
},
setRotationOrigin: function setRotationOrigin(origin) {
this.options.rotationOrigin = origin;
this.update();
return this;
}
});
})();
/***/ }),
/***/ "./public/assets/vendor/leaflet/dist/leaflet.js":
/***/ (function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/* @preserve
* Leaflet 1.2.0, a JS library for interactive maps. http://leafletjs.com
* (c) 2010-2017 Vladimir Agafonkin, (c) 2010-2011 CloudMade
*/
!function (t, i) {
"object" == ( false ? "undefined" : _typeof(exports)) && "undefined" != typeof module ? i(exports) : true ? !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (i),
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : i(t.L = {});
}(this, function (t) {
"use strict";
function i(t) {
var i, e, n, o;for (e = 1, n = arguments.length; e < n; e++) {
o = arguments[e];for (i in o) {
t[i] = o[i];
}
}return t;
}function e(t, i) {
var e = Array.prototype.slice;if (t.bind) return t.bind.apply(t, e.call(arguments, 1));var n = e.call(arguments, 2);return function () {
return t.apply(i, n.length ? n.concat(e.call(arguments)) : arguments);
};
}function n(t) {
return t._leaflet_id = t._leaflet_id || ++ti, t._leaflet_id;
}function o(t, i, e) {
var n, o, s, r;return r = function r() {
n = !1, o && (s.apply(e, o), o = !1);
}, s = function s() {
n ? o = arguments : (t.apply(e, arguments), setTimeout(r, i), n = !0);
};
}function s(t, i, e) {
var n = i[1],
o = i[0],
s = n - o;return t === n && e ? t : ((t - o) % s + s) % s + o;
}function r() {
return !1;
}function a(t, i) {
var e = Math.pow(10, i || 5);return Math.round(t * e) / e;
}function h(t) {
return t.trim ? t.trim() : t.replace(/^\s+|\s+$/g, "");
}function u(t) {
return h(t).split(/\s+/);
}function l(t, i) {
t.hasOwnProperty("options") || (t.options = t.options ? Qt(t.options) : {});for (var e in i) {
t.options[e] = i[e];
}return t.options;
}function c(t, i, e) {
var n = [];for (var o in t) {
n.push(encodeURIComponent(e ? o.toUpperCase() : o) + "=" + encodeURIComponent(t[o]));
}return (i && -1 !== i.indexOf("?") ? "&" : "?") + n.join("&");
}function _(t, i) {
return t.replace(ii, function (t, e) {
var n = i[e];if (void 0 === n) throw new Error("No value provided for variable " + t);return "function" == typeof n && (n = n(i)), n;
});
}function d(t, i) {
for (var e = 0; e < t.length; e++) {
if (t[e] === i) return e;
}return -1;
}function p(t) {
return window["webkit" + t] || window["moz" + t] || window["ms" + t];
}function m(t) {
var i = +new Date(),
e = Math.max(0, 16 - (i - oi));return oi = i + e, window.setTimeout(t, e);
}function f(t, i, n) {
if (!n || si !== m) return si.call(window, e(t, i));t.call(i);
}function g(t) {
t && ri.call(window, t);
}function v() {}function y(t) {
if (L && L.Mixin) {
t = ei(t) ? t : [t];for (var i = 0; i < t.length; i++) {
t[i] === L.Mixin.Events && console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.", new Error().stack);
}
}
}function x(t, i, e) {
this.x = e ? Math.round(t) : t, this.y = e ? Math.round(i) : i;
}function w(t, i, e) {
return t instanceof x ? t : ei(t) ? new x(t[0], t[1]) : void 0 === t || null === t ? t : "object" == (typeof t === "undefined" ? "undefined" : _typeof(t)) && "x" in t && "y" in t ? new x(t.x, t.y) : new x(t, i, e);
}function P(t, i) {
if (t) for (var e = i ? [t, i] : t, n = 0, o = e.length; n < o; n++) {
this.extend(e[n]);
}
}function b(t, i) {
return !t || t instanceof P ? t : new P(t, i);
}function T(t, i) {
if (t) for (var e = i ? [t, i] : t, n = 0, o = e.length; n < o; n++) {
this.extend(e[n]);
}
}function z(t, i) {
return t instanceof T ? t : new T(t, i);
}function M(t, i, e) {
if (isNaN(t) || isNaN(i)) throw new Error("Invalid LatLng object: (" + t + ", " + i + ")");this.lat = +t, this.lng = +i, void 0 !== e && (this.alt = +e);
}function C(t, i, e) {
return t instanceof M ? t : ei(t) && "object" != _typeof(t[0]) ? 3 === t.length ? new M(t[0], t[1], t[2]) : 2 === t.length ? new M(t[0], t[1]) : null : void 0 === t || null === t ? t : "object" == (typeof t === "undefined" ? "undefined" : _typeof(t)) && "lat" in t ? new M(t.lat, "lng" in t ? t.lng : t.lon, t.alt) : void 0 === i ? null : new M(t, i, e);
}function Z(t, i, e, n) {
if (ei(t)) return this._a = t[0], this._b = t[1], this._c = t[2], void (this._d = t[3]);this._a = t, this._b = i, this._c = e, this._d = n;
}function E(t, i, e, n) {
return new Z(t, i, e, n);
}function S(t) {
return document.createElementNS("http://www.w3.org/2000/svg", t);
}function k(t, i) {
var e,
n,
o,
s,
r,
a,
h = "";for (e = 0, o = t.length; e < o; e++) {
for (n = 0, s = (r = t[e]).length; n < s; n++) {
a = r[n], h += (n ? "L" : "M") + a.x + " " + a.y;
}h += i ? qi ? "z" : "x" : "";
}return h || "M0 0";
}function B(t) {
return navigator.userAgent.toLowerCase().indexOf(t) >= 0;
}function I(t, i, e, n) {
return "touchstart" === i ? O(t, e, n) : "touchmove" === i ? W(t, e, n) : "touchend" === i && H(t, e, n), this;
}function A(t, i, e) {
var n = t["_leaflet_" + i + e];return "touchstart" === i ? t.removeEventListener(Xi, n, !1) : "touchmove" === i ? t.removeEventListener(Ji, n, !1) : "touchend" === i && (t.removeEventListener($i, n, !1), t.removeEventListener(Qi, n, !1)), this;
}function O(t, i, n) {
var o = e(function (t) {
if ("mouse" !== t.pointerType && t.pointerType !== t.MSPOINTER_TYPE_MOUSE && t.pointerType !== t.MSPOINTER_TYPE_MOUSE) {
if (!(te.indexOf(t.target.tagName) < 0)) return;$(t);
}j(t, i);
});t["_leaflet_touchstart" + n] = o, t.addEventListener(Xi, o, !1), ee || (document.documentElement.addEventListener(Xi, R, !0), document.documentElement.addEventListener(Ji, D, !0), document.documentElement.addEventListener($i, N, !0), document.documentElement.addEventListener(Qi, N, !0), ee = !0);
}function R(t) {
ie[t.pointerId] = t, ne++;
}function D(t) {
ie[t.pointerId] && (ie[t.pointerId] = t);
}function N(t) {
delete ie[t.pointerId], ne--;
}function j(t, i) {
t.touches = [];for (var e in ie) {
t.touches.push(ie[e]);
}t.changedTouches = [t], i(t);
}function W(t, i, e) {
var n = function n(t) {
(t.pointerType !== t.MSPOINTER_TYPE_MOUSE && "mouse" !== t.pointerType || 0 !== t.buttons) && j(t, i);
};t["_leaflet_touchmove" + e] = n, t.addEventListener(Ji, n, !1);
}function H(t, i, e) {
var n = function n(t) {
j(t, i);
};t["_leaflet_touchend" + e] = n, t.addEventListener($i, n, !1), t.addEventListener(Qi, n, !1);
}function F(t, i, e) {
function n(t) {
var i;if (Wi) {
if (!Li || "mouse" === t.pointerType) return;i = ne;
} else i = t.touches.length;if (!(i > 1)) {
var e = Date.now(),
n = e - (s || e);r = t.touches ? t.touches[0] : t, a = n > 0 && n <= h, s = e;
}
}function o(t) {
if (a && !r.cancelBubble) {
if (Wi) {
if (!Li || "mouse" === t.pointerType) return;var e,
n,
o = {};for (n in r) {
e = r[n], o[n] = e && e.bind ? e.bind(r) : e;
}r = o;
}r.type = "dblclick", i(r), s = null;
}
}var s,
r,
a = !1,
h = 250;return t[re + oe + e] = n, t[re + se + e] = o, t[re + "dblclick" + e] = i, t.addEventListener(oe, n, !1), t.addEventListener(se, o, !1), t.addEventListener("dblclick", i, !1), this;
}function U(t, i) {
var e = t[re + oe + i],
n = t[re + se + i],
o = t[re + "dblclick" + i];return t.removeEventListener(oe, e, !1), t.removeEventListener(se, n, !1), Li || t.removeEventListener("dblclick", o, !1), this;
}function V(t, i, e, n) {
if ("object" == (typeof i === "undefined" ? "undefined" : _typeof(i))) for (var o in i) {
q(t, o, i[o], e);
} else for (var s = 0, r = (i = u(i)).length; s < r; s++) {
q(t, i[s], e, n);
}return this;
}function G(t, i, e, n) {
if ("object" == (typeof i === "undefined" ? "undefined" : _typeof(i))) for (var o in i) {
K(t, o, i[o], e);
} else if (i) for (var s = 0, r = (i = u(i)).length; s < r; s++) {
K(t, i[s], e, n);
} else {
for (var a in t[ae]) {
K(t, a, t[ae][a]);
}delete t[ae];
}return this;
}function q(t, i, e, o) {
var s = i + n(e) + (o ? "_" + n(o) : "");if (t[ae] && t[ae][s]) return this;var r = function r(i) {
return e.call(o || t, i || window.event);
},
a = r;Wi && 0 === i.indexOf("touch") ? I(t, i, r, s) : !Hi || "dblclick" !== i || !F || Wi && Mi ? "addEventListener" in t ? "mousewheel" === i ? t.addEventListener("onwheel" in t ? "wheel" : "mousewheel", r, !1) : "mouseenter" === i || "mouseleave" === i ? (r = function r(i) {
i = i || window.event, ot(t, i) && a(i);
}, t.addEventListener("mouseenter" === i ? "mouseover" : "mouseout", r, !1)) : ("click" === i && bi && (r = function r(t) {
st(t, a);
}), t.addEventListener(i, r, !1)) : "attachEvent" in t && t.attachEvent("on" + i, r) : F(t, r, s), t[ae] = t[ae] || {}, t[ae][s] = r;
}function K(t, i, e, o) {
var s = i + n(e) + (o ? "_" + n(o) : ""),
r = t[ae] && t[ae][s];if (!r) return this;Wi && 0 === i.indexOf("touch") ? A(t, i, s) : Hi && "dblclick" === i && U ? U(t, s) : "removeEventListener" in t ? "mousewheel" === i ? t.removeEventListener("onwheel" in t ? "wheel" : "mousewheel", r, !1) : t.removeEventListener("mouseenter" === i ? "mouseover" : "mouseleave" === i ? "mouseout" : i, r, !1) : "detachEvent" in t && t.detachEvent("on" + i, r), t[ae][s] = null;
}function Y(t) {
return t.stopPropagation ? t.stopPropagation() : t.originalEvent ? t.originalEvent._stopped = !0 : t.cancelBubble = !0, nt(t), this;
}function X(t) {
return q(t, "mousewheel", Y), this;
}function J(t) {
return V(t, "mousedown touchstart dblclick", Y), q(t, "click", et), this;
}function $(t) {
return t.preventDefault ? t.preventDefault() : t.returnValue = !1, this;
}function Q(t) {
return $(t), Y(t), this;
}function tt(t, i) {
if (!i) return new x(t.clientX, t.clientY);var e = i.getBoundingClientRect();return new x(t.clientX - e.left - i.clientLeft, t.clientY - e.top - i.clientTop);
}function it(t) {
return Li ? t.wheelDeltaY / 2 : t.deltaY && 0 === t.deltaMode ? -t.deltaY / he : t.deltaY && 1 === t.deltaMode ? 20 * -t.deltaY : t.deltaY && 2 === t.deltaMode ? 60 * -t.deltaY : t.deltaX || t.deltaZ ? 0 : t.wheelDelta ? (t.wheelDeltaY || t.wheelDelta) / 2 : t.detail && Math.abs(t.detail) < 32765 ? 20 * -t.detail : t.detail ? t.detail / -32765 * 60 : 0;
}function et(t) {
ue[t.type] = !0;
}function nt(t) {
var i = ue[t.type];return ue[t.type] = !1, i;
}function ot(t, i) {
var e = i.relatedTarget;if (!e) return !0;try {
for (; e && e !== t;) {
e = e.parentNode;
}
} catch (t) {
return !1;
}return e !== t;
}function st(t, i) {
var e = t.timeStamp || t.originalEvent && t.originalEvent.timeStamp,
n = di && e - di;n && n > 100 && n < 500 || t.target._simulatedClick && !t._simulated ? Q(t) : (di = e, i(t));
}function rt(t) {
return "string" == typeof t ? document.getElementById(t) : t;
}function at(t, i) {
var e = t.style[i] || t.currentStyle && t.currentStyle[i];if ((!e || "auto" === e) && document.defaultView) {
var n = document.defaultView.getComputedStyle(t, null);e = n ? n[i] : null;
}return "auto" === e ? null : e;
}function ht(t, i, e) {
var n = document.createElement(t);return n.className = i || "", e && e.appendChild(n), n;
}function ut(t) {
var i = t.parentNode;i && i.removeChild(t);
}function lt(t) {
for (; t.firstChild;) {
t.removeChild(t.firstChild);
}
}function ct(t) {
var i = t.parentNode;i.lastChild !== t && i.appendChild(t);
}function _t(t) {
var i = t.parentNode;i.firstChild !== t && i.insertBefore(t, i.firstChild);
}function dt(t, i) {
if (void 0 !== t.classList) return t.classList.contains(i);var e = gt(t);return e.length > 0 && new RegExp("(^|\\s)" + i + "(\\s|$)").test(e);
}function pt(t, i) {
if (void 0 !== t.classList) for (var e = u(i), n = 0, o = e.length; n < o; n++) {
t.classList.add(e[n]);
} else if (!dt(t, i)) {
var s = gt(t);ft(t, (s ? s + " " : "") + i);
}
}function mt(t, i) {
void 0 !== t.classList ? t.classList.remove(i) : ft(t, h((" " + gt(t) + " ").replace(" " + i + " ", " ")));
}function ft(t, i) {
void 0 === t.className.baseVal ? t.className = i : t.className.baseVal = i;
}function gt(t) {
return void 0 === t.className.baseVal ? t.className : t.className.baseVal;
}function vt(t, i) {
"opacity" in t.style ? t.style.opacity = i : "filter" in t.style && yt(t, i);
}function yt(t, i) {
var e = !1,
n = "DXImageTransform.Microsoft.Alpha";try {
e = t.filters.item(n);
} catch (t) {
if (1 === i) return;
}i = Math.round(100 * i), e ? (e.Enabled = 100 !== i, e.Opacity = i) : t.style.filter += " progid:" + n + "(opacity=" + i + ")";
}function xt(t) {
for (var i = document.documentElement.style, e = 0; e < t.length; e++) {
if (t[e] in i) return t[e];
}return !1;
}function wt(t, i, e) {
var n = i || new x(0, 0);t.style[ce] = (Bi ? "translate(" + n.x + "px," + n.y + "px)" : "translate3d(" + n.x + "px," + n.y + "px,0)") + (e ? " scale(" + e + ")" : "");
}function Lt(t, i) {
t._leaflet_pos = i, Oi ? wt(t, i) : (t.style.left = i.x + "px", t.style.top = i.y + "px");
}function Pt(t) {
return t._leaflet_pos || new x(0, 0);
}function bt() {
V(window, "dragstart", $);
}function Tt() {
G(window, "dragstart", $);
}function zt(t) {
for (; -1 === t.tabIndex;) {
t = t.parentNode;
}t.style && (Mt(), me = t, fe = t.style.outline, t.style.outline = "none", V(window, "keydown", Mt));
}function Mt() {
me && (me.style.outline = fe, me = void 0, fe = void 0, G(window, "keydown", Mt));
}function Ct(t, i) {
if (!i || !t.length) return t.slice();var e = i * i;return t = kt(t, e), t = Et(t, e);
}function Zt(t, i, e) {
return Math.sqrt(Rt(t, i, e, !0));
}function Et(t, i) {
var e = t.length,
n = new ((typeof Uint8Array === "undefined" ? "undefined" : _typeof(Uint8Array)) != void 0 + "" ? Uint8Array : Array)(e);n[0] = n[e - 1] = 1, St(t, n, i, 0, e - 1);var o,
s = [];for (o = 0; o < e; o++) {
n[o] && s.push(t[o]);
}return s;
}function St(t, i, e, n, o) {
var s,
r,
a,
h = 0;for (r = n + 1; r <= o - 1; r++) {
(a = Rt(t[r], t[n], t[o], !0)) > h && (s = r, h = a);
}h > e && (i[s] = 1, St(t, i, e, n, s), St(t, i, e, s, o));
}function kt(t, i) {
for (var e = [t[0]], n = 1, o = 0, s = t.length; n < s; n++) {
Ot(t[n], t[o]) > i && (e.push(t[n]), o = n);
}return o < s - 1 && e.push(t[s - 1]), e;
}function Bt(t, i, e, n, o) {
var s,
r,
a,
h = n ? ze : At(t, e),
u = At(i, e);for (ze = u;;) {
if (!(h | u)) return [t, i];if (h & u) return !1;a = At(r = It(t, i, s = h || u, e, o), e), s === h ? (t = r, h = a) : (i = r, u = a);
}
}function It(t, i, e, n, o) {
var s,
r,
a = i.x - t.x,
h = i.y - t.y,
u = n.min,
l = n.max;return 8 & e ? (s = t.x + a * (l.y - t.y) / h, r = l.y) : 4 & e ? (s = t.x + a * (u.y - t.y) / h, r = u.y) : 2 & e ? (s = l.x, r = t.y + h * (l.x - t.x) / a) : 1 & e && (s = u.x, r = t.y + h * (u.x - t.x) / a), new x(s, r, o);
}function At(t, i) {
var e = 0;return t.x < i.min.x ? e |= 1 : t.x > i.max.x && (e |= 2), t.y < i.min.y ? e |= 4 : t.y > i.max.y && (e |= 8), e;
}function Ot(t, i) {
var e = i.x - t.x,
n = i.y - t.y;return e * e + n * n;
}function Rt(t, i, e, n) {
var o,
s = i.x,
r = i.y,
a = e.x - s,
h = e.y - r,
u = a * a + h * h;return u > 0 && ((o = ((t.x - s) * a + (t.y - r) * h) / u) > 1 ? (s = e.x, r = e.y) : o > 0 && (s += a * o, r += h * o)), a = t.x - s, h = t.y - r, n ? a * a + h * h : new x(s, r);
}function Dt(t) {
return !ei(t[0]) || "object" != _typeof(t[0][0]) && void 0 !== t[0][0];
}function Nt(t) {
return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."), Dt(t);
}function jt(t, i, e) {
var n,
o,
s,
r,
a,
h,
u,
l,
c,
_ = [1, 4, 2, 8];for (o = 0, u = t.length; o < u; o++) {
t[o]._code = At(t[o], i);
}for (r = 0; r < 4; r++) {
for (l = _[r], n = [], o = 0, s = (u = t.length) - 1; o < u; s = o++) {
a = t[o], h = t[s], a._code & l ? h._code & l || ((c = It(h, a, l, i, e))._code = At(c, i), n.push(c)) : (h._code & l && ((c = It(h, a, l, i, e))._code = At(c, i), n.push(c)), n.push(a));
}t = n;
}return t;
}function Wt(t, i) {
var e,
n,
o,
s,
r = "Feature" === t.type ? t.geometry : t,
a = r ? r.coordinates : null,
h = [],
u = i && i.pointToLayer,
l = i && i.coordsToLatLng || Ht;if (!a && !r) return null;switch (r.type) {case "Point":
return e = l(a), u ? u(t, e) : new qe(e);case "MultiPoint":
for (o = 0, s = a.length; o < s; o++) {
e = l(a[o]), h.push(u ? u(t, e) : new qe(e));
}return new Fe(h);case "LineString":case "MultiLineString":
return n = Ft(a, "LineString" === r.type ? 0 : 1, l), new Je(n, i);case "Polygon":case "MultiPolygon":
return n = Ft(a, "Polygon" === r.type ? 1 : 2, l), new $e(n, i);case "GeometryCollection":
for (o = 0, s = r.geometries.length; o < s; o++) {
var c = Wt({ geometry: r.geometries[o], type: "Feature", properties: t.properties }, i);c && h.push(c);
}return new Fe(h);default:
throw new Error("Invalid GeoJSON object.");}
}function Ht(t) {
return new M(t[1], t[0], t[2]);
}function Ft(t, i, e) {
for (var n, o = [], s = 0, r = t.length; s < r; s++) {
n = i ? Ft(t[s], i - 1, e) : (e || Ht)(t[s]), o.push(n);
}return o;
}function Ut(t, i) {
return i = "number" == typeof i ? i : 6, void 0 !== t.alt ? [a(t.lng, i), a(t.lat, i), a(t.alt, i)] : [a(t.lng, i), a(t.lat, i)];
}function Vt(t, i, e, n) {
for (var o = [], s = 0, r = t.length; s < r; s++) {
o.push(i ? Vt(t[s], i - 1, e, n) : Ut(t[s], n));
}return !i && e && o.push(o[0]), o;
}function Gt(t, e) {
return t.feature ? i({}, t.feature, { geometry: e }) : qt(e);
}function qt(t) {
return "Feature" === t.type || "FeatureCollection" === t.type ? t : { type: "Feature", properties: {}, geometry: t };
}function Kt(t, i) {
return new Qe(t, i);
}function Yt(t, i) {
return new ln(t, i);
}function Xt(t) {
return Gi ? new dn(t) : null;
}function Jt(t) {
return qi || Ki ? new gn(t) : null;
}var $t = Object.freeze;Object.freeze = function (t) {
return t;
};var Qt = Object.create || function () {
function t() {}return function (i) {
return t.prototype = i, new t();
};
}(),
ti = 0,
ii = /\{ *([\w_\-]+) *\}/g,
ei = Array.isArray || function (t) {
return "[object Array]" === Object.prototype.toString.call(t);
},
ni = "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",
oi = 0,
si = window.requestAnimationFrame || p("RequestAnimationFrame") || m,
ri = window.cancelAnimationFrame || p("CancelAnimationFrame") || p("CancelRequestAnimationFrame") || function (t) {
window.clearTimeout(t);
},
ai = (Object.freeze || Object)({ freeze: $t, extend: i, create: Qt, bind: e, lastId: ti, stamp: n, throttle: o, wrapNum: s, falseFn: r, formatNum: a, trim: h, splitWords: u, setOptions: l, getParamString: c, template: _, isArray: ei, indexOf: d, emptyImageUrl: ni, requestFn: si, cancelFn: ri, requestAnimFrame: f, cancelAnimFrame: g });v.extend = function (t) {
var e = function e() {
this.initialize && this.initialize.apply(this, arguments), this.callInitHooks();
},
n = e.__super__ = this.prototype,
o = Qt(n);o.constructor = e, e.prototype = o;for (var s in this) {
this.hasOwnProperty(s) && "prototype" !== s && "__super__" !== s && (e[s] = this[s]);
}return t.statics && (i(e, t.statics), delete t.statics), t.includes && (y(t.includes), i.apply(null, [o].concat(t.includes)), delete t.includes), o.options && (t.options = i(Qt(o.options), t.options)), i(o, t), o._initHooks = [], o.callInitHooks = function () {
if (!this._initHooksCalled) {
n.callInitHooks && n.callInitHooks.call(this), this._initHooksCalled = !0;for (var t = 0, i = o._initHooks.length; t < i; t++) {
o._initHooks[t].call(this);
}
}
}, e;
}, v.include = function (t) {
return i(this.prototype, t), this;
}, v.mergeOptions = function (t) {
return i(this.prototype.options, t), this;
}, v.addInitHook = function (t) {
var i = Array.prototype.slice.call(arguments, 1),
e = "function" == typeof t ? t : function () {
this[t].apply(this, i);
};return this.prototype._initHooks = this.prototype._initHooks || [], this.prototype._initHooks.push(e), this;
};var hi = { on: function on(t, i, e) {
if ("object" == (typeof t === "undefined" ? "undefined" : _typeof(t))) for (var n in t) {
this._on(n, t[n], i);
} else for (var o = 0, s = (t = u(t)).length; o < s; o++) {
this._on(t[o], i, e);
}return this;
}, off: function off(t, i, e) {
if (t) {
if ("object" == (typeof t === "undefined" ? "undefined" : _typeof(t))) for (var n in t) {
this._off(n, t[n], i);
} else for (var o = 0, s = (t = u(t)).length; o < s; o++) {
this._off(t[o], i, e);
}
} else delete this._events;return this;
}, _on: function _on(t, i, e) {
this._events = this._events || {};var n = this._events[t];n || (n = [], this._events[t] = n), e === this && (e = void 0);for (var o = { fn: i, ctx: e }, s = n, r = 0, a = s.length; r < a; r++) {
if (s[r].fn === i && s[r].ctx === e) return;
}s.push(o);
}, _off: function _off(t, i, e) {
var n, o, s;if (this._events && (n = this._events[t])) if (i) {
if (e === this && (e = void 0), n) for (o = 0, s = n.length; o < s; o++) {
var a = n[o];if (a.ctx === e && a.fn === i) return a.fn = r, this._firingCount && (this._events[t] = n = n.slice()), void n.splice(o, 1);
}
} else {
for (o = 0, s = n.length; o < s; o++) {
n[o].fn = r;
}delete this._events[t];
}
}, fire: function fire(t, e, n) {
if (!this.listens(t, n)) return this;var o = i({}, e, { type: t, target: this });if (this._events) {
var s = this._events[t];if (s) {
this._firingCount = this._firingCount + 1 || 1;for (var r = 0, a = s.length; r < a; r++) {
var h = s[r];h.fn.call(h.ctx || this, o);
}this._firingCount--;
}
}return n && this._propagateEvent(o), this;
}, listens: function listens(t, i) {
var e = this._events && this._events[t];if (e && e.length) return !0;if (i) for (var n in this._eventParents) {
if (this._eventParents[n].listens(t, i)) return !0;
}return !1;
}, once: function once(t, i, n) {
if ("object" == (typeof t === "undefined" ? "undefined" : _typeof(t))) {
for (var o in t) {
this.once(o, t[o], i);
}return this;
}var s = e(function () {
this.off(t, i, n).off(t, s, n);
}, this);return this.on(t, i, n).on(t, s, n);
}, addEventParent: function addEventParent(t) {
return this._eventParents = this._eventParents || {}, this._eventParents[n(t)] = t, this;
}, removeEventParent: function removeEventParent(t) {
return this._eventParents && delete this._eventParents[n(t)], this;
}, _propagateEvent: function _propagateEvent(t) {
for (var e in this._eventParents) {
this._eventParents[e].fire(t.type, i({ layer: t.target }, t), !0);
}
} };hi.addEventListener = hi.on, hi.removeEventListener = hi.clearAllEventListeners = hi.off, hi.addOneTimeEventListener = hi.once, hi.fireEvent = hi.fire, hi.hasEventListeners = hi.listens;var ui = v.extend(hi);x.prototype = { clone: function clone() {
return new x(this.x, this.y);
}, add: function add(t) {
return this.clone()._add(w(t));
}, _add: function _add(t) {
return this.x += t.x, this.y += t.y, this;
}, subtract: function subtract(t) {
return this.clone()._subtract(w(t));
}, _subtract: function _subtract(t) {
return this.x -= t.x, this.y -= t.y, this;
}, divideBy: function divideBy(t) {
return this.clone()._divideBy(t);
}, _divideBy: function _divideBy(t) {
return this.x /= t, this.y /= t, this;
}, multiplyBy: function multiplyBy(t) {
return this.clone()._multiplyBy(t);
}, _multiplyBy: function _multiplyBy(t) {
return this.x *= t, this.y *= t, this;
}, scaleBy: function scaleBy(t) {
return new x(this.x * t.x, this.y * t.y);
}, unscaleBy: function unscaleBy(t) {
return new x(this.x / t.x, this.y / t.y);
}, round: function round() {
return this.clone()._round();
}, _round: function _round() {
return this.x = Math.round(this.x), this.y = Math.round(this.y), this;
}, floor: function floor() {
return this.clone()._floor();
}, _floor: function _floor() {
return this.x = Math.floor(this.x), this.y = Math.floor(this.y), this;
}, ceil: function ceil() {
return this.clone()._ceil();
}, _ceil: function _ceil() {
return this.x = Math.ceil(this.x), this.y = Math.ceil(this.y), this;
}, distanceTo: function distanceTo(t) {
var i = (t = w(t)).x - this.x,
e = t.y - this.y;return Math.sqrt(i * i + e * e);
}, equals: function equals(t) {
return (t = w(t)).x === this.x && t.y === this.y;
}, contains: function contains(t) {
return t = w(t), Math.abs(t.x) <= Math.abs(this.x) && Math.abs(t.y) <= Math.abs(this.y);
}, toString: function toString() {
return "Point(" + a(this.x) + ", " + a(this.y) + ")";
} }, P.prototype = { extend: function extend(t) {
return t = w(t), this.min || this.max ? (this.min.x = Math.min(t.x, this.min.x), this.max.x = Math.max(t.x, this.max.x), this.min.y = Math.min(t.y, this.min.y), this.max.y = Math.max(t.y, this.max.y)) : (this.min = t.clone(), this.max = t.clone()), this;
}, getCenter: function getCenter(t) {
return new x((this.min.x + this.max.x) / 2, (this.min.y + this.max.y) / 2, t);
}, getBottomLeft: function getBottomLeft() {
return new x(this.min.x, this.max.y);
}, getTopRight: function getTopRight() {
return new x(this.max.x, this.min.y);
}, getTopLeft: function getTopLeft() {
return this.min;
}, getBottomRight: function getBottomRight() {
return this.max;
}, getSize: function getSize() {
return this.max.subtract(this.min);
}, contains: function contains(t) {
var i, e;return (t = "number" == typeof t[0] || t instanceof x ? w(t) : b(t)) instanceof P ? (i = t.min, e = t.max) : i = e = t, i.x >= this.min.x && e.x <= this.max.x && i.y >= this.min.y && e.y <= this.max.y;
}, intersects: function intersects(t) {
t = b(t);var i = this.min,
e = this.max,
n = t.min,
o = t.max,
s = o.x >= i.x && n.x <= e.x,
r = o.y >= i.y && n.y <= e.y;return s && r;
}, overlaps: function overlaps(t) {
t = b(t);var i = this.min,
e = this.max,
n = t.min,
o = t.max,
s = o.x > i.x && n.x < e.x,
r = o.y > i.y && n.y < e.y;return s && r;
}, isValid: function isValid() {
return !(!this.min || !this.max);
} }, T.prototype = { extend: function extend(t) {
var i,
e,
n = this._southWest,
o = this._northEast;if (t instanceof M) i = t, e = t;else {
if (!(t instanceof T)) return t ? this.extend(C(t) || z(t)) : this;if (i = t._southWest, e = t._northEast, !i || !e) return this;
}return n || o ? (n.lat = Math.min(i.lat, n.lat), n.lng = Math.min(i.lng, n.lng), o.lat = Math.max(e.lat, o.lat), o.lng = Math.max(e.lng, o.lng)) : (this._southWest = new M(i.lat, i.lng), this._northEast = new M(e.lat, e.lng)), this;
}, pad: function pad(t) {
var i = this._southWest,
e = this._northEast,
n = Math.abs(i.lat - e.lat) * t,
o = Math.abs(i.lng - e.lng) * t;return new T(new M(i.lat - n, i.lng - o), new M(e.lat + n, e.lng + o));
}, getCenter: function getCenter() {
return new M((this._southWest.lat + this._northEast.lat) / 2, (this._southWest.lng + this._northEast.lng) / 2);
}, getSouthWest: function getSouthWest() {
return this._southWest;
}, getNorthEast: function getNorthEast() {
return this._northEast;
}, getNorthWest: function getNorthWest() {
return new M(this.getNorth(), this.getWest());
}, getSouthEast: function getSouthEast() {
return new M(this.getSouth(), this.getEast());
}, getWest: function getWest() {
return this._southWest.lng;
}, getSouth: function getSouth() {
return this._southWest.lat;
}, getEast: function getEast() {
return this._northEast.lng;
}, getNorth: function getNorth() {
return this._northEast.lat;
}, contains: function contains(t) {
t = "number" == typeof t[0] || t instanceof M || "lat" in t ? C(t) : z(t);var i,
e,
n = this._southWest,
o = this._northEast;return t instanceof T ? (i = t.getSouthWest(), e = t.getNorthEast()) : i = e = t, i.lat >= n.lat && e.lat <= o.lat && i.lng >= n.lng && e.lng <= o.lng;
}, intersects: function intersects(t) {
t = z(t);var i = this._southWest,
e = this._northEast,
n = t.getSouthWest(),
o = t.getNorthEast(),
s = o.lat >= i.lat && n.lat <= e.lat,
r = o.lng >= i.lng && n.lng <= e.lng;return s && r;
}, overlaps: function overlaps(t) {
t = z(t);var i = this._southWest,
e = this._northEast,
n = t.getSouthWest(),
o = t.getNorthEast(),
s = o.lat > i.lat && n.lat < e.lat,
r = o.lng > i.lng && n.lng < e.lng;return s && r;
}, toBBoxString: function toBBoxString() {
return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(",");
}, equals: function equals(t, i) {
return !!t && (t = z(t), this._southWest.equals(t.getSouthWest(), i) && this._northEast.equals(t.getNorthEast(), i));
}, isValid: function isValid() {
return !(!this._southWest || !this._northEast);
} }, M.prototype = { equals: function equals(t, i) {
return !!t && (t = C(t), Math.max(Math.abs(this.lat - t.lat), Math.abs(this.lng - t.lng)) <= (void 0 === i ? 1e-9 : i));
}, toString: function toString(t) {
return "LatLng(" + a(this.lat, t) + ", " + a(this.lng, t) + ")";
}, distanceTo: function distanceTo(t) {
return ci.distance(this, C(t));
}, wrap: function wrap() {
return ci.wrapLatLng(this);
}, toBounds: function toBounds(t) {
var i = 180 * t / 40075017,
e = i / Math.cos(Math.PI / 180 * this.lat);return z([this.lat - i, this.lng - e], [this.lat + i, this.lng + e]);
}, clone: function clone() {
return new M(this.lat, this.lng, this.alt);
} };var li = { latLngToPoint: function latLngToPoint(t, i) {
var e = this.projection.project(t),
n = this.scale(i);return this.transformation._transform(e, n);
}, pointToLatLng: function pointToLatLng(t, i) {
var e = this.scale(i),
n = this.transformation.untransform(t, e);return this.projection.unproject(n);
}, project: function project(t) {
return this.projection.project(t);
}, unproject: function unproject(t) {
return this.projection.unproject(t);
}, scale: function scale(t) {
return 256 * Math.pow(2, t);
}, zoom: function zoom(t) {
return Math.log(t / 256) / Math.LN2;
}, getProjectedBounds: function getProjectedBounds(t) {
if (this.infinite) return null;var i = this.projection.bounds,
e = this.scale(t);return new P(this.transformation.transform(i.min, e), this.transformation.transform(i.max, e));
}, infinite: !1, wrapLatLng: function wrapLatLng(t) {
var i = this.wrapLng ? s(t.lng, this.wrapLng, !0) : t.lng;return new M(this.wrapLat ? s(t.lat, this.wrapLat, !0) : t.lat, i, t.alt);
}, wrapLatLngBounds: function wrapLatLngBounds(t) {
var i = t.getCenter(),
e = this.wrapLatLng(i),
n = i.lat - e.lat,
o = i.lng - e.lng;if (0 === n && 0 === o) return t;var s = t.getSouthWest(),
r = t.getNorthEast();return new T(new M(s.lat - n, s.lng - o), new M(r.lat - n, r.lng - o));
} },
ci = i({}, li, { wrapLng: [-180, 180], R: 6371e3, distance: function distance(t, i) {
var e = Math.PI / 180,
n = t.lat * e,
o = i.lat * e,
s = Math.sin(n) * Math.sin(o) + Math.cos(n) * Math.cos(o) * Math.cos((i.lng - t.lng) * e);return this.R * Math.acos(Math.min(s, 1));
} }),
_i = { R: 6378137, MAX_LATITUDE: 85.0511287798, project: function project(t) {
var i = Math.PI / 180,
e = this.MAX_LATITUDE,
n = Math.max(Math.min(e, t.lat), -e),
o = Math.sin(n * i);return new x(this.R * t.lng * i, this.R * Math.log((1 + o) / (1 - o)) / 2);
}, unproject: function unproject(t) {
var i = 180 / Math.PI;return new M((2 * Math.atan(Math.exp(t.y / this.R)) - Math.PI / 2) * i, t.x * i / this.R);
}, bounds: function () {
var t = 6378137 * Math.PI;return new P([-t, -t], [t, t]);
}() };Z.prototype = { transform: function transform(t, i) {
return this._transform(t.clone(), i);
}, _transform: function _transform(t, i) {
return i = i || 1, t.x = i * (this._a * t.x + this._b), t.y = i * (this._c * t.y + this._d), t;
}, untransform: function untransform(t, i) {
return i = i || 1, new x((t.x / i - this._b) / this._a, (t.y / i - this._d) / this._c);
} };var di,
pi,
mi,
fi,
gi = i({}, ci, { code: "EPSG:3857", projection: _i, transformation: function () {
var t = .5 / (Math.PI * _i.R);return E(t, .5, -t, .5);
}() }),
vi = i({}, gi, { code: "EPSG:900913" }),
yi = document.documentElement.style,
xi = "ActiveXObject" in window,
wi = xi && !document.addEventListener,
Li = "msLaunchUri" in navigator && !("documentMode" in document),
Pi = B("webkit"),
bi = B("android"),
Ti = B("android 2") || B("android 3"),
zi = !!window.opera,
Mi = B("chrome"),
Ci = B("gecko") && !Pi && !zi && !xi,
Zi = !Mi && B("safari"),
Ei = B("phantom"),
Si = "OTransition" in yi,
ki = 0 === navigator.platform.indexOf("Win"),
Bi = xi && "transition" in yi,
Ii = "WebKitCSSMatrix" in window && "m11" in new window.WebKitCSSMatrix() && !Ti,
Ai = "MozPerspective" in yi,
Oi = !window.L_DISABLE_3D && (Bi || Ii || Ai) && !Si && !Ei,
Ri = "undefined" != typeof orientation || B("mobile"),
Di = Ri && Pi,
Ni = Ri && Ii,
ji = !window.PointerEvent && window.MSPointerEvent,
Wi = !(!window.PointerEvent && !ji),
Hi = !window.L_NO_TOUCH && (Wi || "ontouchstart" in window || window.DocumentTouch && document instanceof window.DocumentTouch),
Fi = Ri && zi,
Ui = Ri && Ci,
Vi = (window.devicePixelRatio || window.screen.deviceXDPI / window.screen.logicalXDPI) > 1,
Gi = !!document.createElement("canvas").getContext,
qi = !(!document.createElementNS || !S("svg").createSVGRect),
Ki = !qi && function () {
try {
var t = document.createElement("div");t.innerHTML = '<v:shape adj="1"/>';var i = t.firstChild;return i.style.behavior = "url(#default#VML)", i && "object" == _typeof(i.adj);
} catch (t) {
return !1;
}
}(),
Yi = (Object.freeze || Object)({ ie: xi, ielt9: wi, edge: Li, webkit: Pi, android: bi, android23: Ti, opera: zi, chrome: Mi, gecko: Ci, safari: Zi, phantom: Ei, opera12: Si, win: ki, ie3d: Bi, webkit3d: Ii, gecko3d: Ai, any3d: Oi, mobile: Ri, mobileWebkit: Di, mobileWebkit3d: Ni, msPointer: ji, pointer: Wi, touch: Hi, mobileOpera: Fi, mobileGecko: Ui, retina: Vi, canvas: Gi, svg: qi, vml: Ki }),
Xi = ji ? "MSPointerDown" : "pointerdown",
Ji = ji ? "MSPointerMove" : "pointermove",
$i = ji ? "MSPointerUp" : "pointerup",
Qi = ji ? "MSPointerCancel" : "pointercancel",
te = ["INPUT", "SELECT", "OPTION"],
ie = {},
ee = !1,
ne = 0,
oe = ji ? "MSPointerDown" : Wi ? "pointerdown" : "touchstart",
se = ji ? "MSPointerUp" : Wi ? "pointerup" : "touchend",
re = "_leaflet_",
ae = "_leaflet_events",
he = ki && Mi ? 2 * window.devicePixelRatio : Ci ? window.devicePixelRatio : 1,
ue = {},
le = (Object.freeze || Object)({ on: V, off: G, stopPropagation: Y, disableScrollPropagation: X, disableClickPropagation: J, preventDefault: $, stop: Q, getMousePosition: tt, getWheelDelta: it, fakeStop: et, skipped: nt, isExternalTarget: ot, addListener: V, removeListener: G }),
ce = xt(["transform", "WebkitTransform", "OTransform", "MozTransform", "msTransform"]),
_e = xt(["webkitTransition", "transition", "OTransition", "MozTransition", "msTransition"]),
de = "webkitTransition" === _e || "OTransition" === _e ? _e + "End" : "transitionend";if ("onselectstart" in document) pi = function pi() {
V(window, "selectstart", $);
}, mi = function mi() {
G(window, "selectstart", $);
};else {
var pe = xt(["userSelect", "WebkitUserSelect", "OUserSelect", "MozUserSelect", "msUserSelect"]);pi = function pi() {
if (pe) {
var t = document.documentElement.style;fi = t[pe], t[pe] = "none";
}
}, mi = function mi() {
pe && (document.documentElement.style[pe] = fi, fi = void 0);
};
}var me,
fe,
ge = (Object.freeze || Object)({ TRANSFORM: ce, TRANSITION: _e, TRANSITION_END: de, get: rt, getStyle: at, create: ht, remove: ut, empty: lt, toFront: ct, toBack: _t, hasClass: dt, addClass: pt, removeClass: mt, setClass: ft, getClass: gt, setOpacity: vt, testProp: xt, setTransform: wt, setPosition: Lt, getPosition: Pt, disableTextSelection: pi, enableTextSelection: mi, disableImageDrag: bt, enableImageDrag: Tt, preventOutline: zt, restoreOutline: Mt }),
ve = ui.extend({ run: function run(t, i, e, n) {
this.stop(), this._el = t, this._inProgress = !0, this._duration = e || .25, this._easeOutPower = 1 / Math.max(n || .5, .2), this._startPos = Pt(t), this._offset = i.subtract(this._startPos), this._startTime = +new Date(), this.fire("start"), this._animate();
}, stop: function stop() {
this._inProgress && (this._step(!0), this._complete());
}, _animate: function _animate() {
this._animId = f(this._animate, this), this._step();
}, _step: function _step(t) {
var i = +new Date() - this._startTime,
e = 1e3 * this._duration;i < e ? this._runFrame(this._easeOut(i / e), t) : (this._runFrame(1), this._complete());
}, _runFrame: function _runFrame(t, i) {
var e = this._startPos.add(this._offset.multiplyBy(t));i && e._round(), Lt(this._el, e), this.fire("step");
}, _complete: function _complete() {
g(this._animId), this._inProgress = !1, this.fire("end");
}, _easeOut: function _easeOut(t) {
return 1 - Math.pow(1 - t, this._easeOutPower);
} }),
ye = ui.extend({ options: { crs: gi, center: void 0, zoom: void 0, minZoom: void 0, maxZoom: void 0, layers: [], maxBounds: void 0, renderer: void 0, zoomAnimation: !0, zoomAnimationThreshold: 4, fadeAnimation: !0, markerZoomAnimation: !0, transform3DLimit: 8388608, zoomSnap: 1, zoomDelta: 1, trackResize: !0 }, initialize: function initialize(t, i) {
i = l(this, i), this._initContainer(t), this._initLayout(), this._onResize = e(this._onResize, this), this._initEvents(), i.maxBounds && this.setMaxBounds(i.maxBounds), void 0 !== i.zoom && (this._zoom = this._limitZoom(i.zoom)), i.center && void 0 !== i.zoom && this.setView(C(i.center), i.zoom, { reset: !0 }), this._handlers = [], this._layers = {}, this._zoomBoundLayers = {}, this._sizeChanged = !0, this.callInitHooks(), this._zoomAnimated = _e && Oi && !Fi && this.options.zoomAnimation, this._zoomAnimated && (this._createAnimProxy(), V(this._proxy, de, this._catchTransitionEnd, this)), this._addLayers(this.options.layers);
}, setView: function setView(t, e, n) {
return e = void 0 === e ? this._zoom : this._limitZoom(e), t = this._limitCenter(C(t), e, this.options.maxBounds), n = n || {}, this._stop(), this._loaded && !n.reset && !0 !== n && (void 0 !== n.animate && (n.zoom = i({ animate: n.animate }, n.zoom), n.pan = i({ animate: n.animate, duration: n.duration }, n.pan)), this._zoom !== e ? this._tryAnimatedZoom && this._tryAnimatedZoom(t, e, n.zoom) : this._tryAnimatedPan(t, n.pan)) ? (clearTimeout(this._sizeTimer), this) : (this._resetView(t, e), this);
}, setZoom: function setZoom(t, i) {
return this._loaded ? this.setView(this.getCenter(), t, { zoom: i }) : (this._zoom = t, this);
}, zoomIn: function zoomIn(t, i) {
return t = t || (Oi ? this.options.zoomDelta : 1), this.setZoom(this._zoom + t, i);
}, zoomOut: function zoomOut(t, i) {
return t = t || (Oi ? this.options.zoomDelta : 1), this.setZoom(this._zoom - t, i);
}, setZoomAround: function setZoomAround(t, i, e) {
var n = this.getZoomScale(i),
o = this.getSize().divideBy(2),
s = (t instanceof x ? t : this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1 - 1 / n),
r = this.containerPointToLatLng(o.add(s));return this.setView(r, i, { zoom: e });
}, _getBoundsCenterZoom: function _getBoundsCenterZoom(t, i) {
i = i || {}, t = t.getBounds ? t.getBounds() : z(t);var e = w(i.paddingTopLeft || i.padding || [0, 0]),
n = w(i.paddingBottomRight || i.padding || [0, 0]),
o = this.getBoundsZoom(t, !1, e.add(n));if ((o = "number" == typeof i.maxZoom ? Math.min(i.maxZoom, o) : o) === 1 / 0) return { center: t.getCenter(), zoom: o };var s = n.subtract(e).divideBy(2),
r = this.project(t.getSouthWest(), o),
a = this.project(t.getNorthEast(), o);return { center: this.unproject(r.add(a).divideBy(2).add(s), o), zoom: o };
}, fitBounds: function fitBounds(t, i) {
if (!(t = z(t)).isValid()) throw new Error("Bounds are not valid.");var e = this._getBoundsCenterZoom(t, i);return this.setView(e.center, e.zoom, i);
}, fitWorld: function fitWorld(t) {
return this.fitBounds([[-90, -180], [90, 180]], t);
}, panTo: function panTo(t, i) {
return this.setView(t, this._zoom, { pan: i });
}, panBy: function panBy(t, i) {
if (t = w(t).round(), i = i || {}, !t.x && !t.y) return this.fire("moveend");if (!0 !== i.animate && !this.getSize().contains(t)) return this._resetView(this.unproject(this.project(this.getCenter()).add(t)), this.getZoom()), this;if (this._panAnim || (this._panAnim = new ve(), this._panAnim.on({ step: this._onPanTransitionStep, end: this._onPanTransitionEnd }, this)), i.noMoveStart || this.fire("movestart"), !1 !== i.animate) {
pt(this._mapPane, "leaflet-pan-anim");var e = this._getMapPanePos().subtract(t).round();this._panAnim.run(this._mapPane, e, i.duration || .25, i.easeLinearity);
} else this._rawPanBy(t), this.fire("move").fire("moveend");return this;
}, flyTo: function flyTo(t, i, e) {
function n(t) {
var i = (g * g - m * m + (t ? -1 : 1) * x * x * v * v) / (2 * (t ? g : m) * x * v),
e = Math.sqrt(i * i + 1) - i;return e < 1e-9 ? -18 : Math.log(e);
}function o(t) {
return (Math.exp(t) - Math.exp(-t)) / 2;
}function s(t) {
return (Math.exp(t) + Math.exp(-t)) / 2;
}function r(t) {
return o(t) / s(t);
}function a(t) {
return m * (s(w) / s(w + y * t));
}function h(t) {
return m * (s(w) * r(w + y * t) - o(w)) / x;
}function u(t) {
return 1 - Math.pow(1 - t, 1.5);
}function l() {
var e = (Date.now() - L) / b,
n = u(e) * P;e <= 1 ? (this._flyToFrame = f(l, this), this._move(this.unproject(c.add(_.subtract(c).multiplyBy(h(n) / v)), p), this.getScaleZoom(m / a(n), p), { flyTo: !0 })) : this._move(t, i)._moveEnd(!0);
}if (!1 === (e = e || {}).animate || !Oi) return this.setView(t, i, e);this._stop();var c = this.project(this.getCenter()),
_ = this.project(t),
d = this.getSize(),
p = this._zoom;t = C(t), i = void 0 === i ? p : i;var m = Math.max(d.x, d.y),
g = m * this.getZoomScale(p, i),
v = _.distanceTo(c) || 1,
y = 1.42,
x = y * y,
w = n(0),
L = Date.now(),
P = (n(1) - w) / y,
b = e.duration ? 1e3 * e.duration : 1e3 * P * .8;return this._moveStart(!0), l.call(this), this;
}, flyToBounds: function flyToBounds(t, i) {
var e = this._getBoundsCenterZoom(t, i);return this.flyTo(e.center, e.zoom, i);
}, setMaxBounds: function setMaxBounds(t) {
return (t = z(t)).isValid() ? (this.options.maxBounds && this.off("moveend", this._panInsideMaxBounds), this.options.maxBounds = t, this._loaded && this._panInsideMaxBounds(), this.on("moveend", this._panInsideMaxBounds)) : (this.options.maxBounds = null, this.off("moveend", this._panInsideMaxBounds));
}, setMinZoom: function setMinZoom(t) {
return this.options.minZoom = t, this._loaded && this.getZoom() < this.options.minZoom ? this.setZoom(t) : this;
}, setMaxZoom: function setMaxZoom(t) {
return this.options.maxZoom = t, this._loaded && this.getZoom() > this.options.maxZoom ? this.setZoom(t) : this;
}, panInsideBounds: function panInsideBounds(t, i) {
this._enforcingBounds = !0;var e = this.getCenter(),
n = this._limitCenter(e, this._zoom, z(t));return e.equals(n) || this.panTo(n, i), this._enforcingBounds = !1, this;
}, invalidateSize: function invalidateSize(t) {
if (!this._loaded) return this;t = i({ animate: !1, pan: !0 }, !0 === t ? { animate: !0 } : t);var n = this.getSize();this._sizeChanged = !0, this._lastCenter = null;var o = this.getSize(),
s = n.divideBy(2).round(),
r = o.divideBy(2).round(),
a = s.subtract(r);return a.x || a.y ? (t.animate && t.pan ? this.panBy(a) : (t.pan && this._rawPanBy(a), this.fire("move"), t.debounceMoveend ? (clearTimeout(this._sizeTimer), this._sizeTimer = setTimeout(e(this.fire, this, "moveend"), 200)) : this.fire("moveend")), this.fire("resize", { oldSize: n, newSize: o })) : this;
}, stop: function stop() {
return this.setZoom(this._limitZoom(this._zoom)), this.options.zoomSnap || this.fire("viewreset"), this._stop();
}, locate: function locate(t) {
if (t = this._locateOptions = i({ timeout: 1e4, watch: !1 }, t), !("geolocation" in navigator)) return this._handleGeolocationError({ code: 0, message: "Geolocation not supported." }), this;var n = e(this._handleGeolocationResponse, this),
o = e(this._handleGeolocationError, this);return t.watch ? this._locationWatchId = navigator.geolocation.watchPosition(n, o, t) : navigator.geolocation.getCurrentPosition(n, o, t), this;
}, stopLocate: function stopLocate() {
return navigator.geolocation && navigator.geolocation.clearWatch && navigator.geolocation.clearWatch(this._locationWatchId), this._locateOptions && (this._locateOptions.setView = !1), this;
}, _handleGeolocationError: function _handleGeolocationError(t) {
var i = t.code,
e = t.message || (1 === i ? "permission denied" : 2 === i ? "position unavailable" : "timeout");this._locateOptions.setView && !this._loaded && this.fitWorld(), this.fire("locationerror", { code: i, message: "Geolocation error: " + e + "." });
}, _handleGeolocationResponse: function _handleGeolocationResponse(t) {
var i = new M(t.coords.latitude, t.coords.longitude),
e = i.toBounds(t.coords.accuracy),
n = this._locateOptions;if (n.setView) {
var o = this.getBoundsZoom(e);this.setView(i, n.maxZoom ? Math.min(o, n.maxZoom) : o);
}var s = { latlng: i, bounds: e, timestamp: t.timestamp };for (var r in t.coords) {
"number" == typeof t.coords[r] && (s[r] = t.coords[r]);
}this.fire("locationfound", s);
}, addHandler: function addHandler(t, i) {
if (!i) return this;var e = this[t] = new i(this);return this._handlers.push(e), this.options[t] && e.enable(), this;
}, remove: function remove() {
if (this._initEvents(!0), this._containerId !== this._container._leaflet_id) throw new Error("Map container is being reused by another instance");try {
delete this._container._leaflet_id, delete this._containerId;
} catch (t) {
this._container._leaflet_id = void 0, this._containerId = void 0;
}ut(this._mapPane), this._clearControlPos && this._clearControlPos(), this._clearHandlers(), this._loaded && this.fire("unload");var t;for (t in this._layers) {
this._layers[t].remove();
}for (t in this._panes) {
ut(this._panes[t]);
}return this._layers = [], this._panes = [], delete this._mapPane, delete this._renderer, this;
}, createPane: function createPane(t, i) {
var e = ht("div", "leaflet-pane" + (t ? " leaflet-" + t.replace("Pane", "") + "-pane" : ""), i || this._mapPane);return t && (this._panes[t] = e), e;
}, getCenter: function getCenter() {
return this._checkIfLoaded(), this._lastCenter && !this._moved() ? this._lastCenter : this.layerPointToLatLng(this._getCenterLayerPoint());
}, getZoom: function getZoom() {
return this._zoom;
}, getBounds: function getBounds() {
var t = this.getPixelBounds();return new T(this.unproject(t.getBottomLeft()), this.unproject(t.getTopRight()));
}, getMinZoom: function getMinZoom() {
return void 0 === this.options.minZoom ? this._layersMinZoom || 0 : this.options.minZoom;
}, getMaxZoom: function getMaxZoom() {
return void 0 === this.options.maxZoom ? void 0 === this._layersMaxZoom ? 1 / 0 : this._layersMaxZoom : this.options.maxZoom;
}, getBoundsZoom: function getBoundsZoom(t, i, e) {
t = z(t), e = w(e || [0, 0]);var n = this.getZoom() || 0,
o = this.getMinZoom(),
s = this.getMaxZoom(),
r = t.getNorthWest(),
a = t.getSouthEast(),
h = this.getSize().subtract(e),
u = b(this.project(a, n), this.project(r, n)).getSize(),
l = Oi ? this.options.zoomSnap : 1,
c = h.x / u.x,
_ = h.y / u.y,
d = i ? Math.max(c, _) : Math.min(c, _);return n = this.getScaleZoom(d, n), l && (n = Math.round(n / (l / 100)) * (l / 100), n = i ? Math.ceil(n / l) * l : Math.floor(n / l) * l), Math.max(o, Math.min(s, n));
}, getSize: function getSize() {
return this._size && !this._sizeChanged || (this._size = new x(this._container.clientWidth || 0, this._container.clientHeight || 0), this._sizeChanged = !1), this._size.clone();
}, getPixelBounds: function getPixelBounds(t, i) {
var e = this._getTopLeftPoint(t, i);return new P(e, e.add(this.getSize()));
}, getPixelOrigin: function getPixelOrigin() {
return this._checkIfLoaded(), this._pixelOrigin;
}, getPixelWorldBounds: function getPixelWorldBounds(t) {
return this.options.crs.getProjectedBounds(void 0 === t ? this.getZoom() : t);
}, getPane: function getPane(t) {
return "string" == typeof t ? this._panes[t] : t;
}, getPanes: function getPanes() {
return this._panes;
}, getContainer: function getContainer() {
return this._container;
}, getZoomScale: function getZoomScale(t, i) {
var e = this.options.crs;return i = void 0 === i ? this._zoom : i, e.scale(t) / e.scale(i);
}, getScaleZoom: function getScaleZoom(t, i) {
var e = this.options.crs;i = void 0 === i ? this._zoom : i;var n = e.zoom(t * e.scale(i));return isNaN(n) ? 1 / 0 : n;
}, project: function project(t, i) {
return i = void 0 === i ? this._zoom : i, this.options.crs.latLngToPoint(C(t), i);
}, unproject: function unproject(t, i) {
return i = void 0 === i ? this._zoom : i, this.options.crs.pointToLatLng(w(t), i);
}, layerPointToLatLng: function layerPointToLatLng(t) {
var i = w(t).add(this.getPixelOrigin());return this.unproject(i);
}, latLngToLayerPoint: function latLngToLayerPoint(t) {
return this.project(C(t))._round()._subtract(this.getPixelOrigin());
}, wrapLatLng: function wrapLatLng(t) {
return this.options.crs.wrapLatLng(C(t));
}, wrapLatLngBounds: function wrapLatLngBounds(t) {
return this.options.crs.wrapLatLngBounds(z(t));
}, distance: function distance(t, i) {
return this.options.crs.distance(C(t), C(i));
}, containerPointToLayerPoint: function containerPointToLayerPoint(t) {
return w(t).subtract(this._getMapPanePos());
}, layerPointToContainerPoint: function layerPointToContainerPoint(t) {
return w(t).add(this._getMapPanePos());
}, containerPointToLatLng: function containerPointToLatLng(t) {
var i = this.containerPointToLayerPoint(w(t));return this.layerPointToLatLng(i);
}, latLngToContainerPoint: function latLngToContainerPoint(t) {
return this.layerPointToContainerPoint(this.latLngToLayerPoint(C(t)));
}, mouseEventToContainerPoint: function mouseEventToContainerPoint(t) {
return tt(t, this._container);
}, mouseEventToLayerPoint: function mouseEventToLayerPoint(t) {
return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t));
}, mouseEventToLatLng: function mouseEventToLatLng(t) {
return this.layerPointToLatLng(this.mouseEventToLayerPoint(t));
}, _initContainer: function _initContainer(t) {
var i = this._container = rt(t);if (!i) throw new Error("Map container not found.");if (i._leaflet_id) throw new Error("Map container is already initialized.");V(i, "scroll", this._onScroll, this), this._containerId = n(i);
}, _initLayout: function _initLayout() {
var t = this._container;this._fadeAnimated = this.options.fadeAnimation && Oi, pt(t, "leaflet-container" + (Hi ? " leaflet-touch" : "") + (Vi ? " leaflet-retina" : "") + (wi ? " leaflet-oldie" : "") + (Zi ? " leaflet-safari" : "") + (this._fadeAnimated ? " leaflet-fade-anim" : ""));var i = at(t, "position");"absolute" !== i && "relative" !== i && "fixed" !== i && (t.style.position = "relative"), this._initPanes(), this._initControlPos && this._initControlPos();
}, _initPanes: function _initPanes() {
var t = this._panes = {};this._paneRenderers = {}, this._mapPane = this.createPane("mapPane", this._container), Lt(this._mapPane, new x(0, 0)), this.createPane("tilePane"), this.createPane("shadowPane"), this.createPane("overlayPane"), this.createPane("markerPane"), this.createPane("tooltipPane"), this.createPane("popupPane"), this.options.markerZoomAnimation || (pt(t.markerPane, "leaflet-zoom-hide"), pt(t.shadowPane, "leaflet-zoom-hide"));
}, _resetView: function _resetView(t, i) {
Lt(this._mapPane, new x(0, 0));var e = !this._loaded;this._loaded = !0, i = this._limitZoom(i), this.fire("viewprereset");var n = this._zoom !== i;this._moveStart(n)._move(t, i)._moveEnd(n), this.fire("viewreset"), e && this.fire("load");
}, _moveStart: function _moveStart(t) {
return t && this.fire("zoomstart"), this.fire("movestart");
}, _move: function _move(t, i, e) {
void 0 === i && (i = this._zoom);var n = this._zoom !== i;return this._zoom = i, this._lastCenter = t, this._pixelOrigin = this._getNewPixelOrigin(t), (n || e && e.pinch) && this.fire("zoom", e), this.fire("move", e);
}, _moveEnd: function _moveEnd(t) {
return t && this.fire("zoomend"), this.fire("moveend");
}, _stop: function _stop() {
return g(this._flyToFrame), this._panAnim && this._panAnim.stop(), this;
}, _rawPanBy: function _rawPanBy(t) {
Lt(this._mapPane, this._getMapPanePos().subtract(t));
}, _getZoomSpan: function _getZoomSpan() {
return this.getMaxZoom() - this.getMinZoom();
}, _panInsideMaxBounds: function _panInsideMaxBounds() {
this._enforcingBounds || this.panInsideBounds(this.options.maxBounds);
}, _checkIfLoaded: function _checkIfLoaded() {
if (!this._loaded) throw new Error("Set map center and zoom first.");
}, _initEvents: function _initEvents(t) {
this._targets = {}, this._targets[n(this._container)] = this;var i = t ? G : V;i(this._container, "click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress", this._handleDOMEvent, this), this.options.trackResize && i(window, "resize", this._onResize, this), Oi && this.options.transform3DLimit && (t ? this.off : this.on).call(this, "moveend", this._onMoveEnd);
}, _onResize: function _onResize() {
g(this._resizeRequest), this._resizeRequest = f(function () {
this.invalidateSize({ debounceMoveend: !0 });
}, this);
}, _onScroll: function _onScroll() {
this._container.scrollTop = 0, this._container.scrollLeft = 0;
}, _onMoveEnd: function _onMoveEnd() {
var t = this._getMapPanePos();Math.max(Math.abs(t.x), Math.abs(t.y)) >= this.options.transform3DLimit && this._resetView(this.getCenter(), this.getZoom());
}, _findEventTargets: function _findEventTargets(t, i) {
for (var e, o = [], s = "mouseout" === i || "mouseover" === i, r = t.target || t.srcElement, a = !1; r;) {
if ((e = this._targets[n(r)]) && ("click" === i || "preclick" === i) && !t._simulated && this._draggableMoved(e)) {
a = !0;break;
}if (e && e.listens(i, !0)) {
if (s && !ot(r, t)) break;if (o.push(e), s) break;
}if (r === this._container) break;r = r.parentNode;
}return o.length || a || s || !ot(r, t) || (o = [this]), o;
}, _handleDOMEvent: function _handleDOMEvent(t) {
if (this._loaded && !nt(t)) {
var i = t.type;"mousedown" !== i && "keypress" !== i || zt(t.target || t.srcElement), this._fireDOMEvent(t, i);
}
}, _mouseEvents: ["click", "dblclick", "mouseover", "mouseout", "contextmenu"], _fireDOMEvent: function _fireDOMEvent(t, e, n) {
if ("click" === t.type) {
var o = i({}, t);o.type = "preclick", this._fireDOMEvent(o, o.type, n);
}if (!t._stopped && (n = (n || []).concat(this._findEventTargets(t, e))).length) {
var s = n[0];"contextmenu" === e && s.listens(e, !0) && $(t);var r = { originalEvent: t };if ("keypress" !== t.type) {
var a = s.options && "icon" in s.options;r.containerPoint = a ? this.latLngToContainerPoint(s.getLatLng()) : this.mouseEventToContainerPoint(t), r.layerPoint = this.containerPointToLayerPoint(r.containerPoint), r.latlng = a ? s.getLatLng() : this.layerPointToLatLng(r.layerPoint);
}for (var h = 0; h < n.length; h++) {
if (n[h].fire(e, r, !0), r.originalEvent._stopped || !1 === n[h].options.bubblingMouseEvents && -1 !== d(this._mouseEvents, e)) return;
}
}
}, _draggableMoved: function _draggableMoved(t) {
return (t = t.dragging && t.dragging.enabled() ? t : this).dragging && t.dragging.moved() || this.boxZoom && this.boxZoom.moved();
}, _clearHandlers: function _clearHandlers() {
for (var t = 0, i = this._handlers.length; t < i; t++) {
this._handlers[t].disable();
}
}, whenReady: function whenReady(t, i) {
return this._loaded ? t.call(i || this, { target: this }) : this.on("load", t, i), this;
}, _getMapPanePos: function _getMapPanePos() {
return Pt(this._mapPane) || new x(0, 0);
}, _moved: function _moved() {
var t = this._getMapPanePos();return t && !t.equals([0, 0]);
}, _getTopLeftPoint: function _getTopLeftPoint(t, i) {
return (t && void 0 !== i ? this._getNewPixelOrigin(t, i) : this.getPixelOrigin()).subtract(this._getMapPanePos());
}, _getNewPixelOrigin: function _getNewPixelOrigin(t, i) {
var e = this.getSize()._divideBy(2);return this.project(t, i)._subtract(e)._add(this._getMapPanePos())._round();
}, _latLngToNewLayerPoint: function _latLngToNewLayerPoint(t, i, e) {
var n = this._getNewPixelOrigin(e, i);return this.project(t, i)._subtract(n);
}, _latLngBoundsToNewLayerBounds: function _latLngBoundsToNewLayerBounds(t, i, e) {
var n = this._getNewPixelOrigin(e, i);return b([this.project(t.getSouthWest(), i)._subtract(n), this.project(t.getNorthWest(), i)._subtract(n), this.project(t.getSouthEast(), i)._subtract(n), this.project(t.getNorthEast(), i)._subtract(n)]);
}, _getCenterLayerPoint: function _getCenterLayerPoint() {
return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
}, _getCenterOffset: function _getCenterOffset(t) {
return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint());
}, _limitCenter: function _limitCenter(t, i, e) {
if (!e) return t;var n = this.project(t, i),
o = this.getSize().divideBy(2),
s = new P(n.subtract(o), n.add(o)),
r = this._getBoundsOffset(s, e, i);return r.round().equals([0, 0]) ? t : this.unproject(n.add(r), i);
}, _limitOffset: function _limitOffset(t, i) {
if (!i) return t;var e = this.getPixelBounds(),
n = new P(e.min.add(t), e.max.add(t));return t.add(this._getBoundsOffset(n, i));
}, _getBoundsOffset: function _getBoundsOffset(t, i, e) {
var n = b(this.project(i.getNorthEast(), e), this.project(i.getSouthWest(), e)),
o = n.min.subtract(t.min),
s = n.max.subtract(t.max);return new x(this._rebound(o.x, -s.x), this._rebound(o.y, -s.y));
}, _rebound: function _rebound(t, i) {
return t + i > 0 ? Math.round(t - i) / 2 : Math.max(0, Math.ceil(t)) - Math.max(0, Math.floor(i));
}, _limitZoom: function _limitZoom(t) {
var i = this.getMinZoom(),
e = this.getMaxZoom(),
n = Oi ? this.options.zoomSnap : 1;return n && (t = Math.round(t / n) * n), Math.max(i, Math.min(e, t));
}, _onPanTransitionStep: function _onPanTransitionStep() {
this.fire("move");
}, _onPanTransitionEnd: function _onPanTransitionEnd() {
mt(this._mapPane, "leaflet-pan-anim"), this.fire("moveend");
}, _tryAnimatedPan: function _tryAnimatedPan(t, i) {
var e = this._getCenterOffset(t)._floor();return !(!0 !== (i && i.animate) && !this.getSize().contains(e)) && (this.panBy(e, i), !0);
}, _createAnimProxy: function _createAnimProxy() {
var t = this._proxy = ht("div", "leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t), this.on("zoomanim", function (t) {
var i = ce,
e = this._proxy.style[i];wt(this._proxy, this.project(t.center, t.zoom), this.getZoomScale(t.zoom, 1)), e === this._proxy.style[i] && this._animatingZoom && this._onZoomTransitionEnd();
}, this), this.on("load moveend", function () {
var t = this.getCenter(),
i = this.getZoom();wt(this._proxy, this.project(t, i), this.getZoomScale(i, 1));
}, this), this._on("unload", this._destroyAnimProxy, this);
}, _destroyAnimProxy: function _destroyAnimProxy() {
ut(this._proxy), delete this._proxy;
}, _catchTransitionEnd: function _catchTransitionEnd(t) {
this._animatingZoom && t.propertyName.indexOf("transform") >= 0 && this._onZoomTransitionEnd();
}, _nothingToAnimate: function _nothingToAnimate() {
return !this._container.getElementsByClassName("leaflet-zoom-animated").length;
}, _tryAnimatedZoom: function _tryAnimatedZoom(t, i, e) {
if (this._animatingZoom) return !0;if (e = e || {}, !this._zoomAnimated || !1 === e.animate || this._nothingToAnimate() || Math.abs(i - this._zoom) > this.options.zoomAnimationThreshold) return !1;var n = this.getZoomScale(i),
o = this._getCenterOffset(t)._divideBy(1 - 1 / n);return !(!0 !== e.animate && !this.getSize().contains(o)) && (f(function () {
this._moveStart(!0)._animateZoom(t, i, !0);
}, this), !0);
}, _animateZoom: function _animateZoom(t, i, n, o) {
n && (this._animatingZoom = !0, this._animateToCenter = t, this._animateToZoom = i, pt(this._mapPane, "leaflet-zoom-anim")), this.fire("zoomanim", { center: t, zoom: i, noUpdate: o }), setTimeout(e(this._onZoomTransitionEnd, this), 250);
}, _onZoomTransitionEnd: function _onZoomTransitionEnd() {
this._animatingZoom && (mt(this._mapPane, "leaflet-zoom-anim"), this._animatingZoom = !1, this._move(this._animateToCenter, this._animateToZoom), f(function () {
this._moveEnd(!0);
}, this));
} }),
xe = v.extend({ options: { position: "topright" }, initialize: function initialize(t) {
l(this, t);
}, getPosition: function getPosition() {
return this.options.position;
}, setPosition: function setPosition(t) {
var i = this._map;return i && i.removeControl(this), this.options.position = t, i && i.addControl(this), this;
}, getContainer: function getContainer() {
return this._container;
}, addTo: function addTo(t) {
this.remove(), this._map = t;var i = this._container = this.onAdd(t),
e = this.getPosition(),
n = t._controlCorners[e];return pt(i, "leaflet-control"), -1 !== e.indexOf("bottom") ? n.insertBefore(i, n.firstChild) : n.appendChild(i), this;
}, remove: function remove() {
return this._map ? (ut(this._container), this.onRemove && this.onRemove(this._map), this._map = null, this) : this;
}, _refocusOnMap: function _refocusOnMap(t) {
this._map && t && t.screenX > 0 && t.screenY > 0 && this._map.getContainer().focus();
} }),
we = function we(t) {
return new xe(t);
};ye.include({ addControl: function addControl(t) {
return t.addTo(this), this;
}, removeControl: function removeControl(t) {
return t.remove(), this;
}, _initControlPos: function _initControlPos() {
function t(t, o) {
var s = e + t + " " + e + o;i[t + o] = ht("div", s, n);
}var i = this._controlCorners = {},
e = "leaflet-",
n = this._controlContainer = ht("div", e + "control-container", this._container);t("top", "left"), t("top", "right"), t("bottom", "left"), t("bottom", "right");
}, _clearControlPos: function _clearControlPos() {
for (var t in this._controlCorners) {
ut(this._controlCorners[t]);
}ut(this._controlContainer), delete this._controlCorners, delete this._controlContainer;
} });var Le = xe.extend({ options: { collapsed: !0, position: "topright", autoZIndex: !0, hideSingleBase: !1, sortLayers: !1, sortFunction: function sortFunction(t, i, e, n) {
return e < n ? -1 : n < e ? 1 : 0;
} }, initialize: function initialize(t, i, e) {
l(this, e), this._layerControlInputs = [], this._layers = [], this._lastZIndex = 0, this._handlingClick = !1;for (var n in t) {
this._addLayer(t[n], n);
}for (n in i) {
this._addLayer(i[n], n, !0);
}
}, onAdd: function onAdd(t) {
this._initLayout(), this._update(), this._map = t, t.on("zoomend", this._checkDisabledLayers, this);for (var i = 0; i < this._layers.length; i++) {
this._layers[i].layer.on("add remove", this._onLayerChange, this);
}return this._container;
}, addTo: function addTo(t) {
return xe.prototype.addTo.call(this, t), this._expandIfNotCollapsed();
}, onRemove: function onRemove() {
this._map.off("zoomend", this._checkDisabledLayers, this);for (var t = 0; t < this._layers.length; t++) {
this._layers[t].layer.off("add remove", this._onLayerChange, this);
}
}, addBaseLayer: function addBaseLayer(t, i) {
return this._addLayer(t, i), this._map ? this._update() : this;
}, addOverlay: function addOverlay(t, i) {
return this._addLayer(t, i, !0), this._map ? this._update() : this;
}, removeLayer: function removeLayer(t) {
t.off("add remove", this._onLayerChange, this);var i = this._getLayer(n(t));return i && this._layers.splice(this._layers.indexOf(i), 1), this._map ? this._update() : this;
}, expand: function expand() {
pt(this._container, "leaflet-control-layers-expanded"), this._form.style.height = null;var t = this._map.getSize().y - (this._container.offsetTop + 50);return t < this._form.clientHeight ? (pt(this._form, "leaflet-control-layers-scrollbar"), this._form.style.height = t + "px") : mt(this._form, "leaflet-control-layers-scrollbar"), this._checkDisabledLayers(), this;
}, collapse: function collapse() {
return mt(this._container, "leaflet-control-layers-expanded"), this;
}, _initLayout: function _initLayout() {
var t = "leaflet-control-layers",
i = this._container = ht("div", t),
e = this.options.collapsed;i.setAttribute("aria-haspopup", !0), J(i), X(i);var n = this._form = ht("form", t + "-list");e && (this._map.on("click", this.collapse, this), bi || V(i, { mouseenter: this.expand, mouseleave: this.collapse }, this));var o = this._layersLink = ht("a", t + "-toggle", i);o.href = "#", o.title = "Layers", Hi ? (V(o, "click", Q), V(o, "click", this.expand, this)) : V(o, "focus", this.expand, this), e || this.expand(), this._baseLayersList = ht("div", t + "-base", n), this._separator = ht("div", t + "-separator", n), this._overlaysList = ht("div", t + "-overlays", n), i.appendChild(n);
}, _getLayer: function _getLayer(t) {
for (var i = 0; i < this._layers.length; i++) {
if (this._layers[i] && n(this._layers[i].layer) === t) return this._layers[i];
}
}, _addLayer: function _addLayer(t, i, n) {
this._map && t.on("add remove", this._onLayerChange, this), this._layers.push({ layer: t, name: i, overlay: n }), this.options.sortLayers && this._layers.sort(e(function (t, i) {
return this.options.sortFunction(t.layer, i.layer, t.name, i.name);
}, this)), this.options.autoZIndex && t.setZIndex && (this._lastZIndex++, t.setZIndex(this._lastZIndex)), this._expandIfNotCollapsed();
}, _update: function _update() {
if (!this._container) return this;lt(this._baseLayersList), lt(this._overlaysList), this._layerControlInputs = [];var t,
i,
e,
n,
o = 0;for (e = 0; e < this._layers.length; e++) {
n = this._layers[e], this._addItem(n), i = i || n.overlay, t = t || !n.overlay, o += n.overlay ? 0 : 1;
}return this.options.hideSingleBase && (t = t && o > 1, this._baseLayersList.style.display = t ? "" : "none"), this._separator.style.display = i && t ? "" : "none", this;
}, _onLayerChange: function _onLayerChange(t) {
this._handlingClick || this._update();var i = this._getLayer(n(t.target)),
e = i.overlay ? "add" === t.type ? "overlayadd" : "overlayremove" : "add" === t.type ? "baselayerchange" : null;e && this._map.fire(e, i);
}, _createRadioElement: function _createRadioElement(t, i) {
var e = '<input type="radio" class="leaflet-control-layers-selector" name="' + t + '"' + (i ? ' checked="checked"' : "") + "/>",
n = document.createElement("div");return n.innerHTML = e, n.firstChild;
}, _addItem: function _addItem(t) {
var i,
e = document.createElement("label"),
o = this._map.hasLayer(t.layer);t.overlay ? ((i = document.createElement("input")).type = "checkbox", i.className = "leaflet-control-layers-selector", i.defaultChecked = o) : i = this._createRadioElement("leaflet-base-layers", o), this._layerControlInputs.push(i), i.layerId = n(t.layer), V(i, "click", this._onInputClick, this);var s = document.createElement("span");s.innerHTML = " " + t.name;var r = document.createElement("div");return e.appendChild(r), r.appendChild(i), r.appendChild(s), (t.overlay ? this._overlaysList : this._baseLayersList).appendChild(e), this._checkDisabledLayers(), e;
}, _onInputClick: function _onInputClick() {
var t,
i,
e = this._layerControlInputs,
n = [],
o = [];this._handlingClick = !0;for (var s = e.length - 1; s >= 0; s--) {
t = e[s], i = this._getLayer(t.layerId).layer, t.checked ? n.push(i) : t.checked || o.push(i);
}for (s = 0; s < o.length; s++) {
this._map.hasLayer(o[s]) && this._map.removeLayer(o[s]);
}for (s = 0; s < n.length; s++) {
this._map.hasLayer(n[s]) || this._map.addLayer(n[s]);
}this._handlingClick = !1, this._refocusOnMap();
}, _checkDisabledLayers: function _checkDisabledLayers() {
for (var t, i, e = this._layerControlInputs, n = this._map.getZoom(), o = e.length - 1; o >= 0; o--) {
t = e[o], i = this._getLayer(t.layerId).layer, t.disabled = void 0 !== i.options.minZoom && n < i.options.minZoom || void 0 !== i.options.maxZoom && n > i.options.maxZoom;
}
}, _expandIfNotCollapsed: function _expandIfNotCollapsed() {
return this._map && !this.options.collapsed && this.expand(), this;
}, _expand: function _expand() {
return this.expand();
}, _collapse: function _collapse() {
return this.collapse();
} }),
Pe = xe.extend({ options: { position: "topleft", zoomInText: "+", zoomInTitle: "Zoom in", zoomOutText: "&#x2212;", zoomOutTitle: "Zoom out" }, onAdd: function onAdd(t) {
var i = "leaflet-control-zoom",
e = ht("div", i + " leaflet-bar"),
n = this.options;return this._zoomInButton = this._createButton(n.zoomInText, n.zoomInTitle, i + "-in", e, this._zoomIn), this._zoomOutButton = this._createButton(n.zoomOutText, n.zoomOutTitle, i + "-out", e, this._zoomOut), this._updateDisabled(), t.on("zoomend zoomlevelschange", this._updateDisabled, this), e;
}, onRemove: function onRemove(t) {
t.off("zoomend zoomlevelschange", this._updateDisabled, this);
}, disable: function disable() {
return this._disabled = !0, this._updateDisabled(), this;
}, enable: function enable() {
return this._disabled = !1, this._updateDisabled(), this;
}, _zoomIn: function _zoomIn(t) {
!this._disabled && this._map._zoom < this._map.getMaxZoom() && this._map.zoomIn(this._map.options.zoomDelta * (t.shiftKey ? 3 : 1));
}, _zoomOut: function _zoomOut(t) {
!this._disabled && this._map._zoom > this._map.getMinZoom() && this._map.zoomOut(this._map.options.zoomDelta * (t.shiftKey ? 3 : 1));
}, _createButton: function _createButton(t, i, e, n, o) {
var s = ht("a", e, n);return s.innerHTML = t, s.href = "#", s.title = i, s.setAttribute("role", "button"), s.setAttribute("aria-label", i), J(s), V(s, "click", Q), V(s, "click", o, this), V(s, "click", this._refocusOnMap, this), s;
}, _updateDisabled: function _updateDisabled() {
var t = this._map,
i = "leaflet-disabled";mt(this._zoomInButton, i), mt(this._zoomOutButton, i), (this._disabled || t._zoom === t.getMinZoom()) && pt(this._zoomOutButton, i), (this._disabled || t._zoom === t.getMaxZoom()) && pt(this._zoomInButton, i);
} });ye.mergeOptions({ zoomControl: !0 }), ye.addInitHook(function () {
this.options.zoomControl && (this.zoomControl = new Pe(), this.addControl(this.zoomControl));
});var be = xe.extend({ options: { position: "bottomleft", maxWidth: 100, metric: !0, imperial: !0 }, onAdd: function onAdd(t) {
var i = ht("div", "leaflet-control-scale"),
e = this.options;return this._addScales(e, "leaflet-control-scale-line", i), t.on(e.updateWhenIdle ? "moveend" : "move", this._update, this), t.whenReady(this._update, this), i;
}, onRemove: function onRemove(t) {
t.off(this.options.updateWhenIdle ? "moveend" : "move", this._update, this);
}, _addScales: function _addScales(t, i, e) {
t.metric && (this._mScale = ht("div", i, e)), t.imperial && (this._iScale = ht("div", i, e));
}, _update: function _update() {
var t = this._map,
i = t.getSize().y / 2,
e = t.distance(t.containerPointToLatLng([0, i]), t.containerPointToLatLng([this.options.maxWidth, i]));this._updateScales(e);
}, _updateScales: function _updateScales(t) {
this.options.metric && t && this._updateMetric(t), this.options.imperial && t && this._updateImperial(t);
}, _updateMetric: function _updateMetric(t) {
var i = this._getRoundNum(t),
e = i < 1e3 ? i + " m" : i / 1e3 + " km";this._updateScale(this._mScale, e, i / t);
}, _updateImperial: function _updateImperial(t) {
var i,
e,
n,
o = 3.2808399 * t;o > 5280 ? (i = o / 5280, e = this._getRoundNum(i), this._updateScale(this._iScale, e + " mi", e / i)) : (n = this._getRoundNum(o), this._updateScale(this._iScale, n + " ft", n / o));
}, _updateScale: function _updateScale(t, i, e) {
t.style.width = Math.round(this.options.maxWidth * e) + "px", t.innerHTML = i;
}, _getRoundNum: function _getRoundNum(t) {
var i = Math.pow(10, (Math.floor(t) + "").length - 1),
e = t / i;return e = e >= 10 ? 10 : e >= 5 ? 5 : e >= 3 ? 3 : e >= 2 ? 2 : 1, i * e;
} }),
Te = xe.extend({ options: { position: "bottomright", prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>' }, initialize: function initialize(t) {
l(this, t), this._attributions = {};
}, onAdd: function onAdd(t) {
t.attributionControl = this, this._container = ht("div", "leaflet-control-attribution"), J(this._container);for (var i in t._layers) {
t._layers[i].getAttribution && this.addAttribution(t._layers[i].getAttribution());
}return this._update(), this._container;
}, setPrefix: function setPrefix(t) {
return this.options.prefix = t, this._update(), this;
}, addAttribution: function addAttribution(t) {
return t ? (this._attributions[t] || (this._attributions[t] = 0), this._attributions[t]++, this._update(), this) : this;
}, removeAttribution: function removeAttribution(t) {
return t ? (this._attributions[t] && (this._attributions[t]--, this._update()), this) : this;
}, _update: function _update() {
if (this._map) {
var t = [];for (var i in this._attributions) {
this._attributions[i] && t.push(i);
}var e = [];this.options.prefix && e.push(this.options.prefix), t.length && e.push(t.join(", ")), this._container.innerHTML = e.join(" | ");
}
} });ye.mergeOptions({ attributionControl: !0 }), ye.addInitHook(function () {
this.options.attributionControl && new Te().addTo(this);
});xe.Layers = Le, xe.Zoom = Pe, xe.Scale = be, xe.Attribution = Te, we.layers = function (t, i, e) {
return new Le(t, i, e);
}, we.zoom = function (t) {
return new Pe(t);
}, we.scale = function (t) {
return new be(t);
}, we.attribution = function (t) {
return new Te(t);
};var ze,
Me = v.extend({ initialize: function initialize(t) {
this._map = t;
}, enable: function enable() {
return this._enabled ? this : (this._enabled = !0, this.addHooks(), this);
}, disable: function disable() {
return this._enabled ? (this._enabled = !1, this.removeHooks(), this) : this;
}, enabled: function enabled() {
return !!this._enabled;
} }),
Ce = { Events: hi },
Ze = Hi ? "touchstart mousedown" : "mousedown",
Ee = { mousedown: "mouseup", touchstart: "touchend", pointerdown: "touchend", MSPointerDown: "touchend" },
Se = { mousedown: "mousemove", touchstart: "touchmove", pointerdown: "touchmove", MSPointerDown: "touchmove" },
ke = ui.extend({ options: { clickTolerance: 3 }, initialize: function initialize(t, i, e, n) {
l(this, n), this._element = t, this._dragStartTarget = i || t, this._preventOutline = e;
}, enable: function enable() {
this._enabled || (V(this._dragStartTarget, Ze, this._onDown, this), this._enabled = !0);
}, disable: function disable() {
this._enabled && (ke._dragging === this && this.finishDrag(), G(this._dragStartTarget, Ze, this._onDown, this), this._enabled = !1, this._moved = !1);
}, _onDown: function _onDown(t) {
if (!t._simulated && this._enabled && (this._moved = !1, !dt(this._element, "leaflet-zoom-anim") && !(ke._dragging || t.shiftKey || 1 !== t.which && 1 !== t.button && !t.touches || (ke._dragging = this, this._preventOutline && zt(this._element), bt(), pi(), this._moving)))) {
this.fire("down");var i = t.touches ? t.touches[0] : t;this._startPoint = new x(i.clientX, i.clientY), V(document, Se[t.type], this._onMove, this), V(document, Ee[t.type], this._onUp, this);
}
}, _onMove: function _onMove(t) {
if (!t._simulated && this._enabled) if (t.touches && t.touches.length > 1) this._moved = !0;else {
var i = t.touches && 1 === t.touches.length ? t.touches[0] : t,
e = new x(i.clientX, i.clientY).subtract(this._startPoint);(e.x || e.y) && (Math.abs(e.x) + Math.abs(e.y) < this.options.clickTolerance || ($(t), this._moved || (this.fire("dragstart"), this._moved = !0, this._startPos = Pt(this._element).subtract(e), pt(document.body, "leaflet-dragging"), this._lastTarget = t.target || t.srcElement, window.SVGElementInstance && this._lastTarget instanceof SVGElementInstance && (this._lastTarget = this._lastTarget.correspondingUseElement), pt(this._lastTarget, "leaflet-drag-target")), this._newPos = this._startPos.add(e), this._moving = !0, g(this._animRequest), this._lastEvent = t, this._animRequest = f(this._updatePosition, this, !0)));
}
}, _updatePosition: function _updatePosition() {
var t = { originalEvent: this._lastEvent };this.fire("predrag", t), Lt(this._element, this._newPos), this.fire("drag", t);
}, _onUp: function _onUp(t) {
!t._simulated && this._enabled && this.finishDrag();
}, finishDrag: function finishDrag() {
mt(document.body, "leaflet-dragging"), this._lastTarget && (mt(this._lastTarget, "leaflet-drag-target"), this._lastTarget = null);for (var t in Se) {
G(document, Se[t], this._onMove, this), G(document, Ee[t], this._onUp, this);
}Tt(), mi(), this._moved && this._moving && (g(this._animRequest), this.fire("dragend", { distance: this._newPos.distanceTo(this._startPos) })), this._moving = !1, ke._dragging = !1;
} }),
Be = (Object.freeze || Object)({ simplify: Ct, pointToSegmentDistance: Zt, closestPointOnSegment: function closestPointOnSegment(t, i, e) {
return Rt(t, i, e);
}, clipSegment: Bt, _getEdgeIntersection: It, _getBitCode: At, _sqClosestPointOnSegment: Rt, isFlat: Dt, _flat: Nt }),
Ie = (Object.freeze || Object)({ clipPolygon: jt }),
Ae = { project: function project(t) {
return new x(t.lng, t.lat);
}, unproject: function unproject(t) {
return new M(t.y, t.x);
}, bounds: new P([-180, -90], [180, 90]) },
Oe = { R: 6378137, R_MINOR: 6356752.314245179, bounds: new P([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]), project: function project(t) {
var i = Math.PI / 180,
e = this.R,
n = t.lat * i,
o = this.R_MINOR / e,
s = Math.sqrt(1 - o * o),
r = s * Math.sin(n),
a = Math.tan(Math.PI / 4 - n / 2) / Math.pow((1 - r) / (1 + r), s / 2);return n = -e * Math.log(Math.max(a, 1e-10)), new x(t.lng * i * e, n);
}, unproject: function unproject(t) {
for (var i, e = 180 / Math.PI, n = this.R, o = this.R_MINOR / n, s = Math.sqrt(1 - o * o), r = Math.exp(-t.y / n), a = Math.PI / 2 - 2 * Math.atan(r), h = 0, u = .1; h < 15 && Math.abs(u) > 1e-7; h++) {
i = s * Math.sin(a), i = Math.pow((1 - i) / (1 + i), s / 2), a += u = Math.PI / 2 - 2 * Math.atan(r * i) - a;
}return new M(a * e, t.x * e / n);
} },
Re = (Object.freeze || Object)({ LonLat: Ae, Mercator: Oe, SphericalMercator: _i }),
De = i({}, ci, { code: "EPSG:3395", projection: Oe, transformation: function () {
var t = .5 / (Math.PI * Oe.R);return E(t, .5, -t, .5);
}() }),
Ne = i({}, ci, { code: "EPSG:4326", projection: Ae, transformation: E(1 / 180, 1, -1 / 180, .5) }),
je = i({}, li, { projection: Ae, transformation: E(1, 0, -1, 0), scale: function scale(t) {
return Math.pow(2, t);
}, zoom: function zoom(t) {
return Math.log(t) / Math.LN2;
}, distance: function distance(t, i) {
var e = i.lng - t.lng,
n = i.lat - t.lat;return Math.sqrt(e * e + n * n);
}, infinite: !0 });li.Earth = ci, li.EPSG3395 = De, li.EPSG3857 = gi, li.EPSG900913 = vi, li.EPSG4326 = Ne, li.Simple = je;var We = ui.extend({ options: { pane: "overlayPane", attribution: null, bubblingMouseEvents: !0 }, addTo: function addTo(t) {
return t.addLayer(this), this;
}, remove: function remove() {
return this.removeFrom(this._map || this._mapToAdd);
}, removeFrom: function removeFrom(t) {
return t && t.removeLayer(this), this;
}, getPane: function getPane(t) {
return this._map.getPane(t ? this.options[t] || t : this.options.pane);
}, addInteractiveTarget: function addInteractiveTarget(t) {
return this._map._targets[n(t)] = this, this;
}, removeInteractiveTarget: function removeInteractiveTarget(t) {
return delete this._map._targets[n(t)], this;
}, getAttribution: function getAttribution() {
return this.options.attribution;
}, _layerAdd: function _layerAdd(t) {
var i = t.target;if (i.hasLayer(this)) {
if (this._map = i, this._zoomAnimated = i._zoomAnimated, this.getEvents) {
var e = this.getEvents();i.on(e, this), this.once("remove", function () {
i.off(e, this);
}, this);
}this.onAdd(i), this.getAttribution && i.attributionControl && i.attributionControl.addAttribution(this.getAttribution()), this.fire("add"), i.fire("layeradd", { layer: this });
}
} });ye.include({ addLayer: function addLayer(t) {
if (!t._layerAdd) throw new Error("The provided object is not a Layer.");var i = n(t);return this._layers[i] ? this : (this._layers[i] = t, t._mapToAdd = this, t.beforeAdd && t.beforeAdd(this), this.whenReady(t._layerAdd, t), this);
}, removeLayer: function removeLayer(t) {
var i = n(t);return this._layers[i] ? (this._loaded && t.onRemove(this), t.getAttribution && this.attributionControl && this.attributionControl.removeAttribution(t.getAttribution()), delete this._layers[i], this._loaded && (this.fire("layerremove", { layer: t }), t.fire("remove")), t._map = t._mapToAdd = null, this) : this;
}, hasLayer: function hasLayer(t) {
return !!t && n(t) in this._layers;
}, eachLayer: function eachLayer(t, i) {
for (var e in this._layers) {
t.call(i, this._layers[e]);
}return this;
}, _addLayers: function _addLayers(t) {
for (var i = 0, e = (t = t ? ei(t) ? t : [t] : []).length; i < e; i++) {
this.addLayer(t[i]);
}
}, _addZoomLimit: function _addZoomLimit(t) {
!isNaN(t.options.maxZoom) && isNaN(t.options.minZoom) || (this._zoomBoundLayers[n(t)] = t, this._updateZoomLevels());
}, _removeZoomLimit: function _removeZoomLimit(t) {
var i = n(t);this._zoomBoundLayers[i] && (delete this._zoomBoundLayers[i], this._updateZoomLevels());
}, _updateZoomLevels: function _updateZoomLevels() {
var t = 1 / 0,
i = -1 / 0,
e = this._getZoomSpan();for (var n in this._zoomBoundLayers) {
var o = this._zoomBoundLayers[n].options;t = void 0 === o.minZoom ? t : Math.min(t, o.minZoom), i = void 0 === o.maxZoom ? i : Math.max(i, o.maxZoom);
}this._layersMaxZoom = i === -1 / 0 ? void 0 : i, this._layersMinZoom = t === 1 / 0 ? void 0 : t, e !== this._getZoomSpan() && this.fire("zoomlevelschange"), void 0 === this.options.maxZoom && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom && this.setZoom(this._layersMaxZoom), void 0 === this.options.minZoom && this._layersMinZoom && this.getZoom() < this._layersMinZoom && this.setZoom(this._layersMinZoom);
} });var He = We.extend({ initialize: function initialize(t) {
this._layers = {};var i, e;if (t) for (i = 0, e = t.length; i < e; i++) {
this.addLayer(t[i]);
}
}, addLayer: function addLayer(t) {
var i = this.getLayerId(t);return this._layers[i] = t, this._map && this._map.addLayer(t), this;
}, removeLayer: function removeLayer(t) {
var i = t in this._layers ? t : this.getLayerId(t);return this._map && this._layers[i] && this._map.removeLayer(this._layers[i]), delete this._layers[i], this;
}, hasLayer: function hasLayer(t) {
return !!t && (t in this._layers || this.getLayerId(t) in this._layers);
}, clearLayers: function clearLayers() {
for (var t in this._layers) {
this.removeLayer(this._layers[t]);
}return this;
}, invoke: function invoke(t) {
var i,
e,
n = Array.prototype.slice.call(arguments, 1);for (i in this._layers) {
(e = this._layers[i])[t] && e[t].apply(e, n);
}return this;
}, onAdd: function onAdd(t) {
for (var i in this._layers) {
t.addLayer(this._layers[i]);
}
}, onRemove: function onRemove(t) {
for (var i in this._layers) {
t.removeLayer(this._layers[i]);
}
}, eachLayer: function eachLayer(t, i) {
for (var e in this._layers) {
t.call(i, this._layers[e]);
}return this;
}, getLayer: function getLayer(t) {
return this._layers[t];
}, getLayers: function getLayers() {
var t = [];for (var i in this._layers) {
t.push(this._layers[i]);
}return t;
}, setZIndex: function setZIndex(t) {
return this.invoke("setZIndex", t);
}, getLayerId: function getLayerId(t) {
return n(t);
} }),
Fe = He.extend({ addLayer: function addLayer(t) {
return this.hasLayer(t) ? this : (t.addEventParent(this), He.prototype.addLayer.call(this, t), this.fire("layeradd", { layer: t }));
}, removeLayer: function removeLayer(t) {
return this.hasLayer(t) ? (t in this._layers && (t = this._layers[t]), t.removeEventParent(this), He.prototype.removeLayer.call(this, t), this.fire("layerremove", { layer: t })) : this;
}, setStyle: function setStyle(t) {
return this.invoke("setStyle", t);
}, bringToFront: function bringToFront() {
return this.invoke("bringToFront");
}, bringToBack: function bringToBack() {
return this.invoke("bringToBack");
}, getBounds: function getBounds() {
var t = new T();for (var i in this._layers) {
var e = this._layers[i];t.extend(e.getBounds ? e.getBounds() : e.getLatLng());
}return t;
} }),
Ue = v.extend({ initialize: function initialize(t) {
l(this, t);
}, createIcon: function createIcon(t) {
return this._createIcon("icon", t);
}, createShadow: function createShadow(t) {
return this._createIcon("shadow", t);
}, _createIcon: function _createIcon(t, i) {
var e = this._getIconUrl(t);if (!e) {
if ("icon" === t) throw new Error("iconUrl not set in Icon options (see the docs).");return null;
}var n = this._createImg(e, i && "IMG" === i.tagName ? i : null);return this._setIconStyles(n, t), n;
}, _setIconStyles: function _setIconStyles(t, i) {
var e = this.options,
n = e[i + "Size"];"number" == typeof n && (n = [n, n]);var o = w(n),
s = w("shadow" === i && e.shadowAnchor || e.iconAnchor || o && o.divideBy(2, !0));t.className = "leaflet-marker-" + i + " " + (e.className || ""), s && (t.style.marginLeft = -s.x + "px", t.style.marginTop = -s.y + "px"), o && (t.style.width = o.x + "px", t.style.height = o.y + "px");
}, _createImg: function _createImg(t, i) {
return i = i || document.createElement("img"), i.src = t, i;
}, _getIconUrl: function _getIconUrl(t) {
return Vi && this.options[t + "RetinaUrl"] || this.options[t + "Url"];
} }),
Ve = Ue.extend({ options: { iconUrl: "marker-icon.png", iconRetinaUrl: "marker-icon-2x.png", shadowUrl: "marker-shadow.png", iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], tooltipAnchor: [16, -28], shadowSize: [41, 41] }, _getIconUrl: function _getIconUrl(t) {
return Ve.imagePath || (Ve.imagePath = this._detectIconPath()), (this.options.imagePath || Ve.imagePath) + Ue.prototype._getIconUrl.call(this, t);
}, _detectIconPath: function _detectIconPath() {
var t = ht("div", "leaflet-default-icon-path", document.body),
i = at(t, "background-image") || at(t, "backgroundImage");return document.body.removeChild(t), i = null === i || 0 !== i.indexOf("url") ? "" : i.replace(/^url\([\"\']?/, "").replace(/marker-icon\.png[\"\']?\)$/, "");
} }),
Ge = Me.extend({ initialize: function initialize(t) {
this._marker = t;
}, addHooks: function addHooks() {
var t = this._marker._icon;this._draggable || (this._draggable = new ke(t, t, !0)), this._draggable.on({ dragstart: this._onDragStart, drag: this._onDrag, dragend: this._onDragEnd }, this).enable(), pt(t, "leaflet-marker-draggable");
}, removeHooks: function removeHooks() {
this._draggable.off({ dragstart: this._onDragStart, drag: this._onDrag, dragend: this._onDragEnd }, this).disable(), this._marker._icon && mt(this._marker._icon, "leaflet-marker-draggable");
}, moved: function moved() {
return this._draggable && this._draggable._moved;
}, _onDragStart: function _onDragStart() {
this._oldLatLng = this._marker.getLatLng(), this._marker.closePopup().fire("movestart").fire("dragstart");
}, _onDrag: function _onDrag(t) {
var i = this._marker,
e = i._shadow,
n = Pt(i._icon),
o = i._map.layerPointToLatLng(n);e && Lt(e, n), i._latlng = o, t.latlng = o, t.oldLatLng = this._oldLatLng, i.fire("move", t).fire("drag", t);
}, _onDragEnd: function _onDragEnd(t) {
delete this._oldLatLng, this._marker.fire("moveend").fire("dragend", t);
} }),
qe = We.extend({ options: { icon: new Ve(), interactive: !0, draggable: !1, keyboard: !0, title: "", alt: "", zIndexOffset: 0, opacity: 1, riseOnHover: !1, riseOffset: 250, pane: "markerPane", bubblingMouseEvents: !1 }, initialize: function initialize(t, i) {
l(this, i), this._latlng = C(t);
}, onAdd: function onAdd(t) {
this._zoomAnimated = this._zoomAnimated && t.options.markerZoomAnimation, this._zoomAnimated && t.on("zoomanim", this._animateZoom, this), this._initIcon(), this.update();
}, onRemove: function onRemove(t) {
this.dragging && this.dragging.enabled() && (this.options.draggable = !0, this.dragging.removeHooks()), delete this.dragging, this._zoomAnimated && t.off("zoomanim", this._animateZoom, this), this._removeIcon(), this._removeShadow();
}, getEvents: function getEvents() {
return { zoom: this.update, viewreset: this.update };
}, getLatLng: function getLatLng() {
return this._latlng;
}, setLatLng: function setLatLng(t) {
var i = this._latlng;return this._latlng = C(t), this.update(), this.fire("move", { oldLatLng: i, latlng: this._latlng });
}, setZIndexOffset: function setZIndexOffset(t) {
return this.options.zIndexOffset = t, this.update();
}, setIcon: function setIcon(t) {
return this.options.icon = t, this._map && (this._initIcon(), this.update()), this._popup && this.bindPopup(this._popup, this._popup.options), this;
}, getElement: function getElement() {
return this._icon;
}, update: function update() {
if (this._icon) {
var t = this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t);
}return this;
}, _initIcon: function _initIcon() {
var t = this.options,
i = "leaflet-zoom-" + (this._zoomAnimated ? "animated" : "hide"),
e = t.icon.createIcon(this._icon),
n = !1;e !== this._icon && (this._icon && this._removeIcon(), n = !0, t.title && (e.title = t.title), t.alt && (e.alt = t.alt)), pt(e, i), t.keyboard && (e.tabIndex = "0"), this._icon = e, t.riseOnHover && this.on({ mouseover: this._bringToFront, mouseout: this._resetZIndex });var o = t.icon.createShadow(this._shadow),
s = !1;o !== this._shadow && (this._removeShadow(), s = !0), o && (pt(o, i), o.alt = ""), this._shadow = o, t.opacity < 1 && this._updateOpacity(), n && this.getPane().appendChild(this._icon), this._initInteraction(), o && s && this.getPane("shadowPane").appendChild(this._shadow);
}, _removeIcon: function _removeIcon() {
this.options.riseOnHover && this.off({ mouseover: this._bringToFront, mouseout: this._resetZIndex }), ut(this._icon), this.removeInteractiveTarget(this._icon), this._icon = null;
}, _removeShadow: function _removeShadow() {
this._shadow && ut(this._shadow), this._shadow = null;
}, _setPos: function _setPos(t) {
Lt(this._icon, t), this._shadow && Lt(this._shadow, t), this._zIndex = t.y + this.options.zIndexOffset, this._resetZIndex();
}, _updateZIndex: function _updateZIndex(t) {
this._icon.style.zIndex = this._zIndex + t;
}, _animateZoom: function _animateZoom(t) {
var i = this._map._latLngToNewLayerPoint(this._latlng, t.zoom, t.center).round();this._setPos(i);
}, _initInteraction: function _initInteraction() {
if (this.options.interactive && (pt(this._icon, "leaflet-interactive"), this.addInteractiveTarget(this._icon), Ge)) {
var t = this.options.draggable;this.dragging && (t = this.dragging.enabled(), this.dragging.disable()), this.dragging = new Ge(this), t && this.dragging.enable();
}
}, setOpacity: function setOpacity(t) {
return this.options.opacity = t, this._map && this._updateOpacity(), this;
}, _updateOpacity: function _updateOpacity() {
var t = this.options.opacity;vt(this._icon, t), this._shadow && vt(this._shadow, t);
}, _bringToFront: function _bringToFront() {
this._updateZIndex(this.options.riseOffset);
}, _resetZIndex: function _resetZIndex() {
this._updateZIndex(0);
}, _getPopupAnchor: function _getPopupAnchor() {
return this.options.icon.options.popupAnchor || [0, 0];
}, _getTooltipAnchor: function _getTooltipAnchor() {
return this.options.icon.options.tooltipAnchor || [0, 0];
} }),
Ke = We.extend({ options: { stroke: !0, color: "#3388ff", weight: 3, opacity: 1, lineCap: "round", lineJoin: "round", dashArray: null, dashOffset: null, fill: !1, fillColor: null, fillOpacity: .2, fillRule: "evenodd", interactive: !0, bubblingMouseEvents: !0 }, beforeAdd: function beforeAdd(t) {
this._renderer = t.getRenderer(this);
}, onAdd: function onAdd() {
this._renderer._initPath(this), this._reset(), this._renderer._addPath(this);
}, onRemove: function onRemove() {
this._renderer._removePath(this);
}, redraw: function redraw() {
return this._map && this._renderer._updatePath(this), this;
}, setStyle: function setStyle(t) {
return l(this, t), this._renderer && this._renderer._updateStyle(this), this;
}, bringToFront: function bringToFront() {
return this._renderer && this._renderer._bringToFront(this), this;
}, bringToBack: function bringToBack() {
return this._renderer && this._renderer._bringToBack(this), this;
}, getElement: function getElement() {
return this._path;
}, _reset: function _reset() {
this._project(), this._update();
}, _clickTolerance: function _clickTolerance() {
return (this.options.stroke ? this.options.weight / 2 : 0) + (Hi ? 10 : 0);
} }),
Ye = Ke.extend({ options: { fill: !0, radius: 10 }, initialize: function initialize(t, i) {
l(this, i), this._latlng = C(t), this._radius = this.options.radius;
}, setLatLng: function setLatLng(t) {
return this._latlng = C(t), this.redraw(), this.fire("move", { latlng: this._latlng });
}, getLatLng: function getLatLng() {
return this._latlng;
}, setRadius: function setRadius(t) {
return this.options.radius = this._radius = t, this.redraw();
}, getRadius: function getRadius() {
return this._radius;
}, setStyle: function setStyle(t) {
var i = t && t.radius || this._radius;return Ke.prototype.setStyle.call(this, t), this.setRadius(i), this;
}, _project: function _project() {
this._point = this._map.latLngToLayerPoint(this._latlng), this._updateBounds();
}, _updateBounds: function _updateBounds() {
var t = this._radius,
i = this._radiusY || t,
e = this._clickTolerance(),
n = [t + e, i + e];this._pxBounds = new P(this._point.subtract(n), this._point.add(n));
}, _update: function _update() {
this._map && this._updatePath();
}, _updatePath: function _updatePath() {
this._renderer._updateCircle(this);
}, _empty: function _empty() {
return this._radius && !this._renderer._bounds.intersects(this._pxBounds);
}, _containsPoint: function _containsPoint(t) {
return t.distanceTo(this._point) <= this._radius + this._clickTolerance();
} }),
Xe = Ye.extend({ initialize: function initialize(t, e, n) {
if ("number" == typeof e && (e = i({}, n, { radius: e })), l(this, e), this._latlng = C(t), isNaN(this.options.radius)) throw new Error("Circle radius cannot be NaN");this._mRadius = this.options.radius;
}, setRadius: function setRadius(t) {
return this._mRadius = t, this.redraw();
}, getRadius: function getRadius() {
return this._mRadius;
}, getBounds: function getBounds() {
var t = [this._radius, this._radiusY || this._radius];return new T(this._map.layerPointToLatLng(this._point.subtract(t)), this._map.layerPointToLatLng(this._point.add(t)));
}, setStyle: Ke.prototype.setStyle, _project: function _project() {
var t = this._latlng.lng,
i = this._latlng.lat,
e = this._map,
n = e.options.crs;if (n.distance === ci.distance) {
var o = Math.PI / 180,
s = this._mRadius / ci.R / o,
r = e.project([i + s, t]),
a = e.project([i - s, t]),
h = r.add(a).divideBy(2),
u = e.unproject(h).lat,
l = Math.acos((Math.cos(s * o) - Math.sin(i * o) * Math.sin(u * o)) / (Math.cos(i * o) * Math.cos(u * o))) / o;(isNaN(l) || 0 === l) && (l = s / Math.cos(Math.PI / 180 * i)), this._point = h.subtract(e.getPixelOrigin()), this._radius = isNaN(l) ? 0 : Math.max(Math.round(h.x - e.project([u, t - l]).x), 1), this._radiusY = Math.max(Math.round(h.y - r.y), 1);
} else {
var c = n.unproject(n.project(this._latlng).subtract([this._mRadius, 0]));this._point = e.latLngToLayerPoint(this._latlng), this._radius = this._point.x - e.latLngToLayerPoint(c).x;
}this._updateBounds();
} }),
Je = Ke.extend({ options: { smoothFactor: 1, noClip: !1 }, initialize: function initialize(t, i) {
l(this, i), this._setLatLngs(t);
}, getLatLngs: function getLatLngs() {
return this._latlngs;
}, setLatLngs: function setLatLngs(t) {
return this._setLatLngs(t), this.redraw();
}, isEmpty: function isEmpty() {
return !this._latlngs.length;
}, closestLayerPoint: function closestLayerPoint(t) {
for (var i, e, n = 1 / 0, o = null, s = Rt, r = 0, a = this._parts.length; r < a; r++) {
for (var h = this._parts[r], u = 1, l = h.length; u < l; u++) {
var c = s(t, i = h[u - 1], e = h[u], !0);c < n && (n = c, o = s(t, i, e));
}
}return o && (o.distance = Math.sqrt(n)), o;
}, getCenter: function getCenter() {
if (!this._map) throw new Error("Must add layer to map before using getCenter()");var t,
i,
e,
n,
o,
s,
r,
a = this._rings[0],
h = a.length;if (!h) return null;for (t = 0, i = 0; t < h - 1; t++) {
i += a[t].distanceTo(a[t + 1]) / 2;
}if (0 === i) return this._map.layerPointToLatLng(a[0]);for (t = 0, n = 0; t < h - 1; t++) {
if (o = a[t], s = a[t + 1], e = o.distanceTo(s), (n += e) > i) return r = (n - i) / e, this._map.layerPointToLatLng([s.x - r * (s.x - o.x), s.y - r * (s.y - o.y)]);
}
}, getBounds: function getBounds() {
return this._bounds;
}, addLatLng: function addLatLng(t, i) {
return i = i || this._defaultShape(), t = C(t), i.push(t), this._bounds.extend(t), this.redraw();
}, _setLatLngs: function _setLatLngs(t) {
this._bounds = new T(), this._latlngs = this._convertLatLngs(t);
}, _defaultShape: function _defaultShape() {
return Dt(this._latlngs) ? this._latlngs : this._latlngs[0];
}, _convertLatLngs: function _convertLatLngs(t) {
for (var i = [], e = Dt(t), n = 0, o = t.length; n < o; n++) {
e ? (i[n] = C(t[n]), this._bounds.extend(i[n])) : i[n] = this._convertLatLngs(t[n]);
}return i;
}, _project: function _project() {
var t = new P();this._rings = [], this._projectLatlngs(this._latlngs, this._rings, t);var i = this._clickTolerance(),
e = new x(i, i);this._bounds.isValid() && t.isValid() && (t.min._subtract(e), t.max._add(e), this._pxBounds = t);
}, _projectLatlngs: function _projectLatlngs(t, i, e) {
var n,
o,
s = t[0] instanceof M,
r = t.length;if (s) {
for (o = [], n = 0; n < r; n++) {
o[n] = this._map.latLngToLayerPoint(t[n]), e.extend(o[n]);
}i.push(o);
} else for (n = 0; n < r; n++) {
this._projectLatlngs(t[n], i, e);
}
}, _clipPoints: function _clipPoints() {
var t = this._renderer._bounds;if (this._parts = [], this._pxBounds && this._pxBounds.intersects(t)) if (this.options.noClip) this._parts = this._rings;else {
var i,
e,
n,
o,
s,
r,
a,
h = this._parts;for (i = 0, n = 0, o = this._rings.length; i < o; i++) {
for (e = 0, s = (a = this._rings[i]).length; e < s - 1; e++) {
(r = Bt(a[e], a[e + 1], t, e, !0)) && (h[n] = h[n] || [], h[n].push(r[0]), r[1] === a[e + 1] && e !== s - 2 || (h[n].push(r[1]), n++));
}
}
}
}, _simplifyPoints: function _simplifyPoints() {
for (var t = this._parts, i = this.options.smoothFactor, e = 0, n = t.length; e < n; e++) {
t[e] = Ct(t[e], i);
}
}, _update: function _update() {
this._map && (this._clipPoints(), this._simplifyPoints(), this._updatePath());
}, _updatePath: function _updatePath() {
this._renderer._updatePoly(this);
}, _containsPoint: function _containsPoint(t, i) {
var e,
n,
o,
s,
r,
a,
h = this._clickTolerance();if (!this._pxBounds || !this._pxBounds.contains(t)) return !1;for (e = 0, s = this._parts.length; e < s; e++) {
for (n = 0, o = (r = (a = this._parts[e]).length) - 1; n < r; o = n++) {
if ((i || 0 !== n) && Zt(t, a[o], a[n]) <= h) return !0;
}
}return !1;
} });Je._flat = Nt;var $e = Je.extend({ options: { fill: !0 }, isEmpty: function isEmpty() {
return !this._latlngs.length || !this._latlngs[0].length;
}, getCenter: function getCenter() {
if (!this._map) throw new Error("Must add layer to map before using getCenter()");var t,
i,
e,
n,
o,
s,
r,
a,
h,
u = this._rings[0],
l = u.length;if (!l) return null;for (s = r = a = 0, t = 0, i = l - 1; t < l; i = t++) {
e = u[t], n = u[i], o = e.y * n.x - n.y * e.x, r += (e.x + n.x) * o, a += (e.y + n.y) * o, s += 3 * o;
}return h = 0 === s ? u[0] : [r / s, a / s], this._map.layerPointToLatLng(h);
}, _convertLatLngs: function _convertLatLngs(t) {
var i = Je.prototype._convertLatLngs.call(this, t),
e = i.length;return e >= 2 && i[0] instanceof M && i[0].equals(i[e - 1]) && i.pop(), i;
}, _setLatLngs: function _setLatLngs(t) {
Je.prototype._setLatLngs.call(this, t), Dt(this._latlngs) && (this._latlngs = [this._latlngs]);
}, _defaultShape: function _defaultShape() {
return Dt(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];
}, _clipPoints: function _clipPoints() {
var t = this._renderer._bounds,
i = this.options.weight,
e = new x(i, i);if (t = new P(t.min.subtract(e), t.max.add(e)), this._parts = [], this._pxBounds && this._pxBounds.intersects(t)) if (this.options.noClip) this._parts = this._rings;else for (var n, o = 0, s = this._rings.length; o < s; o++) {
(n = jt(this._rings[o], t, !0)).length && this._parts.push(n);
}
}, _updatePath: function _updatePath() {
this._renderer._updatePoly(this, !0);
}, _containsPoint: function _containsPoint(t) {
var i,
e,
n,
o,
s,
r,
a,
h,
u = !1;if (!this._pxBounds.contains(t)) return !1;for (o = 0, a = this._parts.length; o < a; o++) {
for (s = 0, r = (h = (i = this._parts[o]).length) - 1; s < h; r = s++) {
e = i[s], n = i[r], e.y > t.y != n.y > t.y && t.x < (n.x - e.x) * (t.y - e.y) / (n.y - e.y) + e.x && (u = !u);
}
}return u || Je.prototype._containsPoint.call(this, t, !0);
} }),
Qe = Fe.extend({ initialize: function initialize(t, i) {
l(this, i), this._layers = {}, t && this.addData(t);
}, addData: function addData(t) {
var i,
e,
n,
o = ei(t) ? t : t.features;if (o) {
for (i = 0, e = o.length; i < e; i++) {
((n = o[i]).geometries || n.geometry || n.features || n.coordinates) && this.addData(n);
}return this;
}var s = this.options;if (s.filter && !s.filter(t)) return this;var r = Wt(t, s);return r ? (r.feature = qt(t), r.defaultOptions = r.options, this.resetStyle(r), s.onEachFeature && s.onEachFeature(t, r), this.addLayer(r)) : this;
}, resetStyle: function resetStyle(t) {
return t.options = i({}, t.defaultOptions), this._setLayerStyle(t, this.options.style), this;
}, setStyle: function setStyle(t) {
return this.eachLayer(function (i) {
this._setLayerStyle(i, t);
}, this);
}, _setLayerStyle: function _setLayerStyle(t, i) {
"function" == typeof i && (i = i(t.feature)), t.setStyle && t.setStyle(i);
} }),
tn = { toGeoJSON: function toGeoJSON(t) {
return Gt(this, { type: "Point", coordinates: Ut(this.getLatLng(), t) });
} };qe.include(tn), Xe.include(tn), Ye.include(tn), Je.include({ toGeoJSON: function toGeoJSON(t) {
var i = !Dt(this._latlngs),
e = Vt(this._latlngs, i ? 1 : 0, !1, t);return Gt(this, { type: (i ? "Multi" : "") + "LineString", coordinates: e });
} }), $e.include({ toGeoJSON: function toGeoJSON(t) {
var i = !Dt(this._latlngs),
e = i && !Dt(this._latlngs[0]),
n = Vt(this._latlngs, e ? 2 : i ? 1 : 0, !0, t);return i || (n = [n]), Gt(this, { type: (e ? "Multi" : "") + "Polygon", coordinates: n });
} }), He.include({ toMultiPoint: function toMultiPoint(t) {
var i = [];return this.eachLayer(function (e) {
i.push(e.toGeoJSON(t).geometry.coordinates);
}), Gt(this, { type: "MultiPoint", coordinates: i });
}, toGeoJSON: function toGeoJSON(t) {
var i = this.feature && this.feature.geometry && this.feature.geometry.type;if ("MultiPoint" === i) return this.toMultiPoint(t);var e = "GeometryCollection" === i,
n = [];return this.eachLayer(function (i) {
if (i.toGeoJSON) {
var o = i.toGeoJSON(t);if (e) n.push(o.geometry);else {
var s = qt(o);"FeatureCollection" === s.type ? n.push.apply(n, s.features) : n.push(s);
}
}
}), e ? Gt(this, { geometries: n, type: "GeometryCollection" }) : { type: "FeatureCollection", features: n };
} });var en = Kt,
nn = We.extend({ options: { opacity: 1, alt: "", interactive: !1, crossOrigin: !1, errorOverlayUrl: "", zIndex: 1, className: "" }, initialize: function initialize(t, i, e) {
this._url = t, this._bounds = z(i), l(this, e);
}, onAdd: function onAdd() {
this._image || (this._initImage(), this.options.opacity < 1 && this._updateOpacity()), this.options.interactive && (pt(this._image, "leaflet-interactive"), this.addInteractiveTarget(this._image)), this.getPane().appendChild(this._image), this._reset();
}, onRemove: function onRemove() {
ut(this._image), this.options.interactive && this.removeInteractiveTarget(this._image);
}, setOpacity: function setOpacity(t) {
return this.options.opacity = t, this._image && this._updateOpacity(), this;
}, setStyle: function setStyle(t) {
return t.opacity && this.setOpacity(t.opacity), this;
}, bringToFront: function bringToFront() {
return this._map && ct(this._image), this;
}, bringToBack: function bringToBack() {
return this._map && _t(this._image), this;
}, setUrl: function setUrl(t) {
return this._url = t, this._image && (this._image.src = t), this;
}, setBounds: function setBounds(t) {
return this._bounds = z(t), this._map && this._reset(), this;
}, getEvents: function getEvents() {
var t = { zoom: this._reset, viewreset: this._reset };return this._zoomAnimated && (t.zoomanim = this._animateZoom), t;
}, setZIndex: function setZIndex(t) {
return this.options.zIndex = t, this._updateZIndex(), this;
}, getBounds: function getBounds() {
return this._bounds;
}, getElement: function getElement() {
return this._image;
}, _initImage: function _initImage() {
var t = this._image = ht("img", "leaflet-image-layer " + (this._zoomAnimated ? "leaflet-zoom-animated" : "") + (this.options.className || ""));t.onselectstart = r, t.onmousemove = r, t.onload = e(this.fire, this, "load"), t.onerror = e(this._overlayOnError, this, "error"), this.options.crossOrigin && (t.crossOrigin = ""), this.options.zIndex && this._updateZIndex(), t.src = this._url, t.alt = this.options.alt;
}, _animateZoom: function _animateZoom(t) {
var i = this._map.getZoomScale(t.zoom),
e = this._map._latLngBoundsToNewLayerBounds(this._bounds, t.zoom, t.center).min;wt(this._image, e, i);
}, _reset: function _reset() {
var t = this._image,
i = new P(this._map.latLngToLayerPoint(this._bounds.getNorthWest()), this._map.latLngToLayerPoint(this._bounds.getSouthEast())),
e = i.getSize();Lt(t, i.min), t.style.width = e.x + "px", t.style.height = e.y + "px";
}, _updateOpacity: function _updateOpacity() {
vt(this._image, this.options.opacity);
}, _updateZIndex: function _updateZIndex() {
this._image && void 0 !== this.options.zIndex && null !== this.options.zIndex && (this._image.style.zIndex = this.options.zIndex);
}, _overlayOnError: function _overlayOnError() {
this.fire("error");var t = this.options.errorOverlayUrl;t && this._url !== t && (this._url = t, this._image.src = t);
} }),
on = nn.extend({ options: { autoplay: !0, loop: !0 }, _initImage: function _initImage() {
var t = "VIDEO" === this._url.tagName,
i = this._image = t ? this._url : ht("video");if (i.class = i.class || "", i.class += "leaflet-image-layer " + (this._zoomAnimated ? "leaflet-zoom-animated" : ""), i.onselectstart = r, i.onmousemove = r, i.onloadeddata = e(this.fire, this, "load"), !t) {
ei(this._url) || (this._url = [this._url]), i.autoplay = !!this.options.autoplay, i.loop = !!this.options.loop;for (var n = 0; n < this._url.length; n++) {
var o = ht("source");o.src = this._url[n], i.appendChild(o);
}
}
} }),
sn = We.extend({ options: { offset: [0, 7], className: "", pane: "popupPane" }, initialize: function initialize(t, i) {
l(this, t), this._source = i;
}, onAdd: function onAdd(t) {
this._zoomAnimated = t._zoomAnimated, this._container || this._initLayout(), t._fadeAnimated && vt(this._container, 0), clearTimeout(this._removeTimeout), this.getPane().appendChild(this._container), this.update(), t._fadeAnimated && vt(this._container, 1), this.bringToFront();
}, onRemove: function onRemove(t) {
t._fadeAnimated ? (vt(this._container, 0), this._removeTimeout = setTimeout(e(ut, void 0, this._container), 200)) : ut(this._container);
}, getLatLng: function getLatLng() {
return this._latlng;
}, setLatLng: function setLatLng(t) {
return this._latlng = C(t), this._map && (this._updatePosition(), this._adjustPan()), this;
}, getContent: function getContent() {
return this._content;
}, setContent: function setContent(t) {
return this._content = t, this.update(), this;
}, getElement: function getElement() {
return this._container;
}, update: function update() {
this._map && (this._container.style.visibility = "hidden", this._updateContent(), this._updateLayout(), this._updatePosition(), this._container.style.visibility = "", this._adjustPan());
}, getEvents: function getEvents() {
var t = { zoom: this._updatePosition, viewreset: this._updatePosition };return this._zoomAnimated && (t.zoomanim = this._animateZoom), t;
}, isOpen: function isOpen() {
return !!this._map && this._map.hasLayer(this);
}, bringToFront: function bringToFront() {
return this._map && ct(this._container), this;
}, bringToBack: function bringToBack() {
return this._map && _t(this._container), this;
}, _updateContent: function _updateContent() {
if (this._content) {
var t = this._contentNode,
i = "function" == typeof this._content ? this._content(this._source || this) : this._content;if ("string" == typeof i) t.innerHTML = i;else {
for (; t.hasChildNodes();) {
t.removeChild(t.firstChild);
}t.appendChild(i);
}this.fire("contentupdate");
}
}, _updatePosition: function _updatePosition() {
if (this._map) {
var t = this._map.latLngToLayerPoint(this._latlng),
i = w(this.options.offset),
e = this._getAnchor();this._zoomAnimated ? Lt(this._container, t.add(e)) : i = i.add(t).add(e);var n = this._containerBottom = -i.y,
o = this._containerLeft = -Math.round(this._containerWidth / 2) + i.x;this._container.style.bottom = n + "px", this._container.style.left = o + "px";
}
}, _getAnchor: function _getAnchor() {
return [0, 0];
} }),
rn = sn.extend({ options: { maxWidth: 300, minWidth: 50, maxHeight: null, autoPan: !0, autoPanPaddingTopLeft: null, autoPanPaddingBottomRight: null, autoPanPadding: [5, 5], keepInView: !1, closeButton: !0, autoClose: !0, className: "" }, openOn: function openOn(t) {
return t.openPopup(this), this;
}, onAdd: function onAdd(t) {
sn.prototype.onAdd.call(this, t), t.fire("popupopen", { popup: this }), this._source && (this._source.fire("popupopen", { popup: this }, !0), this._source instanceof Ke || this._source.on("preclick", Y));
}, onRemove: function onRemove(t) {
sn.prototype.onRemove.call(this, t), t.fire("popupclose", { popup: this }), this._source && (this._source.fire("popupclose", { popup: this }, !0), this._source instanceof Ke || this._source.off("preclick", Y));
}, getEvents: function getEvents() {
var t = sn.prototype.getEvents.call(this);return (void 0 !== this.options.closeOnClick ? this.options.closeOnClick : this._map.options.closePopupOnClick) && (t.preclick = this._close), this.options.keepInView && (t.moveend = this._adjustPan), t;
}, _close: function _close() {
this._map && this._map.closePopup(this);
}, _initLayout: function _initLayout() {
var t = "leaflet-popup",
i = this._container = ht("div", t + " " + (this.options.className || "") + " leaflet-zoom-animated"),
e = this._wrapper = ht("div", t + "-content-wrapper", i);if (this._contentNode = ht("div", t + "-content", e), J(e), X(this._contentNode), V(e, "contextmenu", Y), this._tipContainer = ht("div", t + "-tip-container", i), this._tip = ht("div", t + "-tip", this._tipContainer), this.options.closeButton) {
var n = this._closeButton = ht("a", t + "-close-button", i);n.href = "#close", n.innerHTML = "&#215;", V(n, "click", this._onCloseButtonClick, this);
}
}, _updateLayout: function _updateLayout() {
var t = this._contentNode,
i = t.style;i.width = "", i.whiteSpace = "nowrap";var e = t.offsetWidth;e = Math.min(e, this.options.maxWidth), e = Math.max(e, this.options.minWidth), i.width = e + 1 + "px", i.whiteSpace = "", i.height = "";var n = t.offsetHeight,
o = this.options.maxHeight;o && n > o ? (i.height = o + "px", pt(t, "leaflet-popup-scrolled")) : mt(t, "leaflet-popup-scrolled"), this._containerWidth = this._container.offsetWidth;
}, _animateZoom: function _animateZoom(t) {
var i = this._map._latLngToNewLayerPoint(this._latlng, t.zoom, t.center),
e = this._getAnchor();Lt(this._container, i.add(e));
}, _adjustPan: function _adjustPan() {
if (!(!this.options.autoPan || this._map._panAnim && this._map._panAnim._inProgress)) {
var t = this._map,
i = parseInt(at(this._container, "marginBottom"), 10) || 0,
e = this._container.offsetHeight + i,
n = this._containerWidth,
o = new x(this._containerLeft, -e - this._containerBottom);o._add(Pt(this._container));var s = t.layerPointToContainerPoint(o),
r = w(this.options.autoPanPadding),
a = w(this.options.autoPanPaddingTopLeft || r),
h = w(this.options.autoPanPaddingBottomRight || r),
u = t.getSize(),
l = 0,
c = 0;s.x + n + h.x > u.x && (l = s.x + n - u.x + h.x), s.x - l - a.x < 0 && (l = s.x - a.x), s.y + e + h.y > u.y && (c = s.y + e - u.y + h.y), s.y - c - a.y < 0 && (c = s.y - a.y), (l || c) && t.fire("autopanstart").panBy([l, c]);
}
}, _onCloseButtonClick: function _onCloseButtonClick(t) {
this._close(), Q(t);
}, _getAnchor: function _getAnchor() {
return w(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);
} });ye.mergeOptions({ closePopupOnClick: !0 }), ye.include({ openPopup: function openPopup(t, i, e) {
return t instanceof rn || (t = new rn(e).setContent(t)), i && t.setLatLng(i), this.hasLayer(t) ? this : (this._popup && this._popup.options.autoClose && this.closePopup(), this._popup = t, this.addLayer(t));
}, closePopup: function closePopup(t) {
return t && t !== this._popup || (t = this._popup, this._popup = null), t && this.removeLayer(t), this;
} }), We.include({ bindPopup: function bindPopup(t, i) {
return t instanceof rn ? (l(t, i), this._popup = t, t._source = this) : (this._popup && !i || (this._popup = new rn(i, this)), this._popup.setContent(t)), this._popupHandlersAdded || (this.on({ click: this._openPopup, keypress: this._onKeyPress, remove: this.closePopup, move: this._movePopup }), this._popupHandlersAdded = !0), this;
}, unbindPopup: function unbindPopup() {
return this._popup && (this.off({ click: this._openPopup, keypress: this._onKeyPress, remove: this.closePopup, move: this._movePopup }), this._popupHandlersAdded = !1, this._popup = null), this;
}, openPopup: function openPopup(t, i) {
if (t instanceof We || (i = t, t = this), t instanceof Fe) for (var e in this._layers) {
t = this._layers[e];break;
}return i || (i = t.getCenter ? t.getCenter() : t.getLatLng()), this._popup && this._map && (this._popup._source = t, this._popup.update(), this._map.openPopup(this._popup, i)), this;
}, closePopup: function closePopup() {
return this._popup && this._popup._close(), this;
}, togglePopup: function togglePopup(t) {
return this._popup && (this._popup._map ? this.closePopup() : this.openPopup(t)), this;
}, isPopupOpen: function isPopupOpen() {
return !!this._popup && this._popup.isOpen();
}, setPopupContent: function setPopupContent(t) {
return this._popup && this._popup.setContent(t), this;
}, getPopup: function getPopup() {
return this._popup;
}, _openPopup: function _openPopup(t) {
var i = t.layer || t.target;this._popup && this._map && (Q(t), i instanceof Ke ? this.openPopup(t.layer || t.target, t.latlng) : this._map.hasLayer(this._popup) && this._popup._source === i ? this.closePopup() : this.openPopup(i, t.latlng));
}, _movePopup: function _movePopup(t) {
this._popup.setLatLng(t.latlng);
}, _onKeyPress: function _onKeyPress(t) {
13 === t.originalEvent.keyCode && this._openPopup(t);
} });var an = sn.extend({ options: { pane: "tooltipPane", offset: [0, 0], direction: "auto", permanent: !1, sticky: !1, interactive: !1, opacity: .9 }, onAdd: function onAdd(t) {
sn.prototype.onAdd.call(this, t), this.setOpacity(this.options.opacity), t.fire("tooltipopen", { tooltip: this }), this._source && this._source.fire("tooltipopen", { tooltip: this }, !0);
}, onRemove: function onRemove(t) {
sn.prototype.onRemove.call(this, t), t.fire("tooltipclose", { tooltip: this }), this._source && this._source.fire("tooltipclose", { tooltip: this }, !0);
}, getEvents: function getEvents() {
var t = sn.prototype.getEvents.call(this);return Hi && !this.options.permanent && (t.preclick = this._close), t;
}, _close: function _close() {
this._map && this._map.closeTooltip(this);
}, _initLayout: function _initLayout() {
var t = "leaflet-tooltip " + (this.options.className || "") + " leaflet-zoom-" + (this._zoomAnimated ? "animated" : "hide");this._contentNode = this._container = ht("div", t);
}, _updateLayout: function _updateLayout() {}, _adjustPan: function _adjustPan() {}, _setPosition: function _setPosition(t) {
var i = this._map,
e = this._container,
n = i.latLngToContainerPoint(i.getCenter()),
o = i.layerPointToContainerPoint(t),
s = this.options.direction,
r = e.offsetWidth,
a = e.offsetHeight,
h = w(this.options.offset),
u = this._getAnchor();"top" === s ? t = t.add(w(-r / 2 + h.x, -a + h.y + u.y, !0)) : "bottom" === s ? t = t.subtract(w(r / 2 - h.x, -h.y, !0)) : "center" === s ? t = t.subtract(w(r / 2 + h.x, a / 2 - u.y + h.y, !0)) : "right" === s || "auto" === s && o.x < n.x ? (s = "right", t = t.add(w(h.x + u.x, u.y - a / 2 + h.y, !0))) : (s = "left", t = t.subtract(w(r + u.x - h.x, a / 2 - u.y - h.y, !0))), mt(e, "leaflet-tooltip-right"), mt(e, "leaflet-tooltip-left"), mt(e, "leaflet-tooltip-top"), mt(e, "leaflet-tooltip-bottom"), pt(e, "leaflet-tooltip-" + s), Lt(e, t);
}, _updatePosition: function _updatePosition() {
var t = this._map.latLngToLayerPoint(this._latlng);this._setPosition(t);
}, setOpacity: function setOpacity(t) {
this.options.opacity = t, this._container && vt(this._container, t);
}, _animateZoom: function _animateZoom(t) {
var i = this._map._latLngToNewLayerPoint(this._latlng, t.zoom, t.center);this._setPosition(i);
}, _getAnchor: function _getAnchor() {
return w(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);
} });ye.include({ openTooltip: function openTooltip(t, i, e) {
return t instanceof an || (t = new an(e).setContent(t)), i && t.setLatLng(i), this.hasLayer(t) ? this : this.addLayer(t);
}, closeTooltip: function closeTooltip(t) {
return t && this.removeLayer(t), this;
} }), We.include({ bindTooltip: function bindTooltip(t, i) {
return t instanceof an ? (l(t, i), this._tooltip = t, t._source = this) : (this._tooltip && !i || (this._tooltip = new an(i, this)), this._tooltip.setContent(t)), this._initTooltipInteractions(), this._tooltip.options.permanent && this._map && this._map.hasLayer(this) && this.openTooltip(), this;
}, unbindTooltip: function unbindTooltip() {
return this._tooltip && (this._initTooltipInteractions(!0), this.closeTooltip(), this._tooltip = null), this;
}, _initTooltipInteractions: function _initTooltipInteractions(t) {
if (t || !this._tooltipHandlersAdded) {
var i = t ? "off" : "on",
e = { remove: this.closeTooltip, move: this._moveTooltip };this._tooltip.options.permanent ? e.add = this._openTooltip : (e.mouseover = this._openTooltip, e.mouseout = this.closeTooltip, this._tooltip.options.sticky && (e.mousemove = this._moveTooltip), Hi && (e.click = this._openTooltip)), this[i](e), this._tooltipHandlersAdded = !t;
}
}, openTooltip: function openTooltip(t, i) {
if (t instanceof We || (i = t, t = this), t instanceof Fe) for (var e in this._layers) {
t = this._layers[e];break;
}return i || (i = t.getCenter ? t.getCenter() : t.getLatLng()), this._tooltip && this._map && (this._tooltip._source = t, this._tooltip.update(), this._map.openTooltip(this._tooltip, i), this._tooltip.options.interactive && this._tooltip._container && (pt(this._tooltip._container, "leaflet-clickable"), this.addInteractiveTarget(this._tooltip._container))), this;
}, closeTooltip: function closeTooltip() {
return this._tooltip && (this._tooltip._close(), this._tooltip.options.interactive && this._tooltip._container && (mt(this._tooltip._container, "leaflet-clickable"), this.removeInteractiveTarget(this._tooltip._container))), this;
}, toggleTooltip: function toggleTooltip(t) {
return this._tooltip && (this._tooltip._map ? this.closeTooltip() : this.openTooltip(t)), this;
}, isTooltipOpen: function isTooltipOpen() {
return this._tooltip.isOpen();
}, setTooltipContent: function setTooltipContent(t) {
return this._tooltip && this._tooltip.setContent(t), this;
}, getTooltip: function getTooltip() {
return this._tooltip;
}, _openTooltip: function _openTooltip(t) {
var i = t.layer || t.target;this._tooltip && this._map && this.openTooltip(i, this._tooltip.options.sticky ? t.latlng : void 0);
}, _moveTooltip: function _moveTooltip(t) {
var i,
e,
n = t.latlng;this._tooltip.options.sticky && t.originalEvent && (i = this._map.mouseEventToContainerPoint(t.originalEvent), e = this._map.containerPointToLayerPoint(i), n = this._map.layerPointToLatLng(e)), this._tooltip.setLatLng(n);
} });var hn = Ue.extend({ options: { iconSize: [12, 12], html: !1, bgPos: null, className: "leaflet-div-icon" }, createIcon: function createIcon(t) {
var i = t && "DIV" === t.tagName ? t : document.createElement("div"),
e = this.options;if (i.innerHTML = !1 !== e.html ? e.html : "", e.bgPos) {
var n = w(e.bgPos);i.style.backgroundPosition = -n.x + "px " + -n.y + "px";
}return this._setIconStyles(i, "icon"), i;
}, createShadow: function createShadow() {
return null;
} });Ue.Default = Ve;var un = We.extend({ options: { tileSize: 256, opacity: 1, updateWhenIdle: Ri, updateWhenZooming: !0, updateInterval: 200, zIndex: 1, bounds: null, minZoom: 0, maxZoom: void 0, maxNativeZoom: void 0, minNativeZoom: void 0, noWrap: !1, pane: "tilePane", className: "", keepBuffer: 2 }, initialize: function initialize(t) {
l(this, t);
}, onAdd: function onAdd() {
this._initContainer(), this._levels = {}, this._tiles = {}, this._resetView(), this._update();
}, beforeAdd: function beforeAdd(t) {
t._addZoomLimit(this);
}, onRemove: function onRemove(t) {
this._removeAllTiles(), ut(this._container), t._removeZoomLimit(this), this._container = null, this._tileZoom = null;
}, bringToFront: function bringToFront() {
return this._map && (ct(this._container), this._setAutoZIndex(Math.max)), this;
}, bringToBack: function bringToBack() {
return this._map && (_t(this._container), this._setAutoZIndex(Math.min)), this;
}, getContainer: function getContainer() {
return this._container;
}, setOpacity: function setOpacity(t) {
return this.options.opacity = t, this._updateOpacity(), this;
}, setZIndex: function setZIndex(t) {
return this.options.zIndex = t, this._updateZIndex(), this;
}, isLoading: function isLoading() {
return this._loading;
}, redraw: function redraw() {
return this._map && (this._removeAllTiles(), this._update()), this;
}, getEvents: function getEvents() {
var t = { viewprereset: this._invalidateAll, viewreset: this._resetView, zoom: this._resetView, moveend: this._onMoveEnd };return this.options.updateWhenIdle || (this._onMove || (this._onMove = o(this._onMoveEnd, this.options.updateInterval, this)), t.move = this._onMove), this._zoomAnimated && (t.zoomanim = this._animateZoom), t;
}, createTile: function createTile() {
return document.createElement("div");
}, getTileSize: function getTileSize() {
var t = this.options.tileSize;return t instanceof x ? t : new x(t, t);
}, _updateZIndex: function _updateZIndex() {
this._container && void 0 !== this.options.zIndex && null !== this.options.zIndex && (this._container.style.zIndex = this.options.zIndex);
}, _setAutoZIndex: function _setAutoZIndex(t) {
for (var i, e = this.getPane().children, n = -t(-1 / 0, 1 / 0), o = 0, s = e.length; o < s; o++) {
i = e[o].style.zIndex, e[o] !== this._container && i && (n = t(n, +i));
}isFinite(n) && (this.options.zIndex = n + t(-1, 1), this._updateZIndex());
}, _updateOpacity: function _updateOpacity() {
if (this._map && !wi) {
vt(this._container, this.options.opacity);var t = +new Date(),
i = !1,
e = !1;for (var n in this._tiles) {
var o = this._tiles[n];if (o.current && o.loaded) {
var s = Math.min(1, (t - o.loaded) / 200);vt(o.el, s), s < 1 ? i = !0 : (o.active ? e = !0 : this._onOpaqueTile(o), o.active = !0);
}
}e && !this._noPrune && this._pruneTiles(), i && (g(this._fadeFrame), this._fadeFrame = f(this._updateOpacity, this));
}
}, _onOpaqueTile: r, _initContainer: function _initContainer() {
this._container || (this._container = ht("div", "leaflet-layer " + (this.options.className || "")), this._updateZIndex(), this.options.opacity < 1 && this._updateOpacity(), this.getPane().appendChild(this._container));
}, _updateLevels: function _updateLevels() {
var t = this._tileZoom,
i = this.options.maxZoom;if (void 0 !== t) {
for (var e in this._levels) {
this._levels[e].el.children.length || e === t ? (this._levels[e].el.style.zIndex = i - Math.abs(t - e), this._onUpdateLevel(e)) : (ut(this._levels[e].el), this._removeTilesAtZoom(e), this._onRemoveLevel(e), delete this._levels[e]);
}var n = this._levels[t],
o = this._map;return n || ((n = this._levels[t] = {}).el = ht("div", "leaflet-tile-container leaflet-zoom-animated", this._container), n.el.style.zIndex = i, n.origin = o.project(o.unproject(o.getPixelOrigin()), t).round(), n.zoom = t, this._setZoomTransform(n, o.getCenter(), o.getZoom()), n.el.offsetWidth, this._onCreateLevel(n)), this._level = n, n;
}
}, _onUpdateLevel: r, _onRemoveLevel: r, _onCreateLevel: r, _pruneTiles: function _pruneTiles() {
if (this._map) {
var t,
i,
e = this._map.getZoom();if (e > this.options.maxZoom || e < this.options.minZoom) this._removeAllTiles();else {
for (t in this._tiles) {
(i = this._tiles[t]).retain = i.current;
}for (t in this._tiles) {
if ((i = this._tiles[t]).current && !i.active) {
var n = i.coords;this._retainParent(n.x, n.y, n.z, n.z - 5) || this._retainChildren(n.x, n.y, n.z, n.z + 2);
}
}for (t in this._tiles) {
this._tiles[t].retain || this._removeTile(t);
}
}
}
}, _removeTilesAtZoom: function _removeTilesAtZoom(t) {
for (var i in this._tiles) {
this._tiles[i].coords.z === t && this._removeTile(i);
}
}, _removeAllTiles: function _removeAllTiles() {
for (var t in this._tiles) {
this._removeTile(t);
}
}, _invalidateAll: function _invalidateAll() {
for (var t in this._levels) {
ut(this._levels[t].el), this._onRemoveLevel(t), delete this._levels[t];
}this._removeAllTiles(), this._tileZoom = null;
}, _retainParent: function _retainParent(t, i, e, n) {
var o = Math.floor(t / 2),
s = Math.floor(i / 2),
r = e - 1,
a = new x(+o, +s);a.z = +r;var h = this._tileCoordsToKey(a),
u = this._tiles[h];return u && u.active ? (u.retain = !0, !0) : (u && u.loaded && (u.retain = !0), r > n && this._retainParent(o, s, r, n));
}, _retainChildren: function _retainChildren(t, i, e, n) {
for (var o = 2 * t; o < 2 * t + 2; o++) {
for (var s = 2 * i; s < 2 * i + 2; s++) {
var r = new x(o, s);r.z = e + 1;var a = this._tileCoordsToKey(r),
h = this._tiles[a];h && h.active ? h.retain = !0 : (h && h.loaded && (h.retain = !0), e + 1 < n && this._retainChildren(o, s, e + 1, n));
}
}
}, _resetView: function _resetView(t) {
var i = t && (t.pinch || t.flyTo);this._setView(this._map.getCenter(), this._map.getZoom(), i, i);
}, _animateZoom: function _animateZoom(t) {
this._setView(t.center, t.zoom, !0, t.noUpdate);
}, _clampZoom: function _clampZoom(t) {
var i = this.options;return void 0 !== i.minNativeZoom && t < i.minNativeZoom ? i.minNativeZoom : void 0 !== i.maxNativeZoom && i.maxNativeZoom < t ? i.maxNativeZoom : t;
}, _setView: function _setView(t, i, e, n) {
var o = this._clampZoom(Math.round(i));(void 0 !== this.options.maxZoom && o > this.options.maxZoom || void 0 !== this.options.minZoom && o < this.options.minZoom) && (o = void 0);var s = this.options.updateWhenZooming && o !== this._tileZoom;n && !s || (this._tileZoom = o, this._abortLoading && this._abortLoading(), this._updateLevels(), this._resetGrid(), void 0 !== o && this._update(t), e || this._pruneTiles(), this._noPrune = !!e), this._setZoomTransforms(t, i);
}, _setZoomTransforms: function _setZoomTransforms(t, i) {
for (var e in this._levels) {
this._setZoomTransform(this._levels[e], t, i);
}
}, _setZoomTransform: function _setZoomTransform(t, i, e) {
var n = this._map.getZoomScale(e, t.zoom),
o = t.origin.multiplyBy(n).subtract(this._map._getNewPixelOrigin(i, e)).round();Oi ? wt(t.el, o, n) : Lt(t.el, o);
}, _resetGrid: function _resetGrid() {
var t = this._map,
i = t.options.crs,
e = this._tileSize = this.getTileSize(),
n = this._tileZoom,
o = this._map.getPixelWorldBounds(this._tileZoom);o && (this._globalTileRange = this._pxBoundsToTileRange(o)), this._wrapX = i.wrapLng && !this.options.noWrap && [Math.floor(t.project([0, i.wrapLng[0]], n).x / e.x), Math.ceil(t.project([0, i.wrapLng[1]], n).x / e.y)], this._wrapY = i.wrapLat && !this.options.noWrap && [Math.floor(t.project([i.wrapLat[0], 0], n).y / e.x), Math.ceil(t.project([i.wrapLat[1], 0], n).y / e.y)];
}, _onMoveEnd: function _onMoveEnd() {
this._map && !this._map._animatingZoom && this._update();
}, _getTiledPixelBounds: function _getTiledPixelBounds(t) {
var i = this._map,
e = i._animatingZoom ? Math.max(i._animateToZoom, i.getZoom()) : i.getZoom(),
n = i.getZoomScale(e, this._tileZoom),
o = i.project(t, this._tileZoom).floor(),
s = i.getSize().divideBy(2 * n);return new P(o.subtract(s), o.add(s));
}, _update: function _update(t) {
var i = this._map;if (i) {
var e = this._clampZoom(i.getZoom());if (void 0 === t && (t = i.getCenter()), void 0 !== this._tileZoom) {
var n = this._getTiledPixelBounds(t),
o = this._pxBoundsToTileRange(n),
s = o.getCenter(),
r = [],
a = this.options.keepBuffer,
h = new P(o.getBottomLeft().subtract([a, -a]), o.getTopRight().add([a, -a]));if (!(isFinite(o.min.x) && isFinite(o.min.y) && isFinite(o.max.x) && isFinite(o.max.y))) throw new Error("Attempted to load an infinite number of tiles");for (var u in this._tiles) {
var l = this._tiles[u].coords;l.z === this._tileZoom && h.contains(new x(l.x, l.y)) || (this._tiles[u].current = !1);
}if (Math.abs(e - this._tileZoom) > 1) this._setView(t, e);else {
for (var c = o.min.y; c <= o.max.y; c++) {
for (var _ = o.min.x; _ <= o.max.x; _++) {
var d = new x(_, c);d.z = this._tileZoom, this._isValidTile(d) && (this._tiles[this._tileCoordsToKey(d)] || r.push(d));
}
}if (r.sort(function (t, i) {
return t.distanceTo(s) - i.distanceTo(s);
}), 0 !== r.length) {
this._loading || (this._loading = !0, this.fire("loading"));var p = document.createDocumentFragment();for (_ = 0; _ < r.length; _++) {
this._addTile(r[_], p);
}this._level.el.appendChild(p);
}
}
}
}
}, _isValidTile: function _isValidTile(t) {
var i = this._map.options.crs;if (!i.infinite) {
var e = this._globalTileRange;if (!i.wrapLng && (t.x < e.min.x || t.x > e.max.x) || !i.wrapLat && (t.y < e.min.y || t.y > e.max.y)) return !1;
}if (!this.options.bounds) return !0;var n = this._tileCoordsToBounds(t);return z(this.options.bounds).overlaps(n);
}, _keyToBounds: function _keyToBounds(t) {
return this._tileCoordsToBounds(this._keyToTileCoords(t));
}, _tileCoordsToBounds: function _tileCoordsToBounds(t) {
var i = this._map,
e = this.getTileSize(),
n = t.scaleBy(e),
o = n.add(e),
s = new T(i.unproject(n, t.z), i.unproject(o, t.z));return this.options.noWrap || i.wrapLatLngBounds(s), s;
}, _tileCoordsToKey: function _tileCoordsToKey(t) {
return t.x + ":" + t.y + ":" + t.z;
}, _keyToTileCoords: function _keyToTileCoords(t) {
var i = t.split(":"),
e = new x(+i[0], +i[1]);return e.z = +i[2], e;
}, _removeTile: function _removeTile(t) {
var i = this._tiles[t];i && (ut(i.el), delete this._tiles[t], this.fire("tileunload", { tile: i.el, coords: this._keyToTileCoords(t) }));
}, _initTile: function _initTile(t) {
pt(t, "leaflet-tile");var i = this.getTileSize();t.style.width = i.x + "px", t.style.height = i.y + "px", t.onselectstart = r, t.onmousemove = r, wi && this.options.opacity < 1 && vt(t, this.options.opacity), bi && !Ti && (t.style.WebkitBackfaceVisibility = "hidden");
}, _addTile: function _addTile(t, i) {
var n = this._getTilePos(t),
o = this._tileCoordsToKey(t),
s = this.createTile(this._wrapCoords(t), e(this._tileReady, this, t));this._initTile(s), this.createTile.length < 2 && f(e(this._tileReady, this, t, null, s)), Lt(s, n), this._tiles[o] = { el: s, coords: t, current: !0 }, i.appendChild(s), this.fire("tileloadstart", { tile: s, coords: t });
}, _tileReady: function _tileReady(t, i, n) {
if (this._map) {
i && this.fire("tileerror", { error: i, tile: n, coords: t });var o = this._tileCoordsToKey(t);(n = this._tiles[o]) && (n.loaded = +new Date(), this._map._fadeAnimated ? (vt(n.el, 0), g(this._fadeFrame), this._fadeFrame = f(this._updateOpacity, this)) : (n.active = !0, this._pruneTiles()), i || (pt(n.el, "leaflet-tile-loaded"), this.fire("tileload", { tile: n.el, coords: t })), this._noTilesToLoad() && (this._loading = !1, this.fire("load"), wi || !this._map._fadeAnimated ? f(this._pruneTiles, this) : setTimeout(e(this._pruneTiles, this), 250)));
}
}, _getTilePos: function _getTilePos(t) {
return t.scaleBy(this.getTileSize()).subtract(this._level.origin);
}, _wrapCoords: function _wrapCoords(t) {
var i = new x(this._wrapX ? s(t.x, this._wrapX) : t.x, this._wrapY ? s(t.y, this._wrapY) : t.y);return i.z = t.z, i;
}, _pxBoundsToTileRange: function _pxBoundsToTileRange(t) {
var i = this.getTileSize();return new P(t.min.unscaleBy(i).floor(), t.max.unscaleBy(i).ceil().subtract([1, 1]));
}, _noTilesToLoad: function _noTilesToLoad() {
for (var t in this._tiles) {
if (!this._tiles[t].loaded) return !1;
}return !0;
} }),
ln = un.extend({ options: { minZoom: 0, maxZoom: 18, subdomains: "abc", errorTileUrl: "", zoomOffset: 0, tms: !1, zoomReverse: !1, detectRetina: !1, crossOrigin: !1 }, initialize: function initialize(t, i) {
this._url = t, (i = l(this, i)).detectRetina && Vi && i.maxZoom > 0 && (i.tileSize = Math.floor(i.tileSize / 2), i.zoomReverse ? (i.zoomOffset--, i.minZoom++) : (i.zoomOffset++, i.maxZoom--), i.minZoom = Math.max(0, i.minZoom)), "string" == typeof i.subdomains && (i.subdomains = i.subdomains.split("")), bi || this.on("tileunload", this._onTileRemove);
}, setUrl: function setUrl(t, i) {
return this._url = t, i || this.redraw(), this;
}, createTile: function createTile(t, i) {
var n = document.createElement("img");return V(n, "load", e(this._tileOnLoad, this, i, n)), V(n, "error", e(this._tileOnError, this, i, n)), this.options.crossOrigin && (n.crossOrigin = ""), n.alt = "", n.setAttribute("role", "presentation"), n.src = this.getTileUrl(t), n;
}, getTileUrl: function getTileUrl(t) {
var e = { r: Vi ? "@2x" : "", s: this._getSubdomain(t), x: t.x, y: t.y, z: this._getZoomForUrl() };if (this._map && !this._map.options.crs.infinite) {
var n = this._globalTileRange.max.y - t.y;this.options.tms && (e.y = n), e["-y"] = n;
}return _(this._url, i(e, this.options));
}, _tileOnLoad: function _tileOnLoad(t, i) {
wi ? setTimeout(e(t, this, null, i), 0) : t(null, i);
}, _tileOnError: function _tileOnError(t, i, e) {
var n = this.options.errorTileUrl;n && i.src !== n && (i.src = n), t(e, i);
}, _onTileRemove: function _onTileRemove(t) {
t.tile.onload = null;
}, _getZoomForUrl: function _getZoomForUrl() {
var t = this._tileZoom,
i = this.options.maxZoom,
e = this.options.zoomReverse,
n = this.options.zoomOffset;return e && (t = i - t), t + n;
}, _getSubdomain: function _getSubdomain(t) {
var i = Math.abs(t.x + t.y) % this.options.subdomains.length;return this.options.subdomains[i];
}, _abortLoading: function _abortLoading() {
var t, i;for (t in this._tiles) {
this._tiles[t].coords.z !== this._tileZoom && ((i = this._tiles[t].el).onload = r, i.onerror = r, i.complete || (i.src = ni, ut(i)));
}
} }),
cn = ln.extend({ defaultWmsParams: { service: "WMS", request: "GetMap", layers: "", styles: "", format: "image/jpeg", transparent: !1, version: "1.1.1" }, options: { crs: null, uppercase: !1 }, initialize: function initialize(t, e) {
this._url = t;var n = i({}, this.defaultWmsParams);for (var o in e) {
o in this.options || (n[o] = e[o]);
}e = l(this, e), n.width = n.height = e.tileSize * (e.detectRetina && Vi ? 2 : 1), this.wmsParams = n;
}, onAdd: function onAdd(t) {
this._crs = this.options.crs || t.options.crs, this._wmsVersion = parseFloat(this.wmsParams.version);var i = this._wmsVersion >= 1.3 ? "crs" : "srs";this.wmsParams[i] = this._crs.code, ln.prototype.onAdd.call(this, t);
}, getTileUrl: function getTileUrl(t) {
var i = this._tileCoordsToBounds(t),
e = this._crs.project(i.getNorthWest()),
n = this._crs.project(i.getSouthEast()),
o = (this._wmsVersion >= 1.3 && this._crs === Ne ? [n.y, e.x, e.y, n.x] : [e.x, n.y, n.x, e.y]).join(","),
s = ln.prototype.getTileUrl.call(this, t);return s + c(this.wmsParams, s, this.options.uppercase) + (this.options.uppercase ? "&BBOX=" : "&bbox=") + o;
}, setParams: function setParams(t, e) {
return i(this.wmsParams, t), e || this.redraw(), this;
} });ln.WMS = cn, Yt.wms = function (t, i) {
return new cn(t, i);
};var _n = We.extend({ options: { padding: .1 }, initialize: function initialize(t) {
l(this, t), n(this), this._layers = this._layers || {};
}, onAdd: function onAdd() {
this._container || (this._initContainer(), this._zoomAnimated && pt(this._container, "leaflet-zoom-animated")), this.getPane().appendChild(this._container), this._update(), this.on("update", this._updatePaths, this);
}, onRemove: function onRemove() {
this.off("update", this._updatePaths, this), this._destroyContainer();
}, getEvents: function getEvents() {
var t = { viewreset: this._reset, zoom: this._onZoom, moveend: this._update, zoomend: this._onZoomEnd };return this._zoomAnimated && (t.zoomanim = this._onAnimZoom), t;
}, _onAnimZoom: function _onAnimZoom(t) {
this._updateTransform(t.center, t.zoom);
}, _onZoom: function _onZoom() {
this._updateTransform(this._map.getCenter(), this._map.getZoom());
}, _updateTransform: function _updateTransform(t, i) {
var e = this._map.getZoomScale(i, this._zoom),
n = Pt(this._container),
o = this._map.getSize().multiplyBy(.5 + this.options.padding),
s = this._map.project(this._center, i),
r = this._map.project(t, i).subtract(s),
a = o.multiplyBy(-e).add(n).add(o).subtract(r);Oi ? wt(this._container, a, e) : Lt(this._container, a);
}, _reset: function _reset() {
this._update(), this._updateTransform(this._center, this._zoom);for (var t in this._layers) {
this._layers[t]._reset();
}
}, _onZoomEnd: function _onZoomEnd() {
for (var t in this._layers) {
this._layers[t]._project();
}
}, _updatePaths: function _updatePaths() {
for (var t in this._layers) {
this._layers[t]._update();
}
}, _update: function _update() {
var t = this.options.padding,
i = this._map.getSize(),
e = this._map.containerPointToLayerPoint(i.multiplyBy(-t)).round();this._bounds = new P(e, e.add(i.multiplyBy(1 + 2 * t)).round()), this._center = this._map.getCenter(), this._zoom = this._map.getZoom();
} }),
dn = _n.extend({ getEvents: function getEvents() {
var t = _n.prototype.getEvents.call(this);return t.viewprereset = this._onViewPreReset, t;
}, _onViewPreReset: function _onViewPreReset() {
this._postponeUpdatePaths = !0;
}, onAdd: function onAdd() {
_n.prototype.onAdd.call(this), this._draw();
}, _initContainer: function _initContainer() {
var t = this._container = document.createElement("canvas");V(t, "mousemove", o(this._onMouseMove, 32, this), this), V(t, "click dblclick mousedown mouseup contextmenu", this._onClick, this), V(t, "mouseout", this._handleMouseOut, this), this._ctx = t.getContext("2d");
}, _destroyContainer: function _destroyContainer() {
delete this._ctx, ut(this._container), G(this._container), delete this._container;
}, _updatePaths: function _updatePaths() {
if (!this._postponeUpdatePaths) {
this._redrawBounds = null;for (var t in this._layers) {
this._layers[t]._update();
}this._redraw();
}
}, _update: function _update() {
if (!this._map._animatingZoom || !this._bounds) {
this._drawnLayers = {}, _n.prototype._update.call(this);var t = this._bounds,
i = this._container,
e = t.getSize(),
n = Vi ? 2 : 1;Lt(i, t.min), i.width = n * e.x, i.height = n * e.y, i.style.width = e.x + "px", i.style.height = e.y + "px", Vi && this._ctx.scale(2, 2), this._ctx.translate(-t.min.x, -t.min.y), this.fire("update");
}
}, _reset: function _reset() {
_n.prototype._reset.call(this), this._postponeUpdatePaths && (this._postponeUpdatePaths = !1, this._updatePaths());
}, _initPath: function _initPath(t) {
this._updateDashArray(t), this._layers[n(t)] = t;var i = t._order = { layer: t, prev: this._drawLast, next: null };this._drawLast && (this._drawLast.next = i), this._drawLast = i, this._drawFirst = this._drawFirst || this._drawLast;
}, _addPath: function _addPath(t) {
this._requestRedraw(t);
}, _removePath: function _removePath(t) {
var i = t._order,
e = i.next,
n = i.prev;e ? e.prev = n : this._drawLast = n, n ? n.next = e : this._drawFirst = e, delete t._order, delete this._layers[L.stamp(t)], this._requestRedraw(t);
}, _updatePath: function _updatePath(t) {
this._extendRedrawBounds(t), t._project(), t._update(), this._requestRedraw(t);
}, _updateStyle: function _updateStyle(t) {
this._updateDashArray(t), this._requestRedraw(t);
}, _updateDashArray: function _updateDashArray(t) {
if (t.options.dashArray) {
var i,
e = t.options.dashArray.split(","),
n = [];for (i = 0; i < e.length; i++) {
n.push(Number(e[i]));
}t.options._dashArray = n;
}
}, _requestRedraw: function _requestRedraw(t) {
this._map && (this._extendRedrawBounds(t), this._redrawRequest = this._redrawRequest || f(this._redraw, this));
}, _extendRedrawBounds: function _extendRedrawBounds(t) {
if (t._pxBounds) {
var i = (t.options.weight || 0) + 1;this._redrawBounds = this._redrawBounds || new P(), this._redrawBounds.extend(t._pxBounds.min.subtract([i, i])), this._redrawBounds.extend(t._pxBounds.max.add([i, i]));
}
}, _redraw: function _redraw() {
this._redrawRequest = null, this._redrawBounds && (this._redrawBounds.min._floor(), this._redrawBounds.max._ceil()), this._clear(), this._draw(), this._redrawBounds = null;
}, _clear: function _clear() {
var t = this._redrawBounds;if (t) {
var i = t.getSize();this._ctx.clearRect(t.min.x, t.min.y, i.x, i.y);
} else this._ctx.clearRect(0, 0, this._container.width, this._container.height);
}, _draw: function _draw() {
var t,
i = this._redrawBounds;if (this._ctx.save(), i) {
var e = i.getSize();this._ctx.beginPath(), this._ctx.rect(i.min.x, i.min.y, e.x, e.y), this._ctx.clip();
}this._drawing = !0;for (var n = this._drawFirst; n; n = n.next) {
t = n.layer, (!i || t._pxBounds && t._pxBounds.intersects(i)) && t._updatePath();
}this._drawing = !1, this._ctx.restore();
}, _updatePoly: function _updatePoly(t, i) {
if (this._drawing) {
var e,
n,
o,
s,
r = t._parts,
a = r.length,
h = this._ctx;if (a) {
for (this._drawnLayers[t._leaflet_id] = t, h.beginPath(), e = 0; e < a; e++) {
for (n = 0, o = r[e].length; n < o; n++) {
s = r[e][n], h[n ? "lineTo" : "moveTo"](s.x, s.y);
}i && h.closePath();
}this._fillStroke(h, t);
}
}
}, _updateCircle: function _updateCircle(t) {
if (this._drawing && !t._empty()) {
var i = t._point,
e = this._ctx,
n = t._radius,
o = (t._radiusY || n) / n;this._drawnLayers[t._leaflet_id] = t, 1 !== o && (e.save(), e.scale(1, o)), e.beginPath(), e.arc(i.x, i.y / o, n, 0, 2 * Math.PI, !1), 1 !== o && e.restore(), this._fillStroke(e, t);
}
}, _fillStroke: function _fillStroke(t, i) {
var e = i.options;e.fill && (t.globalAlpha = e.fillOpacity, t.fillStyle = e.fillColor || e.color, t.fill(e.fillRule || "evenodd")), e.stroke && 0 !== e.weight && (t.setLineDash && t.setLineDash(i.options && i.options._dashArray || []), t.globalAlpha = e.opacity, t.lineWidth = e.weight, t.strokeStyle = e.color, t.lineCap = e.lineCap, t.lineJoin = e.lineJoin, t.stroke());
}, _onClick: function _onClick(t) {
for (var i, e, n = this._map.mouseEventToLayerPoint(t), o = this._drawFirst; o; o = o.next) {
(i = o.layer).options.interactive && i._containsPoint(n) && !this._map._draggableMoved(i) && (e = i);
}e && (et(t), this._fireEvent([e], t));
}, _onMouseMove: function _onMouseMove(t) {
if (this._map && !this._map.dragging.moving() && !this._map._animatingZoom) {
var i = this._map.mouseEventToLayerPoint(t);this._handleMouseHover(t, i);
}
}, _handleMouseOut: function _handleMouseOut(t) {
var i = this._hoveredLayer;i && (mt(this._container, "leaflet-interactive"), this._fireEvent([i], t, "mouseout"), this._hoveredLayer = null);
}, _handleMouseHover: function _handleMouseHover(t, i) {
for (var e, n, o = this._drawFirst; o; o = o.next) {
(e = o.layer).options.interactive && e._containsPoint(i) && (n = e);
}n !== this._hoveredLayer && (this._handleMouseOut(t), n && (pt(this._container, "leaflet-interactive"), this._fireEvent([n], t, "mouseover"), this._hoveredLayer = n)), this._hoveredLayer && this._fireEvent([this._hoveredLayer], t);
}, _fireEvent: function _fireEvent(t, i, e) {
this._map._fireDOMEvent(i, e || i.type, t);
}, _bringToFront: function _bringToFront(t) {
var i = t._order,
e = i.next,
n = i.prev;e && (e.prev = n, n ? n.next = e : e && (this._drawFirst = e), i.prev = this._drawLast, this._drawLast.next = i, i.next = null, this._drawLast = i, this._requestRedraw(t));
}, _bringToBack: function _bringToBack(t) {
var i = t._order,
e = i.next,
n = i.prev;n && (n.next = e, e ? e.prev = n : n && (this._drawLast = n), i.prev = null, i.next = this._drawFirst, this._drawFirst.prev = i, this._drawFirst = i, this._requestRedraw(t));
} }),
pn = function () {
try {
return document.namespaces.add("lvml", "urn:schemas-microsoft-com:vml"), function (t) {
return document.createElement("<lvml:" + t + ' class="lvml">');
};
} catch (t) {
return function (t) {
return document.createElement("<" + t + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">');
};
}
}(),
mn = { _initContainer: function _initContainer() {
this._container = ht("div", "leaflet-vml-container");
}, _update: function _update() {
this._map._animatingZoom || (_n.prototype._update.call(this), this.fire("update"));
}, _initPath: function _initPath(t) {
var i = t._container = pn("shape");pt(i, "leaflet-vml-shape " + (this.options.className || "")), i.coordsize = "1 1", t._path = pn("path"), i.appendChild(t._path), this._updateStyle(t), this._layers[n(t)] = t;
}, _addPath: function _addPath(t) {
var i = t._container;this._container.appendChild(i), t.options.interactive && t.addInteractiveTarget(i);
}, _removePath: function _removePath(t) {
var i = t._container;ut(i), t.removeInteractiveTarget(i), delete this._layers[n(t)];
}, _updateStyle: function _updateStyle(t) {
var i = t._stroke,
e = t._fill,
n = t.options,
o = t._container;o.stroked = !!n.stroke, o.filled = !!n.fill, n.stroke ? (i || (i = t._stroke = pn("stroke")), o.appendChild(i), i.weight = n.weight + "px", i.color = n.color, i.opacity = n.opacity, n.dashArray ? i.dashStyle = ei(n.dashArray) ? n.dashArray.join(" ") : n.dashArray.replace(/( *, *)/g, " ") : i.dashStyle = "", i.endcap = n.lineCap.replace("butt", "flat"), i.joinstyle = n.lineJoin) : i && (o.removeChild(i), t._stroke = null), n.fill ? (e || (e = t._fill = pn("fill")), o.appendChild(e), e.color = n.fillColor || n.color, e.opacity = n.fillOpacity) : e && (o.removeChild(e), t._fill = null);
}, _updateCircle: function _updateCircle(t) {
var i = t._point.round(),
e = Math.round(t._radius),
n = Math.round(t._radiusY || e);this._setPath(t, t._empty() ? "M0 0" : "AL " + i.x + "," + i.y + " " + e + "," + n + " 0,23592600");
}, _setPath: function _setPath(t, i) {
t._path.v = i;
}, _bringToFront: function _bringToFront(t) {
ct(t._container);
}, _bringToBack: function _bringToBack(t) {
_t(t._container);
} },
fn = Ki ? pn : S,
gn = _n.extend({ getEvents: function getEvents() {
var t = _n.prototype.getEvents.call(this);return t.zoomstart = this._onZoomStart, t;
}, _initContainer: function _initContainer() {
this._container = fn("svg"), this._container.setAttribute("pointer-events", "none"), this._rootGroup = fn("g"), this._container.appendChild(this._rootGroup);
}, _destroyContainer: function _destroyContainer() {
ut(this._container), G(this._container), delete this._container, delete this._rootGroup;
}, _onZoomStart: function _onZoomStart() {
this._update();
}, _update: function _update() {
if (!this._map._animatingZoom || !this._bounds) {
_n.prototype._update.call(this);var t = this._bounds,
i = t.getSize(),
e = this._container;this._svgSize && this._svgSize.equals(i) || (this._svgSize = i, e.setAttribute("width", i.x), e.setAttribute("height", i.y)), Lt(e, t.min), e.setAttribute("viewBox", [t.min.x, t.min.y, i.x, i.y].join(" ")), this.fire("update");
}
}, _initPath: function _initPath(t) {
var i = t._path = fn("path");t.options.className && pt(i, t.options.className), t.options.interactive && pt(i, "leaflet-interactive"), this._updateStyle(t), this._layers[n(t)] = t;
}, _addPath: function _addPath(t) {
this._rootGroup || this._initContainer(), this._rootGroup.appendChild(t._path), t.addInteractiveTarget(t._path);
}, _removePath: function _removePath(t) {
ut(t._path), t.removeInteractiveTarget(t._path), delete this._layers[n(t)];
}, _updatePath: function _updatePath(t) {
t._project(), t._update();
}, _updateStyle: function _updateStyle(t) {
var i = t._path,
e = t.options;i && (e.stroke ? (i.setAttribute("stroke", e.color), i.setAttribute("stroke-opacity", e.opacity), i.setAttribute("stroke-width", e.weight), i.setAttribute("stroke-linecap", e.lineCap), i.setAttribute("stroke-linejoin", e.lineJoin), e.dashArray ? i.setAttribute("stroke-dasharray", e.dashArray) : i.removeAttribute("stroke-dasharray"), e.dashOffset ? i.setAttribute("stroke-dashoffset", e.dashOffset) : i.removeAttribute("stroke-dashoffset")) : i.setAttribute("stroke", "none"), e.fill ? (i.setAttribute("fill", e.fillColor || e.color), i.setAttribute("fill-opacity", e.fillOpacity), i.setAttribute("fill-rule", e.fillRule || "evenodd")) : i.setAttribute("fill", "none"));
}, _updatePoly: function _updatePoly(t, i) {
this._setPath(t, k(t._parts, i));
}, _updateCircle: function _updateCircle(t) {
var i = t._point,
e = t._radius,
n = "a" + e + "," + (t._radiusY || e) + " 0 1,0 ",
o = t._empty() ? "M0 0" : "M" + (i.x - e) + "," + i.y + n + 2 * e + ",0 " + n + 2 * -e + ",0 ";this._setPath(t, o);
}, _setPath: function _setPath(t, i) {
t._path.setAttribute("d", i);
}, _bringToFront: function _bringToFront(t) {
ct(t._path);
}, _bringToBack: function _bringToBack(t) {
_t(t._path);
} });Ki && gn.include(mn), ye.include({ getRenderer: function getRenderer(t) {
var i = t.options.renderer || this._getPaneRenderer(t.options.pane) || this.options.renderer || this._renderer;return i || (i = this._renderer = this.options.preferCanvas && Xt() || Jt()), this.hasLayer(i) || this.addLayer(i), i;
}, _getPaneRenderer: function _getPaneRenderer(t) {
if ("overlayPane" === t || void 0 === t) return !1;var i = this._paneRenderers[t];return void 0 === i && (i = gn && Jt({ pane: t }) || dn && Xt({ pane: t }), this._paneRenderers[t] = i), i;
} });var vn = $e.extend({ initialize: function initialize(t, i) {
$e.prototype.initialize.call(this, this._boundsToLatLngs(t), i);
}, setBounds: function setBounds(t) {
return this.setLatLngs(this._boundsToLatLngs(t));
}, _boundsToLatLngs: function _boundsToLatLngs(t) {
return t = z(t), [t.getSouthWest(), t.getNorthWest(), t.getNorthEast(), t.getSouthEast()];
} });gn.create = fn, gn.pointsToPath = k, Qe.geometryToLayer = Wt, Qe.coordsToLatLng = Ht, Qe.coordsToLatLngs = Ft, Qe.latLngToCoords = Ut, Qe.latLngsToCoords = Vt, Qe.getFeature = Gt, Qe.asFeature = qt, ye.mergeOptions({ boxZoom: !0 });var yn = Me.extend({ initialize: function initialize(t) {
this._map = t, this._container = t._container, this._pane = t._panes.overlayPane, this._resetStateTimeout = 0, t.on("unload", this._destroy, this);
}, addHooks: function addHooks() {
V(this._container, "mousedown", this._onMouseDown, this);
}, removeHooks: function removeHooks() {
G(this._container, "mousedown", this._onMouseDown, this);
}, moved: function moved() {
return this._moved;
}, _destroy: function _destroy() {
ut(this._pane), delete this._pane;
}, _resetState: function _resetState() {
this._resetStateTimeout = 0, this._moved = !1;
}, _clearDeferredResetState: function _clearDeferredResetState() {
0 !== this._resetStateTimeout && (clearTimeout(this._resetStateTimeout), this._resetStateTimeout = 0);
}, _onMouseDown: function _onMouseDown(t) {
if (!t.shiftKey || 1 !== t.which && 1 !== t.button) return !1;this._clearDeferredResetState(), this._resetState(), pi(), bt(), this._startPoint = this._map.mouseEventToContainerPoint(t), V(document, { contextmenu: Q, mousemove: this._onMouseMove, mouseup: this._onMouseUp, keydown: this._onKeyDown }, this);
}, _onMouseMove: function _onMouseMove(t) {
this._moved || (this._moved = !0, this._box = ht("div", "leaflet-zoom-box", this._container), pt(this._container, "leaflet-crosshair"), this._map.fire("boxzoomstart")), this._point = this._map.mouseEventToContainerPoint(t);var i = new P(this._point, this._startPoint),
e = i.getSize();Lt(this._box, i.min), this._box.style.width = e.x + "px", this._box.style.height = e.y + "px";
}, _finish: function _finish() {
this._moved && (ut(this._box), mt(this._container, "leaflet-crosshair")), mi(), Tt(), G(document, { contextmenu: Q, mousemove: this._onMouseMove, mouseup: this._onMouseUp, keydown: this._onKeyDown }, this);
}, _onMouseUp: function _onMouseUp(t) {
if ((1 === t.which || 1 === t.button) && (this._finish(), this._moved)) {
this._clearDeferredResetState(), this._resetStateTimeout = setTimeout(e(this._resetState, this), 0);var i = new T(this._map.containerPointToLatLng(this._startPoint), this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire("boxzoomend", { boxZoomBounds: i });
}
}, _onKeyDown: function _onKeyDown(t) {
27 === t.keyCode && this._finish();
} });ye.addInitHook("addHandler", "boxZoom", yn), ye.mergeOptions({ doubleClickZoom: !0 });var xn = Me.extend({ addHooks: function addHooks() {
this._map.on("dblclick", this._onDoubleClick, this);
}, removeHooks: function removeHooks() {
this._map.off("dblclick", this._onDoubleClick, this);
}, _onDoubleClick: function _onDoubleClick(t) {
var i = this._map,
e = i.getZoom(),
n = i.options.zoomDelta,
o = t.originalEvent.shiftKey ? e - n : e + n;"center" === i.options.doubleClickZoom ? i.setZoom(o) : i.setZoomAround(t.containerPoint, o);
} });ye.addInitHook("addHandler", "doubleClickZoom", xn), ye.mergeOptions({ dragging: !0, inertia: !Ti, inertiaDeceleration: 3400, inertiaMaxSpeed: 1 / 0, easeLinearity: .2, worldCopyJump: !1, maxBoundsViscosity: 0 });var wn = Me.extend({ addHooks: function addHooks() {
if (!this._draggable) {
var t = this._map;this._draggable = new ke(t._mapPane, t._container), this._draggable.on({ dragstart: this._onDragStart, drag: this._onDrag, dragend: this._onDragEnd }, this), this._draggable.on("predrag", this._onPreDragLimit, this), t.options.worldCopyJump && (this._draggable.on("predrag", this._onPreDragWrap, this), t.on("zoomend", this._onZoomEnd, this), t.whenReady(this._onZoomEnd, this));
}pt(this._map._container, "leaflet-grab leaflet-touch-drag"), this._draggable.enable(), this._positions = [], this._times = [];
}, removeHooks: function removeHooks() {
mt(this._map._container, "leaflet-grab"), mt(this._map._container, "leaflet-touch-drag"), this._draggable.disable();
}, moved: function moved() {
return this._draggable && this._draggable._moved;
}, moving: function moving() {
return this._draggable && this._draggable._moving;
}, _onDragStart: function _onDragStart() {
var t = this._map;if (t._stop(), this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {
var i = z(this._map.options.maxBounds);this._offsetLimit = b(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1), this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize())), this._viscosity = Math.min(1, Math.max(0, this._map.options.maxBoundsViscosity));
} else this._offsetLimit = null;t.fire("movestart").fire("dragstart"), t.options.inertia && (this._positions = [], this._times = []);
}, _onDrag: function _onDrag(t) {
if (this._map.options.inertia) {
var i = this._lastTime = +new Date(),
e = this._lastPos = this._draggable._absPos || this._draggable._newPos;this._positions.push(e), this._times.push(i), i - this._times[0] > 50 && (this._positions.shift(), this._times.shift());
}this._map.fire("move", t).fire("drag", t);
}, _onZoomEnd: function _onZoomEnd() {
var t = this._map.getSize().divideBy(2),
i = this._map.latLngToLayerPoint([0, 0]);this._initialWorldOffset = i.subtract(t).x, this._worldWidth = this._map.getPixelWorldBounds().getSize().x;
}, _viscousLimit: function _viscousLimit(t, i) {
return t - (t - i) * this._viscosity;
}, _onPreDragLimit: function _onPreDragLimit() {
if (this._viscosity && this._offsetLimit) {
var t = this._draggable._newPos.subtract(this._draggable._startPos),
i = this._offsetLimit;t.x < i.min.x && (t.x = this._viscousLimit(t.x, i.min.x)), t.y < i.min.y && (t.y = this._viscousLimit(t.y, i.min.y)), t.x > i.max.x && (t.x = this._viscousLimit(t.x, i.max.x)), t.y > i.max.y && (t.y = this._viscousLimit(t.y, i.max.y)), this._draggable._newPos = this._draggable._startPos.add(t);
}
}, _onPreDragWrap: function _onPreDragWrap() {
var t = this._worldWidth,
i = Math.round(t / 2),
e = this._initialWorldOffset,
n = this._draggable._newPos.x,
o = (n - i + e) % t + i - e,
s = (n + i + e) % t - i - e,
r = Math.abs(o + e) < Math.abs(s + e) ? o : s;this._draggable._absPos = this._draggable._newPos.clone(), this._draggable._newPos.x = r;
}, _onDragEnd: function _onDragEnd(t) {
var i = this._map,
e = i.options,
n = !e.inertia || this._times.length < 2;if (i.fire("dragend", t), n) i.fire("moveend");else {
var o = this._lastPos.subtract(this._positions[0]),
s = (this._lastTime - this._times[0]) / 1e3,
r = e.easeLinearity,
a = o.multiplyBy(r / s),
h = a.distanceTo([0, 0]),
u = Math.min(e.inertiaMaxSpeed, h),
l = a.multiplyBy(u / h),
c = u / (e.inertiaDeceleration * r),
_ = l.multiplyBy(-c / 2).round();_.x || _.y ? (_ = i._limitOffset(_, i.options.maxBounds), f(function () {
i.panBy(_, { duration: c, easeLinearity: r, noMoveStart: !0, animate: !0 });
})) : i.fire("moveend");
}
} });ye.addInitHook("addHandler", "dragging", wn), ye.mergeOptions({ keyboard: !0, keyboardPanDelta: 80 });var Ln = Me.extend({ keyCodes: { left: [37], right: [39], down: [40], up: [38], zoomIn: [187, 107, 61, 171], zoomOut: [189, 109, 54, 173] }, initialize: function initialize(t) {
this._map = t, this._setPanDelta(t.options.keyboardPanDelta), this._setZoomDelta(t.options.zoomDelta);
}, addHooks: function addHooks() {
var t = this._map._container;t.tabIndex <= 0 && (t.tabIndex = "0"), V(t, { focus: this._onFocus, blur: this._onBlur, mousedown: this._onMouseDown }, this), this._map.on({ focus: this._addHooks, blur: this._removeHooks }, this);
}, removeHooks: function removeHooks() {
this._removeHooks(), G(this._map._container, { focus: this._onFocus, blur: this._onBlur, mousedown: this._onMouseDown }, this), this._map.off({ focus: this._addHooks, blur: this._removeHooks }, this);
}, _onMouseDown: function _onMouseDown() {
if (!this._focused) {
var t = document.body,
i = document.documentElement,
e = t.scrollTop || i.scrollTop,
n = t.scrollLeft || i.scrollLeft;this._map._container.focus(), window.scrollTo(n, e);
}
}, _onFocus: function _onFocus() {
this._focused = !0, this._map.fire("focus");
}, _onBlur: function _onBlur() {
this._focused = !1, this._map.fire("blur");
}, _setPanDelta: function _setPanDelta(t) {
var i,
e,
n = this._panKeys = {},
o = this.keyCodes;for (i = 0, e = o.left.length; i < e; i++) {
n[o.left[i]] = [-1 * t, 0];
}for (i = 0, e = o.right.length; i < e; i++) {
n[o.right[i]] = [t, 0];
}for (i = 0, e = o.down.length; i < e; i++) {
n[o.down[i]] = [0, t];
}for (i = 0, e = o.up.length; i < e; i++) {
n[o.up[i]] = [0, -1 * t];
}
}, _setZoomDelta: function _setZoomDelta(t) {
var i,
e,
n = this._zoomKeys = {},
o = this.keyCodes;for (i = 0, e = o.zoomIn.length; i < e; i++) {
n[o.zoomIn[i]] = t;
}for (i = 0, e = o.zoomOut.length; i < e; i++) {
n[o.zoomOut[i]] = -t;
}
}, _addHooks: function _addHooks() {
V(document, "keydown", this._onKeyDown, this);
}, _removeHooks: function _removeHooks() {
G(document, "keydown", this._onKeyDown, this);
}, _onKeyDown: function _onKeyDown(t) {
if (!(t.altKey || t.ctrlKey || t.metaKey)) {
var i,
e = t.keyCode,
n = this._map;if (e in this._panKeys) {
if (n._panAnim && n._panAnim._inProgress) return;i = this._panKeys[e], t.shiftKey && (i = w(i).multiplyBy(3)), n.panBy(i), n.options.maxBounds && n.panInsideBounds(n.options.maxBounds);
} else if (e in this._zoomKeys) n.setZoom(n.getZoom() + (t.shiftKey ? 3 : 1) * this._zoomKeys[e]);else {
if (27 !== e || !n._popup) return;n.closePopup();
}Q(t);
}
} });ye.addInitHook("addHandler", "keyboard", Ln), ye.mergeOptions({ scrollWheelZoom: !0, wheelDebounceTime: 40, wheelPxPerZoomLevel: 60 });var Pn = Me.extend({ addHooks: function addHooks() {
V(this._map._container, "mousewheel", this._onWheelScroll, this), this._delta = 0;
}, removeHooks: function removeHooks() {
G(this._map._container, "mousewheel", this._onWheelScroll, this);
}, _onWheelScroll: function _onWheelScroll(t) {
var i = it(t),
n = this._map.options.wheelDebounceTime;this._delta += i, this._lastMousePos = this._map.mouseEventToContainerPoint(t), this._startTime || (this._startTime = +new Date());var o = Math.max(n - (+new Date() - this._startTime), 0);clearTimeout(this._timer), this._timer = setTimeout(e(this._performZoom, this), o), Q(t);
}, _performZoom: function _performZoom() {
var t = this._map,
i = t.getZoom(),
e = this._map.options.zoomSnap || 0;t._stop();var n = this._delta / (4 * this._map.options.wheelPxPerZoomLevel),
o = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(n)))) / Math.LN2,
s = e ? Math.ceil(o / e) * e : o,
r = t._limitZoom(i + (this._delta > 0 ? s : -s)) - i;this._delta = 0, this._startTime = null, r && ("center" === t.options.scrollWheelZoom ? t.setZoom(i + r) : t.setZoomAround(this._lastMousePos, i + r));
} });ye.addInitHook("addHandler", "scrollWheelZoom", Pn), ye.mergeOptions({ tap: !0, tapTolerance: 15 });var bn = Me.extend({ addHooks: function addHooks() {
V(this._map._container, "touchstart", this._onDown, this);
}, removeHooks: function removeHooks() {
G(this._map._container, "touchstart", this._onDown, this);
}, _onDown: function _onDown(t) {
if (t.touches) {
if ($(t), this._fireClick = !0, t.touches.length > 1) return this._fireClick = !1, void clearTimeout(this._holdTimeout);var i = t.touches[0],
n = i.target;this._startPos = this._newPos = new x(i.clientX, i.clientY), n.tagName && "a" === n.tagName.toLowerCase() && pt(n, "leaflet-active"), this._holdTimeout = setTimeout(e(function () {
this._isTapValid() && (this._fireClick = !1, this._onUp(), this._simulateEvent("contextmenu", i));
}, this), 1e3), this._simulateEvent("mousedown", i), V(document, { touchmove: this._onMove, touchend: this._onUp }, this);
}
}, _onUp: function _onUp(t) {
if (clearTimeout(this._holdTimeout), G(document, { touchmove: this._onMove, touchend: this._onUp }, this), this._fireClick && t && t.changedTouches) {
var i = t.changedTouches[0],
e = i.target;e && e.tagName && "a" === e.tagName.toLowerCase() && mt(e, "leaflet-active"), this._simulateEvent("mouseup", i), this._isTapValid() && this._simulateEvent("click", i);
}
}, _isTapValid: function _isTapValid() {
return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;
}, _onMove: function _onMove(t) {
var i = t.touches[0];this._newPos = new x(i.clientX, i.clientY), this._simulateEvent("mousemove", i);
}, _simulateEvent: function _simulateEvent(t, i) {
var e = document.createEvent("MouseEvents");e._simulated = !0, i.target._simulatedClick = !0, e.initMouseEvent(t, !0, !0, window, 1, i.screenX, i.screenY, i.clientX, i.clientY, !1, !1, !1, !1, 0, null), i.target.dispatchEvent(e);
} });Hi && !Wi && ye.addInitHook("addHandler", "tap", bn), ye.mergeOptions({ touchZoom: Hi && !Ti, bounceAtZoomLimits: !0 });var Tn = Me.extend({ addHooks: function addHooks() {
pt(this._map._container, "leaflet-touch-zoom"), V(this._map._container, "touchstart", this._onTouchStart, this);
}, removeHooks: function removeHooks() {
mt(this._map._container, "leaflet-touch-zoom"), G(this._map._container, "touchstart", this._onTouchStart, this);
}, _onTouchStart: function _onTouchStart(t) {
var i = this._map;if (t.touches && 2 === t.touches.length && !i._animatingZoom && !this._zooming) {
var e = i.mouseEventToContainerPoint(t.touches[0]),
n = i.mouseEventToContainerPoint(t.touches[1]);this._centerPoint = i.getSize()._divideBy(2), this._startLatLng = i.containerPointToLatLng(this._centerPoint), "center" !== i.options.touchZoom && (this._pinchStartLatLng = i.containerPointToLatLng(e.add(n)._divideBy(2))), this._startDist = e.distanceTo(n), this._startZoom = i.getZoom(), this._moved = !1, this._zooming = !0, i._stop(), V(document, "touchmove", this._onTouchMove, this), V(document, "touchend", this._onTouchEnd, this), $(t);
}
}, _onTouchMove: function _onTouchMove(t) {
if (t.touches && 2 === t.touches.length && this._zooming) {
var i = this._map,
n = i.mouseEventToContainerPoint(t.touches[0]),
o = i.mouseEventToContainerPoint(t.touches[1]),
s = n.distanceTo(o) / this._startDist;if (this._zoom = i.getScaleZoom(s, this._startZoom), !i.options.bounceAtZoomLimits && (this._zoom < i.getMinZoom() && s < 1 || this._zoom > i.getMaxZoom() && s > 1) && (this._zoom = i._limitZoom(this._zoom)), "center" === i.options.touchZoom) {
if (this._center = this._startLatLng, 1 === s) return;
} else {
var r = n._add(o)._divideBy(2)._subtract(this._centerPoint);if (1 === s && 0 === r.x && 0 === r.y) return;this._center = i.unproject(i.project(this._pinchStartLatLng, this._zoom).subtract(r), this._zoom);
}this._moved || (i._moveStart(!0), this._moved = !0), g(this._animRequest);var a = e(i._move, i, this._center, this._zoom, { pinch: !0, round: !1 });this._animRequest = f(a, this, !0), $(t);
}
}, _onTouchEnd: function _onTouchEnd() {
this._moved && this._zooming ? (this._zooming = !1, g(this._animRequest), G(document, "touchmove", this._onTouchMove), G(document, "touchend", this._onTouchEnd), this._map.options.zoomAnimation ? this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), !0, this._map.options.zoomSnap) : this._map._resetView(this._center, this._map._limitZoom(this._zoom))) : this._zooming = !1;
} });ye.addInitHook("addHandler", "touchZoom", Tn), ye.BoxZoom = yn, ye.DoubleClickZoom = xn, ye.Drag = wn, ye.Keyboard = Ln, ye.ScrollWheelZoom = Pn, ye.Tap = bn, ye.TouchZoom = Tn;var zn = window.L;window.L = t, Object.freeze = $t, t.version = "1.2.0", t.noConflict = function () {
return window.L = zn, this;
}, t.Control = xe, t.control = we, t.Browser = Yi, t.Evented = ui, t.Mixin = Ce, t.Util = ai, t.Class = v, t.Handler = Me, t.extend = i, t.bind = e, t.stamp = n, t.setOptions = l, t.DomEvent = le, t.DomUtil = ge, t.PosAnimation = ve, t.Draggable = ke, t.LineUtil = Be, t.PolyUtil = Ie, t.Point = x, t.point = w, t.Bounds = P, t.bounds = b, t.Transformation = Z, t.transformation = E, t.Projection = Re, t.LatLng = M, t.latLng = C, t.LatLngBounds = T, t.latLngBounds = z, t.CRS = li, t.GeoJSON = Qe, t.geoJSON = Kt, t.geoJson = en, t.Layer = We, t.LayerGroup = He, t.layerGroup = function (t) {
return new He(t);
}, t.FeatureGroup = Fe, t.featureGroup = function (t) {
return new Fe(t);
}, t.ImageOverlay = nn, t.imageOverlay = function (t, i, e) {
return new nn(t, i, e);
}, t.VideoOverlay = on, t.videoOverlay = function (t, i, e) {
return new on(t, i, e);
}, t.DivOverlay = sn, t.Popup = rn, t.popup = function (t, i) {
return new rn(t, i);
}, t.Tooltip = an, t.tooltip = function (t, i) {
return new an(t, i);
}, t.Icon = Ue, t.icon = function (t) {
return new Ue(t);
}, t.DivIcon = hn, t.divIcon = function (t) {
return new hn(t);
}, t.Marker = qe, t.marker = function (t, i) {
return new qe(t, i);
}, t.TileLayer = ln, t.tileLayer = Yt, t.GridLayer = un, t.gridLayer = function (t) {
return new un(t);
}, t.SVG = gn, t.svg = Jt, t.Renderer = _n, t.Canvas = dn, t.canvas = Xt, t.Path = Ke, t.CircleMarker = Ye, t.circleMarker = function (t, i) {
return new Ye(t, i);
}, t.Circle = Xe, t.circle = function (t, i, e) {
return new Xe(t, i, e);
}, t.Polyline = Je, t.polyline = function (t, i) {
return new Je(t, i);
}, t.Polygon = $e, t.polygon = function (t, i) {
return new $e(t, i);
}, t.Rectangle = vn, t.rectangle = function (t, i) {
return new vn(t, i);
}, t.Map = ye, t.map = function (t, i) {
return new ye(t, i);
};
});
/***/ }),
/***/ "./public/assets/vendor/select2/dist/js/select2.js":
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function($) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var require;var require;var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/*!
* Select2 4.0.3
* https://select2.github.io
*
* Released under the MIT license
* https://github.com/select2/select2/blob/master/LICENSE.md
*/
(function (factory) {
if (true) {
// AMD. Register as an anonymous module.
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__("./node_modules/jquery/dist/jquery.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
} else if ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object') {
// Node/CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
})(function (jQuery) {
// This is needed so we can catch the AMD loader configuration and use it
// The inner file should be wrapped (by `banner.start.js`) in a function that
// returns the AMD loader references.
var S2 = function () {
// Restore the Select2 AMD loader so it can be used
// Needed mostly in the language files, where the loader is not inserted
if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
var S2 = jQuery.fn.select2.amd;
}
var S2;(function () {
if (!S2 || !S2.requirejs) {
if (!S2) {
S2 = {};
} else {
require = S2;
}
/**
* @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
* Available via the MIT or new BSD license.
* see: http://github.com/jrburke/almond for details
*/
//Going sloppy to avoid 'use strict' string cost, but strict practices should
//be followed.
/*jslint sloppy: true */
/*global setTimeout: false */
var requirejs, require, define;
(function (undef) {
var main,
_req,
makeMap,
handlers,
defined = {},
waiting = {},
config = {},
defining = {},
hasOwn = Object.prototype.hasOwnProperty,
aps = [].slice,
jsSuffixRegExp = /\.js$/;
function hasProp(obj, prop) {
return hasOwn.call(obj, prop);
}
/**
* Given a relative module name, like ./something, normalize it to
* a real name that can be mapped to a path.
* @param {String} name the relative name
* @param {String} baseName a real name that the name arg is relative
* to.
* @returns {String} normalized name
*/
function normalize(name, baseName) {
var nameParts,
nameSegment,
mapValue,
foundMap,
lastIndex,
foundI,
foundStarMap,
starI,
i,
j,
part,
baseParts = baseName && baseName.split("/"),
map = config.map,
starMap = map && map['*'] || {};
//Adjust any relative paths.
if (name && name.charAt(0) === ".") {
//If have a base name, try to normalize against it,
//otherwise, assume it is a top-level require that will
//be relative to baseUrl in the end.
if (baseName) {
name = name.split('/');
lastIndex = name.length - 1;
// Node .js allowance:
if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
}
//Lop off the last part of baseParts, so that . matches the
//"directory" and not name of the baseName's module. For instance,
//baseName of "one/two/three", maps to "one/two/three.js", but we
//want the directory, "one/two" for this normalization.
name = baseParts.slice(0, baseParts.length - 1).concat(name);
//start trimDots
for (i = 0; i < name.length; i += 1) {
part = name[i];
if (part === ".") {
name.splice(i, 1);
i -= 1;
} else if (part === "..") {
if (i === 1 && (name[2] === '..' || name[0] === '..')) {
//End of the line. Keep at least one non-dot
//path segment at the front so it can be mapped
//correctly to disk. Otherwise, there is likely
//no path mapping for a path starting with '..'.
//This can still fail, but catches the most reasonable
//uses of ..
break;
} else if (i > 0) {
name.splice(i - 1, 2);
i -= 2;
}
}
}
//end trimDots
name = name.join("/");
} else if (name.indexOf('./') === 0) {
// No baseName, so this is ID is resolved relative
// to baseUrl, pull off the leading dot.
name = name.substring(2);
}
}
//Apply map config if available.
if ((baseParts || starMap) && map) {
nameParts = name.split('/');
for (i = nameParts.length; i > 0; i -= 1) {
nameSegment = nameParts.slice(0, i).join("/");
if (baseParts) {
//Find the longest baseName segment match in the config.
//So, do joins on the biggest to smallest lengths of baseParts.
for (j = baseParts.length; j > 0; j -= 1) {
mapValue = map[baseParts.slice(0, j).join('/')];
//baseName segment has config, find if it has one for
//this name.
if (mapValue) {
mapValue = mapValue[nameSegment];
if (mapValue) {
//Match, update name to the new value.
foundMap = mapValue;
foundI = i;
break;
}
}
}
}
if (foundMap) {
break;
}
//Check for a star map match, but just hold on to it,
//if there is a shorter segment match later in a matching
//config, then favor over this star map.
if (!foundStarMap && starMap && starMap[nameSegment]) {
foundStarMap = starMap[nameSegment];
starI = i;
}
}
if (!foundMap && foundStarMap) {
foundMap = foundStarMap;
foundI = starI;
}
if (foundMap) {
nameParts.splice(0, foundI, foundMap);
name = nameParts.join('/');
}
}
return name;
}
function makeRequire(relName, forceSync) {
return function () {
//A version of a require function that passes a moduleName
//value for items that may need to
//look up paths relative to the moduleName
var args = aps.call(arguments, 0);
//If first arg is not require('string'), and there is only
//one arg, it is the array form without a callback. Insert
//a null so that the following concat is correct.
if (typeof args[0] !== 'string' && args.length === 1) {
args.push(null);
}
return _req.apply(undef, args.concat([relName, forceSync]));
};
}
function makeNormalize(relName) {
return function (name) {
return normalize(name, relName);
};
}
function makeLoad(depName) {
return function (value) {
defined[depName] = value;
};
}
function callDep(name) {
if (hasProp(waiting, name)) {
var args = waiting[name];
delete waiting[name];
defining[name] = true;
main.apply(undef, args);
}
if (!hasProp(defined, name) && !hasProp(defining, name)) {
throw new Error('No ' + name);
}
return defined[name];
}
//Turns a plugin!resource to [plugin, resource]
//with the plugin being undefined if the name
//did not have a plugin prefix.
function splitPrefix(name) {
var prefix,
index = name ? name.indexOf('!') : -1;
if (index > -1) {
prefix = name.substring(0, index);
name = name.substring(index + 1, name.length);
}
return [prefix, name];
}
/**
* Makes a name map, normalizing the name, and using a plugin
* for normalization if necessary. Grabs a ref to plugin
* too, as an optimization.
*/
makeMap = function makeMap(name, relName) {
var plugin,
parts = splitPrefix(name),
prefix = parts[0];
name = parts[1];
if (prefix) {
prefix = normalize(prefix, relName);
plugin = callDep(prefix);
}
//Normalize according
if (prefix) {
if (plugin && plugin.normalize) {
name = plugin.normalize(name, makeNormalize(relName));
} else {
name = normalize(name, relName);
}
} else {
name = normalize(name, relName);
parts = splitPrefix(name);
prefix = parts[0];
name = parts[1];
if (prefix) {
plugin = callDep(prefix);
}
}
//Using ridiculous property names for space reasons
return {
f: prefix ? prefix + '!' + name : name, //fullName
n: name,
pr: prefix,
p: plugin
};
};
function makeConfig(name) {
return function () {
return config && config.config && config.config[name] || {};
};
}
handlers = {
require: function require(name) {
return makeRequire(name);
},
exports: function exports(name) {
var e = defined[name];
if (typeof e !== 'undefined') {
return e;
} else {
return defined[name] = {};
}
},
module: function module(name) {
return {
id: name,
uri: '',
exports: defined[name],
config: makeConfig(name)
};
}
};
main = function main(name, deps, callback, relName) {
var cjsModule,
depName,
ret,
map,
i,
args = [],
callbackType = typeof callback === 'undefined' ? 'undefined' : _typeof(callback),
usingExports;
//Use name if no relName
relName = relName || name;
//Call the callback to define the module, if necessary.
if (callbackType === 'undefined' || callbackType === 'function') {
//Pull out the defined dependencies and pass the ordered
//values to the callback.
//Default to [require, exports, module] if no deps
deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
for (i = 0; i < deps.length; i += 1) {
map = makeMap(deps[i], relName);
depName = map.f;
//Fast path CommonJS standard dependencies.
if (depName === "require") {
args[i] = handlers.require(name);
} else if (depName === "exports") {
//CommonJS module spec 1.1
args[i] = handlers.exports(name);
usingExports = true;
} else if (depName === "module") {
//CommonJS module spec 1.1
cjsModule = args[i] = handlers.module(name);
} else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) {
args[i] = callDep(depName);
} else if (map.p) {
map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
args[i] = defined[depName];
} else {
throw new Error(name + ' missing ' + depName);
}
}
ret = callback ? callback.apply(defined[name], args) : undefined;
if (name) {
//If setting exports via "module" is in play,
//favor that over return value and exports. After that,
//favor a non-undefined return value over exports use.
if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) {
defined[name] = cjsModule.exports;
} else if (ret !== undef || !usingExports) {
//Use the return value from the function.
defined[name] = ret;
}
}
} else if (name) {
//May just be an object definition for the module. Only
//worry about defining if have a module name.
defined[name] = callback;
}
};
requirejs = require = _req = function req(deps, callback, relName, forceSync, alt) {
if (typeof deps === "string") {
if (handlers[deps]) {
//callback in this case is really relName
return handlers[deps](callback);
}
//Just return the module wanted. In this scenario, the
//deps arg is the module name, and second arg (if passed)
//is just the relName.
//Normalize module name, if it contains . or ..
return callDep(makeMap(deps, callback).f);
} else if (!deps.splice) {
//deps is a config object, not an array.
config = deps;
if (config.deps) {
_req(config.deps, config.callback);
}
if (!callback) {
return;
}
if (callback.splice) {
//callback is an array, which means it is a dependency list.
//Adjust args if there are dependencies
deps = callback;
callback = relName;
relName = null;
} else {
deps = undef;
}
}
//Support require(['a'])
callback = callback || function () {};
//If relName is a function, it is an errback handler,
//so remove it.
if (typeof relName === 'function') {
relName = forceSync;
forceSync = alt;
}
//Simulate async callback;
if (forceSync) {
main(undef, deps, callback, relName);
} else {
//Using a non-zero value because of concern for what old browsers
//do, and latest browsers "upgrade" to 4 if lower value is used:
//http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
//If want a value immediately, use require('id') instead -- something
//that works in almond on the global level, but not guaranteed and
//unlikely to work in other AMD implementations.
setTimeout(function () {
main(undef, deps, callback, relName);
}, 4);
}
return _req;
};
/**
* Just drops the config on the floor, but returns req in case
* the config return value is used.
*/
_req.config = function (cfg) {
return _req(cfg);
};
/**
* Expose module registry for debugging and tooling
*/
requirejs._defined = defined;
define = function define(name, deps, callback) {
if (typeof name !== 'string') {
throw new Error('See almond README: incorrect module build, no module name');
}
//This module may not have dependencies
if (!deps.splice) {
//deps is not an array, so probably means
//an object literal or factory function for
//the value. Adjust args.
callback = deps;
deps = [];
}
if (!hasProp(defined, name) && !hasProp(waiting, name)) {
waiting[name] = [name, deps, callback];
}
};
define.amd = {
jQuery: true
};
})();
S2.requirejs = requirejs;S2.require = require;S2.define = define;
}
})();
S2.define("almond", function () {});
/* global jQuery:false, $:false */
S2.define('jquery', [], function () {
var _$ = jQuery || $;
if (_$ == null && console && console.error) {
console.error('Select2: An instance of jQuery or a jQuery-compatible library was not ' + 'found. Make sure that you are including jQuery before Select2 on your ' + 'web page.');
}
return _$;
});
S2.define('select2/utils', ['jquery'], function ($) {
var Utils = {};
Utils.Extend = function (ChildClass, SuperClass) {
var __hasProp = {}.hasOwnProperty;
function BaseConstructor() {
this.constructor = ChildClass;
}
for (var key in SuperClass) {
if (__hasProp.call(SuperClass, key)) {
ChildClass[key] = SuperClass[key];
}
}
BaseConstructor.prototype = SuperClass.prototype;
ChildClass.prototype = new BaseConstructor();
ChildClass.__super__ = SuperClass.prototype;
return ChildClass;
};
function getMethods(theClass) {
var proto = theClass.prototype;
var methods = [];
for (var methodName in proto) {
var m = proto[methodName];
if (typeof m !== 'function') {
continue;
}
if (methodName === 'constructor') {
continue;
}
methods.push(methodName);
}
return methods;
}
Utils.Decorate = function (SuperClass, DecoratorClass) {
var decoratedMethods = getMethods(DecoratorClass);
var superMethods = getMethods(SuperClass);
function DecoratedClass() {
var unshift = Array.prototype.unshift;
var argCount = DecoratorClass.prototype.constructor.length;
var calledConstructor = SuperClass.prototype.constructor;
if (argCount > 0) {
unshift.call(arguments, SuperClass.prototype.constructor);
calledConstructor = DecoratorClass.prototype.constructor;
}
calledConstructor.apply(this, arguments);
}
DecoratorClass.displayName = SuperClass.displayName;
function ctr() {
this.constructor = DecoratedClass;
}
DecoratedClass.prototype = new ctr();
for (var m = 0; m < superMethods.length; m++) {
var superMethod = superMethods[m];
DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod];
}
var calledMethod = function calledMethod(methodName) {
// Stub out the original method if it's not decorating an actual method
var originalMethod = function originalMethod() {};
if (methodName in DecoratedClass.prototype) {
originalMethod = DecoratedClass.prototype[methodName];
}
var decoratedMethod = DecoratorClass.prototype[methodName];
return function () {
var unshift = Array.prototype.unshift;
unshift.call(arguments, originalMethod);
return decoratedMethod.apply(this, arguments);
};
};
for (var d = 0; d < decoratedMethods.length; d++) {
var decoratedMethod = decoratedMethods[d];
DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
}
return DecoratedClass;
};
var Observable = function Observable() {
this.listeners = {};
};
Observable.prototype.on = function (event, callback) {
this.listeners = this.listeners || {};
if (event in this.listeners) {
this.listeners[event].push(callback);
} else {
this.listeners[event] = [callback];
}
};
Observable.prototype.trigger = function (event) {
var slice = Array.prototype.slice;
var params = slice.call(arguments, 1);
this.listeners = this.listeners || {};
// Params should always come in as an array
if (params == null) {
params = [];
}
// If there are no arguments to the event, use a temporary object
if (params.length === 0) {
params.push({});
}
// Set the `_type` of the first object to the event
params[0]._type = event;
if (event in this.listeners) {
this.invoke(this.listeners[event], slice.call(arguments, 1));
}
if ('*' in this.listeners) {
this.invoke(this.listeners['*'], arguments);
}
};
Observable.prototype.invoke = function (listeners, params) {
for (var i = 0, len = listeners.length; i < len; i++) {
listeners[i].apply(this, params);
}
};
Utils.Observable = Observable;
Utils.generateChars = function (length) {
var chars = '';
for (var i = 0; i < length; i++) {
var randomChar = Math.floor(Math.random() * 36);
chars += randomChar.toString(36);
}
return chars;
};
Utils.bind = function (func, context) {
return function () {
func.apply(context, arguments);
};
};
Utils._convertData = function (data) {
for (var originalKey in data) {
var keys = originalKey.split('-');
var dataLevel = data;
if (keys.length === 1) {
continue;
}
for (var k = 0; k < keys.length; k++) {
var key = keys[k];
// Lowercase the first letter
// By default, dash-separated becomes camelCase
key = key.substring(0, 1).toLowerCase() + key.substring(1);
if (!(key in dataLevel)) {
dataLevel[key] = {};
}
if (k == keys.length - 1) {
dataLevel[key] = data[originalKey];
}
dataLevel = dataLevel[key];
}
delete data[originalKey];
}
return data;
};
Utils.hasScroll = function (index, el) {
// Adapted from the function created by @ShadowScripter
// and adapted by @BillBarry on the Stack Exchange Code Review website.
// The original code can be found at
// http://codereview.stackexchange.com/q/13338
// and was designed to be used with the Sizzle selector engine.
var $el = $(el);
var overflowX = el.style.overflowX;
var overflowY = el.style.overflowY;
//Check both x and y declarations
if (overflowX === overflowY && (overflowY === 'hidden' || overflowY === 'visible')) {
return false;
}
if (overflowX === 'scroll' || overflowY === 'scroll') {
return true;
}
return $el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth;
};
Utils.escapeMarkup = function (markup) {
var replaceMap = {
'\\': '&#92;',
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
'\'': '&#39;',
'/': '&#47;'
};
// Do not try to escape the markup if it's not a string
if (typeof markup !== 'string') {
return markup;
}
return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
return replaceMap[match];
});
};
// Append an array of jQuery nodes to a given element.
Utils.appendMany = function ($element, $nodes) {
// jQuery 1.7.x does not support $.fn.append() with an array
// Fall back to a jQuery object collection using $.fn.add()
if ($.fn.jquery.substr(0, 3) === '1.7') {
var $jqNodes = $();
$.map($nodes, function (node) {
$jqNodes = $jqNodes.add(node);
});
$nodes = $jqNodes;
}
$element.append($nodes);
};
return Utils;
});
S2.define('select2/results', ['jquery', './utils'], function ($, Utils) {
function Results($element, options, dataAdapter) {
this.$element = $element;
this.data = dataAdapter;
this.options = options;
Results.__super__.constructor.call(this);
}
Utils.Extend(Results, Utils.Observable);
Results.prototype.render = function () {
var $results = $('<ul class="select2-results__options" role="tree"></ul>');
if (this.options.get('multiple')) {
$results.attr('aria-multiselectable', 'true');
}
this.$results = $results;
return $results;
};
Results.prototype.clear = function () {
this.$results.empty();
};
Results.prototype.displayMessage = function (params) {
var escapeMarkup = this.options.get('escapeMarkup');
this.clear();
this.hideLoading();
var $message = $('<li role="treeitem" aria-live="assertive"' + ' class="select2-results__option"></li>');
var message = this.options.get('translations').get(params.message);
$message.append(escapeMarkup(message(params.args)));
$message[0].className += ' select2-results__message';
this.$results.append($message);
};
Results.prototype.hideMessages = function () {
this.$results.find('.select2-results__message').remove();
};
Results.prototype.append = function (data) {
this.hideLoading();
var $options = [];
if (data.results == null || data.results.length === 0) {
if (this.$results.children().length === 0) {
this.trigger('results:message', {
message: 'noResults'
});
}
return;
}
data.results = this.sort(data.results);
for (var d = 0; d < data.results.length; d++) {
var item = data.results[d];
var $option = this.option(item);
$options.push($option);
}
this.$results.append($options);
};
Results.prototype.position = function ($results, $dropdown) {
var $resultsContainer = $dropdown.find('.select2-results');
$resultsContainer.append($results);
};
Results.prototype.sort = function (data) {
var sorter = this.options.get('sorter');
return sorter(data);
};
Results.prototype.highlightFirstItem = function () {
var $options = this.$results.find('.select2-results__option[aria-selected]');
var $selected = $options.filter('[aria-selected=true]');
// Check if there are any selected options
if ($selected.length > 0) {
// If there are selected options, highlight the first
$selected.first().trigger('mouseenter');
} else {
// If there are no selected options, highlight the first option
// in the dropdown
$options.first().trigger('mouseenter');
}
this.ensureHighlightVisible();
};
Results.prototype.setClasses = function () {
var self = this;
this.data.current(function (selected) {
var selectedIds = $.map(selected, function (s) {
return s.id.toString();
});
var $options = self.$results.find('.select2-results__option[aria-selected]');
$options.each(function () {
var $option = $(this);
var item = $.data(this, 'data');
// id needs to be converted to a string when comparing
var id = '' + item.id;
if (item.element != null && item.element.selected || item.element == null && $.inArray(id, selectedIds) > -1) {
$option.attr('aria-selected', 'true');
} else {
$option.attr('aria-selected', 'false');
}
});
});
};
Results.prototype.showLoading = function (params) {
this.hideLoading();
var loadingMore = this.options.get('translations').get('searching');
var loading = {
disabled: true,
loading: true,
text: loadingMore(params)
};
var $loading = this.option(loading);
$loading.className += ' loading-results';
this.$results.prepend($loading);
};
Results.prototype.hideLoading = function () {
this.$results.find('.loading-results').remove();
};
Results.prototype.option = function (data) {
var option = document.createElement('li');
option.className = 'select2-results__option';
var attrs = {
'role': 'treeitem',
'aria-selected': 'false'
};
if (data.disabled) {
delete attrs['aria-selected'];
attrs['aria-disabled'] = 'true';
}
if (data.id == null) {
delete attrs['aria-selected'];
}
if (data._resultId != null) {
option.id = data._resultId;
}
if (data.title) {
option.title = data.title;
}
if (data.children) {
attrs.role = 'group';
attrs['aria-label'] = data.text;
delete attrs['aria-selected'];
}
for (var attr in attrs) {
var val = attrs[attr];
option.setAttribute(attr, val);
}
if (data.children) {
var $option = $(option);
var label = document.createElement('strong');
label.className = 'select2-results__group';
var $label = $(label);
this.template(data, label);
var $children = [];
for (var c = 0; c < data.children.length; c++) {
var child = data.children[c];
var $child = this.option(child);
$children.push($child);
}
var $childrenContainer = $('<ul></ul>', {
'class': 'select2-results__options select2-results__options--nested'
});
$childrenContainer.append($children);
$option.append(label);
$option.append($childrenContainer);
} else {
this.template(data, option);
}
$.data(option, 'data', data);
return option;
};
Results.prototype.bind = function (container, $container) {
var self = this;
var id = container.id + '-results';
this.$results.attr('id', id);
container.on('results:all', function (params) {
self.clear();
self.append(params.data);
if (container.isOpen()) {
self.setClasses();
self.highlightFirstItem();
}
});
container.on('results:append', function (params) {
self.append(params.data);
if (container.isOpen()) {
self.setClasses();
}
});
container.on('query', function (params) {
self.hideMessages();
self.showLoading(params);
});
container.on('select', function () {
if (!container.isOpen()) {
return;
}
self.setClasses();
self.highlightFirstItem();
});
container.on('unselect', function () {
if (!container.isOpen()) {
return;
}
self.setClasses();
self.highlightFirstItem();
});
container.on('open', function () {
// When the dropdown is open, aria-expended="true"
self.$results.attr('aria-expanded', 'true');
self.$results.attr('aria-hidden', 'false');
self.setClasses();
self.ensureHighlightVisible();
});
container.on('close', function () {
// When the dropdown is closed, aria-expended="false"
self.$results.attr('aria-expanded', 'false');
self.$results.attr('aria-hidden', 'true');
self.$results.removeAttr('aria-activedescendant');
});
container.on('results:toggle', function () {
var $highlighted = self.getHighlightedResults();
if ($highlighted.length === 0) {
return;
}
$highlighted.trigger('mouseup');
});
container.on('results:select', function () {
var $highlighted = self.getHighlightedResults();
if ($highlighted.length === 0) {
return;
}
var data = $highlighted.data('data');
if ($highlighted.attr('aria-selected') == 'true') {
self.trigger('close', {});
} else {
self.trigger('select', {
data: data
});
}
});
container.on('results:previous', function () {
var $highlighted = self.getHighlightedResults();
var $options = self.$results.find('[aria-selected]');
var currentIndex = $options.index($highlighted);
// If we are already at te top, don't move further
if (currentIndex === 0) {
return;
}
var nextIndex = currentIndex - 1;
// If none are highlighted, highlight the first
if ($highlighted.length === 0) {
nextIndex = 0;
}
var $next = $options.eq(nextIndex);
$next.trigger('mouseenter');
var currentOffset = self.$results.offset().top;
var nextTop = $next.offset().top;
var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
if (nextIndex === 0) {
self.$results.scrollTop(0);
} else if (nextTop - currentOffset < 0) {
self.$results.scrollTop(nextOffset);
}
});
container.on('results:next', function () {
var $highlighted = self.getHighlightedResults();
var $options = self.$results.find('[aria-selected]');
var currentIndex = $options.index($highlighted);
var nextIndex = currentIndex + 1;
// If we are at the last option, stay there
if (nextIndex >= $options.length) {
return;
}
var $next = $options.eq(nextIndex);
$next.trigger('mouseenter');
var currentOffset = self.$results.offset().top + self.$results.outerHeight(false);
var nextBottom = $next.offset().top + $next.outerHeight(false);
var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
if (nextIndex === 0) {
self.$results.scrollTop(0);
} else if (nextBottom > currentOffset) {
self.$results.scrollTop(nextOffset);
}
});
container.on('results:focus', function (params) {
params.element.addClass('select2-results__option--highlighted');
});
container.on('results:message', function (params) {
self.displayMessage(params);
});
if ($.fn.mousewheel) {
this.$results.on('mousewheel', function (e) {
var top = self.$results.scrollTop();
var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
if (isAtTop) {
self.$results.scrollTop(0);
e.preventDefault();
e.stopPropagation();
} else if (isAtBottom) {
self.$results.scrollTop(self.$results.get(0).scrollHeight - self.$results.height());
e.preventDefault();
e.stopPropagation();
}
});
}
this.$results.on('mouseup', '.select2-results__option[aria-selected]', function (evt) {
var $this = $(this);
var data = $this.data('data');
if ($this.attr('aria-selected') === 'true') {
if (self.options.get('multiple')) {
self.trigger('unselect', {
originalEvent: evt,
data: data
});
} else {
self.trigger('close', {});
}
return;
}
self.trigger('select', {
originalEvent: evt,
data: data
});
});
this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) {
var data = $(this).data('data');
self.getHighlightedResults().removeClass('select2-results__option--highlighted');
self.trigger('results:focus', {
data: data,
element: $(this)
});
});
};
Results.prototype.getHighlightedResults = function () {
var $highlighted = this.$results.find('.select2-results__option--highlighted');
return $highlighted;
};
Results.prototype.destroy = function () {
this.$results.remove();
};
Results.prototype.ensureHighlightVisible = function () {
var $highlighted = this.getHighlightedResults();
if ($highlighted.length === 0) {
return;
}
var $options = this.$results.find('[aria-selected]');
var currentIndex = $options.index($highlighted);
var currentOffset = this.$results.offset().top;
var nextTop = $highlighted.offset().top;
var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
var offsetDelta = nextTop - currentOffset;
nextOffset -= $highlighted.outerHeight(false) * 2;
if (currentIndex <= 2) {
this.$results.scrollTop(0);
} else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
this.$results.scrollTop(nextOffset);
}
};
Results.prototype.template = function (result, container) {
var template = this.options.get('templateResult');
var escapeMarkup = this.options.get('escapeMarkup');
var content = template(result, container);
if (content == null) {
container.style.display = 'none';
} else if (typeof content === 'string') {
container.innerHTML = escapeMarkup(content);
} else {
$(container).append(content);
}
};
return Results;
});
S2.define('select2/keys', [], function () {
var KEYS = {
BACKSPACE: 8,
TAB: 9,
ENTER: 13,
SHIFT: 16,
CTRL: 17,
ALT: 18,
ESC: 27,
SPACE: 32,
PAGE_UP: 33,
PAGE_DOWN: 34,
END: 35,
HOME: 36,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
DELETE: 46
};
return KEYS;
});
S2.define('select2/selection/base', ['jquery', '../utils', '../keys'], function ($, Utils, KEYS) {
function BaseSelection($element, options) {
this.$element = $element;
this.options = options;
BaseSelection.__super__.constructor.call(this);
}
Utils.Extend(BaseSelection, Utils.Observable);
BaseSelection.prototype.render = function () {
var $selection = $('<span class="select2-selection" role="combobox" ' + ' aria-haspopup="true" aria-expanded="false">' + '</span>');
this._tabindex = 0;
if (this.$element.data('old-tabindex') != null) {
this._tabindex = this.$element.data('old-tabindex');
} else if (this.$element.attr('tabindex') != null) {
this._tabindex = this.$element.attr('tabindex');
}
$selection.attr('title', this.$element.attr('title'));
$selection.attr('tabindex', this._tabindex);
this.$selection = $selection;
return $selection;
};
BaseSelection.prototype.bind = function (container, $container) {
var self = this;
var id = container.id + '-container';
var resultsId = container.id + '-results';
this.container = container;
this.$selection.on('focus', function (evt) {
self.trigger('focus', evt);
});
this.$selection.on('blur', function (evt) {
self._handleBlur(evt);
});
this.$selection.on('keydown', function (evt) {
self.trigger('keypress', evt);
if (evt.which === KEYS.SPACE) {
evt.preventDefault();
}
});
container.on('results:focus', function (params) {
self.$selection.attr('aria-activedescendant', params.data._resultId);
});
container.on('selection:update', function (params) {
self.update(params.data);
});
container.on('open', function () {
// When the dropdown is open, aria-expanded="true"
self.$selection.attr('aria-expanded', 'true');
self.$selection.attr('aria-owns', resultsId);
self._attachCloseHandler(container);
});
container.on('close', function () {
// When the dropdown is closed, aria-expanded="false"
self.$selection.attr('aria-expanded', 'false');
self.$selection.removeAttr('aria-activedescendant');
self.$selection.removeAttr('aria-owns');
self.$selection.focus();
self._detachCloseHandler(container);
});
container.on('enable', function () {
self.$selection.attr('tabindex', self._tabindex);
});
container.on('disable', function () {
self.$selection.attr('tabindex', '-1');
});
};
BaseSelection.prototype._handleBlur = function (evt) {
var self = this;
// This needs to be delayed as the active element is the body when the tab
// key is pressed, possibly along with others.
window.setTimeout(function () {
// Don't trigger `blur` if the focus is still in the selection
if (document.activeElement == self.$selection[0] || $.contains(self.$selection[0], document.activeElement)) {
return;
}
self.trigger('blur', evt);
}, 1);
};
BaseSelection.prototype._attachCloseHandler = function (container) {
var self = this;
$(document.body).on('mousedown.select2.' + container.id, function (e) {
var $target = $(e.target);
var $select = $target.closest('.select2');
var $all = $('.select2.select2-container--open');
$all.each(function () {
var $this = $(this);
if (this == $select[0]) {
return;
}
var $element = $this.data('element');
$element.select2('close');
});
});
};
BaseSelection.prototype._detachCloseHandler = function (container) {
$(document.body).off('mousedown.select2.' + container.id);
};
BaseSelection.prototype.position = function ($selection, $container) {
var $selectionContainer = $container.find('.selection');
$selectionContainer.append($selection);
};
BaseSelection.prototype.destroy = function () {
this._detachCloseHandler(this.container);
};
BaseSelection.prototype.update = function (data) {
throw new Error('The `update` method must be defined in child classes.');
};
return BaseSelection;
});
S2.define('select2/selection/single', ['jquery', './base', '../utils', '../keys'], function ($, BaseSelection, Utils, KEYS) {
function SingleSelection() {
SingleSelection.__super__.constructor.apply(this, arguments);
}
Utils.Extend(SingleSelection, BaseSelection);
SingleSelection.prototype.render = function () {
var $selection = SingleSelection.__super__.render.call(this);
$selection.addClass('select2-selection--single');
$selection.html('<span class="select2-selection__rendered"></span>' + '<span class="select2-selection__arrow" role="presentation">' + '<b role="presentation"></b>' + '</span>');
return $selection;
};
SingleSelection.prototype.bind = function (container, $container) {
var self = this;
SingleSelection.__super__.bind.apply(this, arguments);
var id = container.id + '-container';
this.$selection.find('.select2-selection__rendered').attr('id', id);
this.$selection.attr('aria-labelledby', id);
this.$selection.on('mousedown', function (evt) {
// Only respond to left clicks
if (evt.which !== 1) {
return;
}
self.trigger('toggle', {
originalEvent: evt
});
});
this.$selection.on('focus', function (evt) {
// User focuses on the container
});
this.$selection.on('blur', function (evt) {
// User exits the container
});
container.on('focus', function (evt) {
if (!container.isOpen()) {
self.$selection.focus();
}
});
container.on('selection:update', function (params) {
self.update(params.data);
});
};
SingleSelection.prototype.clear = function () {
this.$selection.find('.select2-selection__rendered').empty();
};
SingleSelection.prototype.display = function (data, container) {
var template = this.options.get('templateSelection');
var escapeMarkup = this.options.get('escapeMarkup');
return escapeMarkup(template(data, container));
};
SingleSelection.prototype.selectionContainer = function () {
return $('<span></span>');
};
SingleSelection.prototype.update = function (data) {
if (data.length === 0) {
this.clear();
return;
}
var selection = data[0];
var $rendered = this.$selection.find('.select2-selection__rendered');
var formatted = this.display(selection, $rendered);
$rendered.empty().append(formatted);
$rendered.prop('title', selection.title || selection.text);
};
return SingleSelection;
});
S2.define('select2/selection/multiple', ['jquery', './base', '../utils'], function ($, BaseSelection, Utils) {
function MultipleSelection($element, options) {
MultipleSelection.__super__.constructor.apply(this, arguments);
}
Utils.Extend(MultipleSelection, BaseSelection);
MultipleSelection.prototype.render = function () {
var $selection = MultipleSelection.__super__.render.call(this);
$selection.addClass('select2-selection--multiple');
$selection.html('<ul class="select2-selection__rendered"></ul>');
return $selection;
};
MultipleSelection.prototype.bind = function (container, $container) {
var self = this;
MultipleSelection.__super__.bind.apply(this, arguments);
this.$selection.on('click', function (evt) {
self.trigger('toggle', {
originalEvent: evt
});
});
this.$selection.on('click', '.select2-selection__choice__remove', function (evt) {
// Ignore the event if it is disabled
if (self.options.get('disabled')) {
return;
}
var $remove = $(this);
var $selection = $remove.parent();
var data = $selection.data('data');
self.trigger('unselect', {
originalEvent: evt,
data: data
});
});
};
MultipleSelection.prototype.clear = function () {
this.$selection.find('.select2-selection__rendered').empty();
};
MultipleSelection.prototype.display = function (data, container) {
var template = this.options.get('templateSelection');
var escapeMarkup = this.options.get('escapeMarkup');
return escapeMarkup(template(data, container));
};
MultipleSelection.prototype.selectionContainer = function () {
var $container = $('<li class="select2-selection__choice">' + '<span class="select2-selection__choice__remove" role="presentation">' + '&times;' + '</span>' + '</li>');
return $container;
};
MultipleSelection.prototype.update = function (data) {
this.clear();
if (data.length === 0) {
return;
}
var $selections = [];
for (var d = 0; d < data.length; d++) {
var selection = data[d];
var $selection = this.selectionContainer();
var formatted = this.display(selection, $selection);
$selection.append(formatted);
$selection.prop('title', selection.title || selection.text);
$selection.data('data', selection);
$selections.push($selection);
}
var $rendered = this.$selection.find('.select2-selection__rendered');
Utils.appendMany($rendered, $selections);
};
return MultipleSelection;
});
S2.define('select2/selection/placeholder', ['../utils'], function (Utils) {
function Placeholder(decorated, $element, options) {
this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
decorated.call(this, $element, options);
}
Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
if (typeof placeholder === 'string') {
placeholder = {
id: '',
text: placeholder
};
}
return placeholder;
};
Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
var $placeholder = this.selectionContainer();
$placeholder.html(this.display(placeholder));
$placeholder.addClass('select2-selection__placeholder').removeClass('select2-selection__choice');
return $placeholder;
};
Placeholder.prototype.update = function (decorated, data) {
var singlePlaceholder = data.length == 1 && data[0].id != this.placeholder.id;
var multipleSelections = data.length > 1;
if (multipleSelections || singlePlaceholder) {
return decorated.call(this, data);
}
this.clear();
var $placeholder = this.createPlaceholder(this.placeholder);
this.$selection.find('.select2-selection__rendered').append($placeholder);
};
return Placeholder;
});
S2.define('select2/selection/allowClear', ['jquery', '../keys'], function ($, KEYS) {
function AllowClear() {}
AllowClear.prototype.bind = function (decorated, container, $container) {
var self = this;
decorated.call(this, container, $container);
if (this.placeholder == null) {
if (this.options.get('debug') && window.console && console.error) {
console.error('Select2: The `allowClear` option should be used in combination ' + 'with the `placeholder` option.');
}
}
this.$selection.on('mousedown', '.select2-selection__clear', function (evt) {
self._handleClear(evt);
});
container.on('keypress', function (evt) {
self._handleKeyboardClear(evt, container);
});
};
AllowClear.prototype._handleClear = function (_, evt) {
// Ignore the event if it is disabled
if (this.options.get('disabled')) {
return;
}
var $clear = this.$selection.find('.select2-selection__clear');
// Ignore the event if nothing has been selected
if ($clear.length === 0) {
return;
}
evt.stopPropagation();
var data = $clear.data('data');
for (var d = 0; d < data.length; d++) {
var unselectData = {
data: data[d]
};
// Trigger the `unselect` event, so people can prevent it from being
// cleared.
this.trigger('unselect', unselectData);
// If the event was prevented, don't clear it out.
if (unselectData.prevented) {
return;
}
}
this.$element.val(this.placeholder.id).trigger('change');
this.trigger('toggle', {});
};
AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
if (container.isOpen()) {
return;
}
if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
this._handleClear(evt);
}
};
AllowClear.prototype.update = function (decorated, data) {
decorated.call(this, data);
if (this.$selection.find('.select2-selection__placeholder').length > 0 || data.length === 0) {
return;
}
var $remove = $('<span class="select2-selection__clear">' + '&times;' + '</span>');
$remove.data('data', data);
this.$selection.find('.select2-selection__rendered').prepend($remove);
};
return AllowClear;
});
S2.define('select2/selection/search', ['jquery', '../utils', '../keys'], function ($, Utils, KEYS) {
function Search(decorated, $element, options) {
decorated.call(this, $element, options);
}
Search.prototype.render = function (decorated) {
var $search = $('<li class="select2-search select2-search--inline">' + '<input class="select2-search__field" type="search" tabindex="-1"' + ' autocomplete="off" autocorrect="off" autocapitalize="off"' + ' spellcheck="false" role="textbox" aria-autocomplete="list" />' + '</li>');
this.$searchContainer = $search;
this.$search = $search.find('input');
var $rendered = decorated.call(this);
this._transferTabIndex();
return $rendered;
};
Search.prototype.bind = function (decorated, container, $container) {
var self = this;
decorated.call(this, container, $container);
container.on('open', function () {
self.$search.trigger('focus');
});
container.on('close', function () {
self.$search.val('');
self.$search.removeAttr('aria-activedescendant');
self.$search.trigger('focus');
});
container.on('enable', function () {
self.$search.prop('disabled', false);
self._transferTabIndex();
});
container.on('disable', function () {
self.$search.prop('disabled', true);
});
container.on('focus', function (evt) {
self.$search.trigger('focus');
});
container.on('results:focus', function (params) {
self.$search.attr('aria-activedescendant', params.id);
});
this.$selection.on('focusin', '.select2-search--inline', function (evt) {
self.trigger('focus', evt);
});
this.$selection.on('focusout', '.select2-search--inline', function (evt) {
self._handleBlur(evt);
});
this.$selection.on('keydown', '.select2-search--inline', function (evt) {
evt.stopPropagation();
self.trigger('keypress', evt);
self._keyUpPrevented = evt.isDefaultPrevented();
var key = evt.which;
if (key === KEYS.BACKSPACE && self.$search.val() === '') {
var $previousChoice = self.$searchContainer.prev('.select2-selection__choice');
if ($previousChoice.length > 0) {
var item = $previousChoice.data('data');
self.searchRemoveChoice(item);
evt.preventDefault();
}
}
});
// Try to detect the IE version should the `documentMode` property that
// is stored on the document. This is only implemented in IE and is
// slightly cleaner than doing a user agent check.
// This property is not available in Edge, but Edge also doesn't have
// this bug.
var msie = document.documentMode;
var disableInputEvents = msie && msie <= 11;
// Workaround for browsers which do not support the `input` event
// This will prevent double-triggering of events for browsers which support
// both the `keyup` and `input` events.
this.$selection.on('input.searchcheck', '.select2-search--inline', function (evt) {
// IE will trigger the `input` event when a placeholder is used on a
// search box. To get around this issue, we are forced to ignore all
// `input` events in IE and keep using `keyup`.
if (disableInputEvents) {
self.$selection.off('input.search input.searchcheck');
return;
}
// Unbind the duplicated `keyup` event
self.$selection.off('keyup.search');
});
this.$selection.on('keyup.search input.search', '.select2-search--inline', function (evt) {
// IE will trigger the `input` event when a placeholder is used on a
// search box. To get around this issue, we are forced to ignore all
// `input` events in IE and keep using `keyup`.
if (disableInputEvents && evt.type === 'input') {
self.$selection.off('input.search input.searchcheck');
return;
}
var key = evt.which;
// We can freely ignore events from modifier keys
if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
return;
}
// Tabbing will be handled during the `keydown` phase
if (key == KEYS.TAB) {
return;
}
self.handleSearch(evt);
});
};
/**
* This method will transfer the tabindex attribute from the rendered
* selection to the search box. This allows for the search box to be used as
* the primary focus instead of the selection container.
*
* @private
*/
Search.prototype._transferTabIndex = function (decorated) {
this.$search.attr('tabindex', this.$selection.attr('tabindex'));
this.$selection.attr('tabindex', '-1');
};
Search.prototype.createPlaceholder = function (decorated, placeholder) {
this.$search.attr('placeholder', placeholder.text);
};
Search.prototype.update = function (decorated, data) {
var searchHadFocus = this.$search[0] == document.activeElement;
this.$search.attr('placeholder', '');
decorated.call(this, data);
this.$selection.find('.select2-selection__rendered').append(this.$searchContainer);
this.resizeSearch();
if (searchHadFocus) {
this.$search.focus();
}
};
Search.prototype.handleSearch = function () {
this.resizeSearch();
if (!this._keyUpPrevented) {
var input = this.$search.val();
this.trigger('query', {
term: input
});
}
this._keyUpPrevented = false;
};
Search.prototype.searchRemoveChoice = function (decorated, item) {
this.trigger('unselect', {
data: item
});
this.$search.val(item.text);
this.handleSearch();
};
Search.prototype.resizeSearch = function () {
this.$search.css('width', '25px');
var width = '';
if (this.$search.attr('placeholder') !== '') {
width = this.$selection.find('.select2-selection__rendered').innerWidth();
} else {
var minimumWidth = this.$search.val().length + 1;
width = minimumWidth * 0.75 + 'em';
}
this.$search.css('width', width);
};
return Search;
});
S2.define('select2/selection/eventRelay', ['jquery'], function ($) {
function EventRelay() {}
EventRelay.prototype.bind = function (decorated, container, $container) {
var self = this;
var relayEvents = ['open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting'];
var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
decorated.call(this, container, $container);
container.on('*', function (name, params) {
// Ignore events that should not be relayed
if ($.inArray(name, relayEvents) === -1) {
return;
}
// The parameters should always be an object
params = params || {};
// Generate the jQuery event for the Select2 event
var evt = $.Event('select2:' + name, {
params: params
});
self.$element.trigger(evt);
// Only handle preventable events if it was one
if ($.inArray(name, preventableEvents) === -1) {
return;
}
params.prevented = evt.isDefaultPrevented();
});
};
return EventRelay;
});
S2.define('select2/translation', ['jquery', 'require'], function ($, require) {
function Translation(dict) {
this.dict = dict || {};
}
Translation.prototype.all = function () {
return this.dict;
};
Translation.prototype.get = function (key) {
return this.dict[key];
};
Translation.prototype.extend = function (translation) {
this.dict = $.extend({}, translation.all(), this.dict);
};
// Static functions
Translation._cache = {};
Translation.loadPath = function (path) {
if (!(path in Translation._cache)) {
var translations = require(path);
Translation._cache[path] = translations;
}
return new Translation(Translation._cache[path]);
};
return Translation;
});
S2.define('select2/diacritics', [], function () {
var diacritics = {
'\u24B6': 'A',
'\uFF21': 'A',
'\xC0': 'A',
'\xC1': 'A',
'\xC2': 'A',
'\u1EA6': 'A',
'\u1EA4': 'A',
'\u1EAA': 'A',
'\u1EA8': 'A',
'\xC3': 'A',
'\u0100': 'A',
'\u0102': 'A',
'\u1EB0': 'A',
'\u1EAE': 'A',
'\u1EB4': 'A',
'\u1EB2': 'A',
'\u0226': 'A',
'\u01E0': 'A',
'\xC4': 'A',
'\u01DE': 'A',
'\u1EA2': 'A',
'\xC5': 'A',
'\u01FA': 'A',
'\u01CD': 'A',
'\u0200': 'A',
'\u0202': 'A',
'\u1EA0': 'A',
'\u1EAC': 'A',
'\u1EB6': 'A',
'\u1E00': 'A',
'\u0104': 'A',
'\u023A': 'A',
'\u2C6F': 'A',
'\uA732': 'AA',
'\xC6': 'AE',
'\u01FC': 'AE',
'\u01E2': 'AE',
'\uA734': 'AO',
'\uA736': 'AU',
'\uA738': 'AV',
'\uA73A': 'AV',
'\uA73C': 'AY',
'\u24B7': 'B',
'\uFF22': 'B',
'\u1E02': 'B',
'\u1E04': 'B',
'\u1E06': 'B',
'\u0243': 'B',
'\u0182': 'B',
'\u0181': 'B',
'\u24B8': 'C',
'\uFF23': 'C',
'\u0106': 'C',
'\u0108': 'C',
'\u010A': 'C',
'\u010C': 'C',
'\xC7': 'C',
'\u1E08': 'C',
'\u0187': 'C',
'\u023B': 'C',
'\uA73E': 'C',
'\u24B9': 'D',
'\uFF24': 'D',
'\u1E0A': 'D',
'\u010E': 'D',
'\u1E0C': 'D',
'\u1E10': 'D',
'\u1E12': 'D',
'\u1E0E': 'D',
'\u0110': 'D',
'\u018B': 'D',
'\u018A': 'D',
'\u0189': 'D',
'\uA779': 'D',
'\u01F1': 'DZ',
'\u01C4': 'DZ',
'\u01F2': 'Dz',
'\u01C5': 'Dz',
'\u24BA': 'E',
'\uFF25': 'E',
'\xC8': 'E',
'\xC9': 'E',
'\xCA': 'E',
'\u1EC0': 'E',
'\u1EBE': 'E',
'\u1EC4': 'E',
'\u1EC2': 'E',
'\u1EBC': 'E',
'\u0112': 'E',
'\u1E14': 'E',
'\u1E16': 'E',
'\u0114': 'E',
'\u0116': 'E',
'\xCB': 'E',
'\u1EBA': 'E',
'\u011A': 'E',
'\u0204': 'E',
'\u0206': 'E',
'\u1EB8': 'E',
'\u1EC6': 'E',
'\u0228': 'E',
'\u1E1C': 'E',
'\u0118': 'E',
'\u1E18': 'E',
'\u1E1A': 'E',
'\u0190': 'E',
'\u018E': 'E',
'\u24BB': 'F',
'\uFF26': 'F',
'\u1E1E': 'F',
'\u0191': 'F',
'\uA77B': 'F',
'\u24BC': 'G',
'\uFF27': 'G',
'\u01F4': 'G',
'\u011C': 'G',
'\u1E20': 'G',
'\u011E': 'G',
'\u0120': 'G',
'\u01E6': 'G',
'\u0122': 'G',
'\u01E4': 'G',
'\u0193': 'G',
'\uA7A0': 'G',
'\uA77D': 'G',
'\uA77E': 'G',
'\u24BD': 'H',
'\uFF28': 'H',
'\u0124': 'H',
'\u1E22': 'H',
'\u1E26': 'H',
'\u021E': 'H',
'\u1E24': 'H',
'\u1E28': 'H',
'\u1E2A': 'H',
'\u0126': 'H',
'\u2C67': 'H',
'\u2C75': 'H',
'\uA78D': 'H',
'\u24BE': 'I',
'\uFF29': 'I',
'\xCC': 'I',
'\xCD': 'I',
'\xCE': 'I',
'\u0128': 'I',
'\u012A': 'I',
'\u012C': 'I',
'\u0130': 'I',
'\xCF': 'I',
'\u1E2E': 'I',
'\u1EC8': 'I',
'\u01CF': 'I',
'\u0208': 'I',
'\u020A': 'I',
'\u1ECA': 'I',
'\u012E': 'I',
'\u1E2C': 'I',
'\u0197': 'I',
'\u24BF': 'J',
'\uFF2A': 'J',
'\u0134': 'J',
'\u0248': 'J',
'\u24C0': 'K',
'\uFF2B': 'K',
'\u1E30': 'K',
'\u01E8': 'K',
'\u1E32': 'K',
'\u0136': 'K',
'\u1E34': 'K',
'\u0198': 'K',
'\u2C69': 'K',
'\uA740': 'K',
'\uA742': 'K',
'\uA744': 'K',
'\uA7A2': 'K',
'\u24C1': 'L',
'\uFF2C': 'L',
'\u013F': 'L',
'\u0139': 'L',
'\u013D': 'L',
'\u1E36': 'L',
'\u1E38': 'L',
'\u013B': 'L',
'\u1E3C': 'L',
'\u1E3A': 'L',
'\u0141': 'L',
'\u023D': 'L',
'\u2C62': 'L',
'\u2C60': 'L',
'\uA748': 'L',
'\uA746': 'L',
'\uA780': 'L',
'\u01C7': 'LJ',
'\u01C8': 'Lj',
'\u24C2': 'M',
'\uFF2D': 'M',
'\u1E3E': 'M',
'\u1E40': 'M',
'\u1E42': 'M',
'\u2C6E': 'M',
'\u019C': 'M',
'\u24C3': 'N',
'\uFF2E': 'N',
'\u01F8': 'N',
'\u0143': 'N',
'\xD1': 'N',
'\u1E44': 'N',
'\u0147': 'N',
'\u1E46': 'N',
'\u0145': 'N',
'\u1E4A': 'N',
'\u1E48': 'N',
'\u0220': 'N',
'\u019D': 'N',
'\uA790': 'N',
'\uA7A4': 'N',
'\u01CA': 'NJ',
'\u01CB': 'Nj',
'\u24C4': 'O',
'\uFF2F': 'O',
'\xD2': 'O',
'\xD3': 'O',
'\xD4': 'O',
'\u1ED2': 'O',
'\u1ED0': 'O',
'\u1ED6': 'O',
'\u1ED4': 'O',
'\xD5': 'O',
'\u1E4C': 'O',
'\u022C': 'O',
'\u1E4E': 'O',
'\u014C': 'O',
'\u1E50': 'O',
'\u1E52': 'O',
'\u014E': 'O',
'\u022E': 'O',
'\u0230': 'O',
'\xD6': 'O',
'\u022A': 'O',
'\u1ECE': 'O',
'\u0150': 'O',
'\u01D1': 'O',
'\u020C': 'O',
'\u020E': 'O',
'\u01A0': 'O',
'\u1EDC': 'O',
'\u1EDA': 'O',
'\u1EE0': 'O',
'\u1EDE': 'O',
'\u1EE2': 'O',
'\u1ECC': 'O',
'\u1ED8': 'O',
'\u01EA': 'O',
'\u01EC': 'O',
'\xD8': 'O',
'\u01FE': 'O',
'\u0186': 'O',
'\u019F': 'O',
'\uA74A': 'O',
'\uA74C': 'O',
'\u01A2': 'OI',
'\uA74E': 'OO',
'\u0222': 'OU',
'\u24C5': 'P',
'\uFF30': 'P',
'\u1E54': 'P',
'\u1E56': 'P',
'\u01A4': 'P',
'\u2C63': 'P',
'\uA750': 'P',
'\uA752': 'P',
'\uA754': 'P',
'\u24C6': 'Q',
'\uFF31': 'Q',
'\uA756': 'Q',
'\uA758': 'Q',
'\u024A': 'Q',
'\u24C7': 'R',
'\uFF32': 'R',
'\u0154': 'R',
'\u1E58': 'R',
'\u0158': 'R',
'\u0210': 'R',
'\u0212': 'R',
'\u1E5A': 'R',
'\u1E5C': 'R',
'\u0156': 'R',
'\u1E5E': 'R',
'\u024C': 'R',
'\u2C64': 'R',
'\uA75A': 'R',
'\uA7A6': 'R',
'\uA782': 'R',
'\u24C8': 'S',
'\uFF33': 'S',
'\u1E9E': 'S',
'\u015A': 'S',
'\u1E64': 'S',
'\u015C': 'S',
'\u1E60': 'S',
'\u0160': 'S',
'\u1E66': 'S',
'\u1E62': 'S',
'\u1E68': 'S',
'\u0218': 'S',
'\u015E': 'S',
'\u2C7E': 'S',
'\uA7A8': 'S',
'\uA784': 'S',
'\u24C9': 'T',
'\uFF34': 'T',
'\u1E6A': 'T',
'\u0164': 'T',
'\u1E6C': 'T',
'\u021A': 'T',
'\u0162': 'T',
'\u1E70': 'T',
'\u1E6E': 'T',
'\u0166': 'T',
'\u01AC': 'T',
'\u01AE': 'T',
'\u023E': 'T',
'\uA786': 'T',
'\uA728': 'TZ',
'\u24CA': 'U',
'\uFF35': 'U',
'\xD9': 'U',
'\xDA': 'U',
'\xDB': 'U',
'\u0168': 'U',
'\u1E78': 'U',
'\u016A': 'U',
'\u1E7A': 'U',
'\u016C': 'U',
'\xDC': 'U',
'\u01DB': 'U',
'\u01D7': 'U',
'\u01D5': 'U',
'\u01D9': 'U',
'\u1EE6': 'U',
'\u016E': 'U',
'\u0170': 'U',
'\u01D3': 'U',
'\u0214': 'U',
'\u0216': 'U',
'\u01AF': 'U',
'\u1EEA': 'U',
'\u1EE8': 'U',
'\u1EEE': 'U',
'\u1EEC': 'U',
'\u1EF0': 'U',
'\u1EE4': 'U',
'\u1E72': 'U',
'\u0172': 'U',
'\u1E76': 'U',
'\u1E74': 'U',
'\u0244': 'U',
'\u24CB': 'V',
'\uFF36': 'V',
'\u1E7C': 'V',
'\u1E7E': 'V',
'\u01B2': 'V',
'\uA75E': 'V',
'\u0245': 'V',
'\uA760': 'VY',
'\u24CC': 'W',
'\uFF37': 'W',
'\u1E80': 'W',
'\u1E82': 'W',
'\u0174': 'W',
'\u1E86': 'W',
'\u1E84': 'W',
'\u1E88': 'W',
'\u2C72': 'W',
'\u24CD': 'X',
'\uFF38': 'X',
'\u1E8A': 'X',
'\u1E8C': 'X',
'\u24CE': 'Y',
'\uFF39': 'Y',
'\u1EF2': 'Y',
'\xDD': 'Y',
'\u0176': 'Y',
'\u1EF8': 'Y',
'\u0232': 'Y',
'\u1E8E': 'Y',
'\u0178': 'Y',
'\u1EF6': 'Y',
'\u1EF4': 'Y',
'\u01B3': 'Y',
'\u024E': 'Y',
'\u1EFE': 'Y',
'\u24CF': 'Z',
'\uFF3A': 'Z',
'\u0179': 'Z',
'\u1E90': 'Z',
'\u017B': 'Z',
'\u017D': 'Z',
'\u1E92': 'Z',
'\u1E94': 'Z',
'\u01B5': 'Z',
'\u0224': 'Z',
'\u2C7F': 'Z',
'\u2C6B': 'Z',
'\uA762': 'Z',
'\u24D0': 'a',
'\uFF41': 'a',
'\u1E9A': 'a',
'\xE0': 'a',
'\xE1': 'a',
'\xE2': 'a',
'\u1EA7': 'a',
'\u1EA5': 'a',
'\u1EAB': 'a',
'\u1EA9': 'a',
'\xE3': 'a',
'\u0101': 'a',
'\u0103': 'a',
'\u1EB1': 'a',
'\u1EAF': 'a',
'\u1EB5': 'a',
'\u1EB3': 'a',
'\u0227': 'a',
'\u01E1': 'a',
'\xE4': 'a',
'\u01DF': 'a',
'\u1EA3': 'a',
'\xE5': 'a',
'\u01FB': 'a',
'\u01CE': 'a',
'\u0201': 'a',
'\u0203': 'a',
'\u1EA1': 'a',
'\u1EAD': 'a',
'\u1EB7': 'a',
'\u1E01': 'a',
'\u0105': 'a',
'\u2C65': 'a',
'\u0250': 'a',
'\uA733': 'aa',
'\xE6': 'ae',
'\u01FD': 'ae',
'\u01E3': 'ae',
'\uA735': 'ao',
'\uA737': 'au',
'\uA739': 'av',
'\uA73B': 'av',
'\uA73D': 'ay',
'\u24D1': 'b',
'\uFF42': 'b',
'\u1E03': 'b',
'\u1E05': 'b',
'\u1E07': 'b',
'\u0180': 'b',
'\u0183': 'b',
'\u0253': 'b',
'\u24D2': 'c',
'\uFF43': 'c',
'\u0107': 'c',
'\u0109': 'c',
'\u010B': 'c',
'\u010D': 'c',
'\xE7': 'c',
'\u1E09': 'c',
'\u0188': 'c',
'\u023C': 'c',
'\uA73F': 'c',
'\u2184': 'c',
'\u24D3': 'd',
'\uFF44': 'd',
'\u1E0B': 'd',
'\u010F': 'd',
'\u1E0D': 'd',
'\u1E11': 'd',
'\u1E13': 'd',
'\u1E0F': 'd',
'\u0111': 'd',
'\u018C': 'd',
'\u0256': 'd',
'\u0257': 'd',
'\uA77A': 'd',
'\u01F3': 'dz',
'\u01C6': 'dz',
'\u24D4': 'e',
'\uFF45': 'e',
'\xE8': 'e',
'\xE9': 'e',
'\xEA': 'e',
'\u1EC1': 'e',
'\u1EBF': 'e',
'\u1EC5': 'e',
'\u1EC3': 'e',
'\u1EBD': 'e',
'\u0113': 'e',
'\u1E15': 'e',
'\u1E17': 'e',
'\u0115': 'e',
'\u0117': 'e',
'\xEB': 'e',
'\u1EBB': 'e',
'\u011B': 'e',
'\u0205': 'e',
'\u0207': 'e',
'\u1EB9': 'e',
'\u1EC7': 'e',
'\u0229': 'e',
'\u1E1D': 'e',
'\u0119': 'e',
'\u1E19': 'e',
'\u1E1B': 'e',
'\u0247': 'e',
'\u025B': 'e',
'\u01DD': 'e',
'\u24D5': 'f',
'\uFF46': 'f',
'\u1E1F': 'f',
'\u0192': 'f',
'\uA77C': 'f',
'\u24D6': 'g',
'\uFF47': 'g',
'\u01F5': 'g',
'\u011D': 'g',
'\u1E21': 'g',
'\u011F': 'g',
'\u0121': 'g',
'\u01E7': 'g',
'\u0123': 'g',
'\u01E5': 'g',
'\u0260': 'g',
'\uA7A1': 'g',
'\u1D79': 'g',
'\uA77F': 'g',
'\u24D7': 'h',
'\uFF48': 'h',
'\u0125': 'h',
'\u1E23': 'h',
'\u1E27': 'h',
'\u021F': 'h',
'\u1E25': 'h',
'\u1E29': 'h',
'\u1E2B': 'h',
'\u1E96': 'h',
'\u0127': 'h',
'\u2C68': 'h',
'\u2C76': 'h',
'\u0265': 'h',
'\u0195': 'hv',
'\u24D8': 'i',
'\uFF49': 'i',
'\xEC': 'i',
'\xED': 'i',
'\xEE': 'i',
'\u0129': 'i',
'\u012B': 'i',
'\u012D': 'i',
'\xEF': 'i',
'\u1E2F': 'i',
'\u1EC9': 'i',
'\u01D0': 'i',
'\u0209': 'i',
'\u020B': 'i',
'\u1ECB': 'i',
'\u012F': 'i',
'\u1E2D': 'i',
'\u0268': 'i',
'\u0131': 'i',
'\u24D9': 'j',
'\uFF4A': 'j',
'\u0135': 'j',
'\u01F0': 'j',
'\u0249': 'j',
'\u24DA': 'k',
'\uFF4B': 'k',
'\u1E31': 'k',
'\u01E9': 'k',
'\u1E33': 'k',
'\u0137': 'k',
'\u1E35': 'k',
'\u0199': 'k',
'\u2C6A': 'k',
'\uA741': 'k',
'\uA743': 'k',
'\uA745': 'k',
'\uA7A3': 'k',
'\u24DB': 'l',
'\uFF4C': 'l',
'\u0140': 'l',
'\u013A': 'l',
'\u013E': 'l',
'\u1E37': 'l',
'\u1E39': 'l',
'\u013C': 'l',
'\u1E3D': 'l',
'\u1E3B': 'l',
'\u017F': 'l',
'\u0142': 'l',
'\u019A': 'l',
'\u026B': 'l',
'\u2C61': 'l',
'\uA749': 'l',
'\uA781': 'l',
'\uA747': 'l',
'\u01C9': 'lj',
'\u24DC': 'm',
'\uFF4D': 'm',
'\u1E3F': 'm',
'\u1E41': 'm',
'\u1E43': 'm',
'\u0271': 'm',
'\u026F': 'm',
'\u24DD': 'n',
'\uFF4E': 'n',
'\u01F9': 'n',
'\u0144': 'n',
'\xF1': 'n',
'\u1E45': 'n',
'\u0148': 'n',
'\u1E47': 'n',
'\u0146': 'n',
'\u1E4B': 'n',
'\u1E49': 'n',
'\u019E': 'n',
'\u0272': 'n',
'\u0149': 'n',
'\uA791': 'n',
'\uA7A5': 'n',
'\u01CC': 'nj',
'\u24DE': 'o',
'\uFF4F': 'o',
'\xF2': 'o',
'\xF3': 'o',
'\xF4': 'o',
'\u1ED3': 'o',
'\u1ED1': 'o',
'\u1ED7': 'o',
'\u1ED5': 'o',
'\xF5': 'o',
'\u1E4D': 'o',
'\u022D': 'o',
'\u1E4F': 'o',
'\u014D': 'o',
'\u1E51': 'o',
'\u1E53': 'o',
'\u014F': 'o',
'\u022F': 'o',
'\u0231': 'o',
'\xF6': 'o',
'\u022B': 'o',
'\u1ECF': 'o',
'\u0151': 'o',
'\u01D2': 'o',
'\u020D': 'o',
'\u020F': 'o',
'\u01A1': 'o',
'\u1EDD': 'o',
'\u1EDB': 'o',
'\u1EE1': 'o',
'\u1EDF': 'o',
'\u1EE3': 'o',
'\u1ECD': 'o',
'\u1ED9': 'o',
'\u01EB': 'o',
'\u01ED': 'o',
'\xF8': 'o',
'\u01FF': 'o',
'\u0254': 'o',
'\uA74B': 'o',
'\uA74D': 'o',
'\u0275': 'o',
'\u01A3': 'oi',
'\u0223': 'ou',
'\uA74F': 'oo',
'\u24DF': 'p',
'\uFF50': 'p',
'\u1E55': 'p',
'\u1E57': 'p',
'\u01A5': 'p',
'\u1D7D': 'p',
'\uA751': 'p',
'\uA753': 'p',
'\uA755': 'p',
'\u24E0': 'q',
'\uFF51': 'q',
'\u024B': 'q',
'\uA757': 'q',
'\uA759': 'q',
'\u24E1': 'r',
'\uFF52': 'r',
'\u0155': 'r',
'\u1E59': 'r',
'\u0159': 'r',
'\u0211': 'r',
'\u0213': 'r',
'\u1E5B': 'r',
'\u1E5D': 'r',
'\u0157': 'r',
'\u1E5F': 'r',
'\u024D': 'r',
'\u027D': 'r',
'\uA75B': 'r',
'\uA7A7': 'r',
'\uA783': 'r',
'\u24E2': 's',
'\uFF53': 's',
'\xDF': 's',
'\u015B': 's',
'\u1E65': 's',
'\u015D': 's',
'\u1E61': 's',
'\u0161': 's',
'\u1E67': 's',
'\u1E63': 's',
'\u1E69': 's',
'\u0219': 's',
'\u015F': 's',
'\u023F': 's',
'\uA7A9': 's',
'\uA785': 's',
'\u1E9B': 's',
'\u24E3': 't',
'\uFF54': 't',
'\u1E6B': 't',
'\u1E97': 't',
'\u0165': 't',
'\u1E6D': 't',
'\u021B': 't',
'\u0163': 't',
'\u1E71': 't',
'\u1E6F': 't',
'\u0167': 't',
'\u01AD': 't',
'\u0288': 't',
'\u2C66': 't',
'\uA787': 't',
'\uA729': 'tz',
'\u24E4': 'u',
'\uFF55': 'u',
'\xF9': 'u',
'\xFA': 'u',
'\xFB': 'u',
'\u0169': 'u',
'\u1E79': 'u',
'\u016B': 'u',
'\u1E7B': 'u',
'\u016D': 'u',
'\xFC': 'u',
'\u01DC': 'u',
'\u01D8': 'u',
'\u01D6': 'u',
'\u01DA': 'u',
'\u1EE7': 'u',
'\u016F': 'u',
'\u0171': 'u',
'\u01D4': 'u',
'\u0215': 'u',
'\u0217': 'u',
'\u01B0': 'u',
'\u1EEB': 'u',
'\u1EE9': 'u',
'\u1EEF': 'u',
'\u1EED': 'u',
'\u1EF1': 'u',
'\u1EE5': 'u',
'\u1E73': 'u',
'\u0173': 'u',
'\u1E77': 'u',
'\u1E75': 'u',
'\u0289': 'u',
'\u24E5': 'v',
'\uFF56': 'v',
'\u1E7D': 'v',
'\u1E7F': 'v',
'\u028B': 'v',
'\uA75F': 'v',
'\u028C': 'v',
'\uA761': 'vy',
'\u24E6': 'w',
'\uFF57': 'w',
'\u1E81': 'w',
'\u1E83': 'w',
'\u0175': 'w',
'\u1E87': 'w',
'\u1E85': 'w',
'\u1E98': 'w',
'\u1E89': 'w',
'\u2C73': 'w',
'\u24E7': 'x',
'\uFF58': 'x',
'\u1E8B': 'x',
'\u1E8D': 'x',
'\u24E8': 'y',
'\uFF59': 'y',
'\u1EF3': 'y',
'\xFD': 'y',
'\u0177': 'y',
'\u1EF9': 'y',
'\u0233': 'y',
'\u1E8F': 'y',
'\xFF': 'y',
'\u1EF7': 'y',
'\u1E99': 'y',
'\u1EF5': 'y',
'\u01B4': 'y',
'\u024F': 'y',
'\u1EFF': 'y',
'\u24E9': 'z',
'\uFF5A': 'z',
'\u017A': 'z',
'\u1E91': 'z',
'\u017C': 'z',
'\u017E': 'z',
'\u1E93': 'z',
'\u1E95': 'z',
'\u01B6': 'z',
'\u0225': 'z',
'\u0240': 'z',
'\u2C6C': 'z',
'\uA763': 'z',
'\u0386': '\u0391',
'\u0388': '\u0395',
'\u0389': '\u0397',
'\u038A': '\u0399',
'\u03AA': '\u0399',
'\u038C': '\u039F',
'\u038E': '\u03A5',
'\u03AB': '\u03A5',
'\u038F': '\u03A9',
'\u03AC': '\u03B1',
'\u03AD': '\u03B5',
'\u03AE': '\u03B7',
'\u03AF': '\u03B9',
'\u03CA': '\u03B9',
'\u0390': '\u03B9',
'\u03CC': '\u03BF',
'\u03CD': '\u03C5',
'\u03CB': '\u03C5',
'\u03B0': '\u03C5',
'\u03C9': '\u03C9',
'\u03C2': '\u03C3'
};
return diacritics;
});
S2.define('select2/data/base', ['../utils'], function (Utils) {
function BaseAdapter($element, options) {
BaseAdapter.__super__.constructor.call(this);
}
Utils.Extend(BaseAdapter, Utils.Observable);
BaseAdapter.prototype.current = function (callback) {
throw new Error('The `current` method must be defined in child classes.');
};
BaseAdapter.prototype.query = function (params, callback) {
throw new Error('The `query` method must be defined in child classes.');
};
BaseAdapter.prototype.bind = function (container, $container) {
// Can be implemented in subclasses
};
BaseAdapter.prototype.destroy = function () {
// Can be implemented in subclasses
};
BaseAdapter.prototype.generateResultId = function (container, data) {
var id = container.id + '-result-';
id += Utils.generateChars(4);
if (data.id != null) {
id += '-' + data.id.toString();
} else {
id += '-' + Utils.generateChars(4);
}
return id;
};
return BaseAdapter;
});
S2.define('select2/data/select', ['./base', '../utils', 'jquery'], function (BaseAdapter, Utils, $) {
function SelectAdapter($element, options) {
this.$element = $element;
this.options = options;
SelectAdapter.__super__.constructor.call(this);
}
Utils.Extend(SelectAdapter, BaseAdapter);
SelectAdapter.prototype.current = function (callback) {
var data = [];
var self = this;
this.$element.find(':selected').each(function () {
var $option = $(this);
var option = self.item($option);
data.push(option);
});
callback(data);
};
SelectAdapter.prototype.select = function (data) {
var self = this;
data.selected = true;
// If data.element is a DOM node, use it instead
if ($(data.element).is('option')) {
data.element.selected = true;
this.$element.trigger('change');
return;
}
if (this.$element.prop('multiple')) {
this.current(function (currentData) {
var val = [];
data = [data];
data.push.apply(data, currentData);
for (var d = 0; d < data.length; d++) {
var id = data[d].id;
if ($.inArray(id, val) === -1) {
val.push(id);
}
}
self.$element.val(val);
self.$element.trigger('change');
});
} else {
var val = data.id;
this.$element.val(val);
this.$element.trigger('change');
}
};
SelectAdapter.prototype.unselect = function (data) {
var self = this;
if (!this.$element.prop('multiple')) {
return;
}
data.selected = false;
if ($(data.element).is('option')) {
data.element.selected = false;
this.$element.trigger('change');
return;
}
this.current(function (currentData) {
var val = [];
for (var d = 0; d < currentData.length; d++) {
var id = currentData[d].id;
if (id !== data.id && $.inArray(id, val) === -1) {
val.push(id);
}
}
self.$element.val(val);
self.$element.trigger('change');
});
};
SelectAdapter.prototype.bind = function (container, $container) {
var self = this;
this.container = container;
container.on('select', function (params) {
self.select(params.data);
});
container.on('unselect', function (params) {
self.unselect(params.data);
});
};
SelectAdapter.prototype.destroy = function () {
// Remove anything added to child elements
this.$element.find('*').each(function () {
// Remove any custom data set by Select2
$.removeData(this, 'data');
});
};
SelectAdapter.prototype.query = function (params, callback) {
var data = [];
var self = this;
var $options = this.$element.children();
$options.each(function () {
var $option = $(this);
if (!$option.is('option') && !$option.is('optgroup')) {
return;
}
var option = self.item($option);
var matches = self.matches(params, option);
if (matches !== null) {
data.push(matches);
}
});
callback({
results: data
});
};
SelectAdapter.prototype.addOptions = function ($options) {
Utils.appendMany(this.$element, $options);
};
SelectAdapter.prototype.option = function (data) {
var option;
if (data.children) {
option = document.createElement('optgroup');
option.label = data.text;
} else {
option = document.createElement('option');
if (option.textContent !== undefined) {
option.textContent = data.text;
} else {
option.innerText = data.text;
}
}
if (data.id) {
option.value = data.id;
}
if (data.disabled) {
option.disabled = true;
}
if (data.selected) {
option.selected = true;
}
if (data.title) {
option.title = data.title;
}
var $option = $(option);
var normalizedData = this._normalizeItem(data);
normalizedData.element = option;
// Override the option's data with the combined data
$.data(option, 'data', normalizedData);
return $option;
};
SelectAdapter.prototype.item = function ($option) {
var data = {};
data = $.data($option[0], 'data');
if (data != null) {
return data;
}
if ($option.is('option')) {
data = {
id: $option.val(),
text: $option.text(),
disabled: $option.prop('disabled'),
selected: $option.prop('selected'),
title: $option.prop('title')
};
} else if ($option.is('optgroup')) {
data = {
text: $option.prop('label'),
children: [],
title: $option.prop('title')
};
var $children = $option.children('option');
var children = [];
for (var c = 0; c < $children.length; c++) {
var $child = $($children[c]);
var child = this.item($child);
children.push(child);
}
data.children = children;
}
data = this._normalizeItem(data);
data.element = $option[0];
$.data($option[0], 'data', data);
return data;
};
SelectAdapter.prototype._normalizeItem = function (item) {
if (!$.isPlainObject(item)) {
item = {
id: item,
text: item
};
}
item = $.extend({}, {
text: ''
}, item);
var defaults = {
selected: false,
disabled: false
};
if (item.id != null) {
item.id = item.id.toString();
}
if (item.text != null) {
item.text = item.text.toString();
}
if (item._resultId == null && item.id && this.container != null) {
item._resultId = this.generateResultId(this.container, item);
}
return $.extend({}, defaults, item);
};
SelectAdapter.prototype.matches = function (params, data) {
var matcher = this.options.get('matcher');
return matcher(params, data);
};
return SelectAdapter;
});
S2.define('select2/data/array', ['./select', '../utils', 'jquery'], function (SelectAdapter, Utils, $) {
function ArrayAdapter($element, options) {
var data = options.get('data') || [];
ArrayAdapter.__super__.constructor.call(this, $element, options);
this.addOptions(this.convertToOptions(data));
}
Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.select = function (data) {
var $option = this.$element.find('option').filter(function (i, elm) {
return elm.value == data.id.toString();
});
if ($option.length === 0) {
$option = this.option(data);
this.addOptions($option);
}
ArrayAdapter.__super__.select.call(this, data);
};
ArrayAdapter.prototype.convertToOptions = function (data) {
var self = this;
var $existing = this.$element.find('option');
var existingIds = $existing.map(function () {
return self.item($(this)).id;
}).get();
var $options = [];
// Filter out all items except for the one passed in the argument
function onlyItem(item) {
return function () {
return $(this).val() == item.id;
};
}
for (var d = 0; d < data.length; d++) {
var item = this._normalizeItem(data[d]);
// Skip items which were pre-loaded, only merge the data
if ($.inArray(item.id, existingIds) >= 0) {
var $existingOption = $existing.filter(onlyItem(item));
var existingData = this.item($existingOption);
var newData = $.extend(true, {}, item, existingData);
var $newOption = this.option(newData);
$existingOption.replaceWith($newOption);
continue;
}
var $option = this.option(item);
if (item.children) {
var $children = this.convertToOptions(item.children);
Utils.appendMany($option, $children);
}
$options.push($option);
}
return $options;
};
return ArrayAdapter;
});
S2.define('select2/data/ajax', ['./array', '../utils', 'jquery'], function (ArrayAdapter, Utils, $) {
function AjaxAdapter($element, options) {
this.ajaxOptions = this._applyDefaults(options.get('ajax'));
if (this.ajaxOptions.processResults != null) {
this.processResults = this.ajaxOptions.processResults;
}
AjaxAdapter.__super__.constructor.call(this, $element, options);
}
Utils.Extend(AjaxAdapter, ArrayAdapter);
AjaxAdapter.prototype._applyDefaults = function (options) {
var defaults = {
data: function data(params) {
return $.extend({}, params, {
q: params.term
});
},
transport: function transport(params, success, failure) {
var $request = $.ajax(params);
$request.then(success);
$request.fail(failure);
return $request;
}
};
return $.extend({}, defaults, options, true);
};
AjaxAdapter.prototype.processResults = function (results) {
return results;
};
AjaxAdapter.prototype.query = function (params, callback) {
var matches = [];
var self = this;
if (this._request != null) {
// JSONP requests cannot always be aborted
if ($.isFunction(this._request.abort)) {
this._request.abort();
}
this._request = null;
}
var options = $.extend({
type: 'GET'
}, this.ajaxOptions);
if (typeof options.url === 'function') {
options.url = options.url.call(this.$element, params);
}
if (typeof options.data === 'function') {
options.data = options.data.call(this.$element, params);
}
function request() {
var $request = options.transport(options, function (data) {
var results = self.processResults(data, params);
if (self.options.get('debug') && window.console && console.error) {
// Check to make sure that the response included a `results` key.
if (!results || !results.results || !$.isArray(results.results)) {
console.error('Select2: The AJAX results did not return an array in the ' + '`results` key of the response.');
}
}
callback(results);
}, function () {
// Attempt to detect if a request was aborted
// Only works if the transport exposes a status property
if ($request.status && $request.status === '0') {
return;
}
self.trigger('results:message', {
message: 'errorLoading'
});
});
self._request = $request;
}
if (this.ajaxOptions.delay && params.term != null) {
if (this._queryTimeout) {
window.clearTimeout(this._queryTimeout);
}
this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
} else {
request();
}
};
return AjaxAdapter;
});
S2.define('select2/data/tags', ['jquery'], function ($) {
function Tags(decorated, $element, options) {
var tags = options.get('tags');
var createTag = options.get('createTag');
if (createTag !== undefined) {
this.createTag = createTag;
}
var insertTag = options.get('insertTag');
if (insertTag !== undefined) {
this.insertTag = insertTag;
}
decorated.call(this, $element, options);
if ($.isArray(tags)) {
for (var t = 0; t < tags.length; t++) {
var tag = tags[t];
var item = this._normalizeItem(tag);
var $option = this.option(item);
this.$element.append($option);
}
}
}
Tags.prototype.query = function (decorated, params, callback) {
var self = this;
this._removeOldTags();
if (params.term == null || params.page != null) {
decorated.call(this, params, callback);
return;
}
function wrapper(obj, child) {
var data = obj.results;
for (var i = 0; i < data.length; i++) {
var option = data[i];
var checkChildren = option.children != null && !wrapper({
results: option.children
}, true);
var checkText = option.text === params.term;
if (checkText || checkChildren) {
if (child) {
return false;
}
obj.data = data;
callback(obj);
return;
}
}
if (child) {
return true;
}
var tag = self.createTag(params);
if (tag != null) {
var $option = self.option(tag);
$option.attr('data-select2-tag', true);
self.addOptions([$option]);
self.insertTag(data, tag);
}
obj.results = data;
callback(obj);
}
decorated.call(this, params, wrapper);
};
Tags.prototype.createTag = function (decorated, params) {
var term = $.trim(params.term);
if (term === '') {
return null;
}
return {
id: term,
text: term
};
};
Tags.prototype.insertTag = function (_, data, tag) {
data.unshift(tag);
};
Tags.prototype._removeOldTags = function (_) {
var tag = this._lastTag;
var $options = this.$element.find('option[data-select2-tag]');
$options.each(function () {
if (this.selected) {
return;
}
$(this).remove();
});
};
return Tags;
});
S2.define('select2/data/tokenizer', ['jquery'], function ($) {
function Tokenizer(decorated, $element, options) {
var tokenizer = options.get('tokenizer');
if (tokenizer !== undefined) {
this.tokenizer = tokenizer;
}
decorated.call(this, $element, options);
}
Tokenizer.prototype.bind = function (decorated, container, $container) {
decorated.call(this, container, $container);
this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field');
};
Tokenizer.prototype.query = function (decorated, params, callback) {
var self = this;
function createAndSelect(data) {
// Normalize the data object so we can use it for checks
var item = self._normalizeItem(data);
// Check if the data object already exists as a tag
// Select it if it doesn't
var $existingOptions = self.$element.find('option').filter(function () {
return $(this).val() === item.id;
});
// If an existing option wasn't found for it, create the option
if (!$existingOptions.length) {
var $option = self.option(item);
$option.attr('data-select2-tag', true);
self._removeOldTags();
self.addOptions([$option]);
}
// Select the item, now that we know there is an option for it
select(item);
}
function select(data) {
self.trigger('select', {
data: data
});
}
params.term = params.term || '';
var tokenData = this.tokenizer(params, this.options, createAndSelect);
if (tokenData.term !== params.term) {
// Replace the search term if we have the search box
if (this.$search.length) {
this.$search.val(tokenData.term);
this.$search.focus();
}
params.term = tokenData.term;
}
decorated.call(this, params, callback);
};
Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
var separators = options.get('tokenSeparators') || [];
var term = params.term;
var i = 0;
var createTag = this.createTag || function (params) {
return {
id: params.term,
text: params.term
};
};
while (i < term.length) {
var termChar = term[i];
if ($.inArray(termChar, separators) === -1) {
i++;
continue;
}
var part = term.substr(0, i);
var partParams = $.extend({}, params, {
term: part
});
var data = createTag(partParams);
if (data == null) {
i++;
continue;
}
callback(data);
// Reset the term to not include the tokenized portion
term = term.substr(i + 1) || '';
i = 0;
}
return {
term: term
};
};
return Tokenizer;
});
S2.define('select2/data/minimumInputLength', [], function () {
function MinimumInputLength(decorated, $e, options) {
this.minimumInputLength = options.get('minimumInputLength');
decorated.call(this, $e, options);
}
MinimumInputLength.prototype.query = function (decorated, params, callback) {
params.term = params.term || '';
if (params.term.length < this.minimumInputLength) {
this.trigger('results:message', {
message: 'inputTooShort',
args: {
minimum: this.minimumInputLength,
input: params.term,
params: params
}
});
return;
}
decorated.call(this, params, callback);
};
return MinimumInputLength;
});
S2.define('select2/data/maximumInputLength', [], function () {
function MaximumInputLength(decorated, $e, options) {
this.maximumInputLength = options.get('maximumInputLength');
decorated.call(this, $e, options);
}
MaximumInputLength.prototype.query = function (decorated, params, callback) {
params.term = params.term || '';
if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) {
this.trigger('results:message', {
message: 'inputTooLong',
args: {
maximum: this.maximumInputLength,
input: params.term,
params: params
}
});
return;
}
decorated.call(this, params, callback);
};
return MaximumInputLength;
});
S2.define('select2/data/maximumSelectionLength', [], function () {
function MaximumSelectionLength(decorated, $e, options) {
this.maximumSelectionLength = options.get('maximumSelectionLength');
decorated.call(this, $e, options);
}
MaximumSelectionLength.prototype.query = function (decorated, params, callback) {
var self = this;
this.current(function (currentData) {
var count = currentData != null ? currentData.length : 0;
if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) {
self.trigger('results:message', {
message: 'maximumSelected',
args: {
maximum: self.maximumSelectionLength
}
});
return;
}
decorated.call(self, params, callback);
});
};
return MaximumSelectionLength;
});
S2.define('select2/dropdown', ['jquery', './utils'], function ($, Utils) {
function Dropdown($element, options) {
this.$element = $element;
this.options = options;
Dropdown.__super__.constructor.call(this);
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $('<span class="select2-dropdown">' + '<span class="select2-results"></span>' + '</span>');
$dropdown.attr('dir', this.options.get('dir'));
this.$dropdown = $dropdown;
return $dropdown;
};
Dropdown.prototype.bind = function () {
// Should be implemented in subclasses
};
Dropdown.prototype.position = function ($dropdown, $container) {
// Should be implmented in subclasses
};
Dropdown.prototype.destroy = function () {
// Remove the dropdown from the DOM
this.$dropdown.remove();
};
return Dropdown;
});
S2.define('select2/dropdown/search', ['jquery', '../utils'], function ($, Utils) {
function Search() {}
Search.prototype.render = function (decorated) {
var $rendered = decorated.call(this);
var $search = $('<span class="select2-search select2-search--dropdown">' + '<input class="select2-search__field" type="search" tabindex="-1"' + ' autocomplete="off" autocorrect="off" autocapitalize="off"' + ' spellcheck="false" role="textbox" />' + '</span>');
this.$searchContainer = $search;
this.$search = $search.find('input');
$rendered.prepend($search);
return $rendered;
};
Search.prototype.bind = function (decorated, container, $container) {
var self = this;
decorated.call(this, container, $container);
this.$search.on('keydown', function (evt) {
self.trigger('keypress', evt);
self._keyUpPrevented = evt.isDefaultPrevented();
});
// Workaround for browsers which do not support the `input` event
// This will prevent double-triggering of events for browsers which support
// both the `keyup` and `input` events.
this.$search.on('input', function (evt) {
// Unbind the duplicated `keyup` event
$(this).off('keyup');
});
this.$search.on('keyup input', function (evt) {
self.handleSearch(evt);
});
container.on('open', function () {
self.$search.attr('tabindex', 0);
self.$search.focus();
window.setTimeout(function () {
self.$search.focus();
}, 0);
});
container.on('close', function () {
self.$search.attr('tabindex', -1);
self.$search.val('');
});
container.on('focus', function () {
if (container.isOpen()) {
self.$search.focus();
}
});
container.on('results:all', function (params) {
if (params.query.term == null || params.query.term === '') {
var showSearch = self.showSearch(params);
if (showSearch) {
self.$searchContainer.removeClass('select2-search--hide');
} else {
self.$searchContainer.addClass('select2-search--hide');
}
}
});
};
Search.prototype.handleSearch = function (evt) {
if (!this._keyUpPrevented) {
var input = this.$search.val();
this.trigger('query', {
term: input
});
}
this._keyUpPrevented = false;
};
Search.prototype.showSearch = function (_, params) {
return true;
};
return Search;
});
S2.define('select2/dropdown/hidePlaceholder', [], function () {
function HidePlaceholder(decorated, $element, options, dataAdapter) {
this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
decorated.call(this, $element, options, dataAdapter);
}
HidePlaceholder.prototype.append = function (decorated, data) {
data.results = this.removePlaceholder(data.results);
decorated.call(this, data);
};
HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
if (typeof placeholder === 'string') {
placeholder = {
id: '',
text: placeholder
};
}
return placeholder;
};
HidePlaceholder.prototype.removePlaceholder = function (_, data) {
var modifiedData = data.slice(0);
for (var d = data.length - 1; d >= 0; d--) {
var item = data[d];
if (this.placeholder.id === item.id) {
modifiedData.splice(d, 1);
}
}
return modifiedData;
};
return HidePlaceholder;
});
S2.define('select2/dropdown/infiniteScroll', ['jquery'], function ($) {
function InfiniteScroll(decorated, $element, options, dataAdapter) {
this.lastParams = {};
decorated.call(this, $element, options, dataAdapter);
this.$loadingMore = this.createLoadingMore();
this.loading = false;
}
InfiniteScroll.prototype.append = function (decorated, data) {
this.$loadingMore.remove();
this.loading = false;
decorated.call(this, data);
if (this.showLoadingMore(data)) {
this.$results.append(this.$loadingMore);
}
};
InfiniteScroll.prototype.bind = function (decorated, container, $container) {
var self = this;
decorated.call(this, container, $container);
container.on('query', function (params) {
self.lastParams = params;
self.loading = true;
});
container.on('query:append', function (params) {
self.lastParams = params;
self.loading = true;
});
this.$results.on('scroll', function () {
var isLoadMoreVisible = $.contains(document.documentElement, self.$loadingMore[0]);
if (self.loading || !isLoadMoreVisible) {
return;
}
var currentOffset = self.$results.offset().top + self.$results.outerHeight(false);
var loadingMoreOffset = self.$loadingMore.offset().top + self.$loadingMore.outerHeight(false);
if (currentOffset + 50 >= loadingMoreOffset) {
self.loadMore();
}
});
};
InfiniteScroll.prototype.loadMore = function () {
this.loading = true;
var params = $.extend({}, { page: 1 }, this.lastParams);
params.page++;
this.trigger('query:append', params);
};
InfiniteScroll.prototype.showLoadingMore = function (_, data) {
return data.pagination && data.pagination.more;
};
InfiniteScroll.prototype.createLoadingMore = function () {
var $option = $('<li ' + 'class="select2-results__option select2-results__option--load-more"' + 'role="treeitem" aria-disabled="true"></li>');
var message = this.options.get('translations').get('loadingMore');
$option.html(message(this.lastParams));
return $option;
};
return InfiniteScroll;
});
S2.define('select2/dropdown/attachBody', ['jquery', '../utils'], function ($, Utils) {
function AttachBody(decorated, $element, options) {
this.$dropdownParent = options.get('dropdownParent') || $(document.body);
decorated.call(this, $element, options);
}
AttachBody.prototype.bind = function (decorated, container, $container) {
var self = this;
var setupResultsEvents = false;
decorated.call(this, container, $container);
container.on('open', function () {
self._showDropdown();
self._attachPositioningHandler(container);
if (!setupResultsEvents) {
setupResultsEvents = true;
container.on('results:all', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('results:append', function () {
self._positionDropdown();
self._resizeDropdown();
});
}
});
container.on('close', function () {
self._hideDropdown();
self._detachPositioningHandler(container);
});
this.$dropdownContainer.on('mousedown', function (evt) {
evt.stopPropagation();
});
};
AttachBody.prototype.destroy = function (decorated) {
decorated.call(this);
this.$dropdownContainer.remove();
};
AttachBody.prototype.position = function (decorated, $dropdown, $container) {
// Clone all of the container classes
$dropdown.attr('class', $container.attr('class'));
$dropdown.removeClass('select2');
$dropdown.addClass('select2-container--open');
$dropdown.css({
position: 'absolute',
top: -999999
});
this.$container = $container;
};
AttachBody.prototype.render = function (decorated) {
var $container = $('<span></span>');
var $dropdown = decorated.call(this);
$container.append($dropdown);
this.$dropdownContainer = $container;
return $container;
};
AttachBody.prototype._hideDropdown = function (decorated) {
this.$dropdownContainer.detach();
};
AttachBody.prototype._attachPositioningHandler = function (decorated, container) {
var self = this;
var scrollEvent = 'scroll.select2.' + container.id;
var resizeEvent = 'resize.select2.' + container.id;
var orientationEvent = 'orientationchange.select2.' + container.id;
var $watchers = this.$container.parents().filter(Utils.hasScroll);
$watchers.each(function () {
$(this).data('select2-scroll-position', {
x: $(this).scrollLeft(),
y: $(this).scrollTop()
});
});
$watchers.on(scrollEvent, function (ev) {
var position = $(this).data('select2-scroll-position');
$(this).scrollTop(position.y);
});
$(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) {
self._positionDropdown();
self._resizeDropdown();
});
};
AttachBody.prototype._detachPositioningHandler = function (decorated, container) {
var scrollEvent = 'scroll.select2.' + container.id;
var resizeEvent = 'resize.select2.' + container.id;
var orientationEvent = 'orientationchange.select2.' + container.id;
var $watchers = this.$container.parents().filter(Utils.hasScroll);
$watchers.off(scrollEvent);
$(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
};
AttachBody.prototype._positionDropdown = function () {
var $window = $(window);
var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
var newDirection = null;
var offset = this.$container.offset();
offset.bottom = offset.top + this.$container.outerHeight(false);
var container = {
height: this.$container.outerHeight(false)
};
container.top = offset.top;
container.bottom = offset.top + container.height;
var dropdown = {
height: this.$dropdown.outerHeight(false)
};
var viewport = {
top: $window.scrollTop(),
bottom: $window.scrollTop() + $window.height()
};
var enoughRoomAbove = viewport.top < offset.top - dropdown.height;
var enoughRoomBelow = viewport.bottom > offset.bottom + dropdown.height;
var css = {
left: offset.left,
top: container.bottom
};
// Determine what the parent element is to use for calciulating the offset
var $offsetParent = this.$dropdownParent;
// For statically positoned elements, we need to get the element
// that is determining the offset
if ($offsetParent.css('position') === 'static') {
$offsetParent = $offsetParent.offsetParent();
}
var parentOffset = $offsetParent.offset();
css.top -= parentOffset.top;
css.left -= parentOffset.left;
if (!isCurrentlyAbove && !isCurrentlyBelow) {
newDirection = 'below';
}
if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
newDirection = 'above';
} else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
newDirection = 'below';
}
if (newDirection == 'above' || isCurrentlyAbove && newDirection !== 'below') {
css.top = container.top - parentOffset.top - dropdown.height;
}
if (newDirection != null) {
this.$dropdown.removeClass('select2-dropdown--below select2-dropdown--above').addClass('select2-dropdown--' + newDirection);
this.$container.removeClass('select2-container--below select2-container--above').addClass('select2-container--' + newDirection);
}
this.$dropdownContainer.css(css);
};
AttachBody.prototype._resizeDropdown = function () {
var css = {
width: this.$container.outerWidth(false) + 'px'
};
if (this.options.get('dropdownAutoWidth')) {
css.minWidth = css.width;
css.position = 'relative';
css.width = 'auto';
}
this.$dropdown.css(css);
};
AttachBody.prototype._showDropdown = function (decorated) {
this.$dropdownContainer.appendTo(this.$dropdownParent);
this._positionDropdown();
this._resizeDropdown();
};
return AttachBody;
});
S2.define('select2/dropdown/minimumResultsForSearch', [], function () {
function countResults(data) {
var count = 0;
for (var d = 0; d < data.length; d++) {
var item = data[d];
if (item.children) {
count += countResults(item.children);
} else {
count++;
}
}
return count;
}
function MinimumResultsForSearch(decorated, $element, options, dataAdapter) {
this.minimumResultsForSearch = options.get('minimumResultsForSearch');
if (this.minimumResultsForSearch < 0) {
this.minimumResultsForSearch = Infinity;
}
decorated.call(this, $element, options, dataAdapter);
}
MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
if (countResults(params.data.results) < this.minimumResultsForSearch) {
return false;
}
return decorated.call(this, params);
};
return MinimumResultsForSearch;
});
S2.define('select2/dropdown/selectOnClose', [], function () {
function SelectOnClose() {}
SelectOnClose.prototype.bind = function (decorated, container, $container) {
var self = this;
decorated.call(this, container, $container);
container.on('close', function (params) {
self._handleSelectOnClose(params);
});
};
SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
if (params && params.originalSelect2Event != null) {
var event = params.originalSelect2Event;
// Don't select an item if the close event was triggered from a select or
// unselect event
if (event._type === 'select' || event._type === 'unselect') {
return;
}
}
var $highlightedResults = this.getHighlightedResults();
// Only select highlighted results
if ($highlightedResults.length < 1) {
return;
}
var data = $highlightedResults.data('data');
// Don't re-select already selected resulte
if (data.element != null && data.element.selected || data.element == null && data.selected) {
return;
}
this.trigger('select', {
data: data
});
};
return SelectOnClose;
});
S2.define('select2/dropdown/closeOnSelect', [], function () {
function CloseOnSelect() {}
CloseOnSelect.prototype.bind = function (decorated, container, $container) {
var self = this;
decorated.call(this, container, $container);
container.on('select', function (evt) {
self._selectTriggered(evt);
});
container.on('unselect', function (evt) {
self._selectTriggered(evt);
});
};
CloseOnSelect.prototype._selectTriggered = function (_, evt) {
var originalEvent = evt.originalEvent;
// Don't close if the control key is being held
if (originalEvent && originalEvent.ctrlKey) {
return;
}
this.trigger('close', {
originalEvent: originalEvent,
originalSelect2Event: evt
});
};
return CloseOnSelect;
});
S2.define('select2/i18n/en', [], function () {
// English
return {
errorLoading: function errorLoading() {
return 'The results could not be loaded.';
},
inputTooLong: function inputTooLong(args) {
var overChars = args.input.length - args.maximum;
var message = 'Please delete ' + overChars + ' character';
if (overChars != 1) {
message += 's';
}
return message;
},
inputTooShort: function inputTooShort(args) {
var remainingChars = args.minimum - args.input.length;
var message = 'Please enter ' + remainingChars + ' or more characters';
return message;
},
loadingMore: function loadingMore() {
return 'Loading more results…';
},
maximumSelected: function maximumSelected(args) {
var message = 'You can only select ' + args.maximum + ' item';
if (args.maximum != 1) {
message += 's';
}
return message;
},
noResults: function noResults() {
return 'No results found';
},
searching: function searching() {
return 'Searching…';
}
};
});
S2.define('select2/defaults', ['jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en'], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) {
function Defaults() {
this.reset();
}
Defaults.prototype.apply = function (options) {
options = $.extend(true, {}, this.defaults, options);
if (options.dataAdapter == null) {
if (options.ajax != null) {
options.dataAdapter = AjaxData;
} else if (options.data != null) {
options.dataAdapter = ArrayData;
} else {
options.dataAdapter = SelectData;
}
if (options.minimumInputLength > 0) {
options.dataAdapter = Utils.Decorate(options.dataAdapter, MinimumInputLength);
}
if (options.maximumInputLength > 0) {
options.dataAdapter = Utils.Decorate(options.dataAdapter, MaximumInputLength);
}
if (options.maximumSelectionLength > 0) {
options.dataAdapter = Utils.Decorate(options.dataAdapter, MaximumSelectionLength);
}
if (options.tags) {
options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
}
if (options.tokenSeparators != null || options.tokenizer != null) {
options.dataAdapter = Utils.Decorate(options.dataAdapter, Tokenizer);
}
if (options.query != null) {
var Query = require(options.amdBase + 'compat/query');
options.dataAdapter = Utils.Decorate(options.dataAdapter, Query);
}
if (options.initSelection != null) {
var InitSelection = require(options.amdBase + 'compat/initSelection');
options.dataAdapter = Utils.Decorate(options.dataAdapter, InitSelection);
}
}
if (options.resultsAdapter == null) {
options.resultsAdapter = ResultsList;
if (options.ajax != null) {
options.resultsAdapter = Utils.Decorate(options.resultsAdapter, InfiniteScroll);
}
if (options.placeholder != null) {
options.resultsAdapter = Utils.Decorate(options.resultsAdapter, HidePlaceholder);
}
if (options.selectOnClose) {
options.resultsAdapter = Utils.Decorate(options.resultsAdapter, SelectOnClose);
}
}
if (options.dropdownAdapter == null) {
if (options.multiple) {
options.dropdownAdapter = Dropdown;
} else {
var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
options.dropdownAdapter = SearchableDropdown;
}
if (options.minimumResultsForSearch !== 0) {
options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, MinimumResultsForSearch);
}
if (options.closeOnSelect) {
options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, CloseOnSelect);
}
if (options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null) {
var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, DropdownCSS);
}
options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, AttachBody);
}
if (options.selectionAdapter == null) {
if (options.multiple) {
options.selectionAdapter = MultipleSelection;
} else {
options.selectionAdapter = SingleSelection;
}
// Add the placeholder mixin if a placeholder was specified
if (options.placeholder != null) {
options.selectionAdapter = Utils.Decorate(options.selectionAdapter, Placeholder);
}
if (options.allowClear) {
options.selectionAdapter = Utils.Decorate(options.selectionAdapter, AllowClear);
}
if (options.multiple) {
options.selectionAdapter = Utils.Decorate(options.selectionAdapter, SelectionSearch);
}
if (options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null) {
var ContainerCSS = require(options.amdBase + 'compat/containerCss');
options.selectionAdapter = Utils.Decorate(options.selectionAdapter, ContainerCSS);
}
options.selectionAdapter = Utils.Decorate(options.selectionAdapter, EventRelay);
}
if (typeof options.language === 'string') {
// Check if the language is specified with a region
if (options.language.indexOf('-') > 0) {
// Extract the region information if it is included
var languageParts = options.language.split('-');
var baseLanguage = languageParts[0];
options.language = [options.language, baseLanguage];
} else {
options.language = [options.language];
}
}
if ($.isArray(options.language)) {
var languages = new Translation();
options.language.push('en');
var languageNames = options.language;
for (var l = 0; l < languageNames.length; l++) {
var name = languageNames[l];
var language = {};
try {
// Try to load it with the original name
language = Translation.loadPath(name);
} catch (e) {
try {
// If we couldn't load it, check if it wasn't the full path
name = this.defaults.amdLanguageBase + name;
language = Translation.loadPath(name);
} catch (ex) {
// The translation could not be loaded at all. Sometimes this is
// because of a configuration problem, other times this can be
// because of how Select2 helps load all possible translation files.
if (options.debug && window.console && console.warn) {
console.warn('Select2: The language file for "' + name + '" could not be ' + 'automatically loaded. A fallback will be used instead.');
}
continue;
}
}
languages.extend(language);
}
options.translations = languages;
} else {
var baseTranslation = Translation.loadPath(this.defaults.amdLanguageBase + 'en');
var customTranslation = new Translation(options.language);
customTranslation.extend(baseTranslation);
options.translations = customTranslation;
}
return options;
};
Defaults.prototype.reset = function () {
function stripDiacritics(text) {
// Used 'uni range + named function' from http://jsperf.com/diacritics/18
function match(a) {
return DIACRITICS[a] || a;
}
return text.replace(/[^\u0000-\u007E]/g, match);
}
function matcher(params, data) {
// Always return the object if there is nothing to compare
if ($.trim(params.term) === '') {
return data;
}
// Do a recursive check for options with children
if (data.children && data.children.length > 0) {
// Clone the data object if there are children
// This is required as we modify the object to remove any non-matches
var match = $.extend(true, {}, data);
// Check each child of the option
for (var c = data.children.length - 1; c >= 0; c--) {
var child = data.children[c];
var matches = matcher(params, child);
// If there wasn't a match, remove the object in the array
if (matches == null) {
match.children.splice(c, 1);
}
}
// If any children matched, return the new object
if (match.children.length > 0) {
return match;
}
// If there were no matching children, check just the plain object
return matcher(params, match);
}
var original = stripDiacritics(data.text).toUpperCase();
var term = stripDiacritics(params.term).toUpperCase();
// Check if the text contains the term
if (original.indexOf(term) > -1) {
return data;
}
// If it doesn't contain the term, don't return anything
return null;
}
this.defaults = {
amdBase: './',
amdLanguageBase: './i18n/',
closeOnSelect: true,
debug: false,
dropdownAutoWidth: false,
escapeMarkup: Utils.escapeMarkup,
language: EnglishTranslation,
matcher: matcher,
minimumInputLength: 0,
maximumInputLength: 0,
maximumSelectionLength: 0,
minimumResultsForSearch: 0,
selectOnClose: false,
sorter: function sorter(data) {
return data;
},
templateResult: function templateResult(result) {
return result.text;
},
templateSelection: function templateSelection(selection) {
return selection.text;
},
theme: 'default',
width: 'resolve'
};
};
Defaults.prototype.set = function (key, value) {
var camelKey = $.camelCase(key);
var data = {};
data[camelKey] = value;
var convertedData = Utils._convertData(data);
$.extend(this.defaults, convertedData);
};
var defaults = new Defaults();
return defaults;
});
S2.define('select2/options', ['require', 'jquery', './defaults', './utils'], function (require, $, Defaults, Utils) {
function Options(options, $element) {
this.options = options;
if ($element != null) {
this.fromElement($element);
}
this.options = Defaults.apply(this.options);
if ($element && $element.is('input')) {
var InputCompat = require(this.get('amdBase') + 'compat/inputData');
this.options.dataAdapter = Utils.Decorate(this.options.dataAdapter, InputCompat);
}
}
Options.prototype.fromElement = function ($e) {
var excludedData = ['select2'];
if (this.options.multiple == null) {
this.options.multiple = $e.prop('multiple');
}
if (this.options.disabled == null) {
this.options.disabled = $e.prop('disabled');
}
if (this.options.language == null) {
if ($e.prop('lang')) {
this.options.language = $e.prop('lang').toLowerCase();
} else if ($e.closest('[lang]').prop('lang')) {
this.options.language = $e.closest('[lang]').prop('lang');
}
}
if (this.options.dir == null) {
if ($e.prop('dir')) {
this.options.dir = $e.prop('dir');
} else if ($e.closest('[dir]').prop('dir')) {
this.options.dir = $e.closest('[dir]').prop('dir');
} else {
this.options.dir = 'ltr';
}
}
$e.prop('disabled', this.options.disabled);
$e.prop('multiple', this.options.multiple);
if ($e.data('select2Tags')) {
if (this.options.debug && window.console && console.warn) {
console.warn('Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.');
}
$e.data('data', $e.data('select2Tags'));
$e.data('tags', true);
}
if ($e.data('ajaxUrl')) {
if (this.options.debug && window.console && console.warn) {
console.warn('Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.');
}
$e.attr('ajax--url', $e.data('ajaxUrl'));
$e.data('ajax--url', $e.data('ajaxUrl'));
}
var dataset = {};
// Prefer the element's `dataset` attribute if it exists
// jQuery 1.x does not correctly handle data attributes with multiple dashes
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
dataset = $.extend(true, {}, $e[0].dataset, $e.data());
} else {
dataset = $e.data();
}
var data = $.extend(true, {}, dataset);
data = Utils._convertData(data);
for (var key in data) {
if ($.inArray(key, excludedData) > -1) {
continue;
}
if ($.isPlainObject(this.options[key])) {
$.extend(this.options[key], data[key]);
} else {
this.options[key] = data[key];
}
}
return this;
};
Options.prototype.get = function (key) {
return this.options[key];
};
Options.prototype.set = function (key, val) {
this.options[key] = val;
};
return Options;
});
S2.define('select2/core', ['jquery', './options', './utils', './keys'], function ($, Options, Utils, KEYS) {
var Select2 = function Select2($element, options) {
if ($element.data('select2') != null) {
$element.data('select2').destroy();
}
this.$element = $element;
this.id = this._generateId($element);
options = options || {};
this.options = new Options(options, $element);
Select2.__super__.constructor.call(this);
// Set up the tabindex
var tabindex = $element.attr('tabindex') || 0;
$element.data('old-tabindex', tabindex);
$element.attr('tabindex', '-1');
// Set up containers and adapters
var DataAdapter = this.options.get('dataAdapter');
this.dataAdapter = new DataAdapter($element, this.options);
var $container = this.render();
this._placeContainer($container);
var SelectionAdapter = this.options.get('selectionAdapter');
this.selection = new SelectionAdapter($element, this.options);
this.$selection = this.selection.render();
this.selection.position(this.$selection, $container);
var DropdownAdapter = this.options.get('dropdownAdapter');
this.dropdown = new DropdownAdapter($element, this.options);
this.$dropdown = this.dropdown.render();
this.dropdown.position(this.$dropdown, $container);
var ResultsAdapter = this.options.get('resultsAdapter');
this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
this.$results = this.results.render();
this.results.position(this.$results, this.$dropdown);
// Bind events
var self = this;
// Bind the container to all of the adapters
this._bindAdapters();
// Register any DOM event handlers
this._registerDomEvents();
// Register any internal event handlers
this._registerDataEvents();
this._registerSelectionEvents();
this._registerDropdownEvents();
this._registerResultsEvents();
this._registerEvents();
// Set the initial state
this.dataAdapter.current(function (initialData) {
self.trigger('selection:update', {
data: initialData
});
});
// Hide the original select
$element.addClass('select2-hidden-accessible');
$element.attr('aria-hidden', 'true');
// Synchronize any monitored attributes
this._syncAttributes();
$element.data('select2', this);
};
Utils.Extend(Select2, Utils.Observable);
Select2.prototype._generateId = function ($element) {
var id = '';
if ($element.attr('id') != null) {
id = $element.attr('id');
} else if ($element.attr('name') != null) {
id = $element.attr('name') + '-' + Utils.generateChars(2);
} else {
id = Utils.generateChars(4);
}
id = id.replace(/(:|\.|\[|\]|,)/g, '');
id = 'select2-' + id;
return id;
};
Select2.prototype._placeContainer = function ($container) {
$container.insertAfter(this.$element);
var width = this._resolveWidth(this.$element, this.options.get('width'));
if (width != null) {
$container.css('width', width);
}
};
Select2.prototype._resolveWidth = function ($element, method) {
var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
if (method == 'resolve') {
var styleWidth = this._resolveWidth($element, 'style');
if (styleWidth != null) {
return styleWidth;
}
return this._resolveWidth($element, 'element');
}
if (method == 'element') {
var elementWidth = $element.outerWidth(false);
if (elementWidth <= 0) {
return 'auto';
}
return elementWidth + 'px';
}
if (method == 'style') {
var style = $element.attr('style');
if (typeof style !== 'string') {
return null;
}
var attrs = style.split(';');
for (var i = 0, l = attrs.length; i < l; i = i + 1) {
var attr = attrs[i].replace(/\s/g, '');
var matches = attr.match(WIDTH);
if (matches !== null && matches.length >= 1) {
return matches[1];
}
}
return null;
}
return method;
};
Select2.prototype._bindAdapters = function () {
this.dataAdapter.bind(this, this.$container);
this.selection.bind(this, this.$container);
this.dropdown.bind(this, this.$container);
this.results.bind(this, this.$container);
};
Select2.prototype._registerDomEvents = function () {
var self = this;
this.$element.on('change.select2', function () {
self.dataAdapter.current(function (data) {
self.trigger('selection:update', {
data: data
});
});
});
this.$element.on('focus.select2', function (evt) {
self.trigger('focus', evt);
});
this._syncA = Utils.bind(this._syncAttributes, this);
this._syncS = Utils.bind(this._syncSubtree, this);
if (this.$element[0].attachEvent) {
this.$element[0].attachEvent('onpropertychange', this._syncA);
}
var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
if (observer != null) {
this._observer = new observer(function (mutations) {
$.each(mutations, self._syncA);
$.each(mutations, self._syncS);
});
this._observer.observe(this.$element[0], {
attributes: true,
childList: true,
subtree: false
});
} else if (this.$element[0].addEventListener) {
this.$element[0].addEventListener('DOMAttrModified', self._syncA, false);
this.$element[0].addEventListener('DOMNodeInserted', self._syncS, false);
this.$element[0].addEventListener('DOMNodeRemoved', self._syncS, false);
}
};
Select2.prototype._registerDataEvents = function () {
var self = this;
this.dataAdapter.on('*', function (name, params) {
self.trigger(name, params);
});
};
Select2.prototype._registerSelectionEvents = function () {
var self = this;
var nonRelayEvents = ['toggle', 'focus'];
this.selection.on('toggle', function () {
self.toggleDropdown();
});
this.selection.on('focus', function (params) {
self.focus(params);
});
this.selection.on('*', function (name, params) {
if ($.inArray(name, nonRelayEvents) !== -1) {
return;
}
self.trigger(name, params);
});
};
Select2.prototype._registerDropdownEvents = function () {
var self = this;
this.dropdown.on('*', function (name, params) {
self.trigger(name, params);
});
};
Select2.prototype._registerResultsEvents = function () {
var self = this;
this.results.on('*', function (name, params) {
self.trigger(name, params);
});
};
Select2.prototype._registerEvents = function () {
var self = this;
this.on('open', function () {
self.$container.addClass('select2-container--open');
});
this.on('close', function () {
self.$container.removeClass('select2-container--open');
});
this.on('enable', function () {
self.$container.removeClass('select2-container--disabled');
});
this.on('disable', function () {
self.$container.addClass('select2-container--disabled');
});
this.on('blur', function () {
self.$container.removeClass('select2-container--focus');
});
this.on('query', function (params) {
if (!self.isOpen()) {
self.trigger('open', {});
}
this.dataAdapter.query(params, function (data) {
self.trigger('results:all', {
data: data,
query: params
});
});
});
this.on('query:append', function (params) {
this.dataAdapter.query(params, function (data) {
self.trigger('results:append', {
data: data,
query: params
});
});
});
this.on('keypress', function (evt) {
var key = evt.which;
if (self.isOpen()) {
if (key === KEYS.ESC || key === KEYS.TAB || key === KEYS.UP && evt.altKey) {
self.close();
evt.preventDefault();
} else if (key === KEYS.ENTER) {
self.trigger('results:select', {});
evt.preventDefault();
} else if (key === KEYS.SPACE && evt.ctrlKey) {
self.trigger('results:toggle', {});
evt.preventDefault();
} else if (key === KEYS.UP) {
self.trigger('results:previous', {});
evt.preventDefault();
} else if (key === KEYS.DOWN) {
self.trigger('results:next', {});
evt.preventDefault();
}
} else {
if (key === KEYS.ENTER || key === KEYS.SPACE || key === KEYS.DOWN && evt.altKey) {
self.open();
evt.preventDefault();
}
}
});
};
Select2.prototype._syncAttributes = function () {
this.options.set('disabled', this.$element.prop('disabled'));
if (this.options.get('disabled')) {
if (this.isOpen()) {
this.close();
}
this.trigger('disable', {});
} else {
this.trigger('enable', {});
}
};
Select2.prototype._syncSubtree = function (evt, mutations) {
var changed = false;
var self = this;
// Ignore any mutation events raised for elements that aren't options or
// optgroups. This handles the case when the select element is destroyed
if (evt && evt.target && evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP') {
return;
}
if (!mutations) {
// If mutation events aren't supported, then we can only assume that the
// change affected the selections
changed = true;
} else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
for (var n = 0; n < mutations.addedNodes.length; n++) {
var node = mutations.addedNodes[n];
if (node.selected) {
changed = true;
}
}
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
changed = true;
}
// Only re-pull the data if we think there is a change
if (changed) {
this.dataAdapter.current(function (currentData) {
self.trigger('selection:update', {
data: currentData
});
});
}
};
/**
* Override the trigger method to automatically trigger pre-events when
* there are events that can be prevented.
*/
Select2.prototype.trigger = function (name, args) {
var actualTrigger = Select2.__super__.trigger;
var preTriggerMap = {
'open': 'opening',
'close': 'closing',
'select': 'selecting',
'unselect': 'unselecting'
};
if (args === undefined) {
args = {};
}
if (name in preTriggerMap) {
var preTriggerName = preTriggerMap[name];
var preTriggerArgs = {
prevented: false,
name: name,
args: args
};
actualTrigger.call(this, preTriggerName, preTriggerArgs);
if (preTriggerArgs.prevented) {
args.prevented = true;
return;
}
}
actualTrigger.call(this, name, args);
};
Select2.prototype.toggleDropdown = function () {
if (this.options.get('disabled')) {
return;
}
if (this.isOpen()) {
this.close();
} else {
this.open();
}
};
Select2.prototype.open = function () {
if (this.isOpen()) {
return;
}
this.trigger('query', {});
};
Select2.prototype.close = function () {
if (!this.isOpen()) {
return;
}
this.trigger('close', {});
};
Select2.prototype.isOpen = function () {
return this.$container.hasClass('select2-container--open');
};
Select2.prototype.hasFocus = function () {
return this.$container.hasClass('select2-container--focus');
};
Select2.prototype.focus = function (data) {
// No need to re-trigger focus events if we are already focused
if (this.hasFocus()) {
return;
}
this.$container.addClass('select2-container--focus');
this.trigger('focus', {});
};
Select2.prototype.enable = function (args) {
if (this.options.get('debug') && window.console && console.warn) {
console.warn('Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.');
}
if (args == null || args.length === 0) {
args = [true];
}
var disabled = !args[0];
this.$element.prop('disabled', disabled);
};
Select2.prototype.data = function () {
if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) {
console.warn('Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.');
}
var data = [];
this.dataAdapter.current(function (currentData) {
data = currentData;
});
return data;
};
Select2.prototype.val = function (args) {
if (this.options.get('debug') && window.console && console.warn) {
console.warn('Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.');
}
if (args == null || args.length === 0) {
return this.$element.val();
}
var newVal = args[0];
if ($.isArray(newVal)) {
newVal = $.map(newVal, function (obj) {
return obj.toString();
});
}
this.$element.val(newVal).trigger('change');
};
Select2.prototype.destroy = function () {
this.$container.remove();
if (this.$element[0].detachEvent) {
this.$element[0].detachEvent('onpropertychange', this._syncA);
}
if (this._observer != null) {
this._observer.disconnect();
this._observer = null;
} else if (this.$element[0].removeEventListener) {
this.$element[0].removeEventListener('DOMAttrModified', this._syncA, false);
this.$element[0].removeEventListener('DOMNodeInserted', this._syncS, false);
this.$element[0].removeEventListener('DOMNodeRemoved', this._syncS, false);
}
this._syncA = null;
this._syncS = null;
this.$element.off('.select2');
this.$element.attr('tabindex', this.$element.data('old-tabindex'));
this.$element.removeClass('select2-hidden-accessible');
this.$element.attr('aria-hidden', 'false');
this.$element.removeData('select2');
this.dataAdapter.destroy();
this.selection.destroy();
this.dropdown.destroy();
this.results.destroy();
this.dataAdapter = null;
this.selection = null;
this.dropdown = null;
this.results = null;
};
Select2.prototype.render = function () {
var $container = $('<span class="select2 select2-container">' + '<span class="selection"></span>' + '<span class="dropdown-wrapper" aria-hidden="true"></span>' + '</span>');
$container.attr('dir', this.options.get('dir'));
this.$container = $container;
this.$container.addClass('select2-container--' + this.options.get('theme'));
$container.data('element', this.$element);
return $container;
};
return Select2;
});
S2.define('jquery-mousewheel', ['jquery'], function ($) {
// Used to shim jQuery.mousewheel for non-full builds.
return $;
});
S2.define('jquery.select2', ['jquery', 'jquery-mousewheel', './select2/core', './select2/defaults'], function ($, _, Select2, Defaults) {
if ($.fn.select2 == null) {
// All methods that should return the element
var thisMethods = ['open', 'close', 'destroy'];
$.fn.select2 = function (options) {
options = options || {};
if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {
this.each(function () {
var instanceOptions = $.extend(true, {}, options);
var instance = new Select2($(this), instanceOptions);
});
return this;
} else if (typeof options === 'string') {
var ret;
var args = Array.prototype.slice.call(arguments, 1);
this.each(function () {
var instance = $(this).data('select2');
if (instance == null && window.console && console.error) {
console.error('The select2(\'' + options + '\') method was called on an ' + 'element that is not using Select2.');
}
ret = instance[options].apply(instance, args);
});
// Check if we should be returning `this`
if ($.inArray(options, thisMethods) > -1) {
return this;
}
return ret;
} else {
throw new Error('Invalid arguments for Select2: ' + options);
}
};
}
if ($.fn.select2.defaults == null) {
$.fn.select2.defaults = Defaults;
}
return Select2;
});
// Return the AMD loader configuration so it can be used outside of this file
return {
define: S2.define,
require: S2.require
};
}();
// Autoload the jQuery bindings
// We know that all of the modules exist above this, so we're safe
var select2 = S2.require('jquery.select2');
// Hold the AMD module references on the jQuery function that was just loaded
// This allows Select2 to use the internal loader outside of this file, such
// as in the language files.
jQuery.fn.select2.amd = S2;
// Return the Select2 instance for anyone who is importing it.
return select2;
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__("./node_modules/jquery/dist/jquery.js")))
/***/ }),
/***/ 0:
/***/ (function(module, exports, __webpack_require__) {
__webpack_require__("./public/assets/vendor/select2/dist/js/select2.js");
__webpack_require__("./public/assets/vendor/leaflet/dist/leaflet.js");
__webpack_require__("./public/assets/vendor/leaflet-plugins/leaflet.geodesic.js");
__webpack_require__("./public/assets/vendor/leaflet-plugins/leaflet.rotatedMarker.js");
__webpack_require__("./public/assets/vendor/leaflet-ajax/dist/leaflet.ajax.min.js");
__webpack_require__("./public/assets/admin/vendor/sass/paper-dashboard.scss");
module.exports = __webpack_require__("./public/assets/frontend/sass/now-ui-kit.scss");
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMGZkYWFlMmVhY2Q0NzE0NWZmYWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3B1YmxpYy9hc3NldHMvYWRtaW4vdmVuZG9yL3Nhc3MvcGFwZXItZGFzaGJvYXJkLnNjc3M/YWQ3NCIsIndlYnBhY2s6Ly8vLi9wdWJsaWMvYXNzZXRzL2Zyb250ZW5kL3Nhc3Mvbm93LXVpLWtpdC5zY3NzPzY2YTciLCJ3ZWJwYWNrOi8vLy4vcHVibGljL2Fzc2V0cy92ZW5kb3IvbGVhZmxldC1hamF4L2Rpc3QvbGVhZmxldC5hamF4Lm1pbi5qcyIsIndlYnBhY2s6Ly8vLi9wdWJsaWMvYXNzZXRzL3ZlbmRvci9sZWFmbGV0LXBsdWdpbnMvbGVhZmxldC5nZW9kZXNpYy5qcyIsIndlYnBhY2s6Ly8vLi9wdWJsaWMvYXNzZXRzL3ZlbmRvci9sZWFmbGV0LXBsdWdpbnMvbGVhZmxldC5yb3RhdGVkTWFya2VyLmpzIiwid2VicGFjazovLy8uL3B1YmxpYy9hc3NldHMvdmVuZG9yL2xlYWZsZXQvZGlzdC9sZWFmbGV0LmpzIiwid2VicGFjazovLy8uL3B1YmxpYy9hc3NldHMvdmVuZG9yL3NlbGVjdDIvZGlzdC9qcy9zZWxlY3QyLmpzIl0sIm5hbWVzIjpbImUiLCJ0IiwibiIsInIiLCJhIiwiaSIsInMiLCJsIiwicmVxdWlyZSIsIm8iLCJ1IiwiRXJyb3IiLCJjb2RlIiwiYyIsImV4cG9ydHMiLCJjYWxsIiwibGVuZ3RoIiwiVHlwZUVycm9yIiwic3RhdGUiLCJqIiwicXVldWUiLCJvdXRjb21lIiwicHJvbWlzZSIsIm9uRnVsZmlsbGVkIiwiY2FsbEZ1bGZpbGxlZCIsIm90aGVyQ2FsbEZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJjYWxsUmVqZWN0ZWQiLCJvdGhlckNhbGxSZWplY3RlZCIsInAiLCJ2IiwicmVqZWN0IiwicmVzb2x2ZSIsInRoZW4iLCJhcHBseSIsImFyZ3VtZW50cyIsInN0YXR1cyIsInZhbHVlIiwiZiIsImQiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsIkFycmF5IiwiaCIsInkiLCJtIiwiY29uc3RydWN0b3IiLCJwdXNoIiwiYWxsIiwicmFjZSIsImltbWVkaWF0ZSIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiwiZG9jdW1lbnQiLCJjcmVhdGVUZXh0Tm9kZSIsIm9ic2VydmUiLCJjaGFyYWN0ZXJEYXRhIiwiZGF0YSIsInNldEltbWVkaWF0ZSIsIk1lc3NhZ2VDaGFubmVsIiwiY3JlYXRlRWxlbWVudCIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImRvY3VtZW50RWxlbWVudCIsImFwcGVuZENoaWxkIiwic2V0VGltZW91dCIsInBvcnQxIiwib25tZXNzYWdlIiwicG9ydDIiLCJwb3N0TWVzc2FnZSIsImdsb2JhbCIsInNlbGYiLCJ3aW5kb3ciLCJqc29ucCIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsImhlYWRlcnMiLCJrZXlzIiwiZm9yRWFjaCIsInNldFJlcXVlc3RIZWFkZXIiLCJyZWFkeVN0YXRlIiwibG9jYWwiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImFib3J0IiwibGllIiwiTCIsIkdlb0pTT04iLCJBSkFYIiwiZXh0ZW5kIiwiZGVmYXVsdEFKQVhwYXJhbXMiLCJkYXRhVHlwZSIsImNhbGxiYWNrUGFyYW0iLCJtaWRkbGV3YXJlIiwiaW5pdGlhbGl6ZSIsInVybHMiLCJwb3AiLCJjb25jYXQiLCJVdGlsIiwiaGFzT3duUHJvcGVydHkiLCJhamF4UGFyYW1zIiwiX2xheWVycyIsInNldE9wdGlvbnMiLCJvbiIsImZpbHRlciIsInJlZmlsdGVyIiwiYWRkVXJsIiwiY2xlYXJMYXllcnMiLCJmaXJlIiwidG9Mb3dlckNhc2UiLCJhZGREYXRhIiwiZXJyb3IiLCJyZWZyZXNoIiwiZWFjaExheWVyIiwic2V0U3R5bGUiLCJzdHJva2UiLCJjbGlja2FibGUiLCJmZWF0dXJlIiwiUHJvbWlzZSIsImFqYXgiLCJnZW9Kc29uIiwibGVhZmxldCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiRG9tVXRpbCIsImNyZWF0ZSIsImNiUGFyYW0iLCJjYWxsYmFja05hbWUiLCJNYXRoIiwicmFuZG9tIiwic2xpY2UiLCJ0eXBlIiwiX2xlYWZsZXRKU09OUGNhbGxiYWNrcyIsImluZGV4T2YiLCJzcmMiLCJjYiIsIk51bWJlciIsInRvUmFkaWFucyIsIlBJIiwidG9EZWdyZWVzIiwiSU5URVJTRUNUX0xORyIsIkdlb2Rlc2ljIiwiUG9seWxpbmUiLCJvcHRpb25zIiwiY29sb3IiLCJzdGVwcyIsImRhc2giLCJ3cmFwIiwibGF0bG5ncyIsIl9tZXJnZV9vcHRpb25zIiwiZGF0dW0iLCJlbGxpcHNvaWQiLCJiIiwiX2xhdGxuZ3MiLCJfZ2VuZXJhdGVfR2VvZGVzaWNEYXNoZWQiLCJfZ2VuZXJhdGVfR2VvZGVzaWMiLCJzZXRMYXRMbmdzIiwiZ2V0U3RhdHMiLCJvYmoiLCJkaXN0YW5jZSIsInBvaW50cyIsInBvbHlnb25zIiwicG9seSIsIl92aW5jZW50eV9pbnZlcnNlIiwiZ2VvanNvbiIsIm5vcm1hbGl6ZWQiLCJhc0ZlYXR1cmUiLCJmZWF0dXJlcyIsImdlb21ldHJ5IiwiY29vcmRzIiwiY29vcmRpbmF0ZXMiLCJjb29yZHNUb0xhdExuZ3MiLCJjb25zb2xlIiwibG9nIiwiY3JlYXRlQ2lyY2xlIiwiY2VudGVyIiwicmFkaXVzIiwicG9seWxpbmVJbmRleCIsInByZXYiLCJsYXQiLCJsbmciLCJicmciLCJzdGVwIiwiZGlyZWN0IiwiX3ZpbmNlbnR5X2RpcmVjdCIsImxhdExuZyIsImdwIiwiYWJzIiwiaW52ZXJzZSIsInNlYyIsIl9pbnRlcnNlY3Rpb24iLCJpbml0aWFsQmVhcmluZyIsIl9nZW8iLCJfZ2VvY250IiwicG9pbnRBIiwicG9pbnRCIiwiZXF1YWxzIiwiZGlyZWN0MiIsInAxIiwiz4YxIiwizrsxIiwizrExIiwic2luzrExIiwic2luIiwiY29zzrExIiwiY29zIiwidGFuVTEiLCJ0YW4iLCJjb3NVMSIsInNxcnQiLCJzaW5VMSIsIs+DMSIsImF0YW4yIiwic2luzrEiLCJjb3NTcc6xIiwidVNxIiwiQSIsIkIiLCLPgyIsIs+DyrkiLCJpdGVyYXRpb25zIiwiY29zMs+DTSIsInNpbs+DIiwiY29zz4MiLCLOlM+DIiwieCIsIs+GMiIsIs67IiwiQyIsIs67MiIsInJldkF6IiwiZmluYWxCZWFyaW5nIiwicDIiLCJ0YW5VMiIsImNvc1UyIiwic2luVTIiLCLOu8q5Iiwic2luzrsiLCJjb3POuyIsInNpblNxz4MiLCJpc05hTiIsImZ3ZEF6IiwidG9GaXhlZCIsImJybmcxIiwiYnJuZzIiLCLOuDEzIiwizrgyMyIsIs6Uz4YiLCLOlM67IiwizrQxMiIsImFzaW4iLCLOuDEiLCJhY29zIiwizrgyIiwizrgxMiIsIs64MjEiLCLOsTIiLCLOsTMiLCLOtDEzIiwiz4YzIiwizpTOuzEzIiwizrszIiwib2JqMSIsIm9iajIiLCJvYmozIiwiYXR0cm5hbWUiLCJnZW9kZXNpYyIsInByb3RvX2luaXRJY29uIiwiTWFya2VyIiwiX2luaXRJY29uIiwicHJvdG9fc2V0UG9zIiwiX3NldFBvcyIsIm9sZElFIiwiVFJBTlNGT1JNIiwiYWRkSW5pdEhvb2siLCJpY29uT3B0aW9ucyIsImljb24iLCJpY29uQW5jaG9yIiwicm90YXRpb25PcmlnaW4iLCJyb3RhdGlvbkFuZ2xlIiwidGFyZ2V0IiwiX2FwcGx5Um90YXRpb24iLCJpbmNsdWRlIiwicG9zIiwiX2ljb24iLCJzdHlsZSIsInNldFJvdGF0aW9uQW5nbGUiLCJhbmdsZSIsInVwZGF0ZSIsInNldFJvdGF0aW9uT3JpZ2luIiwib3JpZ2luIiwibW9kdWxlIiwiYmluZCIsIl9sZWFmbGV0X2lkIiwidGkiLCJwb3ciLCJyb3VuZCIsInRyaW0iLCJyZXBsYWNlIiwic3BsaXQiLCJRdCIsImVuY29kZVVSSUNvbXBvbmVudCIsInRvVXBwZXJDYXNlIiwiam9pbiIsIl8iLCJpaSIsIkRhdGUiLCJtYXgiLCJvaSIsInNpIiwiZyIsInJpIiwiTWl4aW4iLCJlaSIsIkV2ZW50cyIsIndhcm4iLCJzdGFjayIsInciLCJQIiwiVCIsInoiLCJNIiwiYWx0IiwibG9uIiwiWiIsIl9hIiwiX2IiLCJfYyIsIl9kIiwiRSIsIlMiLCJjcmVhdGVFbGVtZW50TlMiLCJrIiwicWkiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJJIiwiTyIsIlciLCJIIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlhpIiwiSmkiLCIkaSIsIlFpIiwicG9pbnRlclR5cGUiLCJNU1BPSU5URVJfVFlQRV9NT1VTRSIsInRlIiwidGFnTmFtZSIsIiQiLCJhZGRFdmVudExpc3RlbmVyIiwiZWUiLCJSIiwiRCIsIk4iLCJpZSIsInBvaW50ZXJJZCIsIm5lIiwidG91Y2hlcyIsImNoYW5nZWRUb3VjaGVzIiwiYnV0dG9ucyIsIkYiLCJXaSIsIkxpIiwibm93IiwiY2FuY2VsQnViYmxlIiwicmUiLCJvZSIsInNlIiwiVSIsIlYiLCJxIiwiRyIsIksiLCJhZSIsImV2ZW50IiwiSGkiLCJNaSIsIm90IiwiYmkiLCJzdCIsImF0dGFjaEV2ZW50IiwiZGV0YWNoRXZlbnQiLCJZIiwic3RvcFByb3BhZ2F0aW9uIiwib3JpZ2luYWxFdmVudCIsIl9zdG9wcGVkIiwibnQiLCJYIiwiSiIsImV0IiwicHJldmVudERlZmF1bHQiLCJyZXR1cm5WYWx1ZSIsIlEiLCJ0dCIsImNsaWVudFgiLCJjbGllbnRZIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGVmdCIsImNsaWVudExlZnQiLCJ0b3AiLCJjbGllbnRUb3AiLCJpdCIsIndoZWVsRGVsdGFZIiwiZGVsdGFZIiwiZGVsdGFNb2RlIiwiaGUiLCJkZWx0YVgiLCJkZWx0YVoiLCJ3aGVlbERlbHRhIiwiZGV0YWlsIiwidWUiLCJyZWxhdGVkVGFyZ2V0IiwidGltZVN0YW1wIiwiZGkiLCJfc2ltdWxhdGVkQ2xpY2siLCJfc2ltdWxhdGVkIiwicnQiLCJnZXRFbGVtZW50QnlJZCIsImF0IiwiY3VycmVudFN0eWxlIiwiZGVmYXVsdFZpZXciLCJnZXRDb21wdXRlZFN0eWxlIiwiaHQiLCJjbGFzc05hbWUiLCJ1dCIsImx0IiwiZmlyc3RDaGlsZCIsImN0IiwibGFzdENoaWxkIiwiX3QiLCJpbnNlcnRCZWZvcmUiLCJkdCIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiZ3QiLCJSZWdFeHAiLCJ0ZXN0IiwicHQiLCJhZGQiLCJmdCIsIm10IiwicmVtb3ZlIiwiYmFzZVZhbCIsInZ0Iiwib3BhY2l0eSIsInl0IiwiZmlsdGVycyIsIml0ZW0iLCJFbmFibGVkIiwiT3BhY2l0eSIsInh0Iiwid3QiLCJjZSIsIkJpIiwiTHQiLCJfbGVhZmxldF9wb3MiLCJPaSIsIlB0IiwiYnQiLCJUdCIsInp0IiwidGFiSW5kZXgiLCJNdCIsIm1lIiwiZmUiLCJvdXRsaW5lIiwiQ3QiLCJrdCIsIkV0IiwiWnQiLCJSdCIsIlVpbnQ4QXJyYXkiLCJTdCIsIk90IiwiQnQiLCJ6ZSIsIkF0IiwiSXQiLCJtaW4iLCJEdCIsIk50IiwianQiLCJfY29kZSIsIld0IiwicG9pbnRUb0xheWVyIiwiY29vcmRzVG9MYXRMbmciLCJIdCIsInFlIiwiRmUiLCJGdCIsIkplIiwiJGUiLCJnZW9tZXRyaWVzIiwicHJvcGVydGllcyIsIlV0IiwiVnQiLCJHdCIsInF0IiwiS3QiLCJRZSIsIll0IiwibG4iLCJYdCIsIkdpIiwiZG4iLCJKdCIsIktpIiwiZ24iLCIkdCIsImZyZWV6ZSIsImlzQXJyYXkiLCJuaSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiY2xlYXJUaW1lb3V0IiwiYWkiLCJsYXN0SWQiLCJzdGFtcCIsInRocm90dGxlIiwid3JhcE51bSIsImZhbHNlRm4iLCJmb3JtYXROdW0iLCJzcGxpdFdvcmRzIiwiZ2V0UGFyYW1TdHJpbmciLCJ0ZW1wbGF0ZSIsImVtcHR5SW1hZ2VVcmwiLCJyZXF1ZXN0Rm4iLCJjYW5jZWxGbiIsInJlcXVlc3RBbmltRnJhbWUiLCJjYW5jZWxBbmltRnJhbWUiLCJjYWxsSW5pdEhvb2tzIiwiX19zdXBlcl9fIiwic3RhdGljcyIsImluY2x1ZGVzIiwiX2luaXRIb29rcyIsIl9pbml0SG9va3NDYWxsZWQiLCJtZXJnZU9wdGlvbnMiLCJoaSIsIl9vbiIsIm9mZiIsIl9vZmYiLCJfZXZlbnRzIiwiZm4iLCJjdHgiLCJfZmlyaW5nQ291bnQiLCJzcGxpY2UiLCJsaXN0ZW5zIiwiX3Byb3BhZ2F0ZUV2ZW50IiwiX2V2ZW50UGFyZW50cyIsIm9uY2UiLCJhZGRFdmVudFBhcmVudCIsInJlbW92ZUV2ZW50UGFyZW50IiwibGF5ZXIiLCJjbGVhckFsbEV2ZW50TGlzdGVuZXJzIiwiYWRkT25lVGltZUV2ZW50TGlzdGVuZXIiLCJmaXJlRXZlbnQiLCJoYXNFdmVudExpc3RlbmVycyIsInVpIiwiY2xvbmUiLCJfYWRkIiwic3VidHJhY3QiLCJfc3VidHJhY3QiLCJkaXZpZGVCeSIsIl9kaXZpZGVCeSIsIm11bHRpcGx5QnkiLCJfbXVsdGlwbHlCeSIsInNjYWxlQnkiLCJ1bnNjYWxlQnkiLCJfcm91bmQiLCJmbG9vciIsIl9mbG9vciIsImNlaWwiLCJfY2VpbCIsImRpc3RhbmNlVG8iLCJnZXRDZW50ZXIiLCJnZXRCb3R0b21MZWZ0IiwiZ2V0VG9wUmlnaHQiLCJnZXRUb3BMZWZ0IiwiZ2V0Qm90dG9tUmlnaHQiLCJnZXRTaXplIiwiaW50ZXJzZWN0cyIsIm92ZXJsYXBzIiwiaXNWYWxpZCIsIl9zb3V0aFdlc3QiLCJfbm9ydGhFYXN0IiwicGFkIiwiZ2V0U291dGhXZXN0IiwiZ2V0Tm9ydGhFYXN0IiwiZ2V0Tm9ydGhXZXN0IiwiZ2V0Tm9ydGgiLCJnZXRXZXN0IiwiZ2V0U291dGhFYXN0IiwiZ2V0U291dGgiLCJnZXRFYXN0IiwidG9CQm94U3RyaW5nIiwiY2kiLCJ3cmFwTGF0TG5nIiwidG9Cb3VuZHMiLCJsaSIsImxhdExuZ1RvUG9pbnQiLCJwcm9qZWN0aW9uIiwicHJvamVjdCIsInNjYWxlIiwidHJhbnNmb3JtYXRpb24iLCJfdHJhbnNmb3JtIiwicG9pbnRUb0xhdExuZyIsInVudHJhbnNmb3JtIiwidW5wcm9qZWN0Iiwiem9vbSIsIkxOMiIsImdldFByb2plY3RlZEJvdW5kcyIsImluZmluaXRlIiwiYm91bmRzIiwidHJhbnNmb3JtIiwid3JhcExuZyIsIndyYXBMYXQiLCJ3cmFwTGF0TG5nQm91bmRzIiwiX2kiLCJNQVhfTEFUSVRVREUiLCJhdGFuIiwiZXhwIiwicGkiLCJtaSIsImZpIiwiZ2kiLCJ2aSIsInlpIiwieGkiLCJ3aSIsIlBpIiwiVGkiLCJ6aSIsIm9wZXJhIiwiQ2kiLCJaaSIsIkVpIiwiU2kiLCJraSIsInBsYXRmb3JtIiwiSWkiLCJXZWJLaXRDU1NNYXRyaXgiLCJBaSIsIkxfRElTQUJMRV8zRCIsIlJpIiwib3JpZW50YXRpb24iLCJEaSIsIk5pIiwiamkiLCJQb2ludGVyRXZlbnQiLCJNU1BvaW50ZXJFdmVudCIsIkxfTk9fVE9VQ0giLCJEb2N1bWVudFRvdWNoIiwiRmkiLCJVaSIsIlZpIiwiZGV2aWNlUGl4ZWxSYXRpbyIsInNjcmVlbiIsImRldmljZVhEUEkiLCJsb2dpY2FsWERQSSIsImdldENvbnRleHQiLCJjcmVhdGVTVkdSZWN0IiwiaW5uZXJIVE1MIiwiYmVoYXZpb3IiLCJhZGoiLCJZaSIsImllbHQ5IiwiZWRnZSIsIndlYmtpdCIsImFuZHJvaWQiLCJhbmRyb2lkMjMiLCJjaHJvbWUiLCJnZWNrbyIsInNhZmFyaSIsInBoYW50b20iLCJvcGVyYTEyIiwid2luIiwiaWUzZCIsIndlYmtpdDNkIiwiZ2Vja28zZCIsImFueTNkIiwibW9iaWxlIiwibW9iaWxlV2Via2l0IiwibW9iaWxlV2Via2l0M2QiLCJtc1BvaW50ZXIiLCJwb2ludGVyIiwidG91Y2giLCJtb2JpbGVPcGVyYSIsIm1vYmlsZUdlY2tvIiwicmV0aW5hIiwiY2FudmFzIiwic3ZnIiwidm1sIiwibGUiLCJkaXNhYmxlU2Nyb2xsUHJvcGFnYXRpb24iLCJkaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbiIsInN0b3AiLCJnZXRNb3VzZVBvc2l0aW9uIiwiZ2V0V2hlZWxEZWx0YSIsImZha2VTdG9wIiwic2tpcHBlZCIsImlzRXh0ZXJuYWxUYXJnZXQiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiX2UiLCJkZSIsInBlIiwiZ2UiLCJUUkFOU0lUSU9OIiwiVFJBTlNJVElPTl9FTkQiLCJnZXQiLCJnZXRTdHlsZSIsImVtcHR5IiwidG9Gcm9udCIsInRvQmFjayIsImhhc0NsYXNzIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInNldENsYXNzIiwiZ2V0Q2xhc3MiLCJzZXRPcGFjaXR5IiwidGVzdFByb3AiLCJzZXRUcmFuc2Zvcm0iLCJzZXRQb3NpdGlvbiIsImdldFBvc2l0aW9uIiwiZGlzYWJsZVRleHRTZWxlY3Rpb24iLCJlbmFibGVUZXh0U2VsZWN0aW9uIiwiZGlzYWJsZUltYWdlRHJhZyIsImVuYWJsZUltYWdlRHJhZyIsInByZXZlbnRPdXRsaW5lIiwicmVzdG9yZU91dGxpbmUiLCJ2ZSIsInJ1biIsIl9lbCIsIl9pblByb2dyZXNzIiwiX2R1cmF0aW9uIiwiX2Vhc2VPdXRQb3dlciIsIl9zdGFydFBvcyIsIl9vZmZzZXQiLCJfc3RhcnRUaW1lIiwiX2FuaW1hdGUiLCJfc3RlcCIsIl9jb21wbGV0ZSIsIl9hbmltSWQiLCJfcnVuRnJhbWUiLCJfZWFzZU91dCIsInllIiwiY3JzIiwibWluWm9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJtYXhCb3VuZHMiLCJyZW5kZXJlciIsInpvb21BbmltYXRpb24iLCJ6b29tQW5pbWF0aW9uVGhyZXNob2xkIiwiZmFkZUFuaW1hdGlvbiIsIm1hcmtlclpvb21BbmltYXRpb24iLCJ0cmFuc2Zvcm0zRExpbWl0Iiwiem9vbVNuYXAiLCJ6b29tRGVsdGEiLCJ0cmFja1Jlc2l6ZSIsIl9pbml0Q29udGFpbmVyIiwiX2luaXRMYXlvdXQiLCJfb25SZXNpemUiLCJfaW5pdEV2ZW50cyIsInNldE1heEJvdW5kcyIsIl96b29tIiwiX2xpbWl0Wm9vbSIsInNldFZpZXciLCJyZXNldCIsIl9oYW5kbGVycyIsIl96b29tQm91bmRMYXllcnMiLCJfc2l6ZUNoYW5nZWQiLCJfem9vbUFuaW1hdGVkIiwiX2NyZWF0ZUFuaW1Qcm94eSIsIl9wcm94eSIsIl9jYXRjaFRyYW5zaXRpb25FbmQiLCJfYWRkTGF5ZXJzIiwiX2xpbWl0Q2VudGVyIiwiX3N0b3AiLCJfbG9hZGVkIiwiYW5pbWF0ZSIsInBhbiIsImR1cmF0aW9uIiwiX3RyeUFuaW1hdGVkWm9vbSIsIl90cnlBbmltYXRlZFBhbiIsIl9zaXplVGltZXIiLCJfcmVzZXRWaWV3Iiwic2V0Wm9vbSIsInpvb21JbiIsInpvb21PdXQiLCJzZXRab29tQXJvdW5kIiwiZ2V0Wm9vbVNjYWxlIiwibGF0TG5nVG9Db250YWluZXJQb2ludCIsImNvbnRhaW5lclBvaW50VG9MYXRMbmciLCJfZ2V0Qm91bmRzQ2VudGVyWm9vbSIsImdldEJvdW5kcyIsInBhZGRpbmdUb3BMZWZ0IiwicGFkZGluZyIsInBhZGRpbmdCb3R0b21SaWdodCIsImdldEJvdW5kc1pvb20iLCJmaXRCb3VuZHMiLCJmaXRXb3JsZCIsInBhblRvIiwicGFuQnkiLCJnZXRab29tIiwiX3BhbkFuaW0iLCJfb25QYW5UcmFuc2l0aW9uU3RlcCIsImVuZCIsIl9vblBhblRyYW5zaXRpb25FbmQiLCJub01vdmVTdGFydCIsIl9tYXBQYW5lIiwiX2dldE1hcFBhbmVQb3MiLCJlYXNlTGluZWFyaXR5IiwiX3Jhd1BhbkJ5IiwiZmx5VG8iLCJfZmx5VG9GcmFtZSIsIl9tb3ZlIiwiZ2V0U2NhbGVab29tIiwiX21vdmVFbmQiLCJfbW92ZVN0YXJ0IiwiZmx5VG9Cb3VuZHMiLCJfcGFuSW5zaWRlTWF4Qm91bmRzIiwic2V0TWluWm9vbSIsInNldE1heFpvb20iLCJwYW5JbnNpZGVCb3VuZHMiLCJfZW5mb3JjaW5nQm91bmRzIiwiaW52YWxpZGF0ZVNpemUiLCJfbGFzdENlbnRlciIsImRlYm91bmNlTW92ZWVuZCIsIm9sZFNpemUiLCJuZXdTaXplIiwibG9jYXRlIiwiX2xvY2F0ZU9wdGlvbnMiLCJ0aW1lb3V0Iiwid2F0Y2giLCJfaGFuZGxlR2VvbG9jYXRpb25FcnJvciIsIm1lc3NhZ2UiLCJfaGFuZGxlR2VvbG9jYXRpb25SZXNwb25zZSIsIl9sb2NhdGlvbldhdGNoSWQiLCJnZW9sb2NhdGlvbiIsIndhdGNoUG9zaXRpb24iLCJnZXRDdXJyZW50UG9zaXRpb24iLCJzdG9wTG9jYXRlIiwiY2xlYXJXYXRjaCIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYWNjdXJhY3kiLCJsYXRsbmciLCJ0aW1lc3RhbXAiLCJhZGRIYW5kbGVyIiwiZW5hYmxlIiwiX2NvbnRhaW5lcklkIiwiX2NvbnRhaW5lciIsIl9jbGVhckNvbnRyb2xQb3MiLCJfY2xlYXJIYW5kbGVycyIsIl9wYW5lcyIsIl9yZW5kZXJlciIsImNyZWF0ZVBhbmUiLCJfY2hlY2tJZkxvYWRlZCIsIl9tb3ZlZCIsImxheWVyUG9pbnRUb0xhdExuZyIsIl9nZXRDZW50ZXJMYXllclBvaW50IiwiZ2V0UGl4ZWxCb3VuZHMiLCJnZXRNaW5ab29tIiwiX2xheWVyc01pblpvb20iLCJnZXRNYXhab29tIiwiX2xheWVyc01heFpvb20iLCJfc2l6ZSIsImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0IiwiX2dldFRvcExlZnRQb2ludCIsImdldFBpeGVsT3JpZ2luIiwiX3BpeGVsT3JpZ2luIiwiZ2V0UGl4ZWxXb3JsZEJvdW5kcyIsImdldFBhbmUiLCJnZXRQYW5lcyIsImdldENvbnRhaW5lciIsImxhdExuZ1RvTGF5ZXJQb2ludCIsImNvbnRhaW5lclBvaW50VG9MYXllclBvaW50IiwibGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQiLCJtb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCIsIm1vdXNlRXZlbnRUb0xheWVyUG9pbnQiLCJtb3VzZUV2ZW50VG9MYXRMbmciLCJfb25TY3JvbGwiLCJfZmFkZUFuaW1hdGVkIiwicG9zaXRpb24iLCJfaW5pdFBhbmVzIiwiX2luaXRDb250cm9sUG9zIiwiX3BhbmVSZW5kZXJlcnMiLCJtYXJrZXJQYW5lIiwic2hhZG93UGFuZSIsIl9nZXROZXdQaXhlbE9yaWdpbiIsInBpbmNoIiwiX2dldFpvb21TcGFuIiwiX3RhcmdldHMiLCJfaGFuZGxlRE9NRXZlbnQiLCJfb25Nb3ZlRW5kIiwiX3Jlc2l6ZVJlcXVlc3QiLCJzY3JvbGxUb3AiLCJzY3JvbGxMZWZ0IiwiX2ZpbmRFdmVudFRhcmdldHMiLCJzcmNFbGVtZW50IiwiX2RyYWdnYWJsZU1vdmVkIiwiX2ZpcmVET01FdmVudCIsIl9tb3VzZUV2ZW50cyIsImNvbnRhaW5lclBvaW50IiwiZ2V0TGF0TG5nIiwibGF5ZXJQb2ludCIsImJ1YmJsaW5nTW91c2VFdmVudHMiLCJkcmFnZ2luZyIsImVuYWJsZWQiLCJtb3ZlZCIsImJveFpvb20iLCJkaXNhYmxlIiwid2hlblJlYWR5IiwiX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCIsIl9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzIiwiX2dldENlbnRlck9mZnNldCIsIl9nZXRCb3VuZHNPZmZzZXQiLCJfbGltaXRPZmZzZXQiLCJfcmVib3VuZCIsIm1hcFBhbmUiLCJfYW5pbWF0aW5nWm9vbSIsIl9vblpvb21UcmFuc2l0aW9uRW5kIiwiX2Rlc3Ryb3lBbmltUHJveHkiLCJwcm9wZXJ0eU5hbWUiLCJfbm90aGluZ1RvQW5pbWF0ZSIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJfYW5pbWF0ZVpvb20iLCJfYW5pbWF0ZVRvQ2VudGVyIiwiX2FuaW1hdGVUb1pvb20iLCJub1VwZGF0ZSIsInhlIiwiX21hcCIsInJlbW92ZUNvbnRyb2wiLCJhZGRDb250cm9sIiwiYWRkVG8iLCJvbkFkZCIsIl9jb250cm9sQ29ybmVycyIsIm9uUmVtb3ZlIiwiX3JlZm9jdXNPbk1hcCIsInNjcmVlblgiLCJzY3JlZW5ZIiwiZm9jdXMiLCJ3ZSIsIl9jb250cm9sQ29udGFpbmVyIiwiTGUiLCJjb2xsYXBzZWQiLCJhdXRvWkluZGV4IiwiaGlkZVNpbmdsZUJhc2UiLCJzb3J0TGF5ZXJzIiwic29ydEZ1bmN0aW9uIiwiX2xheWVyQ29udHJvbElucHV0cyIsIl9sYXN0WkluZGV4IiwiX2hhbmRsaW5nQ2xpY2siLCJfYWRkTGF5ZXIiLCJfdXBkYXRlIiwiX2NoZWNrRGlzYWJsZWRMYXllcnMiLCJfb25MYXllckNoYW5nZSIsIl9leHBhbmRJZk5vdENvbGxhcHNlZCIsImFkZEJhc2VMYXllciIsImFkZE92ZXJsYXkiLCJyZW1vdmVMYXllciIsIl9nZXRMYXllciIsImV4cGFuZCIsIl9mb3JtIiwiaGVpZ2h0Iiwib2Zmc2V0VG9wIiwiY29sbGFwc2UiLCJzZXRBdHRyaWJ1dGUiLCJtb3VzZWVudGVyIiwibW91c2VsZWF2ZSIsIl9sYXllcnNMaW5rIiwiaHJlZiIsInRpdGxlIiwiX2Jhc2VMYXllcnNMaXN0IiwiX3NlcGFyYXRvciIsIl9vdmVybGF5c0xpc3QiLCJuYW1lIiwib3ZlcmxheSIsInNvcnQiLCJzZXRaSW5kZXgiLCJfYWRkSXRlbSIsImRpc3BsYXkiLCJfY3JlYXRlUmFkaW9FbGVtZW50IiwiaGFzTGF5ZXIiLCJkZWZhdWx0Q2hlY2tlZCIsImxheWVySWQiLCJfb25JbnB1dENsaWNrIiwiY2hlY2tlZCIsImFkZExheWVyIiwiZGlzYWJsZWQiLCJfZXhwYW5kIiwiX2NvbGxhcHNlIiwiUGUiLCJ6b29tSW5UZXh0Iiwiem9vbUluVGl0bGUiLCJ6b29tT3V0VGV4dCIsInpvb21PdXRUaXRsZSIsIl96b29tSW5CdXR0b24iLCJfY3JlYXRlQnV0dG9uIiwiX3pvb21JbiIsIl96b29tT3V0QnV0dG9uIiwiX3pvb21PdXQiLCJfdXBkYXRlRGlzYWJsZWQiLCJfZGlzYWJsZWQiLCJzaGlmdEtleSIsInpvb21Db250cm9sIiwiYmUiLCJtYXhXaWR0aCIsIm1ldHJpYyIsImltcGVyaWFsIiwiX2FkZFNjYWxlcyIsInVwZGF0ZVdoZW5JZGxlIiwiX21TY2FsZSIsIl9pU2NhbGUiLCJfdXBkYXRlU2NhbGVzIiwiX3VwZGF0ZU1ldHJpYyIsIl91cGRhdGVJbXBlcmlhbCIsIl9nZXRSb3VuZE51bSIsIl91cGRhdGVTY2FsZSIsIndpZHRoIiwiVGUiLCJwcmVmaXgiLCJfYXR0cmlidXRpb25zIiwiYXR0cmlidXRpb25Db250cm9sIiwiZ2V0QXR0cmlidXRpb24iLCJhZGRBdHRyaWJ1dGlvbiIsInNldFByZWZpeCIsInJlbW92ZUF0dHJpYnV0aW9uIiwiTGF5ZXJzIiwiWm9vbSIsIlNjYWxlIiwiQXR0cmlidXRpb24iLCJhdHRyaWJ1dGlvbiIsIk1lIiwiX2VuYWJsZWQiLCJhZGRIb29rcyIsInJlbW92ZUhvb2tzIiwiQ2UiLCJaZSIsIkVlIiwibW91c2Vkb3duIiwidG91Y2hzdGFydCIsInBvaW50ZXJkb3duIiwiTVNQb2ludGVyRG93biIsIlNlIiwia2UiLCJjbGlja1RvbGVyYW5jZSIsIl9lbGVtZW50IiwiX2RyYWdTdGFydFRhcmdldCIsIl9wcmV2ZW50T3V0bGluZSIsIl9vbkRvd24iLCJfZHJhZ2dpbmciLCJmaW5pc2hEcmFnIiwid2hpY2giLCJidXR0b24iLCJfbW92aW5nIiwiX3N0YXJ0UG9pbnQiLCJfb25Nb3ZlIiwiX29uVXAiLCJib2R5IiwiX2xhc3RUYXJnZXQiLCJTVkdFbGVtZW50SW5zdGFuY2UiLCJjb3JyZXNwb25kaW5nVXNlRWxlbWVudCIsIl9uZXdQb3MiLCJfYW5pbVJlcXVlc3QiLCJfbGFzdEV2ZW50IiwiX3VwZGF0ZVBvc2l0aW9uIiwiQmUiLCJzaW1wbGlmeSIsInBvaW50VG9TZWdtZW50RGlzdGFuY2UiLCJjbG9zZXN0UG9pbnRPblNlZ21lbnQiLCJjbGlwU2VnbWVudCIsIl9nZXRFZGdlSW50ZXJzZWN0aW9uIiwiX2dldEJpdENvZGUiLCJfc3FDbG9zZXN0UG9pbnRPblNlZ21lbnQiLCJpc0ZsYXQiLCJfZmxhdCIsIkllIiwiY2xpcFBvbHlnb24iLCJBZSIsIk9lIiwiUl9NSU5PUiIsIlJlIiwiTG9uTGF0IiwiTWVyY2F0b3IiLCJTcGhlcmljYWxNZXJjYXRvciIsIkRlIiwiTmUiLCJqZSIsIkVhcnRoIiwiRVBTRzMzOTUiLCJFUFNHMzg1NyIsIkVQU0c5MDA5MTMiLCJFUFNHNDMyNiIsIlNpbXBsZSIsIldlIiwicGFuZSIsInJlbW92ZUZyb20iLCJfbWFwVG9BZGQiLCJhZGRJbnRlcmFjdGl2ZVRhcmdldCIsInJlbW92ZUludGVyYWN0aXZlVGFyZ2V0IiwiX2xheWVyQWRkIiwiZ2V0RXZlbnRzIiwiYmVmb3JlQWRkIiwiX2FkZFpvb21MaW1pdCIsIl91cGRhdGVab29tTGV2ZWxzIiwiX3JlbW92ZVpvb21MaW1pdCIsIkhlIiwiZ2V0TGF5ZXJJZCIsImludm9rZSIsImdldExheWVyIiwiZ2V0TGF5ZXJzIiwiYnJpbmdUb0Zyb250IiwiYnJpbmdUb0JhY2siLCJVZSIsImNyZWF0ZUljb24iLCJfY3JlYXRlSWNvbiIsImNyZWF0ZVNoYWRvdyIsIl9nZXRJY29uVXJsIiwiX2NyZWF0ZUltZyIsIl9zZXRJY29uU3R5bGVzIiwic2hhZG93QW5jaG9yIiwibWFyZ2luTGVmdCIsIm1hcmdpblRvcCIsIlZlIiwiaWNvblVybCIsImljb25SZXRpbmFVcmwiLCJzaGFkb3dVcmwiLCJpY29uU2l6ZSIsInBvcHVwQW5jaG9yIiwidG9vbHRpcEFuY2hvciIsInNoYWRvd1NpemUiLCJpbWFnZVBhdGgiLCJfZGV0ZWN0SWNvblBhdGgiLCJHZSIsIl9tYXJrZXIiLCJfZHJhZ2dhYmxlIiwiZHJhZ3N0YXJ0IiwiX29uRHJhZ1N0YXJ0IiwiZHJhZyIsIl9vbkRyYWciLCJkcmFnZW5kIiwiX29uRHJhZ0VuZCIsIl9vbGRMYXRMbmciLCJjbG9zZVBvcHVwIiwiX3NoYWRvdyIsIl9sYXRsbmciLCJvbGRMYXRMbmciLCJpbnRlcmFjdGl2ZSIsImRyYWdnYWJsZSIsImtleWJvYXJkIiwiekluZGV4T2Zmc2V0IiwicmlzZU9uSG92ZXIiLCJyaXNlT2Zmc2V0IiwiX3JlbW92ZUljb24iLCJfcmVtb3ZlU2hhZG93Iiwidmlld3Jlc2V0Iiwic2V0TGF0TG5nIiwic2V0WkluZGV4T2Zmc2V0Iiwic2V0SWNvbiIsIl9wb3B1cCIsImJpbmRQb3B1cCIsImdldEVsZW1lbnQiLCJtb3VzZW92ZXIiLCJfYnJpbmdUb0Zyb250IiwibW91c2VvdXQiLCJfcmVzZXRaSW5kZXgiLCJfdXBkYXRlT3BhY2l0eSIsIl9pbml0SW50ZXJhY3Rpb24iLCJfekluZGV4IiwiX3VwZGF0ZVpJbmRleCIsInpJbmRleCIsIl9nZXRQb3B1cEFuY2hvciIsIl9nZXRUb29sdGlwQW5jaG9yIiwiS2UiLCJ3ZWlnaHQiLCJsaW5lQ2FwIiwibGluZUpvaW4iLCJkYXNoQXJyYXkiLCJkYXNoT2Zmc2V0IiwiZmlsbCIsImZpbGxDb2xvciIsImZpbGxPcGFjaXR5IiwiZmlsbFJ1bGUiLCJnZXRSZW5kZXJlciIsIl9pbml0UGF0aCIsIl9yZXNldCIsIl9hZGRQYXRoIiwiX3JlbW92ZVBhdGgiLCJyZWRyYXciLCJfdXBkYXRlUGF0aCIsIl91cGRhdGVTdHlsZSIsIl9icmluZ1RvQmFjayIsIl9wYXRoIiwiX3Byb2plY3QiLCJfY2xpY2tUb2xlcmFuY2UiLCJZZSIsIl9yYWRpdXMiLCJzZXRSYWRpdXMiLCJnZXRSYWRpdXMiLCJfcG9pbnQiLCJfdXBkYXRlQm91bmRzIiwiX3JhZGl1c1kiLCJfcHhCb3VuZHMiLCJfdXBkYXRlQ2lyY2xlIiwiX2VtcHR5IiwiX2JvdW5kcyIsIl9jb250YWluc1BvaW50IiwiWGUiLCJfbVJhZGl1cyIsInNtb290aEZhY3RvciIsIm5vQ2xpcCIsIl9zZXRMYXRMbmdzIiwiZ2V0TGF0TG5ncyIsImlzRW1wdHkiLCJjbG9zZXN0TGF5ZXJQb2ludCIsIl9wYXJ0cyIsIl9yaW5ncyIsImFkZExhdExuZyIsIl9kZWZhdWx0U2hhcGUiLCJfY29udmVydExhdExuZ3MiLCJfcHJvamVjdExhdGxuZ3MiLCJfY2xpcFBvaW50cyIsIl9zaW1wbGlmeVBvaW50cyIsIl91cGRhdGVQb2x5IiwiZGVmYXVsdE9wdGlvbnMiLCJyZXNldFN0eWxlIiwib25FYWNoRmVhdHVyZSIsIl9zZXRMYXllclN0eWxlIiwidG4iLCJ0b0dlb0pTT04iLCJ0b011bHRpUG9pbnQiLCJlbiIsIm5uIiwiY3Jvc3NPcmlnaW4iLCJlcnJvck92ZXJsYXlVcmwiLCJfdXJsIiwiX2ltYWdlIiwiX2luaXRJbWFnZSIsInNldFVybCIsInNldEJvdW5kcyIsInpvb21hbmltIiwib25zZWxlY3RzdGFydCIsIm9ubW91c2Vtb3ZlIiwib25sb2FkIiwib25lcnJvciIsIl9vdmVybGF5T25FcnJvciIsImF1dG9wbGF5IiwibG9vcCIsImNsYXNzIiwib25sb2FkZWRkYXRhIiwic24iLCJvZmZzZXQiLCJfc291cmNlIiwiX3JlbW92ZVRpbWVvdXQiLCJfYWRqdXN0UGFuIiwiZ2V0Q29udGVudCIsIl9jb250ZW50Iiwic2V0Q29udGVudCIsInZpc2liaWxpdHkiLCJfdXBkYXRlQ29udGVudCIsIl91cGRhdGVMYXlvdXQiLCJpc09wZW4iLCJfY29udGVudE5vZGUiLCJoYXNDaGlsZE5vZGVzIiwiX2dldEFuY2hvciIsIl9jb250YWluZXJCb3R0b20iLCJfY29udGFpbmVyTGVmdCIsIl9jb250YWluZXJXaWR0aCIsImJvdHRvbSIsInJuIiwibWluV2lkdGgiLCJtYXhIZWlnaHQiLCJhdXRvUGFuIiwiYXV0b1BhblBhZGRpbmdUb3BMZWZ0IiwiYXV0b1BhblBhZGRpbmdCb3R0b21SaWdodCIsImF1dG9QYW5QYWRkaW5nIiwia2VlcEluVmlldyIsImNsb3NlQnV0dG9uIiwiYXV0b0Nsb3NlIiwib3Blbk9uIiwib3BlblBvcHVwIiwicG9wdXAiLCJjbG9zZU9uQ2xpY2siLCJjbG9zZVBvcHVwT25DbGljayIsInByZWNsaWNrIiwiX2Nsb3NlIiwibW92ZWVuZCIsIl93cmFwcGVyIiwiX3RpcENvbnRhaW5lciIsIl90aXAiLCJfY2xvc2VCdXR0b24iLCJfb25DbG9zZUJ1dHRvbkNsaWNrIiwid2hpdGVTcGFjZSIsIm9mZnNldFdpZHRoIiwib2Zmc2V0SGVpZ2h0IiwicGFyc2VJbnQiLCJfcG9wdXBIYW5kbGVyc0FkZGVkIiwiY2xpY2siLCJfb3BlblBvcHVwIiwia2V5cHJlc3MiLCJfb25LZXlQcmVzcyIsIm1vdmUiLCJfbW92ZVBvcHVwIiwidW5iaW5kUG9wdXAiLCJ0b2dnbGVQb3B1cCIsImlzUG9wdXBPcGVuIiwic2V0UG9wdXBDb250ZW50IiwiZ2V0UG9wdXAiLCJrZXlDb2RlIiwiYW4iLCJkaXJlY3Rpb24iLCJwZXJtYW5lbnQiLCJzdGlja3kiLCJ0b29sdGlwIiwiY2xvc2VUb29sdGlwIiwiX3NldFBvc2l0aW9uIiwib3BlblRvb2x0aXAiLCJiaW5kVG9vbHRpcCIsIl90b29sdGlwIiwiX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zIiwidW5iaW5kVG9vbHRpcCIsIl90b29sdGlwSGFuZGxlcnNBZGRlZCIsIl9tb3ZlVG9vbHRpcCIsIl9vcGVuVG9vbHRpcCIsIm1vdXNlbW92ZSIsInRvZ2dsZVRvb2x0aXAiLCJpc1Rvb2x0aXBPcGVuIiwic2V0VG9vbHRpcENvbnRlbnQiLCJnZXRUb29sdGlwIiwiaG4iLCJodG1sIiwiYmdQb3MiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJEZWZhdWx0IiwidW4iLCJ0aWxlU2l6ZSIsInVwZGF0ZVdoZW5ab29taW5nIiwidXBkYXRlSW50ZXJ2YWwiLCJtYXhOYXRpdmVab29tIiwibWluTmF0aXZlWm9vbSIsIm5vV3JhcCIsImtlZXBCdWZmZXIiLCJfbGV2ZWxzIiwiX3RpbGVzIiwiX3JlbW92ZUFsbFRpbGVzIiwiX3RpbGVab29tIiwiX3NldEF1dG9aSW5kZXgiLCJpc0xvYWRpbmciLCJfbG9hZGluZyIsInZpZXdwcmVyZXNldCIsIl9pbnZhbGlkYXRlQWxsIiwiY3JlYXRlVGlsZSIsImdldFRpbGVTaXplIiwiY2hpbGRyZW4iLCJpc0Zpbml0ZSIsImN1cnJlbnQiLCJsb2FkZWQiLCJlbCIsImFjdGl2ZSIsIl9vbk9wYXF1ZVRpbGUiLCJfbm9QcnVuZSIsIl9wcnVuZVRpbGVzIiwiX2ZhZGVGcmFtZSIsIl91cGRhdGVMZXZlbHMiLCJfb25VcGRhdGVMZXZlbCIsIl9yZW1vdmVUaWxlc0F0Wm9vbSIsIl9vblJlbW92ZUxldmVsIiwiX3NldFpvb21UcmFuc2Zvcm0iLCJfb25DcmVhdGVMZXZlbCIsIl9sZXZlbCIsInJldGFpbiIsIl9yZXRhaW5QYXJlbnQiLCJfcmV0YWluQ2hpbGRyZW4iLCJfcmVtb3ZlVGlsZSIsIl90aWxlQ29vcmRzVG9LZXkiLCJfc2V0VmlldyIsIl9jbGFtcFpvb20iLCJfYWJvcnRMb2FkaW5nIiwiX3Jlc2V0R3JpZCIsIl9zZXRab29tVHJhbnNmb3JtcyIsIl90aWxlU2l6ZSIsIl9nbG9iYWxUaWxlUmFuZ2UiLCJfcHhCb3VuZHNUb1RpbGVSYW5nZSIsIl93cmFwWCIsIl93cmFwWSIsIl9nZXRUaWxlZFBpeGVsQm91bmRzIiwiX2lzVmFsaWRUaWxlIiwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsIl9hZGRUaWxlIiwiX3RpbGVDb29yZHNUb0JvdW5kcyIsIl9rZXlUb0JvdW5kcyIsIl9rZXlUb1RpbGVDb29yZHMiLCJ0aWxlIiwiX2luaXRUaWxlIiwiV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5IiwiX2dldFRpbGVQb3MiLCJfd3JhcENvb3JkcyIsIl90aWxlUmVhZHkiLCJfbm9UaWxlc1RvTG9hZCIsInN1YmRvbWFpbnMiLCJlcnJvclRpbGVVcmwiLCJ6b29tT2Zmc2V0IiwidG1zIiwiem9vbVJldmVyc2UiLCJkZXRlY3RSZXRpbmEiLCJfb25UaWxlUmVtb3ZlIiwiX3RpbGVPbkxvYWQiLCJfdGlsZU9uRXJyb3IiLCJnZXRUaWxlVXJsIiwiX2dldFN1YmRvbWFpbiIsIl9nZXRab29tRm9yVXJsIiwiY29tcGxldGUiLCJjbiIsImRlZmF1bHRXbXNQYXJhbXMiLCJzZXJ2aWNlIiwicmVxdWVzdCIsInN0eWxlcyIsImZvcm1hdCIsInRyYW5zcGFyZW50IiwidmVyc2lvbiIsInVwcGVyY2FzZSIsIndtc1BhcmFtcyIsIl9jcnMiLCJfd21zVmVyc2lvbiIsInBhcnNlRmxvYXQiLCJzZXRQYXJhbXMiLCJXTVMiLCJ3bXMiLCJfbiIsIl91cGRhdGVQYXRocyIsIl9kZXN0cm95Q29udGFpbmVyIiwiX29uWm9vbSIsInpvb21lbmQiLCJfb25ab29tRW5kIiwiX29uQW5pbVpvb20iLCJfdXBkYXRlVHJhbnNmb3JtIiwiX2NlbnRlciIsIl9vblZpZXdQcmVSZXNldCIsIl9wb3N0cG9uZVVwZGF0ZVBhdGhzIiwiX2RyYXciLCJfb25Nb3VzZU1vdmUiLCJfb25DbGljayIsIl9oYW5kbGVNb3VzZU91dCIsIl9jdHgiLCJfcmVkcmF3Qm91bmRzIiwiX3JlZHJhdyIsIl9kcmF3bkxheWVycyIsInRyYW5zbGF0ZSIsIl91cGRhdGVEYXNoQXJyYXkiLCJfb3JkZXIiLCJfZHJhd0xhc3QiLCJuZXh0IiwiX2RyYXdGaXJzdCIsIl9yZXF1ZXN0UmVkcmF3IiwiX2V4dGVuZFJlZHJhd0JvdW5kcyIsIl9kYXNoQXJyYXkiLCJfcmVkcmF3UmVxdWVzdCIsIl9jbGVhciIsImNsZWFyUmVjdCIsInNhdmUiLCJiZWdpblBhdGgiLCJyZWN0IiwiY2xpcCIsIl9kcmF3aW5nIiwicmVzdG9yZSIsImNsb3NlUGF0aCIsIl9maWxsU3Ryb2tlIiwiYXJjIiwiZ2xvYmFsQWxwaGEiLCJmaWxsU3R5bGUiLCJzZXRMaW5lRGFzaCIsImxpbmVXaWR0aCIsInN0cm9rZVN0eWxlIiwiX2ZpcmVFdmVudCIsIm1vdmluZyIsIl9oYW5kbGVNb3VzZUhvdmVyIiwiX2hvdmVyZWRMYXllciIsInBuIiwibmFtZXNwYWNlcyIsIm1uIiwiY29vcmRzaXplIiwiX3N0cm9rZSIsIl9maWxsIiwic3Ryb2tlZCIsImZpbGxlZCIsImRhc2hTdHlsZSIsImVuZGNhcCIsImpvaW5zdHlsZSIsIl9zZXRQYXRoIiwiem9vbXN0YXJ0IiwiX29uWm9vbVN0YXJ0IiwiX3Jvb3RHcm91cCIsIl9zdmdTaXplIiwicmVtb3ZlQXR0cmlidXRlIiwiX2dldFBhbmVSZW5kZXJlciIsInByZWZlckNhbnZhcyIsInZuIiwiX2JvdW5kc1RvTGF0TG5ncyIsInBvaW50c1RvUGF0aCIsImdlb21ldHJ5VG9MYXllciIsImxhdExuZ1RvQ29vcmRzIiwibGF0TG5nc1RvQ29vcmRzIiwiZ2V0RmVhdHVyZSIsInluIiwiX3BhbmUiLCJvdmVybGF5UGFuZSIsIl9yZXNldFN0YXRlVGltZW91dCIsIl9kZXN0cm95IiwiX29uTW91c2VEb3duIiwiX3Jlc2V0U3RhdGUiLCJfY2xlYXJEZWZlcnJlZFJlc2V0U3RhdGUiLCJjb250ZXh0bWVudSIsIm1vdXNldXAiLCJfb25Nb3VzZVVwIiwia2V5ZG93biIsIl9vbktleURvd24iLCJfYm94IiwiX2ZpbmlzaCIsImJveFpvb21Cb3VuZHMiLCJkb3VibGVDbGlja1pvb20iLCJ4biIsIl9vbkRvdWJsZUNsaWNrIiwiaW5lcnRpYSIsImluZXJ0aWFEZWNlbGVyYXRpb24iLCJpbmVydGlhTWF4U3BlZWQiLCJ3b3JsZENvcHlKdW1wIiwibWF4Qm91bmRzVmlzY29zaXR5Iiwid24iLCJfb25QcmVEcmFnTGltaXQiLCJfb25QcmVEcmFnV3JhcCIsIl9wb3NpdGlvbnMiLCJfdGltZXMiLCJfb2Zmc2V0TGltaXQiLCJfdmlzY29zaXR5IiwiX2xhc3RUaW1lIiwiX2xhc3RQb3MiLCJfYWJzUG9zIiwic2hpZnQiLCJfaW5pdGlhbFdvcmxkT2Zmc2V0IiwiX3dvcmxkV2lkdGgiLCJfdmlzY291c0xpbWl0Iiwia2V5Ym9hcmRQYW5EZWx0YSIsIkxuIiwia2V5Q29kZXMiLCJyaWdodCIsImRvd24iLCJ1cCIsIl9zZXRQYW5EZWx0YSIsIl9zZXRab29tRGVsdGEiLCJfb25Gb2N1cyIsImJsdXIiLCJfb25CbHVyIiwiX2FkZEhvb2tzIiwiX3JlbW92ZUhvb2tzIiwiX2ZvY3VzZWQiLCJzY3JvbGxUbyIsIl9wYW5LZXlzIiwiX3pvb21LZXlzIiwiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJzY3JvbGxXaGVlbFpvb20iLCJ3aGVlbERlYm91bmNlVGltZSIsIndoZWVsUHhQZXJab29tTGV2ZWwiLCJQbiIsIl9vbldoZWVsU2Nyb2xsIiwiX2RlbHRhIiwiX2xhc3RNb3VzZVBvcyIsIl90aW1lciIsIl9wZXJmb3JtWm9vbSIsInRhcCIsInRhcFRvbGVyYW5jZSIsImJuIiwiX2ZpcmVDbGljayIsIl9ob2xkVGltZW91dCIsIl9pc1RhcFZhbGlkIiwiX3NpbXVsYXRlRXZlbnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIsImNyZWF0ZUV2ZW50IiwiaW5pdE1vdXNlRXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwidG91Y2hab29tIiwiYm91bmNlQXRab29tTGltaXRzIiwiVG4iLCJfb25Ub3VjaFN0YXJ0IiwiX3pvb21pbmciLCJfY2VudGVyUG9pbnQiLCJfc3RhcnRMYXRMbmciLCJfcGluY2hTdGFydExhdExuZyIsIl9zdGFydERpc3QiLCJfc3RhcnRab29tIiwiX29uVG91Y2hNb3ZlIiwiX29uVG91Y2hFbmQiLCJCb3hab29tIiwiRG91YmxlQ2xpY2tab29tIiwiRHJhZyIsIktleWJvYXJkIiwiU2Nyb2xsV2hlZWxab29tIiwiVGFwIiwiVG91Y2hab29tIiwiem4iLCJub0NvbmZsaWN0IiwiQ29udHJvbCIsImNvbnRyb2wiLCJCcm93c2VyIiwiRXZlbnRlZCIsIkNsYXNzIiwiSGFuZGxlciIsIkRvbUV2ZW50IiwiUG9zQW5pbWF0aW9uIiwiRHJhZ2dhYmxlIiwiTGluZVV0aWwiLCJQb2x5VXRpbCIsIlBvaW50IiwicG9pbnQiLCJCb3VuZHMiLCJUcmFuc2Zvcm1hdGlvbiIsIlByb2plY3Rpb24iLCJMYXRMbmciLCJMYXRMbmdCb3VuZHMiLCJsYXRMbmdCb3VuZHMiLCJDUlMiLCJnZW9KU09OIiwiTGF5ZXIiLCJMYXllckdyb3VwIiwibGF5ZXJHcm91cCIsIkZlYXR1cmVHcm91cCIsImZlYXR1cmVHcm91cCIsIkltYWdlT3ZlcmxheSIsImltYWdlT3ZlcmxheSIsIlZpZGVvT3ZlcmxheSIsInZpZGVvT3ZlcmxheSIsIkRpdk92ZXJsYXkiLCJQb3B1cCIsIlRvb2x0aXAiLCJJY29uIiwiRGl2SWNvbiIsImRpdkljb24iLCJtYXJrZXIiLCJUaWxlTGF5ZXIiLCJ0aWxlTGF5ZXIiLCJHcmlkTGF5ZXIiLCJncmlkTGF5ZXIiLCJTVkciLCJSZW5kZXJlciIsIkNhbnZhcyIsIlBhdGgiLCJDaXJjbGVNYXJrZXIiLCJjaXJjbGVNYXJrZXIiLCJDaXJjbGUiLCJjaXJjbGUiLCJwb2x5bGluZSIsIlBvbHlnb24iLCJwb2x5Z29uIiwiUmVjdGFuZ2xlIiwicmVjdGFuZ2xlIiwiTWFwIiwibWFwIiwiZmFjdG9yeSIsImRlZmluZSIsImpRdWVyeSIsIlMyIiwic2VsZWN0MiIsImFtZCIsInJlcXVpcmVqcyIsInVuZGVmIiwibWFpbiIsInJlcSIsIm1ha2VNYXAiLCJoYW5kbGVycyIsImRlZmluZWQiLCJ3YWl0aW5nIiwiY29uZmlnIiwiZGVmaW5pbmciLCJoYXNPd24iLCJhcHMiLCJqc1N1ZmZpeFJlZ0V4cCIsImhhc1Byb3AiLCJwcm9wIiwibm9ybWFsaXplIiwiYmFzZU5hbWUiLCJuYW1lUGFydHMiLCJuYW1lU2VnbWVudCIsIm1hcFZhbHVlIiwiZm91bmRNYXAiLCJsYXN0SW5kZXgiLCJmb3VuZEkiLCJmb3VuZFN0YXJNYXAiLCJzdGFySSIsInBhcnQiLCJiYXNlUGFydHMiLCJzdGFyTWFwIiwiY2hhckF0Iiwibm9kZUlkQ29tcGF0Iiwic3Vic3RyaW5nIiwibWFrZVJlcXVpcmUiLCJyZWxOYW1lIiwiZm9yY2VTeW5jIiwiYXJncyIsIm1ha2VOb3JtYWxpemUiLCJtYWtlTG9hZCIsImRlcE5hbWUiLCJjYWxsRGVwIiwic3BsaXRQcmVmaXgiLCJpbmRleCIsInBsdWdpbiIsInBhcnRzIiwicHIiLCJtYWtlQ29uZmlnIiwiaWQiLCJ1cmkiLCJkZXBzIiwiY2FsbGJhY2siLCJjanNNb2R1bGUiLCJyZXQiLCJjYWxsYmFja1R5cGUiLCJ1c2luZ0V4cG9ydHMiLCJsb2FkIiwidW5kZWZpbmVkIiwiY2ZnIiwiX2RlZmluZWQiLCJfJCIsIlV0aWxzIiwiRXh0ZW5kIiwiQ2hpbGRDbGFzcyIsIlN1cGVyQ2xhc3MiLCJfX2hhc1Byb3AiLCJCYXNlQ29uc3RydWN0b3IiLCJrZXkiLCJnZXRNZXRob2RzIiwidGhlQ2xhc3MiLCJwcm90byIsIm1ldGhvZHMiLCJtZXRob2ROYW1lIiwiRGVjb3JhdGUiLCJEZWNvcmF0b3JDbGFzcyIsImRlY29yYXRlZE1ldGhvZHMiLCJzdXBlck1ldGhvZHMiLCJEZWNvcmF0ZWRDbGFzcyIsInVuc2hpZnQiLCJhcmdDb3VudCIsImNhbGxlZENvbnN0cnVjdG9yIiwiZGlzcGxheU5hbWUiLCJjdHIiLCJzdXBlck1ldGhvZCIsImNhbGxlZE1ldGhvZCIsIm9yaWdpbmFsTWV0aG9kIiwiZGVjb3JhdGVkTWV0aG9kIiwiT2JzZXJ2YWJsZSIsImxpc3RlbmVycyIsInRyaWdnZXIiLCJwYXJhbXMiLCJfdHlwZSIsImxlbiIsImdlbmVyYXRlQ2hhcnMiLCJjaGFycyIsInJhbmRvbUNoYXIiLCJmdW5jIiwiY29udGV4dCIsIl9jb252ZXJ0RGF0YSIsIm9yaWdpbmFsS2V5IiwiZGF0YUxldmVsIiwiaGFzU2Nyb2xsIiwiJGVsIiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwiaW5uZXJIZWlnaHQiLCJzY3JvbGxIZWlnaHQiLCJpbm5lcldpZHRoIiwic2Nyb2xsV2lkdGgiLCJlc2NhcGVNYXJrdXAiLCJtYXJrdXAiLCJyZXBsYWNlTWFwIiwiU3RyaW5nIiwibWF0Y2giLCJhcHBlbmRNYW55IiwiJGVsZW1lbnQiLCIkbm9kZXMiLCJqcXVlcnkiLCJzdWJzdHIiLCIkanFOb2RlcyIsIm5vZGUiLCJhcHBlbmQiLCJSZXN1bHRzIiwiZGF0YUFkYXB0ZXIiLCJyZW5kZXIiLCIkcmVzdWx0cyIsImF0dHIiLCJjbGVhciIsImRpc3BsYXlNZXNzYWdlIiwiaGlkZUxvYWRpbmciLCIkbWVzc2FnZSIsImhpZGVNZXNzYWdlcyIsImZpbmQiLCIkb3B0aW9ucyIsInJlc3VsdHMiLCIkb3B0aW9uIiwib3B0aW9uIiwiJGRyb3Bkb3duIiwiJHJlc3VsdHNDb250YWluZXIiLCJzb3J0ZXIiLCJoaWdobGlnaHRGaXJzdEl0ZW0iLCIkc2VsZWN0ZWQiLCJmaXJzdCIsImVuc3VyZUhpZ2hsaWdodFZpc2libGUiLCJzZXRDbGFzc2VzIiwic2VsZWN0ZWQiLCJzZWxlY3RlZElkcyIsImVhY2giLCJlbGVtZW50IiwiaW5BcnJheSIsInNob3dMb2FkaW5nIiwibG9hZGluZ01vcmUiLCJsb2FkaW5nIiwidGV4dCIsIiRsb2FkaW5nIiwicHJlcGVuZCIsImF0dHJzIiwiX3Jlc3VsdElkIiwicm9sZSIsInZhbCIsImxhYmVsIiwiJGxhYmVsIiwiJGNoaWxkcmVuIiwiY2hpbGQiLCIkY2hpbGQiLCIkY2hpbGRyZW5Db250YWluZXIiLCJjb250YWluZXIiLCIkY29udGFpbmVyIiwicmVtb3ZlQXR0ciIsIiRoaWdobGlnaHRlZCIsImdldEhpZ2hsaWdodGVkUmVzdWx0cyIsImN1cnJlbnRJbmRleCIsIm5leHRJbmRleCIsIiRuZXh0IiwiZXEiLCJjdXJyZW50T2Zmc2V0IiwibmV4dFRvcCIsIm5leHRPZmZzZXQiLCJvdXRlckhlaWdodCIsIm5leHRCb3R0b20iLCJtb3VzZXdoZWVsIiwiaXNBdFRvcCIsImlzQXRCb3R0b20iLCJldnQiLCIkdGhpcyIsImRlc3Ryb3kiLCJvZmZzZXREZWx0YSIsInJlc3VsdCIsImNvbnRlbnQiLCJLRVlTIiwiQkFDS1NQQUNFIiwiVEFCIiwiRU5URVIiLCJTSElGVCIsIkNUUkwiLCJBTFQiLCJFU0MiLCJTUEFDRSIsIlBBR0VfVVAiLCJQQUdFX0RPV04iLCJFTkQiLCJIT01FIiwiTEVGVCIsIlVQIiwiUklHSFQiLCJET1dOIiwiREVMRVRFIiwiQmFzZVNlbGVjdGlvbiIsIiRzZWxlY3Rpb24iLCJfdGFiaW5kZXgiLCJyZXN1bHRzSWQiLCJfaGFuZGxlQmx1ciIsIl9hdHRhY2hDbG9zZUhhbmRsZXIiLCJfZGV0YWNoQ2xvc2VIYW5kbGVyIiwiYWN0aXZlRWxlbWVudCIsIiR0YXJnZXQiLCIkc2VsZWN0IiwiY2xvc2VzdCIsIiRhbGwiLCIkc2VsZWN0aW9uQ29udGFpbmVyIiwiU2luZ2xlU2VsZWN0aW9uIiwic2VsZWN0aW9uQ29udGFpbmVyIiwic2VsZWN0aW9uIiwiJHJlbmRlcmVkIiwiZm9ybWF0dGVkIiwiTXVsdGlwbGVTZWxlY3Rpb24iLCIkcmVtb3ZlIiwicGFyZW50IiwiJHNlbGVjdGlvbnMiLCJQbGFjZWhvbGRlciIsImRlY29yYXRlZCIsInBsYWNlaG9sZGVyIiwibm9ybWFsaXplUGxhY2Vob2xkZXIiLCJjcmVhdGVQbGFjZWhvbGRlciIsIiRwbGFjZWhvbGRlciIsInNpbmdsZVBsYWNlaG9sZGVyIiwibXVsdGlwbGVTZWxlY3Rpb25zIiwiQWxsb3dDbGVhciIsIl9oYW5kbGVDbGVhciIsIl9oYW5kbGVLZXlib2FyZENsZWFyIiwiJGNsZWFyIiwidW5zZWxlY3REYXRhIiwicHJldmVudGVkIiwiU2VhcmNoIiwiJHNlYXJjaCIsIiRzZWFyY2hDb250YWluZXIiLCJfdHJhbnNmZXJUYWJJbmRleCIsIl9rZXlVcFByZXZlbnRlZCIsImlzRGVmYXVsdFByZXZlbnRlZCIsIiRwcmV2aW91c0Nob2ljZSIsInNlYXJjaFJlbW92ZUNob2ljZSIsIm1zaWUiLCJkb2N1bWVudE1vZGUiLCJkaXNhYmxlSW5wdXRFdmVudHMiLCJoYW5kbGVTZWFyY2giLCJzZWFyY2hIYWRGb2N1cyIsInJlc2l6ZVNlYXJjaCIsImlucHV0IiwidGVybSIsImNzcyIsIm1pbmltdW1XaWR0aCIsIkV2ZW50UmVsYXkiLCJyZWxheUV2ZW50cyIsInByZXZlbnRhYmxlRXZlbnRzIiwiRXZlbnQiLCJUcmFuc2xhdGlvbiIsImRpY3QiLCJ0cmFuc2xhdGlvbiIsIl9jYWNoZSIsImxvYWRQYXRoIiwicGF0aCIsInRyYW5zbGF0aW9ucyIsImRpYWNyaXRpY3MiLCJCYXNlQWRhcHRlciIsInF1ZXJ5IiwiZ2VuZXJhdGVSZXN1bHRJZCIsIlNlbGVjdEFkYXB0ZXIiLCJzZWxlY3QiLCJpcyIsImN1cnJlbnREYXRhIiwidW5zZWxlY3QiLCJyZW1vdmVEYXRhIiwibWF0Y2hlcyIsImFkZE9wdGlvbnMiLCJ0ZXh0Q29udGVudCIsImlubmVyVGV4dCIsIm5vcm1hbGl6ZWREYXRhIiwiX25vcm1hbGl6ZUl0ZW0iLCJpc1BsYWluT2JqZWN0IiwiZGVmYXVsdHMiLCJtYXRjaGVyIiwiQXJyYXlBZGFwdGVyIiwiY29udmVydFRvT3B0aW9ucyIsImVsbSIsIiRleGlzdGluZyIsImV4aXN0aW5nSWRzIiwib25seUl0ZW0iLCIkZXhpc3RpbmdPcHRpb24iLCJleGlzdGluZ0RhdGEiLCJuZXdEYXRhIiwiJG5ld09wdGlvbiIsInJlcGxhY2VXaXRoIiwiQWpheEFkYXB0ZXIiLCJhamF4T3B0aW9ucyIsIl9hcHBseURlZmF1bHRzIiwicHJvY2Vzc1Jlc3VsdHMiLCJ0cmFuc3BvcnQiLCJzdWNjZXNzIiwiZmFpbHVyZSIsIiRyZXF1ZXN0IiwiZmFpbCIsIl9yZXF1ZXN0IiwiaXNGdW5jdGlvbiIsInVybCIsImRlbGF5IiwiX3F1ZXJ5VGltZW91dCIsIlRhZ3MiLCJ0YWdzIiwiY3JlYXRlVGFnIiwiaW5zZXJ0VGFnIiwidGFnIiwiX3JlbW92ZU9sZFRhZ3MiLCJwYWdlIiwid3JhcHBlciIsImNoZWNrQ2hpbGRyZW4iLCJjaGVja1RleHQiLCJfbGFzdFRhZyIsIlRva2VuaXplciIsInRva2VuaXplciIsImRyb3Bkb3duIiwiY3JlYXRlQW5kU2VsZWN0IiwiJGV4aXN0aW5nT3B0aW9ucyIsInRva2VuRGF0YSIsInNlcGFyYXRvcnMiLCJ0ZXJtQ2hhciIsInBhcnRQYXJhbXMiLCJNaW5pbXVtSW5wdXRMZW5ndGgiLCJtaW5pbXVtSW5wdXRMZW5ndGgiLCJtaW5pbXVtIiwiTWF4aW11bUlucHV0TGVuZ3RoIiwibWF4aW11bUlucHV0TGVuZ3RoIiwibWF4aW11bSIsIk1heGltdW1TZWxlY3Rpb25MZW5ndGgiLCJtYXhpbXVtU2VsZWN0aW9uTGVuZ3RoIiwiY291bnQiLCJEcm9wZG93biIsInNob3dTZWFyY2giLCJIaWRlUGxhY2Vob2xkZXIiLCJyZW1vdmVQbGFjZWhvbGRlciIsIm1vZGlmaWVkRGF0YSIsIkluZmluaXRlU2Nyb2xsIiwibGFzdFBhcmFtcyIsIiRsb2FkaW5nTW9yZSIsImNyZWF0ZUxvYWRpbmdNb3JlIiwic2hvd0xvYWRpbmdNb3JlIiwiaXNMb2FkTW9yZVZpc2libGUiLCJsb2FkaW5nTW9yZU9mZnNldCIsImxvYWRNb3JlIiwicGFnaW5hdGlvbiIsIm1vcmUiLCJBdHRhY2hCb2R5IiwiJGRyb3Bkb3duUGFyZW50Iiwic2V0dXBSZXN1bHRzRXZlbnRzIiwiX3Nob3dEcm9wZG93biIsIl9hdHRhY2hQb3NpdGlvbmluZ0hhbmRsZXIiLCJfcG9zaXRpb25Ecm9wZG93biIsIl9yZXNpemVEcm9wZG93biIsIl9oaWRlRHJvcGRvd24iLCJfZGV0YWNoUG9zaXRpb25pbmdIYW5kbGVyIiwiJGRyb3Bkb3duQ29udGFpbmVyIiwiZGV0YWNoIiwic2Nyb2xsRXZlbnQiLCJyZXNpemVFdmVudCIsIm9yaWVudGF0aW9uRXZlbnQiLCIkd2F0Y2hlcnMiLCJwYXJlbnRzIiwiZXYiLCIkd2luZG93IiwiaXNDdXJyZW50bHlBYm92ZSIsImlzQ3VycmVudGx5QmVsb3ciLCJuZXdEaXJlY3Rpb24iLCJ2aWV3cG9ydCIsImVub3VnaFJvb21BYm92ZSIsImVub3VnaFJvb21CZWxvdyIsIiRvZmZzZXRQYXJlbnQiLCJvZmZzZXRQYXJlbnQiLCJwYXJlbnRPZmZzZXQiLCJvdXRlcldpZHRoIiwiYXBwZW5kVG8iLCJjb3VudFJlc3VsdHMiLCJNaW5pbXVtUmVzdWx0c0ZvclNlYXJjaCIsIm1pbmltdW1SZXN1bHRzRm9yU2VhcmNoIiwiSW5maW5pdHkiLCJTZWxlY3RPbkNsb3NlIiwiX2hhbmRsZVNlbGVjdE9uQ2xvc2UiLCJvcmlnaW5hbFNlbGVjdDJFdmVudCIsIiRoaWdobGlnaHRlZFJlc3VsdHMiLCJDbG9zZU9uU2VsZWN0IiwiX3NlbGVjdFRyaWdnZXJlZCIsImVycm9yTG9hZGluZyIsImlucHV0VG9vTG9uZyIsIm92ZXJDaGFycyIsImlucHV0VG9vU2hvcnQiLCJyZW1haW5pbmdDaGFycyIsIm1heGltdW1TZWxlY3RlZCIsIm5vUmVzdWx0cyIsInNlYXJjaGluZyIsIlJlc3VsdHNMaXN0IiwiU2VsZWN0aW9uU2VhcmNoIiwiRElBQ1JJVElDUyIsIlNlbGVjdERhdGEiLCJBcnJheURhdGEiLCJBamF4RGF0YSIsIkRyb3Bkb3duU2VhcmNoIiwiRW5nbGlzaFRyYW5zbGF0aW9uIiwiRGVmYXVsdHMiLCJ0b2tlblNlcGFyYXRvcnMiLCJRdWVyeSIsImFtZEJhc2UiLCJpbml0U2VsZWN0aW9uIiwiSW5pdFNlbGVjdGlvbiIsInJlc3VsdHNBZGFwdGVyIiwic2VsZWN0T25DbG9zZSIsImRyb3Bkb3duQWRhcHRlciIsIm11bHRpcGxlIiwiU2VhcmNoYWJsZURyb3Bkb3duIiwiY2xvc2VPblNlbGVjdCIsImRyb3Bkb3duQ3NzQ2xhc3MiLCJkcm9wZG93bkNzcyIsImFkYXB0RHJvcGRvd25Dc3NDbGFzcyIsIkRyb3Bkb3duQ1NTIiwic2VsZWN0aW9uQWRhcHRlciIsImFsbG93Q2xlYXIiLCJjb250YWluZXJDc3NDbGFzcyIsImNvbnRhaW5lckNzcyIsImFkYXB0Q29udGFpbmVyQ3NzQ2xhc3MiLCJDb250YWluZXJDU1MiLCJsYW5ndWFnZSIsImxhbmd1YWdlUGFydHMiLCJiYXNlTGFuZ3VhZ2UiLCJsYW5ndWFnZXMiLCJsYW5ndWFnZU5hbWVzIiwiYW1kTGFuZ3VhZ2VCYXNlIiwiZXgiLCJkZWJ1ZyIsImJhc2VUcmFuc2xhdGlvbiIsImN1c3RvbVRyYW5zbGF0aW9uIiwic3RyaXBEaWFjcml0aWNzIiwib3JpZ2luYWwiLCJkcm9wZG93bkF1dG9XaWR0aCIsInRlbXBsYXRlUmVzdWx0IiwidGVtcGxhdGVTZWxlY3Rpb24iLCJ0aGVtZSIsInNldCIsImNhbWVsS2V5IiwiY2FtZWxDYXNlIiwiY29udmVydGVkRGF0YSIsIk9wdGlvbnMiLCJmcm9tRWxlbWVudCIsIklucHV0Q29tcGF0IiwiZXhjbHVkZWREYXRhIiwiZGlyIiwiZGF0YXNldCIsIlNlbGVjdDIiLCJfZ2VuZXJhdGVJZCIsInRhYmluZGV4IiwiRGF0YUFkYXB0ZXIiLCJfcGxhY2VDb250YWluZXIiLCJTZWxlY3Rpb25BZGFwdGVyIiwiRHJvcGRvd25BZGFwdGVyIiwiUmVzdWx0c0FkYXB0ZXIiLCJfYmluZEFkYXB0ZXJzIiwiX3JlZ2lzdGVyRG9tRXZlbnRzIiwiX3JlZ2lzdGVyRGF0YUV2ZW50cyIsIl9yZWdpc3RlclNlbGVjdGlvbkV2ZW50cyIsIl9yZWdpc3RlckRyb3Bkb3duRXZlbnRzIiwiX3JlZ2lzdGVyUmVzdWx0c0V2ZW50cyIsIl9yZWdpc3RlckV2ZW50cyIsImluaXRpYWxEYXRhIiwiX3N5bmNBdHRyaWJ1dGVzIiwiaW5zZXJ0QWZ0ZXIiLCJfcmVzb2x2ZVdpZHRoIiwibWV0aG9kIiwiV0lEVEgiLCJzdHlsZVdpZHRoIiwiZWxlbWVudFdpZHRoIiwiX3N5bmNBIiwiX3N5bmNTIiwiX3N5bmNTdWJ0cmVlIiwib2JzZXJ2ZXIiLCJNb3pNdXRhdGlvbk9ic2VydmVyIiwiX29ic2VydmVyIiwibXV0YXRpb25zIiwiYXR0cmlidXRlcyIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJub25SZWxheUV2ZW50cyIsInRvZ2dsZURyb3Bkb3duIiwiY2xvc2UiLCJjaGFuZ2VkIiwibm9kZU5hbWUiLCJhZGRlZE5vZGVzIiwicmVtb3ZlZE5vZGVzIiwiYWN0dWFsVHJpZ2dlciIsInByZVRyaWdnZXJNYXAiLCJwcmVUcmlnZ2VyTmFtZSIsInByZVRyaWdnZXJBcmdzIiwiaGFzRm9jdXMiLCJuZXdWYWwiLCJkaXNjb25uZWN0IiwidGhpc01ldGhvZHMiLCJpbnN0YW5jZU9wdGlvbnMiLCJpbnN0YW5jZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7OztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOzs7O0FBSUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxZQUFZOztBQUVwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUYsb0JBQW9COztBQUVwQjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLFNBQVM7QUFDbEI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLFlBQVk7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFlBQVk7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBLGdCQUFnQixJQUFJOztBQUVwQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsSUFBSTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZ0NBQWdDLE1BQU07QUFDdEM7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsZUFBZTs7QUFFZixTQUFTOztBQUVUO0FBQ0EsUUFBUSxpQ0FBaUM7QUFDekMsUUFBUSxvQkFBb0I7QUFDNUIsUUFBUSxzQ0FBc0M7QUFDOUMsUUFBUTtBQUNSLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixhQUFhLEVBQUU7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDREQUE0RDs7QUFFNUQ7QUFDQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7O0FBRTdEO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnRUFBZ0U7O0FBRWhFO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxpRUFBaUUsVUFBVTtBQUMzRSxzQ0FBc0MsMkJBQTJCO0FBQ2pFO0FBQ0EsZ0NBQWdDLE1BQU07QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxVQUFVLFVBQVU7QUFDcEI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsVUFBVSxjQUFjO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsWUFBWSx1RUFBdUU7QUFDbkY7QUFDQTtBQUNBLFlBQVksNEJBQTRCO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLDJEQUEyRDs7QUFFM0Q7QUFDQTtBQUNBLG9GQUFvRjs7QUFFcEY7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxTQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLFNBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsUUFBUSxTQUFTO0FBQ2pCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxpREFBaUQ7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQsVUFBVSx3Q0FBd0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsUUFBUSxHQUFHO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7Ozs7QUFJQTs7QUFFQTs7QUFFQTtBQUNBOzs7O0FBSUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTs7QUFFQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsT0FBTztBQUNqQiwwQkFBMEIsd0JBQXdCOztBQUVsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGNBQWM7QUFDeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3Q0FBd0Msc0NBQXNDO0FBQzlFLG9DQUFvQyx1Q0FBdUM7QUFDM0Usb0NBQW9DLHNDQUFzQztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVOztBQUVWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DO0FBQ3BDLHFDQUFxQztBQUNyQyxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7Ozs7QUFLQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVLFNBQVM7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsYUFBYTtBQUNwQyxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLGdCQUFnQjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7Ozs7QUFJQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEVBQUU7QUFDRjs7QUFFQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsT0FBTztBQUNmOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGdCQUFnQjtBQUNsQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsV0FBVzs7QUFFWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7O0FBRUE7QUFDQTs7QUFFQSxjQUFjLHNCQUFzQjtBQUNwQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsK0RBQStEO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxjQUFjOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG1CQUFtQjtBQUNwQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHVDQUF1QztBQUNqRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsdURBQXVEO0FBQzlFOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsY0FBYztBQUNuRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkMsT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVSxPQUFPO0FBQ2pCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsK0JBQStCO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMscUNBQXFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUEsU0FBUyw4QkFBOEI7QUFDdkM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFlBQVksT0FBTztBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVztBQUNwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUIsc0JBQXNCLGNBQWM7QUFDcEMsZ0JBQWdCLFdBQVcsWUFBWTtBQUN2QyxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsVUFBVSxTQUFTLE1BQU0sYUFBYTtBQUMzRSxhQUFhLGVBQWU7QUFDNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDOzs7QUFHRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLCtEQUErRDtBQUMzRTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxRQUFRLE9BQU87O0FBRWY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBOztBQUVBLFVBQVUsT0FBTztBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBOztBQUVBLFdBQVcsU0FBUztBQUNwQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBLFFBQVEsT0FBTztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxnQkFBZ0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixpREFBaUQsMEJBQTBCO0FBQzNFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxnQkFBZ0I7QUFDMUI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQTs7QUFFQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBLFFBQVEsZ0JBQWdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxnQkFBZ0I7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsY0FBYztBQUNsQyxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0JBQStCLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGtCQUFrQjtBQUM1QixXQUFXLGtCQUFrQjtBQUM3QixjQUFjO0FBQ2QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxRQUFRLG1CQUFtQjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7QUFLRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLGlDQUFpQztBQUNqQztBQUNBOztBQUVBLElBQUk7QUFDSjs7QUFFQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFNBQVM7QUFDcEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7OztBQUdBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxLQUFLO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFDQUFxQzs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYixLQUFLO0FBQ0w7O0FBRUEsV0FBVztBQUNYLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQixnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjtBQUNqQixTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQSxzQkFBc0I7QUFDdEIsMkJBQTJCOztBQUUzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcseUJBQXlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSDs7QUFFQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkIsNERBQTRELGVBQWU7QUFDM0U7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxzREFBc0Q7QUFDcEU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QVUsR0FoQ0s7QUFpQ2Ysa0JBQVUsR0FqQ0s7QUFrQ2Ysa0JBQVUsSUFsQ0s7QUFtQ2YsZ0JBQVUsSUFuQ0s7QUFvQ2Ysa0JBQVUsSUFwQ0s7QUFxQ2Ysa0JBQVUsSUFyQ0s7QUFzQ2Ysa0JBQVUsSUF0Q0s7QUF1Q2Ysa0JBQVUsSUF2Q0s7QUF3Q2Ysa0JBQVUsSUF4Q0s7QUF5Q2Ysa0JBQVUsSUF6Q0s7QUEwQ2Ysa0JBQVUsSUExQ0s7QUEyQ2Ysa0JBQVUsR0EzQ0s7QUE0Q2Ysa0JBQVUsR0E1Q0s7QUE2Q2Ysa0JBQVUsR0E3Q0s7QUE4Q2Ysa0JBQVUsR0E5Q0s7QUErQ2Ysa0JBQVUsR0EvQ0s7QUFnRGYsa0JBQVUsR0FoREs7QUFpRGYsa0JBQVUsR0FqREs7QUFrRGYsa0JBQVUsR0FsREs7QUFtRGYsa0JBQVUsR0FuREs7QUFvRGYsa0JBQVUsR0FwREs7QUFxRGYsa0JBQVUsR0FyREs7QUFzRGYsa0JBQVUsR0F0REs7QUF1RGYsa0JBQVUsR0F2REs7QUF3RGYsa0JBQVUsR0F4REs7QUF5RGYsZ0JBQVUsR0F6REs7QUEwRGYsa0JBQVUsR0ExREs7QUEyRGYsa0JBQVUsR0EzREs7QUE0RGYsa0JBQVUsR0E1REs7QUE2RGYsa0JBQVUsR0E3REs7QUE4RGYsa0JBQVUsR0E5REs7QUErRGYsa0JBQVUsR0EvREs7QUFnRWYsa0JBQVUsR0FoRUs7QUFpRWYsa0JBQVUsR0FqRUs7QUFrRWYsa0JBQVUsR0FsRUs7QUFtRWYsa0JBQVUsR0FuRUs7QUFvRWYsa0JBQVUsR0FwRUs7QUFxRWYsa0JBQVUsR0FyRUs7QUFzRWYsa0JBQVUsR0F0RUs7QUF1RWYsa0JBQVUsR0F2RUs7QUF3RWYsa0JBQVUsR0F4RUs7QUF5RWYsa0JBQVUsR0F6RUs7QUEwRWYsa0JBQVUsR0ExRUs7QUEyRWYsa0JBQVUsSUEzRUs7QUE0RWYsa0JBQVUsSUE1RUs7QUE2RWYsa0JBQVUsSUE3RUs7QUE4RWYsa0JBQVUsSUE5RUs7QUErRWYsa0JBQVUsR0EvRUs7QUFnRmYsa0JBQVUsR0FoRks7QUFpRmYsZ0JBQVUsR0FqRks7QUFrRmYsZ0JBQVUsR0FsRks7QUFtRmYsZ0JBQVUsR0FuRks7QUFvRmYsa0JBQVUsR0FwRks7QUFxRmYsa0JBQVUsR0FyRks7QUFzRmYsa0JBQVUsR0F0Rks7QUF1RmYsa0JBQVUsR0F2Rks7QUF3RmYsa0JBQVUsR0F4Rks7QUF5RmYsa0JBQVUsR0F6Rks7QUEwRmYsa0JBQVUsR0ExRks7QUEyRmYsa0JBQVUsR0EzRks7QUE0RmYsa0JBQVUsR0E1Rks7QUE2RmYsa0JBQVUsR0E3Rks7QUE4RmYsZ0JBQVUsR0E5Rks7QUErRmYsa0JBQVUsR0EvRks7QUFnR2Ysa0JBQVUsR0FoR0s7QUFpR2Ysa0JBQVUsR0FqR0s7QUFrR2Ysa0JBQVUsR0FsR0s7QUFtR2Ysa0JBQVUsR0FuR0s7QUFvR2Ysa0JBQVUsR0FwR0s7QUFxR2Ysa0JBQVUsR0FyR0s7QUFzR2Ysa0JBQVUsR0F0R0s7QUF1R2Ysa0JBQVUsR0F2R0s7QUF3R2Ysa0JBQVUsR0F4R0s7QUF5R2Ysa0JBQVUsR0F6R0s7QUEwR2Ysa0JBQVUsR0ExR0s7QUEyR2Ysa0JBQVUsR0EzR0s7QUE0R2Ysa0JBQVUsR0E1R0s7QUE2R2Ysa0JBQVUsR0E3R0s7QUE4R2Ysa0JBQVUsR0E5R0s7QUErR2Ysa0JBQVUsR0EvR0s7QUFnSGYsa0JBQVUsR0FoSEs7QUFpSGYsa0JBQVUsR0FqSEs7QUFrSGYsa0JBQVUsR0FsSEs7QUFtSGYsa0JBQVUsR0FuSEs7QUFvSGYsa0JBQVUsR0FwSEs7QUFxSGYsa0JBQVUsR0FySEs7QUFzSGYsa0JBQVUsR0F0SEs7QUF1SGYsa0JBQVUsR0F2SEs7QUF3SGYsa0JBQVUsR0F4SEs7QUF5SGYsa0JBQVUsR0F6SEs7QUEwSGYsa0JBQVUsR0ExSEs7QUEySGYsa0JBQVUsR0EzSEs7QUE0SGYsa0JBQVUsR0E1SEs7QUE2SGYsa0JBQVUsR0E3SEs7QUE4SGYsa0JBQVUsR0E5SEs7QUErSGYsa0JBQVUsR0EvSEs7QUFnSWYsa0JBQVUsR0FoSUs7QUFpSWYsa0JBQVUsR0FqSUs7QUFrSWYsa0JBQVUsR0FsSUs7QUFtSWYsa0JBQVUsR0FuSUs7QUFvSWYsa0JBQVUsR0FwSUs7QUFxSWYsa0JBQVUsR0FySUs7QUFzSWYsa0JBQVUsR0F0SUs7QUF1SWYsa0JBQVUsR0F2SUs7QUF3SWYsa0JBQVUsR0F4SUs7QUF5SWYsa0JBQVUsR0F6SUs7QUEwSWYsa0JBQVUsR0ExSUs7QUEySWYsa0JBQVUsR0EzSUs7QUE0SWYsa0JBQVUsR0E1SUs7QUE2SWYsa0JBQVUsR0E3SUs7QUE4SWYsZ0JBQVUsR0E5SUs7QUErSWYsZ0JBQVUsR0EvSUs7QUFnSmYsZ0JBQVUsR0FoSks7QUFpSmYsa0JBQVUsR0FqSks7QUFrSmYsa0JBQVUsR0FsSks7QUFtSmYsa0JBQVUsR0FuSks7QUFvSmYsa0JBQVUsR0FwSks7QUFxSmYsZ0JBQVUsR0FySks7QUFzSmYsa0JBQVUsR0F0Sks7QUF1SmYsa0JBQVUsR0F2Sks7QUF3SmYsa0JBQVUsR0F4Sks7QUF5SmYsa0JBQVUsR0F6Sks7QUEwSmYsa0JBQVUsR0ExSks7QUEySmYsa0JBQVUsR0EzSks7QUE0SmYsa0JBQVUsR0E1Sks7QUE2SmYsa0JBQVUsR0E3Sks7QUE4SmYsa0JBQVUsR0E5Sks7QUErSmYsa0JBQVUsR0EvSks7QUFnS2Ysa0JBQVUsR0FoS0s7QUFpS2Ysa0JBQVUsR0FqS0s7QUFrS2Ysa0JBQVUsR0FsS0s7QUFtS2Ysa0JBQVUsR0FuS0s7QUFvS2Ysa0JBQVUsR0FwS0s7QUFxS2Ysa0JBQVUsR0FyS0s7QUFzS2Ysa0JBQVUsR0F0S0s7QUF1S2Ysa0JBQVUsR0F2S0s7QUF3S2Ysa0JBQVUsR0F4S0s7QUF5S2Ysa0JBQVUsR0F6S0s7QUEwS2Ysa0JBQVUsR0ExS0s7QUEyS2Ysa0JBQVUsR0EzS0s7QUE0S2Ysa0JBQVUsR0E1S0s7QUE2S2Ysa0JBQVUsR0E3S0s7QUE4S2Ysa0JBQVUsR0E5S0s7QUErS2Ysa0JBQVUsR0EvS0s7QUFnTGYsa0JBQVUsR0FoTEs7QUFpTGYsa0JBQVUsR0FqTEs7QUFrTGYsa0JBQVUsR0FsTEs7QUFtTGYsa0JBQVUsR0FuTEs7QUFvTGYsa0JBQVUsR0FwTEs7QUFxTGYsa0JBQVUsR0FyTEs7QUFzTGYsa0JBQVUsR0F0TEs7QUF1TGYsa0JBQVUsR0F2TEs7QUF3TGYsa0JBQVUsR0F4TEs7QUF5TGYsa0JBQVUsR0F6TEs7QUEwTGYsa0JBQVUsR0ExTEs7QUEyTGYsa0JBQVUsR0EzTEs7QUE0TGYsa0JBQVUsR0E1TEs7QUE2TGYsa0JBQVUsR0E3TEs7QUE4TGYsa0JBQVUsR0E5TEs7QUErTGYsa0JBQVUsR0EvTEs7QUFnTWYsa0JBQVUsR0FoTUs7QUFpTWYsa0JBQVUsSUFqTUs7QUFrTWYsa0JBQVUsSUFsTUs7QUFtTWYsa0JBQVUsR0FuTUs7QUFvTWYsa0JBQVUsR0FwTUs7QUFxTWYsa0JBQVUsR0FyTUs7QUFzTWYsa0JBQVUsR0F0TUs7QUF1TWYsa0JBQVUsR0F2TUs7QUF3TWYsa0JBQVUsR0F4TUs7QUF5TWYsa0JBQVUsR0F6TUs7QUEwTWYsa0JBQVUsR0ExTUs7QUEyTWYsa0JBQVUsR0EzTUs7QUE0TWYsa0JBQVUsR0E1TUs7QUE2TWYsa0JBQVUsR0E3TUs7QUE4TWYsZ0JBQVUsR0E5TUs7QUErTWYsa0JBQVUsR0EvTUs7QUFnTmYsa0JBQVUsR0FoTks7QUFpTmYsa0JBQVUsR0FqTks7QUFrTmYsa0JBQVUsR0FsTks7QUFtTmYsa0JBQVUsR0FuTks7QUFvTmYsa0JBQVUsR0FwTks7QUFxTmYsa0JBQVUsR0FyTks7QUFzTmYsa0JBQVUsR0F0Tks7QUF1TmYsa0JBQVUsR0F2Tks7QUF3TmYsa0JBQVUsR0F4Tks7QUF5TmYsa0JBQVUsSUF6Tks7QUEwTmYsa0JBQVUsSUExTks7QUEyTmYsa0JBQVUsR0EzTks7QUE0TmYsa0JBQVUsR0E1Tks7QUE2TmYsZ0JBQVUsR0E3Tks7QUE4TmYsZ0JBQVUsR0E5Tks7QUErTmYsZ0JBQVUsR0EvTks7QUFnT2Ysa0JBQVUsR0FoT0s7QUFpT2Ysa0JBQVUsR0FqT0s7QUFrT2Ysa0JBQVUsR0FsT0s7QUFtT2Ysa0JBQVUsR0FuT0s7QUFvT2YsZ0JBQVUsR0FwT0s7QUFxT2Ysa0JBQVUsR0FyT0s7QUFzT2Ysa0JBQVUsR0F0T0s7QUF1T2Ysa0JBQVUsR0F2T0s7QUF3T2Ysa0JBQVUsR0F4T0s7QUF5T2Ysa0JBQVUsR0F6T0s7QUEwT2Ysa0JBQVUsR0ExT0s7QUEyT2Ysa0JBQVUsR0EzT0s7QUE0T2Ysa0JBQVUsR0E1T0s7QUE2T2Ysa0JBQVUsR0E3T0s7QUE4T2YsZ0JBQVUsR0E5T0s7QUErT2Ysa0JBQVUsR0EvT0s7QUFnUGYsa0JBQVUsR0FoUEs7QUFpUGYsa0JBQVUsR0FqUEs7QUFrUGYsa0JBQVUsR0FsUEs7QUFtUGYsa0JBQVUsR0FuUEs7QUFvUGYsa0JBQVUsR0FwUEs7QUFxUGYsa0JBQVUsR0FyUEs7QUFzUGYsa0JBQVUsR0F0UEs7QUF1UGYsa0JBQVUsR0F2UEs7QUF3UGYsa0JBQVUsR0F4UEs7QUF5UGYsa0JBQVUsR0F6UEs7QUEwUGYsa0JBQVUsR0ExUEs7QUEyUGYsa0JBQVUsR0EzUEs7QUE0UGYsa0JBQVUsR0E1UEs7QUE2UGYsa0JBQVUsR0E3UEs7QUE4UGYsa0JBQVUsR0E5UEs7QUErUGYsZ0JBQVUsR0EvUEs7QUFnUWYsa0JBQVUsR0FoUUs7QUFpUWYsa0JBQVUsR0FqUUs7QUFrUWYsa0JBQVUsR0FsUUs7QUFtUWYsa0JBQVUsR0FuUUs7QUFvUWYsa0JBQVUsR0FwUUs7QUFxUWYsa0JBQVUsSUFyUUs7QUFzUWYsa0JBQVUsSUF0UUs7QUF1UWYsa0JBQVUsSUF2UUs7QUF3UWYsa0JBQVUsR0F4UUs7QUF5UWYsa0JBQVUsR0F6UUs7QUEwUWYsa0JBQVUsR0ExUUs7QUEyUWYsa0JBQVUsR0EzUUs7QUE0UWYsa0JBQVUsR0E1UUs7QUE2UWYsa0JBQVUsR0E3UUs7QUE4UWYsa0JBQVUsR0E5UUs7QUErUWYsa0JBQVUsR0EvUUs7QUFnUmYsa0JBQVUsR0FoUks7QUFpUmYsa0JBQVUsR0FqUks7QUFrUmYsa0JBQVUsR0FsUks7QUFtUmYsa0JBQVUsR0FuUks7QUFvUmYsa0JBQVUsR0FwUks7QUFxUmYsa0JBQVUsR0FyUks7QUFzUmYsa0JBQVUsR0F0Uks7QUF1UmYsa0JBQVUsR0F2Uks7QUF3UmYsa0JBQVUsR0F4Uks7QUF5UmYsa0JBQVUsR0F6Uks7QUEwUmYsa0JBQVUsR0ExUks7QUEyUmYsa0JBQVUsR0EzUks7QUE0UmYsa0JBQVUsR0E1Uks7QUE2UmYsa0JBQVUsR0E3Uks7QUE4UmYsa0JBQVUsR0E5Uks7QUErUmYsa0JBQVUsR0EvUks7QUFnU2Ysa0JBQVUsR0FoU0s7QUFpU2Ysa0JBQVUsR0FqU0s7QUFrU2Ysa0JBQVUsR0FsU0s7QUFtU2Ysa0JBQVUsR0FuU0s7QUFvU2Ysa0JBQVUsR0FwU0s7QUFxU2Ysa0JBQVUsR0FyU0s7QUFzU2Ysa0JBQVUsR0F0U0s7QUF1U2Ysa0JBQVUsR0F2U0s7QUF3U2Ysa0JBQVUsR0F4U0s7QUF5U2Ysa0JBQVUsR0F6U0s7QUEwU2Ysa0JBQVUsR0ExU0s7QUEyU2Ysa0JBQVUsR0EzU0s7QUE0U2Ysa0JBQVUsR0E1U0s7QUE2U2Ysa0JBQVUsR0E3U0s7QUE4U2Ysa0JBQVUsR0E5U0s7QUErU2Ysa0JBQVUsR0EvU0s7QUFnVGYsa0JBQVUsR0FoVEs7QUFpVGYsa0JBQVUsR0FqVEs7QUFrVGYsa0JBQVUsR0FsVEs7QUFtVGYsa0JBQVUsR0FuVEs7QUFvVGYsa0JBQVUsR0FwVEs7QUFxVGYsa0JBQVUsR0FyVEs7QUFzVGYsa0JBQVUsR0F0VEs7QUF1VGYsa0JBQVUsR0F2VEs7QUF3VGYsa0JBQVUsR0F4VEs7QUF5VGYsa0JBQVUsR0F6VEs7QUEwVGYsa0JBQVUsR0ExVEs7QUEyVGYsa0JBQVUsR0EzVEs7QUE0VGYsa0JBQVUsR0E1VEs7QUE2VGYsa0JBQVUsR0E3VEs7QUE4VGYsa0JBQVUsR0E5VEs7QUErVGYsa0JBQVUsR0EvVEs7QUFnVWYsa0JBQVUsR0FoVUs7QUFpVWYsa0JBQVUsR0FqVUs7QUFrVWYsa0JBQVUsR0FsVUs7QUFtVWYsa0JBQVUsR0FuVUs7QUFvVWYsa0JBQVUsSUFwVUs7QUFxVWYsa0JBQVUsR0FyVUs7QUFzVWYsa0JBQVUsR0F0VUs7QUF1VWYsZ0JBQVUsR0F2VUs7QUF3VWYsZ0JBQVUsR0F4VUs7QUF5VWYsZ0JBQVUsR0F6VUs7QUEwVWYsa0JBQVUsR0ExVUs7QUEyVWYsa0JBQVUsR0EzVUs7QUE0VWYsa0JBQVUsR0E1VUs7QUE2VWYsa0JBQVUsR0E3VUs7QUE4VWYsa0JBQVUsR0E5VUs7QUErVWYsZ0JBQVUsR0EvVUs7QUFnVmYsa0JBQVUsR0FoVks7QUFpVmYsa0JBQVUsR0FqVks7QUFrVmYsa0JBQVUsR0FsVks7QUFtVmYsa0JBQVUsR0FuVks7QUFvVmYsa0JBQVUsR0FwVks7QUFxVmYsa0JBQVUsR0FyVks7QUFzVmYsa0JBQVUsR0F0Vks7QUF1VmYsa0JBQVUsR0F2Vks7QUF3VmYsa0JBQVUsR0F4Vks7QUF5VmYsa0JBQVUsR0F6Vks7QUEwVmYsa0JBQVUsR0ExVks7QUEyVmYsa0JBQVUsR0EzVks7QUE0VmYsa0JBQVUsR0E1Vks7QUE2VmYsa0JBQVUsR0E3Vks7QUE4VmYsa0JBQVUsR0E5Vks7QUErVmYsa0JBQVUsR0EvVks7QUFnV2Ysa0JBQVUsR0FoV0s7QUFpV2Ysa0JBQVUsR0FqV0s7QUFrV2Ysa0JBQVUsR0FsV0s7QUFtV2Ysa0JBQVUsR0FuV0s7QUFvV2Ysa0JBQVUsR0FwV0s7QUFxV2Ysa0JBQVUsR0FyV0s7QUFzV2Ysa0JBQVUsR0F0V0s7QUF1V2Ysa0JBQVUsR0F2V0s7QUF3V2Ysa0JBQVUsR0F4V0s7QUF5V2Ysa0JBQVUsR0F6V0s7QUEwV2Ysa0JBQVUsR0ExV0s7QUEyV2Ysa0JBQVUsR0EzV0s7QUE0V2Ysa0JBQVUsR0E1V0s7QUE2V2Ysa0JBQVUsSUE3V0s7QUE4V2Ysa0JBQVUsR0E5V0s7QUErV2Ysa0JBQVUsR0EvV0s7QUFnWGYsa0JBQVUsR0FoWEs7QUFpWGYsa0JBQVUsR0FqWEs7QUFrWGYsa0JBQVUsR0FsWEs7QUFtWGYsa0JBQVUsR0FuWEs7QUFvWGYsa0JBQVUsR0FwWEs7QUFxWGYsa0JBQVUsR0FyWEs7QUFzWGYsa0JBQVUsR0F0WEs7QUF1WGYsa0JBQVUsR0F2WEs7QUF3WGYsa0JBQVUsR0F4WEs7QUF5WGYsa0JBQVUsR0F6WEs7QUEwWGYsa0JBQVUsR0ExWEs7QUEyWGYsa0JBQVUsR0EzWEs7QUE0WGYsa0JBQVUsR0E1WEs7QUE2WGYsa0JBQVUsR0E3WEs7QUE4WGYsZ0JBQVUsR0E5WEs7QUErWGYsa0JBQVUsR0EvWEs7QUFnWWYsa0JBQVUsR0FoWUs7QUFpWWYsa0JBQVUsR0FqWUs7QUFrWWYsa0JBQVUsR0FsWUs7QUFtWWYsa0JBQVUsR0FuWUs7QUFvWWYsa0JBQVUsR0FwWUs7QUFxWWYsa0JBQVUsR0FyWUs7QUFzWWYsa0JBQVUsR0F0WUs7QUF1WWYsa0JBQVUsR0F2WUs7QUF3WWYsa0JBQVUsR0F4WUs7QUF5WWYsa0JBQVUsR0F6WUs7QUEwWWYsa0JBQVUsR0ExWUs7QUEyWWYsa0JBQVUsR0EzWUs7QUE0WWYsa0JBQVUsR0E1WUs7QUE2WWYsa0JBQVUsR0E3WUs7QUE4WWYsa0JBQVUsR0E5WUs7QUErWWYsa0JBQVUsR0EvWUs7QUFnWmYsa0JBQVUsR0FoWks7QUFpWmYsa0JBQVUsR0FqWks7QUFrWmYsa0JBQVUsR0FsWks7QUFtWmYsa0JBQVUsR0FuWks7QUFvWmYsa0JBQVUsR0FwWks7QUFxWmYsa0JBQVUsR0FyWks7QUFzWmYsa0JBQVUsR0F0Wks7QUF1WmYsa0JBQVUsR0F2Wks7QUF3WmYsa0JBQVUsR0F4Wks7QUF5WmYsZ0JBQVUsR0F6Wks7QUEwWmYsZ0JBQVUsR0ExWks7QUEyWmYsZ0JBQVUsR0EzWks7QUE0WmYsa0JBQVUsR0E1Wks7QUE2WmYsa0JBQVUsR0E3Wks7QUE4WmYsa0JBQVUsR0E5Wks7QUErWmYsa0JBQVUsR0EvWks7QUFnYWYsZ0JBQVUsR0FoYUs7QUFpYWYsa0JBQVUsR0FqYUs7QUFrYWYsa0JBQVUsR0FsYUs7QUFtYWYsa0JBQVUsR0FuYUs7QUFvYWYsa0JBQVUsR0FwYUs7QUFxYWYsa0JBQVUsR0FyYUs7QUFzYWYsa0JBQVUsR0F0YUs7QUF1YWYsa0JBQVUsR0F2YUs7QUF3YWYsa0JBQVUsR0F4YUs7QUF5YWYsZ0JBQVUsR0F6YUs7QUEwYWYsa0JBQVUsR0ExYUs7QUEyYWYsa0JBQVUsR0EzYUs7QUE0YWYsZ0JBQVUsR0E1YUs7QUE2YWYsa0JBQVUsR0E3YUs7QUE4YWYsa0JBQVUsR0E5YUs7QUErYWYsa0JBQVUsR0EvYUs7QUFnYmYsa0JBQVUsR0FoYks7QUFpYmYsa0JBQVUsR0FqYks7QUFrYmYsa0JBQVUsR0FsYks7QUFtYmYsa0JBQVUsR0FuYks7QUFvYmYsa0JBQVUsR0FwYks7QUFxYmYsa0JBQVUsR0FyYks7QUFzYmYsa0JBQVUsR0F0Yks7QUF1YmYsa0JBQVUsR0F2Yks7QUF3YmYsa0JBQVUsSUF4Yks7QUF5YmYsZ0JBQVUsSUF6Yks7QUEwYmYsa0JBQVUsSUExYks7QUEyYmYsa0JBQVUsSUEzYks7QUE0YmYsa0JBQVUsSUE1Yks7QUE2YmYsa0JBQVUsSUE3Yks7QUE4YmYsa0JBQVUsSUE5Yks7QUErYmYsa0JBQVUsSUEvYks7QUFnY2Ysa0JBQVUsSUFoY0s7QUFpY2Ysa0JBQVUsR0FqY0s7QUFrY2Ysa0JBQVUsR0FsY0s7QUFtY2Ysa0JBQVUsR0FuY0s7QUFvY2Ysa0JBQVUsR0FwY0s7QUFxY2Ysa0JBQVUsR0FyY0s7QUFzY2Ysa0JBQVUsR0F0Y0s7QUF1Y2Ysa0JBQVUsR0F2Y0s7QUF3Y2Ysa0JBQVUsR0F4Y0s7QUF5Y2Ysa0JBQVUsR0F6Y0s7QUEwY2Ysa0JBQVUsR0ExY0s7QUEyY2Ysa0JBQVUsR0EzY0s7QUE0Y2Ysa0JBQVUsR0E1Y0s7QUE2Y2Ysa0JBQVUsR0E3Y0s7QUE4Y2Ysa0JBQVUsR0E5Y0s7QUErY2YsZ0JBQVUsR0EvY0s7QUFnZGYsa0JBQVUsR0FoZEs7QUFpZGYsa0JBQVUsR0FqZEs7QUFrZGYsa0JBQVUsR0FsZEs7QUFtZGYsa0JBQVUsR0FuZEs7QUFvZGYsa0JBQVUsR0FwZEs7QUFxZGYsa0JBQVUsR0FyZEs7QUFzZGYsa0JBQVUsR0F0ZEs7QUF1ZGYsa0JBQVUsR0F2ZEs7QUF3ZGYsa0JBQVUsR0F4ZEs7QUF5ZGYsa0JBQVUsR0F6ZEs7QUEwZGYsa0JBQVUsR0ExZEs7QUEyZGYsa0JBQVUsR0EzZEs7QUE0ZGYsa0JBQVUsR0E1ZEs7QUE2ZGYsa0JBQVUsR0E3ZEs7QUE4ZGYsa0JBQVUsR0E5ZEs7QUErZGYsa0JBQVUsR0EvZEs7QUFnZWYsa0JBQVUsR0FoZUs7QUFpZWYsa0JBQVUsR0FqZUs7QUFrZWYsa0JB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QUFVLG9DQUFvQ3dJLE9BQTlDLENBQU47QUFDRDtBQUNGLFNBckNEO0FBc0NEOztBQUVELFVBQUk4TSxFQUFFa00sRUFBRixDQUFLb21DLE9BQUwsQ0FBYWdTLFFBQWIsSUFBeUIsSUFBN0IsRUFBbUM7QUFDakN0a0QsVUFBRWtNLEVBQUYsQ0FBS29tQyxPQUFMLENBQWFnUyxRQUFiLEdBQXdCOEgsUUFBeEI7QUFDRDs7QUFFRCxhQUFPZ0QsT0FBUDtBQUNELEtBeEREOztBQTBERTtBQUNBLFdBQU87QUFDTGpkLGNBQVFFLEdBQUdGLE1BRE47QUFFTDVuRCxlQUFTOG5ELEdBQUc5bkQ7QUFGUCxLQUFQO0FBSUQsR0F4akxBLEVBREM7O0FBMmpMQTtBQUNBO0FBQ0EsTUFBSStuRCxVQUFVRCxHQUFHOW5ELE9BQUgsQ0FBVyxnQkFBWCxDQUFkOztBQUVBO0FBQ0E7QUFDQTtBQUNBNm5ELFNBQU9sbUMsRUFBUCxDQUFVb21DLE9BQVYsQ0FBa0JDLEdBQWxCLEdBQXdCRixFQUF4Qjs7QUFFQTtBQUNBLFNBQU9DLE9BQVA7QUFDRCxDQXJsTEEsQ0FBRCxDIiwiZmlsZSI6Ii9hc3NldHMvc3lzdGVtL2pzL3N5c3RlbS1kZXBzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgMGZkYWFlMmVhY2Q0NzE0NWZmYWIiLCIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMi4xXG4gKiBodHRwczovL2pxdWVyeS5jb20vXG4gKlxuICogSW5jbHVkZXMgU2l6emxlLmpzXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNy0wMy0yMFQxODo1OVpcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59ICkoIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gRWRnZSA8PSAxMiAtIDEzKywgRmlyZWZveCA8PTE4IC0gNDUrLCBJRSAxMCAtIDExLCBTYWZhcmkgNS4xIC0gOSssIGlPUyA2IC0gOS4xXG4vLyB0aHJvdyBleGNlcHRpb25zIHdoZW4gbm9uLXN0cmljdCBjb2RlIChlLmcuLCBBU1AuTkVUIDQuNSkgYWNjZXNzZXMgc3RyaWN0IG1vZGVcbi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uXG4vLyBlbm91Z2ggdGhhdCBhbGwgc3VjaCBhdHRlbXB0cyBhcmUgZ3VhcmRlZCBpbiBhIHRyeSBibG9jay5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyID0gW107XG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBjb25jYXQgPSBhcnIuY29uY2F0O1xuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZuVG9TdHJpbmcgPSBoYXNPd24udG9TdHJpbmc7XG5cbnZhciBPYmplY3RGdW5jdGlvblN0cmluZyA9IGZuVG9TdHJpbmcuY2FsbCggT2JqZWN0ICk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cblxuXG5cdGZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYyApIHtcblx0XHRkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7XG5cblx0XHR2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblxuXHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRkb2MuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0ICkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdH1cbi8qIGdsb2JhbCBTeW1ib2wgKi9cbi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8gZGVmaW5lIGdsb2JhbCBvbmx5IGZvciB0aGlzIG1vZHVsZVxuXG5cblxudmFyXG5cdHZlcnNpb24gPSBcIjMuMi4xXCIsXG5cblx0Ly8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnlcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuXHQvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcblx0cnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csXG5cblx0Ly8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXG5cdHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZyxcblxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5cdGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7XG5cdFx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAoIHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHtcblxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgKSB7XG5cdFx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgPyBzcmMgOiB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBjb3B5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3Rcblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2Vcblx0ZXhwYW5kbzogXCJqUXVlcnlcIiArICggdmVyc2lvbiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXFxEL2csIFwiXCIgKSxcblxuXHQvLyBBc3N1bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhlIHJlYWR5IG1vZHVsZVxuXHRpc1JlYWR5OiB0cnVlLFxuXG5cdGVycm9yOiBmdW5jdGlvbiggbXNnICkge1xuXHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cdH0sXG5cblx0bm9vcDogZnVuY3Rpb24oKSB7fSxcblxuXHRpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHJldHVybiBqUXVlcnkudHlwZSggb2JqICkgPT09IFwiZnVuY3Rpb25cIjtcblx0fSxcblxuXHRpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRyZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqID09PSBvYmoud2luZG93O1xuXHR9LFxuXG5cdGlzTnVtZXJpYzogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvXG5cdFx0Ly8gc3RyaW5ncyBhbmQgbnVtYmVycyAocHJpbWl0aXZlcyBvciBvYmplY3RzKVxuXHRcdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdFx0dmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cdFx0cmV0dXJuICggdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcInN0cmluZ1wiICkgJiZcblxuXHRcdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0XHQvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzIChcIjB4Li4uXCIpXG5cdFx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcblx0fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBwcm90bywgQ3RvcjtcblxuXHRcdC8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlc1xuXHRcdC8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0c1xuXHRcdGlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRwcm90byA9IGdldFByb3RvKCBvYmogKTtcblxuXHRcdC8vIE9iamVjdHMgd2l0aCBubyBwcm90b3R5cGUgKGUuZy4sIGBPYmplY3QuY3JlYXRlKCBudWxsIClgKSBhcmUgcGxhaW5cblx0XHRpZiAoICFwcm90byApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIE9iamVjdHMgd2l0aCBwcm90b3R5cGUgYXJlIHBsYWluIGlmZiB0aGV5IHdlcmUgY29uc3RydWN0ZWQgYnkgYSBnbG9iYWwgT2JqZWN0IGZ1bmN0aW9uXG5cdFx0Q3RvciA9IGhhc093bi5jYWxsKCBwcm90bywgXCJjb25zdHJ1Y3RvclwiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7XG5cdFx0cmV0dXJuIHR5cGVvZiBDdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgZm5Ub1N0cmluZy5jYWxsKCBDdG9yICkgPT09IE9iamVjdEZ1bmN0aW9uU3RyaW5nO1xuXHR9LFxuXG5cdGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvNjEyNVxuXHRcdHZhciBuYW1lO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdHR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0aWYgKCBvYmogPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seSAoZnVuY3Rpb25pc2ggUmVnRXhwKVxuXHRcdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XG5cdFx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdFx0dHlwZW9mIG9iajtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dFxuXHRnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHtcblx0XHRET01FdmFsKCBjb2RlICk7XG5cdH0sXG5cblx0Ly8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDEzXG5cdC8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3Milcblx0Y2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkge1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuXHQvLyBhcmd1bWVudHMuXG5cdHByb3h5OiBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdFx0dmFyIHRtcCwgYXJncywgcHJveHk7XG5cblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRcdGNvbnRleHQgPSBmbjtcblx0XHRcdGZuID0gdG1wO1xuXHRcdH1cblxuXHRcdC8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjXG5cdFx0Ly8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gU2ltdWxhdGVkIGJpbmRcblx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdFx0cHJveHkgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApO1xuXHRcdH07XG5cblx0XHQvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWRcblx0XHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKztcblxuXHRcdHJldHVybiBwcm94eTtcblx0fSxcblxuXHRub3c6IERhdGUubm93LFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXG5cdGlmICggdHlwZSA9PT0gXCJmdW5jdGlvblwiIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHR5cGUgPT09IFwiYXJyYXlcIiB8fCBsZW5ndGggPT09IDAgfHxcblx0XHR0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgKCBsZW5ndGggLSAxICkgaW4gb2JqO1xufVxudmFyIFNpenpsZSA9XG4vKiFcbiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuM1xuICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTYtMDgtMDhcbiAqL1xuKGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG5cbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEluc3RhbmNlIG1ldGhvZHNcblx0aGFzT3duID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSxcblx0YXJyID0gW10sXG5cdHBvcCA9IGFyci5wb3AsXG5cdHB1c2hfbmF0aXZlID0gYXJyLnB1c2gsXG5cdHB1c2ggPSBhcnIucHVzaCxcblx0c2xpY2UgPSBhcnIuc2xpY2UsXG5cdC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBhcyBpdCdzIGZhc3RlciB0aGFuIG5hdGl2ZVxuXHQvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFtpXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2Vcblx0d2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIixcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFwwLVxcXFx4YTBdKStcIixcblxuXHQvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBPcGVyYXRvciAoY2FwdHVyZSAyKVxuXHRcdFwiKihbKl4kfCF+XT89KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gXCJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdXCJcblx0XHRcIiooPzonKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCJ8KFwiICsgaWRlbnRpZmllciArIFwiKSl8KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCIqXFxcXF1cIixcblxuXHRwc2V1ZG9zID0gXCI6KFwiICsgaWRlbnRpZmllciArIFwiKSg/OlxcXFwoKFwiICtcblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXHRcdC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KVxuXHRcdFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiICsgYXR0cmlidXRlcyArIFwiKSopfFwiICtcblx0XHQvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpXG5cdFx0XCIuKlwiICtcblx0XHRcIilcXFxcKXwpXCIsXG5cblx0Ly8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlclxuXHRyd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcIitcIiwgXCJnXCIgKSxcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblxuXHRyYXR0cmlidXRlUXVvdGVzID0gbmV3IFJlZ0V4cCggXCI9XCIgKyB3aGl0ZXNwYWNlICsgXCIqKFteXFxcXF0nXFxcIl0qPylcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcXVwiLCBcImdcIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0XCJJRFwiOiBuZXcgUmVnRXhwKCBcIl4jKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJDTEFTU1wiOiBuZXcgUmVnRXhwKCBcIl5cXFxcLihcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiVEFHXCI6IG5ldyBSZWdFeHAoIFwiXihcIiArIGlkZW50aWZpZXIgKyBcInxbKl0pXCIgKSxcblx0XHRcIkFUVFJcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBhdHRyaWJ1dGVzICksXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXG5cdFx0XCJDSElMRFwiOiBuZXcgUmVnRXhwKCBcIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcXFwoXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooXFxcXGQrKXwpKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfClcIiwgXCJpXCIgKSxcblx0XHRcImJvb2xcIjogbmV3IFJlZ0V4cCggXCJeKD86XCIgKyBib29sZWFucyArIFwiKSRcIiwgXCJpXCIgKSxcblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdHJuYXRpdmUgPSAvXltee10rXFx7XFxzKlxcW25hdGl2ZSBcXHcvLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cblx0Ly8gQ1NTIGVzY2FwZXNcblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVyc1xuXHRydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCBcIlxcXFxcXFxcKFtcXFxcZGEtZl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3woXCIgKyB3aGl0ZXNwYWNlICsgXCIpfC4pXCIsIFwiaWdcIiApLFxuXHRmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7XG5cdFx0dmFyIGhpZ2ggPSBcIjB4XCIgKyBlc2NhcGVkIC0gMHgxMDAwMDtcblx0XHQvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludFxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjRcblx0XHQvLyBXb3JrYXJvdW5kIGVycm9uZW91cyBudW1lcmljIGludGVycHJldGF0aW9uIG9mICtcIjB4XCJcblx0XHRyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/XG5cdFx0XHRlc2NhcGVkIDpcblx0XHRcdGhpZ2ggPCAwID9cblx0XHRcdFx0Ly8gQk1QIGNvZGVwb2ludFxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFx0Ly8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpXG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uXG5cdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jY29tbW9uLXNlcmlhbGl6aW5nLWlkaW9tc1xuXHRyY3NzZXNjYXBlID0gLyhbXFwwLVxceDFmXFx4N2ZdfF4tP1xcZCl8Xi0kfFteXFwwLVxceDFmXFx4N2YtXFx1RkZGRlxcdy1dL2csXG5cdGZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkge1xuXHRcdGlmICggYXNDb2RlUG9pbnQgKSB7XG5cblx0XHRcdC8vIFUrMDAwMCBOVUxMIGJlY29tZXMgVStGRkZEIFJFUExBQ0VNRU5UIENIQVJBQ1RFUlxuXHRcdFx0aWYgKCBjaCA9PT0gXCJcXDBcIiApIHtcblx0XHRcdFx0cmV0dXJuIFwiXFx1RkZGRFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb250cm9sIGNoYXJhY3RlcnMgYW5kIChkZXBlbmRlbnQgdXBvbiBwb3NpdGlvbikgbnVtYmVycyBnZXQgZXNjYXBlZCBhcyBjb2RlIHBvaW50c1xuXHRcdFx0cmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgXCJcXFxcXCIgKyBjaC5jaGFyQ29kZUF0KCBjaC5sZW5ndGggLSAxICkudG9TdHJpbmcoIDE2ICkgKyBcIiBcIjtcblx0XHR9XG5cblx0XHQvLyBPdGhlciBwb3RlbnRpYWxseS1zcGVjaWFsIEFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGJhY2tzbGFzaC1lc2NhcGVkXG5cdFx0cmV0dXJuIFwiXFxcXFwiICsgY2g7XG5cdH0sXG5cblx0Ly8gVXNlZCBmb3IgaWZyYW1lc1xuXHQvLyBTZWUgc2V0RG9jdW1lbnQoKVxuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUVcblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH0sXG5cblx0ZGlzYWJsZWRBbmNlc3RvciA9IGFkZENvbWJpbmF0b3IoXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiAoXCJmb3JtXCIgaW4gZWxlbSB8fCBcImxhYmVsXCIgaW4gZWxlbSk7XG5cdFx0fSxcblx0XHR7IGRpcjogXCJwYXJlbnROb2RlXCIsIG5leHQ6IFwibGVnZW5kXCIgfVxuXHQpO1xuXG4vLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKVxudHJ5IHtcblx0cHVzaC5hcHBseShcblx0XHQoYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7IGFwcGx5OiBhcnIubGVuZ3RoID9cblxuXHRcdC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlXG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0cHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHQvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGhcblx0XHRcdHdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge31cblx0XHRcdHRhcmdldC5sZW5ndGggPSBqIC0gMTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBtLCBpLCBlbGVtLCBuaWQsIG1hdGNoLCBncm91cHMsIG5ld1NlbGVjdG9yLFxuXHRcdG5ld0NvbnRleHQgPSBjb250ZXh0ICYmIGNvbnRleHQub3duZXJEb2N1bWVudCxcblxuXHRcdC8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnRcblx0XHRub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dFxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQgdG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHNcblx0aWYgKCAhc2VlZCApIHtcblxuXHRcdGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHRcdH1cblx0XHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHRcdC8vIElmIHRoZSBzZWxlY3RvciBpcyBzdWZmaWNpZW50bHkgc2ltcGxlLCB0cnkgdXNpbmcgYSBcImdldCpCeSpcIiBET00gbWV0aG9kXG5cdFx0XHQvLyAoZXhjZXB0aW5nIERvY3VtZW50RnJhZ21lbnQgY29udGV4dCwgd2hlcmUgdGhlIG1ldGhvZHMgZG9uJ3QgZXhpc3QpXG5cdFx0XHRpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb2N1bWVudCBjb250ZXh0XG5cdFx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmIChlbGVtID0gbmV3Q29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApKSAmJlxuXHRcdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmXG5cdFx0XHRcdFx0XHRcdGVsZW0uaWQgPT09IG0gKSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUeXBlIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzJdICkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0XHQvLyBDbGFzcyBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiZcblx0XHRcdFx0XHRjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggc3VwcG9ydC5xc2EgJiZcblx0XHRcdFx0IWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3RvcjtcblxuXHRcdFx0XHQvLyBxU0EgbG9va3Mgb3V0c2lkZSBFbGVtZW50IGNvbnRleHQsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnRcblx0XHRcdFx0Ly8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWVcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgb2JqZWN0IGVsZW1lbnRzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0aWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApKSApIHtcblx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsIChuaWQgPSBleHBhbmRvKSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzW2ldID0gXCIjXCIgKyBuaWQgKyBcIiBcIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBuZXdTZWxlY3RvciApIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cyxcblx0XHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFsbCBvdGhlcnNcblx0cmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nLCBvYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoXG4gKlx0cHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aClcbiAqXHRkZWxldGluZyB0aGUgb2xkZXN0IGVudHJ5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkge1xuXHR2YXIga2V5cyA9IFtdO1xuXG5cdGZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkge1xuXHRcdC8vIFVzZSAoa2V5ICsgXCIgXCIpIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG5hdGl2ZSBwcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIElzc3VlICMxNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUpO1xuXHR9XG5cdHJldHVybiBjYWNoZTtcbn1cblxuLyoqXG4gKiBNYXJrIGEgZnVuY3Rpb24gZm9yIHNwZWNpYWwgdXNlIGJ5IFNpenpsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIG1hcmtcbiAqL1xuZnVuY3Rpb24gbWFya0Z1bmN0aW9uKCBmbiApIHtcblx0Zm5bIGV4cGFuZG8gXSA9IHRydWU7XG5cdHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGVsZW1lbnQgYW5kIHJldHVybnMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIik7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gISFmbiggZWwgKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGVsLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApO1xuXHRcdH1cblx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxuXHRcdGVsID0gbnVsbDtcblx0fVxufVxuXG4vKipcbiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBhdHRycyBQaXBlLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgVGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgYXBwbGllZFxuICovXG5mdW5jdGlvbiBhZGRIYW5kbGUoIGF0dHJzLCBoYW5kbGVyICkge1xuXHR2YXIgYXJyID0gYXR0cnMuc3BsaXQoXCJ8XCIpLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4O1xuXG5cdC8vIFVzZSBJRSBzb3VyY2VJbmRleCBpZiBhdmFpbGFibGUgb24gYm90aCBub2Rlc1xuXHRpZiAoIGRpZmYgKSB7XG5cdFx0cmV0dXJuIGRpZmY7XG5cdH1cblxuXHQvLyBDaGVjayBpZiBiIGZvbGxvd3MgYVxuXHRpZiAoIGN1ciApIHtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIubmV4dFNpYmxpbmcpICkge1xuXHRcdFx0aWYgKCBjdXIgPT09IGIgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYSA/IDEgOiAtMTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIChuYW1lID09PSBcImlucHV0XCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIikgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExXG5cdFx0XHRcdC8vIFVzZSB0aGUgaXNEaXNhYmxlZCBzaG9ydGN1dCBwcm9wZXJ0eSB0byBjaGVjayBmb3IgZGlzYWJsZWQgZmllbGRzZXQgYW5jZXN0b3JzXG5cdFx0XHRcdHJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8XG5cblx0XHRcdFx0XHQvLyBXaGVyZSB0aGVyZSBpcyBubyBpc0Rpc2FibGVkLCBjaGVjayBtYW51YWxseVxuXHRcdFx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0XHRcdGVsZW0uaXNEaXNhYmxlZCAhPT0gIWRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRkaXNhYmxlZEFuY2VzdG9yKCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxuXHQvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMylcblx0dmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHN1YldpbmRvdyxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGlmIGRvYyBpcyBpbnZhbGlkIG9yIGFscmVhZHkgc2VsZWN0ZWRcblx0aWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQ7XG5cdH1cblxuXHQvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlc1xuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvY3VtZW50ICk7XG5cblx0Ly8gU3VwcG9ydDogSUUgOS0xMSwgRWRnZVxuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpXG5cdGlmICggcHJlZmVycmVkRG9jICE9PSBkb2N1bWVudCAmJlxuXHRcdChzdWJXaW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldykgJiYgc3ViV2luZG93LnRvcCAhPT0gc3ViV2luZG93ICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgMTEsIEVkZ2Vcblx0XHRpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0c3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTAgb25seVxuXHRcdH0gZWxzZSBpZiAoIHN1YldpbmRvdy5hdHRhY2hFdmVudCApIHtcblx0XHRcdHN1YldpbmRvdy5hdHRhY2hFdmVudCggXCJvbnVubG9hZFwiLCB1bmxvYWRIYW5kbGVyICk7XG5cdFx0fVxuXHR9XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZWwuY2xhc3NOYW1lID0gXCJpXCI7XG5cdFx0cmV0dXJuICFlbC5nZXRBdHRyaWJ1dGUoXCJjbGFzc05hbWVcIik7XG5cdH0pO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZWwuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJcIikgKTtcblx0XHRyZXR1cm4gIWVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKS5sZW5ndGg7XG5cdH0pO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1tYXRpY2FsbHktc2V0IG5hbWVzLFxuXHQvLyBzbyB1c2UgYSByb3VuZGFib3V0IGdldEVsZW1lbnRzQnlOYW1lIHRlc3Rcblx0c3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gSUQgZmlsdGVyIGFuZCBmaW5kXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmlsdGVyW1wiSURcIl0gPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblx0XHRcdFx0cmV0dXJuIGVsZW0gPyBbIGVsZW0gXSA6IFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHlcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0RXhwci5maW5kW1wiSURcIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaSwgZWxlbXMsXG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtICkge1xuXG5cdFx0XHRcdFx0Ly8gVmVyaWZ5IHRoZSBpZCBhdHRyaWJ1dGVcblx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdFx0aWYgKCBub2RlICYmIG5vZGUudmFsdWUgPT09IGlkICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZVxuXHRcdFx0XHRcdGVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTtcblx0XHRcdFx0XHRpID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBbIGVsZW0gXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbXCJUQUdcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFtcIkNMQVNTXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxuXHRyYnVnZ3lNYXRjaGVzID0gW107XG5cblx0Ly8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSlcblx0Ly8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yXG5cdC8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWVcblx0Ly8gU28sIHdlIGFsbG93IDpmb2N1cyB0byBwYXNzIHRocm91Z2ggUVNBIGFsbCB0aGUgdGltZSB0byBhdm9pZCB0aGUgSUUgZXJyb3Jcblx0Ly8gU2VlIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHtcblx0XHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0XHQvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5XG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcclxcXFwnIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvblxuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuNCwgU2FmYXJpPDcuMCssIGlPUzw3LjArLCBQaGFudG9tSlM8MS45LjgrXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIn49XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2libGluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIuIy4rWyt+XVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdFx0XHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD5cIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiaGlkZGVuXCIgKTtcblx0XHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZT1kXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHRcdFx0Ly8gSUUncyA6ZGlzYWJsZWQgc2VsZWN0b3IgZG9lcyBub3QgcGljayB1cCB0aGUgY2hpbGRyZW4gb2YgZGlzYWJsZWQgZmllbGRzZXRzXG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjpkaXNhYmxlZFwiKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3Ncblx0XHRcdGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIqLDp4XCIpO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIsLio6XCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpICkpICkge1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxuXHRcdFx0Ly8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSlcblx0XHRcdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGVsLCBcIipcIiApO1xuXG5cdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXG5cdFx0XHQvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkXG5cdFx0XHRtYXRjaGVzLmNhbGwoIGVsLCBcIltzIT0nJ106eFwiICk7XG5cdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIFwiIT1cIiwgcHNldWRvcyApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbihcInxcIikgKTtcblx0cmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbihcInxcIikgKTtcblxuXHQvKiBDb250YWluc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cdGhhc0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gKTtcblxuXHQvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcblx0Ly8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlXG5cdC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmXG5cdGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuXHRcdFx0XHRidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRhZG93bi5jb250YWlucyA/XG5cdFx0XHRcdFx0YWRvd24uY29udGFpbnMoIGJ1cCApIDpcblx0XHRcdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0XHRcdCkpO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0aWYgKCBiICkge1xuXHRcdFx0XHR3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHtcblx0XHRcdFx0XHRpZiAoIGIgPT09IGEgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gaGFzQ29tcGFyZSA/XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuXHRcdHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtcblx0XHRpZiAoIGNvbXBhcmUgKSB7XG5cdFx0XHRyZXR1cm4gY29tcGFyZTtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50XG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlKSApIHtcblxuXHRcdFx0Ly8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50XG5cdFx0XHRpZiAoIGEgPT09IGRvY3VtZW50IHx8IGEub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYSkgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHRcdGlmICggYiA9PT0gZG9jdW1lbnQgfHwgYi5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fSA6XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxuXHRcdFx0YnVwID0gYi5wYXJlbnROb2RlLFxuXHRcdFx0YXAgPSBbIGEgXSxcblx0XHRcdGJwID0gWyBiIF07XG5cblx0XHQvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZFxuXHRcdGlmICggIWF1cCB8fCAhYnVwICkge1xuXHRcdFx0cmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOlxuXHRcdFx0XHRiID09PSBkb2N1bWVudCA/IDEgOlxuXHRcdFx0XHRhdXAgPyAtMSA6XG5cdFx0XHRcdGJ1cCA/IDEgOlxuXHRcdFx0XHRzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHQvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVja1xuXHRcdH0gZWxzZSBpZiAoIGF1cCA9PT0gYnVwICkge1xuXHRcdFx0cmV0dXJuIHNpYmxpbmdDaGVjayggYSwgYiApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uXG5cdFx0Y3VyID0gYTtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRhcC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cdFx0Y3VyID0gYjtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRicC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cblx0XHQvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeVxuXHRcdHdoaWxlICggYXBbaV0gPT09IGJwW2ldICkge1xuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHJldHVybiBpID9cblx0XHRcdC8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvclxuXHRcdFx0c2libGluZ0NoZWNrKCBhcFtpXSwgYnBbaV0gKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdFxuXHRcdFx0YXBbaV0gPT09IHByZWZlcnJlZERvYyA/IC0xIDpcblx0XHRcdGJwW2ldID09PSBwcmVmZXJyZWREb2MgPyAxIDpcblx0XHRcdDA7XG5cdH07XG5cblx0cmV0dXJuIGRvY3VtZW50O1xufTtcblxuU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZFxuXHRleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCBcIj0nJDEnXVwiICk7XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCFjb21waWxlckNhY2hlWyBleHByICsgXCIgXCIgXSAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkge1xuXHRyZXR1cm4gKHNlbCArIFwiXCIpLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkge1xuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbM10gPSAoIG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzJdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzFdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWzNdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSBcImV2ZW5cIiB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwcltcIkNISUxEXCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0bWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiZcblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdChleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQocGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkpICYmXG5cdFx0XHRcdGNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIgKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgbm9kZUluZGV4LCBzdGFydCxcblx0XHRcdFx0XHRcdGRpciA9IHNpbXBsZSAhPT0gZm9yd2FyZCA/IFwibmV4dFNpYmxpbmdcIiA6IFwicHJldmlvdXNTaWJsaW5nXCIsXG5cdFx0XHRcdFx0XHRwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0XHRuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLFxuXHRcdFx0XHRcdFx0ZGlmZiA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIDooZmlyc3R8bGFzdHxvbmx5KS0oY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0XHRcdGlmICggc2ltcGxlICkge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIGRpciApIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHBhcmVudDtcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdO1xuXHRcdFx0XHRcdFx0XHRub2RlID0gbm9kZUluZGV4ICYmIHBhcmVudC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLilcblx0XHRcdFx0XHRcdFx0Ly8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0XHRpZiAoIGRpZmYgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsrZGlmZiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WzBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFswXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8IFwiXCIpICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksXG5cdFx0XCJkaXNhYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggdHJ1ZSApLFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0pLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1tcIm50aFwiXSA9IEV4cHIucHNldWRvc1tcImVxXCJdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAodG9rZW5zID0gW10pICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9KTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRza2lwID0gY29tYmluYXRvci5uZXh0LFxuXHRcdGtleSA9IHNraXAgfHwgZGlyLFxuXHRcdGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGtleSA9PT0gXCJwYXJlbnROb2RlXCIsXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XG5cblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xuXHRcdC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRvciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSB8fCAob3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRlbGVtID0gZWxlbVsgZGlyIF0gfHwgZWxlbTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbMF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmXG5cdFx0XHRcdFx0XHQodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlW1wiIFwiXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3Rvcihcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9KVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kW1wiVEFHXCJdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdGlmICggIWNvbnRleHQgJiYgZWxlbS5vd25lckRvY3VtZW50ICE9PSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQgfHwgZG9jdW1lbnQsIHhtbCkgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzXG5cdFx0XHRcdGlmICggYnlTZXQgKSB7XG5cdFx0XHRcdFx0Ly8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVyc1xuXHRcdFx0XHRcdGlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFtpXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlc1xuXHRcdFx0XHRcdHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0c1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7XG5cblx0XHRcdFx0Ly8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nXG5cdFx0XHRcdGlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdCggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkge1xuXG5cdFx0XHRcdFx0U2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnNcblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bm1hdGNoZWQ7XG5cdFx0fTtcblxuXHRyZXR1cm4gYnlTZXQgP1xuXHRcdG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOlxuXHRcdHN1cGVyTWF0Y2hlcjtcbn1cblxuY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0dmFyIGksXG5cdFx0c2V0TWF0Y2hlcnMgPSBbXSxcblx0XHRlbGVtZW50TWF0Y2hlcnMgPSBbXSxcblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCAhY2FjaGVkICkge1xuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFtpXSApO1xuXHRcdFx0aWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0c2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufTtcblxuLyoqXG4gKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIFNpenpsZSdzIGNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggU2l6emxlLmNvbXBpbGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dFxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdXG4gKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0Y2ggYWdhaW5zdFxuICovXG5zZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCxcblx0XHRjb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHNlbGVjdG9yLFxuXHRcdG1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoIChzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yKSApO1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdG9yIGluIHRoZSBsaXN0IGFuZCBubyBzZWVkXG5cdC8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dClcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIpICkgJiAxO1xufSk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweFxuaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcImhyZWZcIikgPT09IFwiI1wiIDtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidHlwZXxocmVmfGhlaWdodHx3aWR0aFwiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0eXBlXCIgPyAxIDogMiApO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBkZWZhdWx0VmFsdWUgaW4gcGxhY2Ugb2YgZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcbmlmICggIXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRlbC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiLCBcIlwiICk7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRyZXR1cm4gZWwuZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPT0gbnVsbDtcbn0pICkge1xuXHRhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHZhbDtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcblx0XHR9XG5cdH0pO1xufVxuXG5yZXR1cm4gU2l6emxlO1xuXG59KSggd2luZG93ICk7XG5cblxuXG5qUXVlcnkuZmluZCA9IFNpenpsZTtcbmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9ycztcblxuLy8gRGVwcmVjYXRlZFxualF1ZXJ5LmV4cHJbIFwiOlwiIF0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XG5qUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0O1xualF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MO1xualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xualF1ZXJ5LmVzY2FwZVNlbGVjdG9yID0gU2l6emxlLmVzY2FwZTtcblxuXG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxuXG5cbmZ1bmN0aW9uIG5vZGVOYW1lKCBlbGVtLCBuYW1lICkge1xuXG4gIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG59O1xudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG52YXIgcmlzU2ltcGxlID0gL14uW146I1xcW1xcLixdKiQvO1xuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHF1YWxpZmllciApICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIFNpbmdsZSBlbGVtZW50XG5cdGlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBBcnJheWxpa2Ugb2YgZWxlbWVudHMgKGpRdWVyeSwgYXJndW1lbnRzLCBBcnJheSlcblx0aWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBTaW1wbGUgc2VsZWN0b3IgdGhhdCBjYW4gYmUgZmlsdGVyZWQgZGlyZWN0bHksIHJlbW92aW5nIG5vbi1FbGVtZW50c1xuXHRpZiAoIHJpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG5cdH1cblxuXHQvLyBDb21wbGV4IHNlbGVjdG9yLCBjb21wYXJlIHRoZSB0d28gc2V0cywgcmVtb3Zpbmcgbm9uLUVsZW1lbnRzXG5cdHF1YWxpZmllciA9IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMgKTtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdCAmJiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHR9ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRpZiAoIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW107XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSwgcmV0LFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGVuID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKSA6IHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XG5cdFx0XHRyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0cm9vdC5yZWFkeSggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRzZWxlY3RvciggalF1ZXJ5ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yLCB0aGlzICk7XG5cdH07XG5cbi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb25cbmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuO1xuXG4vLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlXG5yb290alF1ZXJ5ID0galF1ZXJ5KCBkb2N1bWVudCApO1xuXG5cbnZhciBycGFyZW50c3ByZXYgPSAvXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxcblxuXHQvLyBNZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldFxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xuXHRcdGNoaWxkcmVuOiB0cnVlLFxuXHRcdGNvbnRlbnRzOiB0cnVlLFxuXHRcdG5leHQ6IHRydWUsXG5cdFx0cHJldjogdHJ1ZVxuXHR9O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcblx0XHR2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksXG5cdFx0XHRsID0gdGFyZ2V0cy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0Y2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHtcblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRtYXRjaGVkID0gW10sXG5cdFx0XHR0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gXCJzdHJpbmdcIiAmJiBqUXVlcnkoIHNlbGVjdG9ycyApO1xuXG5cdFx0Ly8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dFxuXHRcdGlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cblx0XHRcdFx0XHQvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHNcblx0XHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA8IDExICYmICggdGFyZ2V0cyA/XG5cdFx0XHRcdFx0XHR0YXJnZXRzLmluZGV4KCBjdXIgKSA+IC0xIDpcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcGFzcyBub24tZWxlbWVudHMgdG8gU2l6emxlXG5cdFx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBjdXIsIHNlbGVjdG9ycyApICkgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGNoZWQucHVzaCggY3VyICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoIHNlbGVjdG9yIClcblx0XHQpO1xuXHR9XG59ICk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoICggY3VyID0gY3VyWyBkaXIgXSApICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApIHt9XG5cdHJldHVybiBjdXI7XG59XG5cbmpRdWVyeS5lYWNoKCB7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiApO1xuXHR9LFxuXHRwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgICBpZiAoIG5vZGVOYW1lKCBlbGVtLCBcImlmcmFtZVwiICkgKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seSwgaU9TIDcgb25seSwgQW5kcm9pZCBCcm93c2VyIDw9NC4zIG9ubHlcbiAgICAgICAgLy8gVHJlYXQgdGhlIHRlbXBsYXRlIGVsZW1lbnQgYXMgYSByZWd1bGFyIG9uZSBpbiBicm93c2VycyB0aGF0XG4gICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuXG4gICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sIFwidGVtcGxhdGVcIiApICkge1xuICAgICAgICAgICAgZWxlbSA9IGVsZW0uY29udGVudCB8fCBlbGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApO1xuXG5cdFx0aWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSBcIlVudGlsXCIgKSB7XG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0bWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldmVyc2Ugb3JkZXIgZm9yIHBhcmVudHMqIGFuZCBwcmV2LWRlcml2YXRpdmVzXG5cdFx0XHRpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApO1xuXHR9O1xufSApO1xudmFyIHJub3RodG1sd2hpdGUgPSAoIC9bXlxceDIwXFx0XFxyXFxuXFxmXSsvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9ICk7XG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8qXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAqXG4gKlx0b3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvd1xuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XG4gKlxuICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmVcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBQb3NzaWJsZSBvcHRpb25zOlxuICpcbiAqXHRvbmNlOlx0XHRcdHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcbiAqXHRcdFx0XHRcdGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0IFwibWVtb3JpemVkXCJcbiAqXHRcdFx0XHRcdHZhbHVlcyAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHR1bmlxdWU6XHRcdFx0d2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpXG4gKlxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gKlxuICovXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0Ly8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZFxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXG5cdG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0Y3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXG5cdFx0Ly8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHNcblx0XHRtZW1vcnksXG5cblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZFxuXHRcdGZpcmVkLFxuXG5cdFx0Ly8gRmxhZyB0byBwcmV2ZW50IGZpcmluZ1xuXHRcdGxvY2tlZCxcblxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXG5cdFx0Ly8gUXVldWUgb2YgZXhlY3V0aW9uIGRhdGEgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRxdWV1ZSA9IFtdLFxuXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQpXG5cdFx0ZmlyaW5nSW5kZXggPSAtMSxcblxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbmZvcmNlIHNpbmdsZS1maXJpbmdcblx0XHRcdGxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7XG5cblx0XHRcdC8vIEV4ZWN1dGUgY2FsbGJhY2tzIGZvciBhbGwgcGVuZGluZyBleGVjdXRpb25zLFxuXHRcdFx0Ly8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlc1xuXHRcdFx0ZmlyZWQgPSBmaXJpbmcgPSB0cnVlO1xuXHRcdFx0Zm9yICggOyBxdWV1ZS5sZW5ndGg7IGZpcmluZ0luZGV4ID0gLTEgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRcdHdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gUnVuIGNhbGxiYWNrIGFuZCBjaGVjayBmb3IgZWFybHkgdGVybWluYXRpb25cblx0XHRcdFx0XHRpZiAoIGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIG1lbW9yeVsgMCBdLCBtZW1vcnlbIDEgXSApID09PSBmYWxzZSAmJlxuXHRcdFx0XHRcdFx0b3B0aW9ucy5zdG9wT25GYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSnVtcCB0byBlbmQgYW5kIGZvcmdldCB0aGUgZGF0YSBzbyAuYWRkIGRvZXNuJ3QgcmUtZmlyZVxuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aDtcblx0XHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3JnZXQgdGhlIGRhdGEgaWYgd2UncmUgZG9uZSB3aXRoIGl0XG5cdFx0XHRpZiAoICFvcHRpb25zLm1lbW9yeSApIHtcblx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGZpcmluZyA9IGZhbHNlO1xuXG5cdFx0XHQvLyBDbGVhbiB1cCBpZiB3ZSdyZSBkb25lIGZpcmluZyBmb3IgZ29vZFxuXHRcdFx0aWYgKCBsb2NrZWQgKSB7XG5cblx0XHRcdFx0Ly8gS2VlcCBhbiBlbXB0eSBsaXN0IGlmIHdlIGhhdmUgZGF0YSBmb3IgZnV0dXJlIGFkZCBjYWxsc1xuXHRcdFx0XHRpZiAoIG1lbW9yeSApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCB0aGlzIG9iamVjdCBpcyBzcGVudFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxpc3QgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0XG5cdFx0c2VsZiA9IHtcblxuXHRcdFx0Ly8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdFxuXHRcdFx0YWRkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmdcblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXggPSBsaXN0Lmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBtZW1vcnkgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQoIGZ1bmN0aW9uIGFkZCggYXJncyApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIGpRdWVyeS50eXBlKCBhcmcgKSAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcblx0XHRcdFx0XHRcdFx0XHRhZGQoIGFyZyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fSApKCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdFxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHR2YXIgaW5kZXg7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRsaXN0LnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGZpcmluZyBpbmRleGVzXG5cdFx0XHRcdFx0XHRpZiAoIGluZGV4IDw9IGZpcmluZ0luZGV4ICkge1xuXHRcdFx0XHRcdFx0XHRmaXJpbmdJbmRleC0tO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENoZWNrIGlmIGEgZ2l2ZW4gY2FsbGJhY2sgaXMgaW4gdGhlIGxpc3QuXG5cdFx0XHQvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC5cblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xuXHRcdFx0XHRyZXR1cm4gZm4gP1xuXHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOlxuXHRcdFx0XHRcdGxpc3QubGVuZ3RoID4gMDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3Rcblx0XHRcdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmUgYW5kIC5hZGRcblx0XHRcdC8vIEFib3J0IGFueSBjdXJyZW50L3BlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0Ly8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzXG5cdFx0XHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICFsaXN0O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZVxuXHRcdFx0Ly8gQWxzbyBkaXNhYmxlIC5hZGQgdW5sZXNzIHdlIGhhdmUgbWVtb3J5IChzaW5jZSBpdCB3b3VsZCBoYXZlIG5vIGVmZmVjdClcblx0XHRcdC8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdGxvY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRpZiAoICFtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRsb2NrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFsb2NrZWQ7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XG5cdFx0XHRcdGlmICggIWxvY2tlZCApIHtcblx0XHRcdFx0XHRhcmdzID0gYXJncyB8fCBbXTtcblx0XHRcdFx0XHRhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdO1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGFyZ3MgKTtcblx0XHRcdFx0XHRpZiAoICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcblx0XHRcdGZpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2Vcblx0XHRcdGZpcmVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhZmlyZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRyZXR1cm4gc2VsZjtcbn07XG5cblxuZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7XG5cdHJldHVybiB2O1xufVxuZnVuY3Rpb24gVGhyb3dlciggZXggKSB7XG5cdHRocm93IGV4O1xufVxuXG5mdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkge1xuXHR2YXIgbWV0aG9kO1xuXG5cdHRyeSB7XG5cblx0XHQvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yXG5cdFx0aWYgKCB2YWx1ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnRoZW4gKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIG5vbi10aGVuYWJsZXNcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb250cm9sIGByZXNvbHZlYCBhcmd1bWVudHMgYnkgbGV0dGluZyBBcnJheSNzbGljZSBjYXN0IGJvb2xlYW4gYG5vVmFsdWVgIHRvIGludGVnZXI6XG5cdFx0XHQvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApXG5cdFx0XHQvLyAqIHRydWU6IFsgdmFsdWUgXS5zbGljZSggMSApID0+IHJlc29sdmUoKVxuXHRcdFx0cmVzb2x2ZS5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0uc2xpY2UoIG5vVmFsdWUgKSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTtcblx0fVxufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGNhbGxiYWNrcyxcblx0XHRcdFx0Ly8gLi4uIC50aGVuIGhhbmRsZXJzLCBhcmd1bWVudCBpbmRleCwgW2ZpbmFsIHN0YXRlXVxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSwgMiBdLFxuXHRcdFx0XHRbIFwicmVzb2x2ZVwiLCBcImRvbmVcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDAsIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMSwgXCJyZWplY3RlZFwiIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjYXRjaFwiOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2UudGhlbiggbnVsbCwgZm4gKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdHBpcGU6IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE1hcCB0dXBsZXMgKHByb2dyZXNzLCBkb25lLCBmYWlsKSB0byBhcmd1bWVudHMgKGRvbmUsIGZhaWwsIHByb2dyZXNzKVxuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZm5zWyB0dXBsZVsgNCBdIF0gKSAmJiBmbnNbIHR1cGxlWyA0IF0gXTtcblxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5wcm9ncmVzcyhmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5ub3RpZnkgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmZhaWwoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVqZWN0IH0pXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhlbiApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgcHJvY2Vzc29ycyAobm90aWZ5KSBqdXN0IHdhaXQgZm9yIHJlc29sdXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1heERlcHRoKys7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYWxsIG90aGVyIHJldHVybmVkIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IElkZW50aXR5ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgcmV0dXJuZWQgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmF1bHQgcHJvY2VzcyBpcyByZXNvbHZlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggc3BlY2lhbCB8fCBkZWZlcnJlZC5yZXNvbHZlV2l0aCApKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MgPSBzcGVjaWFsID9cblx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgOlxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayggZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjQuMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTYxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIHBvc3QtcmVzb2x1dGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCArIDEgPj0gbWF4RGVwdGggKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyBlIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjFcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTdcblx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVzb2x2ZSBwcm9taXNlcyBpbW1lZGlhdGVseSB0byBkb2RnZSBmYWxzZSByZWplY3Rpb24gZnJvbVxuXHRcdFx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGVycm9yc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdC8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIG9uUHJvZ3Jlc3MgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvblByb2dyZXNzIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLm5vdGlmeVdpdGhcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMSBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlXG5cdFx0XHQvLyByZWplY3RlZF9oYW5kbGVycy5maXJlXG5cdFx0XHRsaXN0LmFkZCggdHVwbGVbIDMgXS5maXJlICk7XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeSA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5ub3RpZnlXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZSA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZXNvbHZlV2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfVxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gdW5kZWZpbmVkIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5V2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmVXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSApO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc2luZ2xlVmFsdWUgKSB7XG5cdFx0dmFyXG5cblx0XHRcdC8vIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gYXJndW1lbnRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5wcm9jZXNzZWQgYXJndW1lbnRzXG5cdFx0XHRpID0gcmVtYWluaW5nLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBmdWxmaWxsbWVudCBkYXRhXG5cdFx0XHRyZXNvbHZlQ29udGV4dHMgPSBBcnJheSggaSApLFxuXHRcdFx0cmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXG5cdFx0XHQvLyB0aGUgbWFzdGVyIERlZmVycmVkXG5cdFx0XHRtYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgY2FsbGJhY2sgZmFjdG9yeVxuXHRcdFx0dXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJlc29sdmVDb250ZXh0c1sgaSBdID0gdGhpcztcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIDogdmFsdWU7XG5cdFx0XHRcdFx0aWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xuXHRcdFx0XHRcdFx0bWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0Ly8gU2luZ2xlLSBhbmQgZW1wdHkgYXJndW1lbnRzIGFyZSBhZG9wdGVkIGxpa2UgUHJvbWlzZS5yZXNvbHZlXG5cdFx0aWYgKCByZW1haW5pbmcgPD0gMSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHNpbmdsZVZhbHVlLCBtYXN0ZXIuZG9uZSggdXBkYXRlRnVuYyggaSApICkucmVzb2x2ZSwgbWFzdGVyLnJlamVjdCxcblx0XHRcdFx0IXJlbWFpbmluZyApO1xuXG5cdFx0XHQvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApXG5cdFx0XHRpZiAoIG1hc3Rlci5zdGF0ZSgpID09PSBcInBlbmRpbmdcIiB8fFxuXHRcdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG1hc3Rlci50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hc3Rlci5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucmVhZHkudGhlbiA9IHJlYWR5TGlzdC50aGVuO1xuXG4vLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG4vLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMCBvbmx5XG4vLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cbmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cbn0gZWxzZSB7XG5cblx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcbn1cblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCBqUXVlcnkudHlwZSgga2V5ICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblx0XHRmb3IgKCBpIGluIGtleSApIHtcblx0XHRcdGFjY2VzcyggZWxlbXMsIGZuLCBpLCBrZXlbIGkgXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApO1xuXHRcdH1cblxuXHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0dmFsdWUgOlxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xudmFyIGFjY2VwdERhdGEgPSBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0Ly8gQWNjZXB0cyBvbmx5OlxuXHQvLyAgLSBOb2RlXG5cdC8vICAgIC0gTm9kZS5FTEVNRU5UX05PREVcblx0Ly8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREVcblx0Ly8gIC0gT2JqZWN0XG5cdC8vICAgIC0gQW55XG5cdHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIERhdGEoKSB7XG5cdHRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKztcbn1cblxuRGF0YS51aWQgPSAxO1xuXG5EYXRhLnByb3RvdHlwZSA9IHtcblxuXHRjYWNoZTogZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlXG5cdFx0dmFyIHZhbHVlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdmFsdWUgKSB7XG5cdFx0XHR2YWx1ZSA9IHt9O1xuXG5cdFx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHRcdC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuXG5cdFx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRcdGlmICggYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0XHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5XG5cdFx0XHRcdC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0XHRcdC8vIGRlbGV0ZWQgd2hlbiBkYXRhIGlzIHJlbW92ZWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Y2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIGRhdGEgKSBdID0gdmFsdWU7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJnc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0XG5cdFx0XHRmb3IgKCBwcm9wIGluIGRhdGEgKSB7XG5cdFx0XHRcdGNhY2hlWyBqUXVlcnkuY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgalF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmdldCggb3duZXIsIGtleSApO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIGtleSBpcyBub3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly8gYXJlIHNwZWNpZmllZCwgc2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG5cdFx0Ly8gICAyLiBBIGtleSBhbmQgdmFsdWVcblx0XHQvL1xuXHRcdHRoaXMuc2V0KCBvd25lciwga2V5LCB2YWx1ZSApO1xuXG5cdFx0Ly8gU2luY2UgdGhlIFwic2V0XCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzXG5cdFx0Ly8gcmV0dXJuIHRoZSBleHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTtcblx0fSxcblx0cmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHR2YXIgaSxcblx0XHRcdGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0aWYgKCBjYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGtleSApICkge1xuXG5cdFx0XHRcdC8vIElmIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LlxuXHRcdFx0XHRrZXkgPSBrZXkubWFwKCBqUXVlcnkuY2FtZWxDYXNlICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRrZXkgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICYmXG5cblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiO1xuXHR9O1xuXG52YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsXG5cdFx0c2NhbGUgPSAxLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgaXRlcmF0aW9uIHplcm9lZCBvdXQsIGRvdWJsZSB1bnRpbCB3ZSBnZXQgKnNvbWV0aGluZyouXG5cdFx0XHQvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xuXHRcdFx0c2NhbGUgPSBzY2FsZSB8fCBcIi41XCI7XG5cblx0XHRcdC8vIEFkanVzdCBhbmQgYXBwbHlcblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKVxuXHRcdC8vIEJyZWFrIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2guXG5cdFx0fSB3aGlsZSAoXG5cdFx0XHRzY2FsZSAhPT0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCApICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9uc1xuXHRcdCk7XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCBqUXVlcnkudHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHR9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lclxuXHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKCMxMjM5Milcblx0XHRcdFx0dG1wLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG5cdGZyYWdtZW50LnRleHRDb250ZW50ID0gXCJcIjtcblxuXHRpID0gMDtcblx0d2hpbGUgKCAoIGVsZW0gPSBub2Rlc1sgaSsrIF0gKSApIHtcblxuXHRcdC8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpXG5cdFx0aWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7XG5cdFx0XHRpZiAoIGlnbm9yZWQgKSB7XG5cdFx0XHRcdGlnbm9yZWQucHVzaCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXG5cdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBjb250YWlucyApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZnJhZ21lbnQ7XG59XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHlcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKCMxMTIxNylcblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seVxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZFxuXHRkaXYuaW5uZXJIVE1MID0gXCI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+XCI7XG5cdHN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO1xufSApKCk7XG52YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cblxudmFyXG5cdHJrZXlFdmVudCA9IC9ea2V5Lyxcblx0cm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sXG5cdHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG4vLyBTZWUgIzEzMzkzIGZvciBtb3JlIGluZm9cbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cylcblx0XHRpZiAoICFlbGVtRGF0YSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhhdCBpbnZhbGlkIHNlbGVjdG9ycyB0aHJvdyBleGNlcHRpb25zIGF0IGF0dGFjaCB0aW1lXG5cdFx0Ly8gRXZhbHVhdGUgYWdhaW5zdCBkb2N1bWVudEVsZW1lbnQgaW4gY2FzZSBlbGVtIGlzIGEgbm9uLWVsZW1lbnQgbm9kZSAoZS5nLiwgZG9jdW1lbnQpXG5cdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlclxuXHRcdGlmICggIWhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCAhKCBldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSApICkge1xuXHRcdFx0ZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHtcblxuXHRcdFx0XHQvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZFxuXHRcdFx0XHQvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkXG5cdFx0XHRcdHJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSBcInVuZGVmaW5lZFwiICYmIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSA/XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBlbGVtLCBhcmd1bWVudHMgKSA6IHVuZGVmaW5lZDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZVxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdG9yaWdUeXBlOiBvcmlnVHlwZSxcblx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0aGFuZGxlcjogaGFuZGxlcixcblx0XHRcdFx0Z3VpZDogaGFuZGxlci5ndWlkLFxuXHRcdFx0XHRzZWxlY3Rvcjogc2VsZWN0b3IsXG5cdFx0XHRcdG5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksXG5cdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKCBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdICkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHxcblx0XHRcdFx0XHRzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cblx0XHR2YXIgaiwgb3JpZ0NvdW50LCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuaGFzRGF0YSggZWxlbSApICYmIGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnRcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XG5cdFx0XHR0bXAgPSB0bXBbIDIgXSAmJlxuXHRcdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50c1xuXHRcdFx0b3JpZ0NvdW50ID0gaiA9IGhhbmRsZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBdO1xuXG5cdFx0XHRcdGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiZcblx0XHRcdFx0XHQoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJlxuXHRcdFx0XHRcdCggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiZcblx0XHRcdFx0XHQoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8XG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9PT0gXCIqKlwiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkge1xuXHRcdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaiwgMSApO1xuXG5cdFx0XHRcdFx0aWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc3BlY2lhbC5yZW1vdmUgKSB7XG5cdFx0XHRcdFx0XHRzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdFxuXHRcdFx0Ly8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpXG5cdFx0XHRpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBlbGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkXG5cdFx0aWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7XG5cdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiaGFuZGxlIGV2ZW50c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGRpc3BhdGNoOiBmdW5jdGlvbiggbmF0aXZlRXZlbnQgKSB7XG5cblx0XHQvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3Rcblx0XHR2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApO1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLCBoYW5kbGVyUXVldWUsXG5cdFx0XHRhcmdzID0gbmV3IEFycmF5KCBhcmd1bWVudHMubGVuZ3RoICksXG5cdFx0XHRoYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307XG5cblx0XHQvLyBVc2UgdGhlIGZpeC1lZCBqUXVlcnkuRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudFxuXHRcdGFyZ3NbIDAgXSA9IGV2ZW50O1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTtcblx0XHR9XG5cblx0XHRldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7XG5cblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXG5cdFx0aWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGhhbmRsZXJzXG5cdFx0aGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2ZW50LCBoYW5kbGVycyApO1xuXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggbWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiZcblx0XHRcdFx0IWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvciAyKSBoYXZlIG5hbWVzcGFjZShzKVxuXHRcdFx0XHQvLyBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS5cblx0XHRcdFx0aWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycyxcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OVxuXHRcdFx0Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKHRyYWMtMTMxODApXG5cdFx0XHRjdXIubm9kZVR5cGUgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQyXG5cdFx0XHQvLyBTdXBwcmVzcyBzcGVjLXZpb2xhdGluZyBjbGlja3MgaW5kaWNhdGluZyBhIG5vbi1wcmltYXJ5IHBvaW50ZXIgYnV0dG9uICh0cmFjLTM4NjEpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHQvLyAuLi5idXQgbm90IGFycm93IGtleSBcImNsaWNrc1wiIG9mIHJhZGlvIGlucHV0cywgd2hpY2ggY2FuIGhhdmUgYGJ1dHRvbmAgLTEgKGdoLTIzNDMpXG5cdFx0XHQhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgZXZlbnQuYnV0dG9uID49IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpXG5cdFx0XHRcdC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KVxuXHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiAhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlZEhhbmRsZXJzID0gW107XG5cdFx0XHRcdFx0bWF0Y2hlZFNlbGVjdG9ycyA9IHt9O1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlZEhhbmRsZXJzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0Y3VyID0gdGhpcztcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdGFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBqUXVlcnkuaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpO1xuXG5cdC8vIE1hcmsgaXQgYXMgZml4ZWRcblx0dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7XG59O1xuXG4vLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmdcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBqUXVlcnkuRXZlbnQsXG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc1NpbXVsYXRlZDogZmFsc2UsXG5cblx0cHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSxcblx0c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHNcbmpRdWVyeS5lYWNoKCB7XG5cdGFsdEtleTogdHJ1ZSxcblx0YnViYmxlczogdHJ1ZSxcblx0Y2FuY2VsYWJsZTogdHJ1ZSxcblx0Y2hhbmdlZFRvdWNoZXM6IHRydWUsXG5cdGN0cmxLZXk6IHRydWUsXG5cdGRldGFpbDogdHJ1ZSxcblx0ZXZlbnRQaGFzZTogdHJ1ZSxcblx0bWV0YUtleTogdHJ1ZSxcblx0cGFnZVg6IHRydWUsXG5cdHBhZ2VZOiB0cnVlLFxuXHRzaGlmdEtleTogdHJ1ZSxcblx0dmlldzogdHJ1ZSxcblx0XCJjaGFyXCI6IHRydWUsXG5cdGNoYXJDb2RlOiB0cnVlLFxuXHRrZXk6IHRydWUsXG5cdGtleUNvZGU6IHRydWUsXG5cdGJ1dHRvbjogdHJ1ZSxcblx0YnV0dG9uczogdHJ1ZSxcblx0Y2xpZW50WDogdHJ1ZSxcblx0Y2xpZW50WTogdHJ1ZSxcblx0b2Zmc2V0WDogdHJ1ZSxcblx0b2Zmc2V0WTogdHJ1ZSxcblx0cG9pbnRlcklkOiB0cnVlLFxuXHRwb2ludGVyVHlwZTogdHJ1ZSxcblx0c2NyZWVuWDogdHJ1ZSxcblx0c2NyZWVuWTogdHJ1ZSxcblx0dGFyZ2V0VG91Y2hlczogdHJ1ZSxcblx0dG9FbGVtZW50OiB0cnVlLFxuXHR0b3VjaGVzOiB0cnVlLFxuXG5cdHdoaWNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcblxuXHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xuXHRcdGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCAmJiBya2V5RXZlbnQudGVzdCggZXZlbnQudHlwZSApICkge1xuXHRcdFx0cmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICYmIHJtb3VzZUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdGlmICggYnV0dG9uICYgMSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggYnV0dG9uICYgMiApIHtcblx0XHRcdFx0cmV0dXJuIDM7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggYnV0dG9uICYgNCApIHtcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC53aGljaDtcblx0fVxufSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LlxuLy8gRG8gdGhlIHNhbWUgZm9yIHBvaW50ZXJlbnRlci9wb2ludGVybGVhdmUgYW5kIHBvaW50ZXJvdmVyL3BvaW50ZXJvdXRcbi8vXG4vLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5XG4vLyBTYWZhcmkgc2VuZHMgbW91c2VlbnRlciB0b28gb2Z0ZW47IHNlZTpcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OFxuLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS5cbmpRdWVyeS5lYWNoKCB7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8ICggcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApICkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG52YXJcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5XG5cdHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKilbXj5dKilcXC8+L2dpLFxuXG5cdC8qIGVzbGludC1lbmFibGUgKi9cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTEwIC0gMTEsIEVkZ2UgMTIgLSAxM1xuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVxcLyguKikvLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggXCI+dGJvZHlcIiwgZWxlbSApWyAwIF0gfHwgZWxlbTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG4vLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uXG5mdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkge1xuXHRlbGVtLnR5cGUgPSAoIGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICE9PSBudWxsICkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHR2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTtcblxuXHRpZiAoIG1hdGNoICkge1xuXHRcdGVsZW0udHlwZSA9IG1hdGNoWyAxIF07XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIFwidHlwZVwiICk7XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0cGRhdGFPbGQgPSBkYXRhUHJpdi5hY2Nlc3MoIHNyYyApO1xuXHRcdHBkYXRhQ3VyID0gZGF0YVByaXYuc2V0KCBkZXN0LCBwZGF0YU9sZCApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTtcblx0XHRcdHBkYXRhQ3VyLmV2ZW50cyA9IHt9O1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHR1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFVc2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG4vLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHNcbmZ1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHQvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi5cblx0aWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XG5cdFx0ZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XG5cblx0Ly8gRmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQgc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlvbnNcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7XG5cblx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApO1xuXG5cdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRpID0gMCxcblx0XHRsID0gY29sbGVjdGlvbi5sZW5ndGgsXG5cdFx0aU5vQ2xvbmUgPSBsIC0gMSxcblx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XG5cdGlmICggaXNGdW5jdGlvbiB8fFxuXHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0dmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApO1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRET01FdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApLCBkb2MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKCBlbGVtLCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XG5cdHZhciBub2RlLFxuXHRcdG5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSxcblx0XHRpID0gMDtcblxuXHRmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7XG5cdFx0XHRcdHNldEdsb2JhbEV2YWwoIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHR9XG5cdFx0XHRub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRodG1sUHJlZmlsdGVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRyZXR1cm4gaHRtbC5yZXBsYWNlKCByeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIgKTtcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdHZhciBpLCBsLCBzcmNFbGVtZW50cywgZGVzdEVsZW1lbnRzLFxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLFxuXHRcdFx0aW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEZpeCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdGlmICggIXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgJiYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiZcblx0XHRcdFx0IWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0aWYgKCAoIGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApO1xuXHR9LFxuXG5cdHRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS50ZXh0KCB0aGlzICkgOlxuXHRcdFx0XHR0aGlzLmVtcHR5KCkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRwcmVwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0YXJnZXQuZmlyc3RDaGlsZCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGFmdGVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzXG5cdFx0XHRcdGVsZW0udGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0aHRtbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBlbGVtID0gdGhpc1sgMCBdIHx8IHt9LFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uaW5uZXJIVE1MO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiZcblx0XHRcdFx0IXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkge1xuXG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gdGhpc1sgaSBdIHx8IHt9O1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cdFx0XHRcdFx0XHRcdGVsZW0uaW5uZXJIVE1MID0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbSA9IDA7XG5cblx0XHRcdFx0Ly8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpZ25vcmVkID0gW107XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0XHRwYXJlbnQucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEZvcmNlIGNhbGxiYWNrIGludm9jYXRpb25cblx0XHR9LCBpZ25vcmVkICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdHJldCA9IFtdLFxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxuXHRcdFx0bGFzdCA9IGluc2VydC5sZW5ndGggLSAxLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0gKTtcbnZhciBybWFyZ2luID0gKCAvXm1hcmdpbi8gKTtcblxudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0dmFyIHZpZXcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0XHRpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHtcblx0XHRcdHZpZXcgPSB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuXHR9O1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblxuXHQvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXRcblx0Ly8gc28gdGhleSdyZSBleGVjdXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgdGhlIHNlY29uZCBjb21wdXRhdGlvbi5cblx0ZnVuY3Rpb24gY29tcHV0ZVN0eWxlVGVzdHMoKSB7XG5cblx0XHQvLyBUaGlzIGlzIGEgc2luZ2xldG9uLCB3ZSBuZWVkIHRvIGV4ZWN1dGUgaXQgb25seSBvbmNlXG5cdFx0aWYgKCAhZGl2ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwiYm94LXNpemluZzpib3JkZXItYm94O1wiICtcblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztcIiArXG5cdFx0XHRcIm1hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7XCIgK1xuXHRcdFx0XCJ0b3A6MSU7d2lkdGg6NTAlXCI7XG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0ZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gZGl2U3R5bGUubWFyZ2luTGVmdCA9PT0gXCIycHhcIjtcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09PSBcIjRweFwiO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seVxuXHRcdC8vIFNvbWUgc3R5bGVzIGNvbWUgYmFjayB3aXRoIHBlcmNlbnRhZ2UgdmFsdWVzLCBldmVuIHRob3VnaCB0aGV5IHNob3VsZG4ndFxuXHRcdGRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IFwiNTAlXCI7XG5cdFx0cGl4ZWxNYXJnaW5SaWdodFZhbCA9IGRpdlN0eWxlLm1hcmdpblJpZ2h0ID09PSBcIjRweFwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCwgcGl4ZWxNYXJnaW5SaWdodFZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7XCIgK1xuXHRcdFwicGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHR9LFxuXHRcdHBpeGVsTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbE1hcmdpblJpZ2h0VmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggNTErXG5cdFx0Ly8gUmV0cmlldmluZyBzdHlsZSBiZWZvcmUgY29tcHV0ZWQgc29tZWhvd1xuXHRcdC8vIGZpeGVzIGFuIGlzc3VlIHdpdGggZ2V0dGluZyB3cm9uZyB2YWx1ZXNcblx0XHQvLyBvbiBkZXRhY2hlZCBlbGVtZW50c1xuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXG5cdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgbmVlZGVkIGZvcjpcblx0Ly8gICAuY3NzKCdmaWx0ZXInKSAoSUUgOSBvbmx5LCAjMTI1MzcpXG5cdC8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBBIHRyaWJ1dGUgdG8gdGhlIFwiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1wiXG5cdFx0Ly8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsXG5cdFx0Ly8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy5cblx0XHQvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6XG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoICFzdXBwb3J0LnBpeGVsTWFyZ2luUmlnaHQoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuXG5cdFx0cmV0ICsgXCJcIiA6XG5cdFx0cmV0O1xufVxuXG5cbmZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHtcblxuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9O1xufVxuXG5cbnZhclxuXG5cdC8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGVcblx0Ly8gZXhjZXB0IFwidGFibGVcIiwgXCJ0YWJsZS1jZWxsXCIsIG9yIFwidGFibGUtY2FwdGlvblwiXG5cdC8vIFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxuXHRyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sXG5cdHJjdXN0b21Qcm9wID0gL14tLS8sXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCIgXSxcblx0ZW1wdHlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKS5zdHlsZTtcblxuLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB7XG5cblx0Ly8gU2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4ZWRcblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuLy8gUmV0dXJuIGEgcHJvcGVydHkgbWFwcGVkIGFsb25nIHdoYXQgalF1ZXJ5LmNzc1Byb3BzIHN1Z2dlc3RzIG9yIHRvXG4vLyBhIHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eS5cbmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7XG5cdHZhciByZXQgPSBqUXVlcnkuY3NzUHJvcHNbIG5hbWUgXTtcblx0aWYgKCAhcmV0ICkge1xuXHRcdHJldCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB8fCBuYW1lO1xuXHR9XG5cdHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cblx0Ly8gQW55IHJlbGF0aXZlICgrLy0pIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlblxuXHQvLyBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnRcblx0dmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblxuXHRcdC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIFwic3VidHJhY3RcIiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzXG5cdFx0TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDIgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSA6XG5cdFx0dmFsdWU7XG59XG5cbmZ1bmN0aW9uIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSwgaXNCb3JkZXJCb3gsIHN0eWxlcyApIHtcblx0dmFyIGksXG5cdFx0dmFsID0gMDtcblxuXHQvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IG1lYXN1cmVtZW50LCBhdm9pZCBhdWdtZW50YXRpb25cblx0aWYgKCBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApICkge1xuXHRcdGkgPSA0O1xuXG5cdC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXNcblx0fSBlbHNlIHtcblx0XHRpID0gbmFtZSA9PT0gXCJ3aWR0aFwiID8gMSA6IDA7XG5cdH1cblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBCb3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0XG5cdFx0aWYgKCBleHRyYSA9PT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnRcblx0XHRcdGlmICggZXh0cmEgPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZ1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgdmFsdWVJc0JvcmRlckJveCxcblx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIjtcblxuXHQvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLlxuXHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3ggJiZcblx0XHQoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApO1xuXG5cdC8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9IZWlnaHQgd2hlbiB2YWx1ZSBpcyBcImF1dG9cIlxuXHQvLyBUaGlzIGhhcHBlbnMgZm9yIGlubGluZSBlbGVtZW50cyB3aXRoIG5vIGV4cGxpY2l0IHNldHRpbmcgKGdoLTM1NzEpXG5cdGlmICggdmFsID09PSBcImF1dG9cIiApIHtcblx0XHR2YWwgPSBlbGVtWyBcIm9mZnNldFwiICsgbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICkgXTtcblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBcIlwiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmFcblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBVc2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlc1xuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0ZWxlbSxcblx0XHRcdG5hbWUsXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50XCI6IHRydWUsXG5cdFx0XCJjb2x1bW5Db3VudFwiOiB0cnVlLFxuXHRcdFwiZmlsbE9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcImZsZXhHcm93XCI6IHRydWUsXG5cdFx0XCJmbGV4U2hyaW5rXCI6IHRydWUsXG5cdFx0XCJmb250V2VpZ2h0XCI6IHRydWUsXG5cdFx0XCJsaW5lSGVpZ2h0XCI6IHRydWUsXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJvcmRlclwiOiB0cnVlLFxuXHRcdFwib3JwaGFuc1wiOiB0cnVlLFxuXHRcdFwid2lkb3dzXCI6IHRydWUsXG5cdFx0XCJ6SW5kZXhcIjogdHJ1ZSxcblx0XHRcInpvb21cIjogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge1xuXHRcdFwiZmxvYXRcIjogXCJjc3NGbG9hdFwiXG5cdH0sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgIzkyMzdcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHRcdHN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHQvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW1cblx0XHRcdFx0Ly8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXRcblx0XHRcdFx0cmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApICkgJiZcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4K1xuXHRcdFx0XHRcdC8vIFRhYmxlIGNvbHVtbnMgaW4gU2FmYXJpIGhhdmUgbm9uLXplcm8gb2Zmc2V0V2lkdGggJiB6ZXJvXG5cdFx0XHRcdFx0Ly8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggdW5sZXNzIGRpc3BsYXkgaXMgY2hhbmdlZC5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHRcdFx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlXG5cdFx0XHRcdFx0Ly8gaW4gSUUgdGhyb3dzIGFuIGVycm9yLlxuXHRcdFx0XHRcdCggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggfHwgIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKSA/XG5cdFx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApLFxuXHRcdFx0XHRzdWJ0cmFjdCA9IGV4dHJhICYmIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHQpO1xuXG5cdFx0XHQvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZFxuXHRcdFx0aWYgKCBzdWJ0cmFjdCAmJiAoIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSAhPT0gXCJweFwiICkge1xuXG5cdFx0XHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCkgKyBcInB4XCI7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCgge1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoIFwiIFwiICkgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7XG59XG5cbi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xuXHR2YXIgd2hpY2gsXG5cdFx0aSA9IDAsXG5cdFx0YXR0cnMgPSB7IGhlaWdodDogdHlwZSB9O1xuXG5cdC8vIElmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcyxcblx0Ly8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHRcblx0aW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7XG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHtcblx0XHR3aGljaCA9IGNzc0V4cGFuZFsgaSBdO1xuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xuXHR9XG5cblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XG5cdFx0YXR0cnMub3BhY2l0eSA9IGF0dHJzLndpZHRoID0gdHlwZTtcblx0fVxuXG5cdHJldHVybiBhdHRycztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7XG5cdHZhciB0d2Vlbixcblx0XHRjb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyBcIipcIiBdICksXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggKCB0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgKSB7XG5cblx0XHRcdC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkge1xuXHR2YXIgcHJvcCwgdmFsdWUsIHRvZ2dsZSwgaG9va3MsIG9sZGZpcmUsIHByb3BUd2VlbiwgcmVzdG9yZURpc3BsYXksIGRpc3BsYXksXG5cdFx0aXNCb3ggPSBcIndpZHRoXCIgaW4gcHJvcHMgfHwgXCJoZWlnaHRcIiBpbiBwcm9wcyxcblx0XHRhbmltID0gdGhpcyxcblx0XHRvcmlnID0ge30sXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlLFxuXHRcdGhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksXG5cdFx0ZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZnhzaG93XCIgKTtcblxuXHQvLyBRdWV1ZS1za2lwcGluZyBhbmltYXRpb25zIGhpamFjayB0aGUgZnggaG9va3Ncblx0aWYgKCAhb3B0cy5xdWV1ZSApIHtcblx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgXCJmeFwiICk7XG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xuXHRcdFx0aG9va3MudW5xdWV1ZWQgPSAwO1xuXHRcdFx0b2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggIWhvb2tzLnVucXVldWVkICkge1xuXHRcdFx0XHRcdG9sZGZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aG9va3MudW5xdWV1ZWQrKztcblxuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5zdXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVyIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBjb21wbGV0ZXNcblx0XHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0aG9va3MudW5xdWV1ZWQtLTtcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCBcImZ4XCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRGV0ZWN0IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdGZvciAoIHByb3AgaW4gcHJvcHMgKSB7XG5cdFx0dmFsdWUgPSBwcm9wc1sgcHJvcCBdO1xuXHRcdGlmICggcmZ4dHlwZXMudGVzdCggdmFsdWUgKSApIHtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgcHJvcCBdO1xuXHRcdFx0dG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSBcInRvZ2dsZVwiO1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyBcImhpZGVcIiA6IFwic2hvd1wiICkgKSB7XG5cblx0XHRcdFx0Ly8gUHJldGVuZCB0byBiZSBoaWRkZW4gaWYgdGhpcyBpcyBhIFwic2hvd1wiIGFuZFxuXHRcdFx0XHQvLyB0aGVyZSBpcyBzdGlsbCBkYXRhIGZyb20gYSBzdG9wcGVkIHNob3cvaGlkZVxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcInNob3dcIiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gdHJ1ZTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQmFpbCBvdXQgaWYgdGhpcyBpcyBhIG5vLW9wIGxpa2UgLmhpZGUoKS5oaWRlKClcblx0cHJvcFR3ZWVuID0gIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wcyApO1xuXHRpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBSZXN0cmljdCBcIm92ZXJmbG93XCIgYW5kIFwiZGlzcGxheVwiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnNcblx0aWYgKCBpc0JveCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxM1xuXHRcdC8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZFxuXHRcdC8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZXG5cdFx0b3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07XG5cblx0XHQvLyBJZGVudGlmeSBhIGRpc3BsYXkgdHlwZSwgcHJlZmVycmluZyBvbGQgc2hvdy9oaWRlIGRhdGEgb3ZlciB0aGUgQ1NTIGNhc2NhZGVcblx0XHRyZXN0b3JlRGlzcGxheSA9IGRhdGFTaG93ICYmIGRhdGFTaG93LmRpc3BsYXk7XG5cdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0fVxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ICkge1xuXHRcdFx0XHRkaXNwbGF5ID0gcmVzdG9yZURpc3BsYXk7XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHlcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdLCB0cnVlICk7XG5cdFx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5IHx8IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrXG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcImlubGluZVwiIHx8IGRpc3BsYXkgPT09IFwiaW5saW5lLWJsb2NrXCIgJiYgcmVzdG9yZURpc3BsYXkgIT0gbnVsbCApIHtcblx0XHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xuXG5cdFx0XHRcdC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zXG5cdFx0XHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdFx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0c3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5ID0gc3R5bGUuZGlzcGxheTtcblx0XHRcdFx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGlzcGxheSA9PT0gXCJub25lXCIgPyBcIlwiIDogZGlzcGxheTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBvcHRzLm92ZXJmbG93ICkge1xuXHRcdHN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTtcblx0XHRcdHN0eWxlLm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTtcblx0XHRcdHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBJbXBsZW1lbnQgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0cHJvcFR3ZWVuID0gZmFsc2U7XG5cdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblxuXHRcdC8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uXG5cdFx0aWYgKCAhcHJvcFR3ZWVuICkge1xuXHRcdFx0aWYgKCBkYXRhU2hvdyApIHtcblx0XHRcdFx0aWYgKCBcImhpZGRlblwiIGluIGRhdGFTaG93ICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVNob3cgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIFwiZnhzaG93XCIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCBcInJldmVyc2VzXCJcblx0XHRcdGlmICggdG9nZ2xlICkge1xuXHRcdFx0XHRkYXRhU2hvdy5oaWRkZW4gPSAhaGlkZGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaG93IGVsZW1lbnRzIGJlZm9yZSBhbmltYXRpbmcgdGhlbVxuXHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuXHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuXHRcdFx0XHQvLyBUaGUgZmluYWwgc3RlcCBvZiBhIFwiaGlkZVwiIGFuaW1hdGlvbiBpcyBhY3R1YWxseSBoaWRpbmcgdGhlIGVsZW1lbnRcblx0XHRcdFx0aWYgKCAhaGlkZGVuICkge1xuXHRcdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vIFBlci1wcm9wZXJ0eSBzZXR1cFxuXHRcdHByb3BUd2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwgcHJvcCwgYW5pbSApO1xuXHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0ZGF0YVNob3dbIHByb3AgXSA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRwcm9wVHdlZW4uZW5kID0gcHJvcFR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRwcm9wVHdlZW4uc3RhcnQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRqUXVlcnkucHJveHkoIHJlc3VsdC5zdG9wLCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xuXHRcdGFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApO1xuXHR9XG5cblx0Ly8gQXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0YW5pbWF0aW9uXG5cdFx0LnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcblx0XHQuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApXG5cdFx0LmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7XG5cblx0alF1ZXJ5LmZ4LnRpbWVyKFxuXHRcdGpRdWVyeS5leHRlbmQoIHRpY2ssIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRhbmltOiBhbmltYXRpb24sXG5cdFx0XHRxdWV1ZTogYW5pbWF0aW9uLm9wdHMucXVldWVcblx0XHR9IClcblx0KTtcblxuXHRyZXR1cm4gYW5pbWF0aW9uO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cblx0dHdlZW5lcnM6IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApO1xuXHRcdFx0YWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCByY3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH0sXG5cblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nXG5cdH07XG5cblx0Ly8gR28gdG8gdGhlIGVuZCBzdGF0ZSBpZiBmeCBhcmUgb2ZmXG5cdGlmICggalF1ZXJ5LmZ4Lm9mZiApIHtcblx0XHRvcHQuZHVyYXRpb24gPSAwO1xuXG5cdH0gZWxzZSB7XG5cdFx0aWYgKCB0eXBlb2Ygb3B0LmR1cmF0aW9uICE9PSBcIm51bWJlclwiICkge1xuXHRcdFx0aWYgKCBvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyApIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0galF1ZXJ5Lm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gUnVuIHRoZSB0aW1lciBhbmQgc2FmZWx5IHJlbW92ZSBpdCB3aGVuIGRvbmUgKGFsbG93aW5nIGZvciBleHRlcm5hbCByZW1vdmFsKVxuXHRcdGlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkge1xuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhdGltZXJzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZnguc3RvcCgpO1xuXHR9XG5cdGZ4Tm93ID0gdW5kZWZpbmVkO1xufTtcblxualF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkge1xuXHRqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7XG5cdGpRdWVyeS5meC5zdGFydCgpO1xufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCBpblByb2dyZXNzICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGluUHJvZ3Jlc3MgPSB0cnVlO1xuXHRzY2hlZHVsZSgpO1xufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0aW5Qcm9ncmVzcyA9IG51bGw7XG59O1xuXG5qUXVlcnkuZnguc3BlZWRzID0ge1xuXHRzbG93OiA2MDAsXG5cdGZhc3Q6IDIwMCxcblxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxuLy8gaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTAwMzI0MDE0NzQ3L2h0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBocC8yMDA5LzA3L2pxdWVyeS1kZWxheS9cbmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xuXHR0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lO1xuXHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHtcblx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0gKTtcbn07XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4zIG9ubHlcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59ICkoKTtcblxuXG52YXIgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvblxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0bm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgdmFsdWUgKTtcblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsXG5cdFx0XHRpID0gMCxcblxuXHRcdFx0Ly8gQXR0cmlidXRlIG5hbWVzIGNhbiBjb250YWluIG5vbi1IVE1MIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuXHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkge1xuXHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2Vcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7XG5cdFx0fVxuXHRcdHJldHVybiBuYW1lO1xuXHR9XG59O1xuXG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlLFxuXHRcdFx0bG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdGlmICggIWlzWE1MICkge1xuXG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdGxvd2VyY2FzZU5hbWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSApO1xuXG5cblxuXG52YXIgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcblx0fSxcblxuXHRwcm9wSG9va3M6IHtcblx0XHR0YWJJbmRleDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0XHRcdC8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZVxuXHRcdFx0XHQvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXRcblx0XHRcdFx0Ly8gaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTQxMTE2MjMzMzQ3L2h0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvXG5cdFx0XHRcdC8vIFVzZSBwcm9wZXIgYXR0cmlidXRlIHJldHJpZXZhbCgjMTIwNzIpXG5cdFx0XHRcdHZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidGFiaW5kZXhcIiApO1xuXG5cdFx0XHRcdGlmICggdGFiaW5kZXggKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlSW50KCB0YWJpbmRleCwgMTAgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fFxuXHRcdFx0XHRcdHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmXG5cdFx0XHRcdFx0ZWxlbS5ocmVmXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRwcm9wRml4OiB7XG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXG5cdFx0XCJjbGFzc1wiOiBcImNsYXNzTmFtZVwiXG5cdH1cbn0gKTtcblxuLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG4vLyBBY2Nlc3NpbmcgdGhlIHNlbGVjdGVkSW5kZXggcHJvcGVydHlcbi8vIGZvcmNlcyB0aGUgYnJvd3NlciB0byByZXNwZWN0IHNldHRpbmcgc2VsZWN0ZWRcbi8vIG9uIHRoZSBvcHRpb25cbi8vIFRoZSBnZXR0ZXIgZW5zdXJlcyBhIGRlZmF1bHQgb3B0aW9uIGlzIHNlbGVjdGVkXG4vLyB3aGVuIGluIGFuIG9wdGdyb3VwXG4vLyBlc2xpbnQgcnVsZSBcIm5vLXVudXNlZC1leHByZXNzaW9uc1wiIGlzIGRpc2FibGVkIGZvciB0aGlzIGNvZGVcbi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcFxuaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHtcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCAmJiBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdHBhcmVudC5zZWxlY3RlZEluZGV4O1xuXG5cdFx0XHRcdGlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxualF1ZXJ5LmVhY2goIFtcblx0XCJ0YWJJbmRleFwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwibWF4TGVuZ3RoXCIsXG5cdFwiY2VsbFNwYWNpbmdcIixcblx0XCJjZWxsUGFkZGluZ1wiLFxuXHRcInJvd1NwYW5cIixcblx0XCJjb2xTcGFuXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJjb250ZW50RWRpdGFibGVcIlxuXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7XG59ICk7XG5cblxuXG5cblx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlY1xuXHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbmZyYXN0cnVjdHVyZS5odG1sI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICkge1xuXHRcdFx0Y2xhc3NlcyA9IHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXR0ciggXCJjbGFzc1wiLCBcIlwiICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgKSB7XG5cdFx0XHRjbGFzc2VzID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIHR5cGUgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnRvZ2dsZUNsYXNzKFxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIHRoaXMsIGksIGdldENsYXNzKCB0aGlzICksIHN0YXRlVmFsICksXG5cdFx0XHRcdFx0c3RhdGVWYWxcblx0XHRcdFx0KTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBjbGFzc05hbWUsIGksIHNlbGYsIGNsYXNzTmFtZXM7XG5cblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0XHR3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHRcdC8vIENoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdFxuXHRcdFx0XHRcdGlmICggc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICkgKSB7XG5cdFx0XHRcdFx0XHRzZWxmLnJlbW92ZUNsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdC8vIFRvZ2dsZSB3aG9sZSBjbGFzcyBuYW1lXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0XHRjbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApO1xuXHRcdFx0XHRpZiAoIGNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdC8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXRcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiLCBjbGFzc05hbWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkIGBmYWxzZWAsXG5cdFx0XHRcdC8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBicmluZyBiYWNrIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5IHNhdmVkIChpZiBhbnl0aGluZyksXG5cdFx0XHRcdC8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cblx0XHRcdFx0aWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHtcblx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLFxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRcdFx0XHRcIlwiIDpcblx0XHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBjbGFzc05hbWUsIGVsZW0sXG5cdFx0XHRpID0gMDtcblxuXHRcdGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIjtcblx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0KCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArIFwiIFwiICkuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIHJyZXR1cm4gPSAvXFxyL2c7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIGlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87XG5cbmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXG5cdFx0dmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gdG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7XG5cblx0XHQvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vd1xuXHRcdGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGUuaW5kZXhPZiggXCIuXCIgKSA+IC0xICkge1xuXG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdHR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7XG5cdFx0XHRuYW1lc3BhY2VzLnNvcnQoKTtcblx0XHR9XG5cdFx0b250eXBlID0gdHlwZS5pbmRleE9mKCBcIjpcIiApIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiICk7XG5cdFx0ZXZlbnQucm5hbWVzcGFjZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiZcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fFxuXHRcdFx0XHRzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKVxuXHRcdFx0XHRpZiAoIG9udHlwZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZFxuXHRcdFx0XHRcdHRtcCA9IGVsZW1bIG9udHlwZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmVcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IHRtcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZVxuXHQvLyBVc2VkIG9ubHkgZm9yIGBmb2N1cyhpbiB8IG91dClgIGV2ZW50c1xuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkge1xuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXHR9XG5cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTtcblx0XHR9ICk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXTtcblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG4vLyBTdXBwb3J0OiBGaXJlZm94IDw9NDRcbi8vIEZpcmVmb3ggZG9lc24ndCBoYXZlIGZvY3VzKGluIHwgb3V0KSBldmVudHNcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3Nzg3XG4vL1xuLy8gU3VwcG9ydDogQ2hyb21lIDw9NDggLSA0OSwgU2FmYXJpIDw9OS4wIC0gOS4xXG4vLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcbi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlclxuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDk4NTdcbmlmICggIXN1cHBvcnQuZm9jdXNpbiApIHtcblx0alF1ZXJ5LmVhY2goIHsgZm9jdXM6IFwiZm9jdXNpblwiLCBibHVyOiBcImZvY3Vzb3V0XCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblxuXHRcdC8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0XG5cdFx0dmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApICk7XG5cdFx0fTtcblxuXHRcdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHtcblx0XHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5hZGRFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7XG5cdFx0XHR9LFxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICkgLSAxO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBkb2MsIGZpeCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0gKTtcbn1cbnZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcblxudmFyIG5vbmNlID0galF1ZXJ5Lm5vdygpO1xuXG52YXIgcnF1ZXJ5ID0gKCAvXFw/LyApO1xuXG5cblxuLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZ1xualF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHZhciB4bWw7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHQvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC5cblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHR4bWwgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLlxuXHRcdGpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkge1xuXHRcdFx0aWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHtcblxuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKFxuXHRcdFx0XHRcdHByZWZpeCArIFwiW1wiICsgKCB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9IG51bGwgPyBpIDogXCJcIiApICsgXCJdXCIsXG5cdFx0XHRcdFx0dixcblx0XHRcdFx0XHR0cmFkaXRpb25hbCxcblx0XHRcdFx0XHRhZGRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZU9yRnVuY3Rpb24gKSA/XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbigpIDpcblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uO1xuXG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICtcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0fTtcblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0gKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApXG5cdFx0LmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKVxuXHRcdC5tYXAoIGZ1bmN0aW9uKCBpLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSApLmdldCgpO1xuXHR9XG59ICk7XG5cblxudmFyXG5cdHIyMCA9IC8lMjAvZyxcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJhbnRpQ2FjaGUgPSAvKFs/Jl0pXz1bXiZdKi8sXG5cdHJoZWFkZXJzID0gL14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopJC9tZyxcblxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblxuXHQvKiBQcmVmaWx0ZXJzXG5cdCAqIDEpIFRoZXkgYXJlIHVzZWZ1bCB0byBpbnRyb2R1Y2UgY3VzdG9tIGRhdGFUeXBlcyAoc2VlIGFqYXgvanNvbnAuanMgZm9yIGFuIGV4YW1wbGUpXG5cdCAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6XG5cdCAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnRcblx0ICogICAgLSBBRlRFUiBwYXJhbSBzZXJpYWxpemF0aW9uIChzLmRhdGEgaXMgYSBzdHJpbmcgaWYgcy5wcm9jZXNzRGF0YSBpcyB0cnVlKVxuXHQgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHByZWZpbHRlcnMgPSB7fSxcblxuXHQvKiBUcmFuc3BvcnRzIGJpbmRpbmdzXG5cdCAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogMikgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHRyYW5zcG9ydHMgPSB7fSxcblxuXHQvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb25cblx0YWxsVHlwZXMgPSBcIiovXCIuY29uY2F0KCBcIipcIiApLFxuXG5cdC8vIEFuY2hvciB0YWcgZm9yIHBhcnNpbmcgdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvcmlnaW5BbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXHRvcmlnaW5BbmNob3IuaHJlZiA9IGxvY2F0aW9uLmhyZWY7XG5cbi8vIEJhc2UgXCJjb25zdHJ1Y3RvclwiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnRcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xuXG5cdC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXCIqXCJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xuXHRcdFx0ZGF0YVR5cGVFeHByZXNzaW9uID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGFUeXBlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkge1xuXG5cdFx0XHQvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uXG5cdFx0XHR3aGlsZSAoICggZGF0YVR5cGUgPSBkYXRhVHlwZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0Ly8gUHJlcGVuZCBpZiByZXF1ZXN0ZWRcblx0XHRcdFx0aWYgKCBkYXRhVHlwZVsgMCBdID09PSBcIitcIiApIHtcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgXCIqXCI7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS51bnNoaWZ0KCBmdW5jICk7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkucHVzaCggZnVuYyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG4vLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHNcbmZ1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKSB7XG5cblx0dmFyIGluc3BlY3RlZCA9IHt9LFxuXHRcdHNlZWtpbmdUcmFuc3BvcnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApO1xuXG5cdGZ1bmN0aW9uIGluc3BlY3QoIGRhdGFUeXBlICkge1xuXHRcdHZhciBzZWxlY3RlZDtcblx0XHRpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlO1xuXHRcdGpRdWVyeS5lYWNoKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10sIGZ1bmN0aW9uKCBfLCBwcmVmaWx0ZXJPckZhY3RvcnkgKSB7XG5cdFx0XHR2YXIgZGF0YVR5cGVPclRyYW5zcG9ydCA9IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApO1xuXHRcdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc2Vla2luZ1RyYW5zcG9ydCAmJiAhaW5zcGVjdGVkWyBkYXRhVHlwZU9yVHJhbnNwb3J0IF0gKSB7XG5cblx0XHRcdFx0b3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7XG5cdFx0XHRcdHJldHVybiAhKCBzZWxlY3RlZCA9IGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0cmV0dXJuIGluc3BlY3QoIG9wdGlvbnMuZGF0YVR5cGVzWyAwIF0gKSB8fCAhaW5zcGVjdGVkWyBcIipcIiBdICYmIGluc3BlY3QoIFwiKlwiICk7XG59XG5cbi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9uc1xuLy8gdGhhdCB0YWtlcyBcImZsYXRcIiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZClcbi8vIEZpeGVzICM5ODg3XG5mdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyApIHtcblx0dmFyIGtleSwgZGVlcCxcblx0XHRmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307XG5cblx0Zm9yICgga2V5IGluIHNyYyApIHtcblx0XHRpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdCggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XG5cdFx0fVxuXHR9XG5cdGlmICggZGVlcCApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcbiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpXG4gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHtcblxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXG5cdFx0Y29udGVudHMgPSBzLmNvbnRlbnRzLFxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzO1xuXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXG5cdHdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09IFwiKlwiICkge1xuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xuXHRcdGlmICggY3QgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJDb250ZW50LVR5cGVcIiApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxuXHRpZiAoIGN0ICkge1xuXHRcdGZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7XG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xuXHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGVcblx0aWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7XG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlc1xuXHRcdGZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkge1xuXHRcdFx0aWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgXCIgXCIgKyBkYXRhVHlwZXNbIDAgXSBdICkge1xuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xuXHRcdFx0XHRmaXJzdERhdGFUeXBlID0gdHlwZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcblx0XHRmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlO1xuXHR9XG5cblx0Ly8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZVxuXHQvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZFxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG5cdGlmICggZmluYWxEYXRhVHlwZSApIHtcblx0XHRpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkge1xuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdO1xuXHR9XG59XG5cbi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcbiAqIEFsc28gc2V0cyB0aGUgcmVzcG9uc2VYWFggZmllbGRzIG9uIHRoZSBqcVhIUiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7XG5cdHZhciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LFxuXHRcdGNvbnZlcnRlcnMgPSB7fSxcblxuXHRcdC8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb25cblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpO1xuXG5cdC8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5c1xuXHRpZiAoIGRhdGFUeXBlc1sgMSBdICkge1xuXHRcdGZvciAoIGNvbnYgaW4gcy5jb252ZXJ0ZXJzICkge1xuXHRcdFx0Y29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTtcblx0XHR9XG5cdH1cblxuXHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0Ly8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGVcblx0d2hpbGUgKCBjdXJyZW50ICkge1xuXG5cdFx0aWYgKCBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gKSB7XG5cdFx0XHRqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZFxuXHRcdGlmICggIXByZXYgJiYgaXNTdWNjZXNzICYmIHMuZGF0YUZpbHRlciApIHtcblx0XHRcdHJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApO1xuXHRcdH1cblxuXHRcdHByZXYgPSBjdXJyZW50O1xuXHRcdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHRcdGlmICggY3VycmVudCApIHtcblxuXHRcdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgcy50aHJvd3MgKSB7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInBhcnNlcmVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogbG9jYXRpb24uaHJlZixcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGxvY2F0aW9uLnByb3RvY29sICksXG5cdFx0Z2xvYmFsOiB0cnVlLFxuXHRcdHByb2Nlc3NEYXRhOiB0cnVlLFxuXHRcdGFzeW5jOiB0cnVlLFxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxuXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC9cXGJ4bWxcXGIvLFxuXHRcdFx0aHRtbDogL1xcYmh0bWwvLFxuXHRcdFx0anNvbjogL1xcYmpzb25cXGIvXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IEpTT04ucGFyc2UsXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyxcblx0XHRcdHJlc3BvbnNlSGVhZGVycyxcblxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblxuXHRcdFx0Ly8gVXJsIGNsZWFudXAgdmFyXG5cdFx0XHR1cmxBbmNob3IsXG5cblx0XHRcdC8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbilcblx0XHRcdGNvbXBsZXRlZCxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkXG5cdFx0XHRmaXJlR2xvYmFscyxcblxuXHRcdFx0Ly8gTG9vcCB2YXJpYWJsZVxuXHRcdFx0aSxcblxuXHRcdFx0Ly8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsXG5cdFx0XHR1bmNhY2hlZCxcblxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuXHRcdFx0cyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksXG5cblx0XHRcdC8vIENhbGxiYWNrcyBjb250ZXh0XG5cdFx0XHRjYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcyxcblxuXHRcdFx0Ly8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvblxuXHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmXG5cdFx0XHRcdCggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/XG5cdFx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LFxuXG5cdFx0XHQvLyBEZWZlcnJlZHNcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LFxuXG5cdFx0XHQvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKVxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcblx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSxcblxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnMgPSB7fTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBtYXRjaCA9PSBudWxsID8gbnVsbCA6IG1hdGNoO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFJhdyBzdHJpbmdcblx0XHRcdFx0Z2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29tcGxldGVkID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSA9XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRzLm1pbWVUeXBlID0gdHlwZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdFx0c3RhdHVzQ29kZTogZnVuY3Rpb24oIG1hcCApIHtcblx0XHRcdFx0XHR2YXIgY29kZTtcblx0XHRcdFx0XHRpZiAoIG1hcCApIHtcblx0XHRcdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrc1xuXHRcdFx0XHRcdFx0XHRqcVhIUi5hbHdheXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFja3MgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgb2xkIG9uZXNcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0XG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHR2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDtcblx0XHRcdFx0XHRpZiAoIHRyYW5zcG9ydCApIHtcblx0XHRcdFx0XHRcdHRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRvbmUoIDAsIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGRlZmVycmVkc1xuXHRcdGRlZmVycmVkLnByb21pc2UoIGpxWEhSICk7XG5cblx0XHQvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVjdCBpdClcblx0XHQvLyBIYW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKVxuXHRcdC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZVxuXHRcdHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCBycHJvdG9jb2wsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICk7XG5cblx0XHQvLyBBbGlhcyBtZXRob2Qgb3B0aW9uIHRvIHR5cGUgYXMgcGVyIHRpY2tldCAjMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSwgRWRnZSAxMiAtIDEzXG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIG9uIGFjY2Vzc2luZyB0aGUgaHJlZiBwcm9wZXJ0eSBpZiB1cmwgaXMgbWFsZm9ybWVkLFxuXHRcdFx0Ly8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5XG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RhcnRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFVwcGVyY2FzZSB0aGUgdHlwZVxuXHRcdHMudHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnRcblx0XHRzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTtcblxuXHRcdC8vIFNhdmUgdGhlIFVSTCBpbiBjYXNlIHdlJ3JlIHRveWluZyB3aXRoIHRoZSBJZi1Nb2RpZmllZC1TaW5jZVxuXHRcdC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvblxuXHRcdC8vIFJlbW92ZSBoYXNoIHRvIHNpbXBsaWZ5IHVybCBtYW5pcHVsYXRpb25cblx0XHRjYWNoZVVSTCA9IHMudXJsLnJlcGxhY2UoIHJoYXNoLCBcIlwiICk7XG5cblx0XHQvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudFxuXHRcdGlmICggIXMuaGFzQ29udGVudCApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrXG5cdFx0XHR1bmNhY2hlZCA9IHMudXJsLnNsaWNlKCBjYWNoZVVSTC5sZW5ndGggKTtcblxuXHRcdFx0Ly8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybFxuXHRcdFx0aWYgKCBzLmRhdGEgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlKysgKSArIHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKVxuXHRcdHJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0sIGpRdWVyeS5pc1BsYWluT2JqZWN0KCB1cmwgKSAmJiB1cmwgKSApO1xuXHR9O1xufSApO1xuXG5cbmpRdWVyeS5fZXZhbFVybCA9IGZ1bmN0aW9uKCB1cmwgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICgjMTEyNjQpXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRkYXRhVHlwZTogXCJzY3JpcHRcIixcblx0XHRjYWNoZTogdHJ1ZSxcblx0XHRhc3luYzogZmFsc2UsXG5cdFx0Z2xvYmFsOiBmYWxzZSxcblx0XHRcInRocm93c1wiOiB0cnVlXG5cdH0gKTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0XHRodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcblx0XHRcdHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApO1xuXG5cdFx0XHRpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXAubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXG5cdFx0XHRcdHdoaWxlICggZWxlbS5maXJzdEVsZW1lbnRDaGlsZCApIHtcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbGVtO1xuXHRcdFx0fSApLmFwcGVuZCggdGhpcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwoIHRoaXMsIGkgKSA6IGh0bWwgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0dW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCBcImJvZHlcIiApLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xuXHRcdH0gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiAhalF1ZXJ5LmV4cHIucHNldWRvcy52aXNpYmxlKCBlbGVtICk7XG59O1xualF1ZXJ5LmV4cHIucHNldWRvcy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7XG59O1xuXG5cblxuXG5qUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cdH0gY2F0Y2ggKCBlICkge31cbn07XG5cbnZhciB4aHJTdWNjZXNzU3RhdHVzID0ge1xuXG5cdFx0Ly8gRmlsZSBwcm90b2NvbCBhbHdheXMgeWllbGRzIHN0YXR1cyBjb2RlIDAsIGFzc3VtZSAyMDBcblx0XHQwOiAyMDAsXG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdDEyMjM6IDIwNFxuXHR9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG5zdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoIFwid2l0aENyZWRlbnRpYWxzXCIgaW4geGhyU3VwcG9ydGVkICk7XG5zdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDtcblxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHR2YXIgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s7XG5cblx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0dmFyIGksXG5cdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKTtcblxuXHRcdFx0XHR4aHIub3Blbihcblx0XHRcdFx0XHRvcHRpb25zLnR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucy51cmwsXG5cdFx0XHRcdFx0b3B0aW9ucy5hc3luYyxcblx0XHRcdFx0XHRvcHRpb25zLnVzZXJuYW1lLFxuXHRcdFx0XHRcdG9wdGlvbnMucGFzc3dvcmRcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHQvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLlxuXHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gKSB7XG5cdFx0XHRcdFx0aGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBoZWFkZXJzXG5cdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblx0XHRcdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0gZXJyb3JDYWxsYmFjayA9IHhoci5vbmxvYWQgPVxuXHRcdFx0XHRcdFx0XHRcdHhoci5vbmVycm9yID0geGhyLm9uYWJvcnQgPSB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0gY2FsbGJhY2soIFwiZXJyb3JcIiApO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdFx0XHQvLyBVc2Ugb25yZWFkeXN0YXRlY2hhbmdlIHRvIHJlcGxhY2Ugb25hYm9ydFxuXHRcdFx0XHQvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzXG5cdFx0XHRcdGlmICggeGhyLm9uYWJvcnQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR4aHIub25hYm9ydCA9IGVycm9yQ2FsbGJhY2s7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXNcblx0XHRcdFx0XHRcdGlmICggeGhyLnJlYWR5U3RhdGUgPT09IDQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQWxsb3cgb25lcnJvciB0byBiZSBjYWxsZWQgZmlyc3QsXG5cdFx0XHRcdFx0XHRcdC8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydFxuXHRcdFx0XHRcdFx0XHQvLyBBbHNvLCBzYXZlIGVycm9yQ2FsbGJhY2sgdG8gYSB2YXJpYWJsZVxuXHRcdFx0XHRcdFx0XHQvLyBhcyB4aHIub25lcnJvciBjYW5ub3QgYmUgYWNjZXNzZWRcblx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlcnJvckNhbGxiYWNrKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBjYWxsYmFjayggXCJhYm9ydFwiICk7XG5cblx0XHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRcdC8vIERvIHNlbmQgdGhlIHJlcXVlc3QgKHRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbilcblx0XHRcdFx0XHR4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8fCBudWxsICk7XG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0Ly8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3RpZmllZCBhcyBhbiBlcnJvciB5ZXRcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKVxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTtcblx0fVxufSApO1xuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRhY2NlcHRzOiB7XG5cdFx0c2NyaXB0OiBcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgXCIgK1xuXHRcdFx0XCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogL1xcYig/OmphdmF8ZWNtYSlzY3JpcHRcXGIvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5kIGNyb3NzRG9tYWluXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHMuY2FjaGUgPSBmYWxzZTtcblx0fVxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy50eXBlID0gXCJHRVRcIjtcblx0fVxufSApO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblxuXHQvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHR2YXIgc2NyaXB0LCBjYWxsYmFjaztcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkge1xuXHRcdFx0XHRzY3JpcHQgPSBqUXVlcnkoIFwiPHNjcmlwdD5cIiApLnByb3AoIHtcblx0XHRcdFx0XHRjaGFyc2V0OiBzLnNjcmlwdENoYXJzZXQsXG5cdFx0XHRcdFx0c3JjOiBzLnVybFxuXHRcdFx0XHR9ICkub24oXG5cdFx0XHRcdFx0XCJsb2FkIGVycm9yXCIsXG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggZXZ0ICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBldnQudHlwZSA9PT0gXCJlcnJvclwiID8gNDA0IDogMjAwLCBldnQudHlwZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnlcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTtcblx0XHRcdH0sXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIG9sZENhbGxiYWNrcyA9IFtdLFxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vO1xuXG4vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGpzb25wOiBcImNhbGxiYWNrXCIsXG5cdGpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjYWxsYmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgXCJfXCIgKyAoIG5vbmNlKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0gKTtcblxuXHRcdC8vIERlbGVnYXRlIHRvIHNjcmlwdFxuXHRcdHJldHVybiBcInNjcmlwdFwiO1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA4IG9ubHlcbi8vIEluIFNhZmFyaSA4IGRvY3VtZW50cyBjcmVhdGVkIHZpYSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnRcbi8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLlxuLy8gQmVjYXVzZSBvZiB0aGF0LCB0aGlzIHNlY3VyaXR5IG1lYXN1cmUgaGFzIHRvIGJlIGRpc2FibGVkIGluIFNhZmFyaSA4LlxuLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzMzN1xuc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkge1xuXHR2YXIgYm9keSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApLmJvZHk7XG5cdGJvZHkuaW5uZXJIVE1MID0gXCI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPlwiO1xuXHRyZXR1cm4gYm9keS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMjtcbn0gKSgpO1xuXG5cbi8vIEFyZ3VtZW50IFwiZGF0YVwiIHNob3VsZCBiZSBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LFxuLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnRcbi8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmdcbmpRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7XG5cdGlmICggdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblxuXHR2YXIgYmFzZSwgcGFyc2VkLCBzY3JpcHRzO1xuXG5cdGlmICggIWNvbnRleHQgKSB7XG5cblx0XHQvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcblx0XHQvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvblxuXHRcdGlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7XG5cdFx0XHRjb250ZXh0ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICk7XG5cblx0XHRcdC8vIFNldCB0aGUgYmFzZSBocmVmIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHRcdFx0Ly8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHNcblx0XHRcdC8vIGFyZSBiYXNlZCBvbiB0aGUgZG9jdW1lbnQncyBVUkwgKGdoLTI5NjUpXG5cdFx0XHRiYXNlID0gY29udGV4dC5jcmVhdGVFbGVtZW50KCBcImJhc2VcIiApO1xuXHRcdFx0YmFzZS5ocmVmID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjtcblx0XHRcdGNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0fVxuXHR9XG5cblx0cGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7XG5cdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsgMSBdICkgXTtcblx0fVxuXG5cdHBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoIFwiIFwiICk7XG5cblx0aWYgKCBvZmYgPiAtMSApIHtcblx0XHRzZWxlY3RvciA9IHN0cmlwQW5kQ29sbGFwc2UoIHVybC5zbGljZSggb2ZmICkgKTtcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xuXHR9XG5cblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzXG5qUXVlcnkuZWFjaCggW1xuXHRcImFqYXhTdGFydFwiLFxuXHRcImFqYXhTdG9wXCIsXG5cdFwiYWpheENvbXBsZXRlXCIsXG5cdFwiYWpheEVycm9yXCIsXG5cdFwiYWpheFN1Y2Nlc3NcIixcblx0XCJhamF4U2VuZFwiXG5dLCBmdW5jdGlvbiggaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59ICk7XG5cblxuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgZG9jLCBkb2NFbGVtLCByZWN0LCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gemVyb3MgZm9yIGRpc2Nvbm5lY3RlZCBhbmQgaGlkZGVuIChkaXNwbGF5OiBub25lKSBlbGVtZW50cyAoZ2gtMjMxMClcblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdHdpbiA9IGRvYy5kZWZhdWx0VmlldztcblxuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsXG5cdFx0XHRsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQgLSBkb2NFbGVtLmNsaWVudExlZnRcblx0XHR9O1xuXHR9LFxuXG5cdHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICF0aGlzWyAwIF0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIG9mZnNldFBhcmVudCwgb2Zmc2V0LFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBGaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LFxuXHRcdC8vIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zmc2V0IHBhcmVudFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblxuXHRcdFx0Ly8gQXNzdW1lIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpcyB0aGVyZSB3aGVuIGNvbXB1dGVkIHBvc2l0aW9uIGlzIGZpeGVkXG5cdFx0XHRvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnRcblx0XHRcdG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7XG5cblx0XHRcdC8vIEdldCBjb3JyZWN0IG9mZnNldHNcblx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7XG5cdFx0XHRpZiAoICFub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7XG5cdFx0XHRcdHRvcDogcGFyZW50T2Zmc2V0LnRvcCArIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKSxcblx0XHRcdFx0bGVmdDogcGFyZW50T2Zmc2V0LmxlZnQgKyBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtO1xuXHRcdFx0fSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0d2luID0gZWxlbS5kZWZhdWx0Vmlldztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fTtcbn0gKTtcblxuLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OVxuLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb25cbi8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NFxuLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDdcbi8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQ7XG4vLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwganVzdCBjaGVjayBmb3IgaXQgaGVyZVxualF1ZXJ5LmVhY2goIFsgXCJ0b3BcIiwgXCJsZWZ0XCIgXSwgZnVuY3Rpb24oIGksIHByb3AgKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdFx0Y29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTtcblxuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0gKTtcblxuXG4vLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IEhlaWdodDogXCJoZWlnaHRcIiwgV2lkdGg6IFwid2lkdGhcIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHtcblx0alF1ZXJ5LmVhY2goIHsgcGFkZGluZzogXCJpbm5lclwiICsgbmFtZSwgY29udGVudDogdHlwZSwgXCJcIjogXCJvdXRlclwiICsgbmFtZSB9LFxuXHRcdGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gJCggd2luZG93ICkub3V0ZXJXaWR0aC9IZWlnaHQgcmV0dXJuIHcvaCBpbmNsdWRpbmcgc2Nyb2xsYmFycyAoZ2gtMTcyOSlcblx0XHRcdFx0XHRyZXR1cm4gZnVuY05hbWUuaW5kZXhPZiggXCJvdXRlclwiICkgPT09IDAgP1xuXHRcdFx0XHRcdFx0ZWxlbVsgXCJpbm5lclwiICsgbmFtZSBdIDpcblx0XHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBcImNsaWVudFwiICsgbmFtZSBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodFxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0ZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdFx0XHQvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sXG5cdFx0XHRcdFx0Ly8gd2hpY2hldmVyIGlzIGdyZWF0ZXN0XG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwib2Zmc2V0XCIgKyBuYW1lIF0sIGRvY1sgXCJvZmZzZXRcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGRvY1sgXCJjbGllbnRcIiArIG5hbWUgXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cblx0XHRcdFx0XHQvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0XG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6XG5cblx0XHRcdFx0XHQvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTtcblx0XHRcdH0sIHR5cGUsIGNoYWluYWJsZSA/IG1hcmdpbiA6IHVuZGVmaW5lZCwgY2hhaW5hYmxlICk7XG5cdFx0fTtcblx0fSApO1xufSApO1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRiaW5kOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7XG5cdH0sXG5cblx0ZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkge1xuXG5cdFx0Ly8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKVxuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID9cblx0XHRcdHRoaXMub2ZmKCBzZWxlY3RvciwgXCIqKlwiICkgOlxuXHRcdFx0dGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkge1xuXHRpZiAoIGhvbGQgKSB7XG5cdFx0alF1ZXJ5LnJlYWR5V2FpdCsrO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHR9XG59O1xualF1ZXJ5LmlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xualF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7XG5qUXVlcnkubm9kZU5hbWUgPSBub2RlTmFtZTtcblxuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG5cbnZhclxuXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSxcblxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfJCA9IHdpbmRvdy4kO1xuXG5qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkge1xuXHRpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LiQgPSBfJDtcblx0fVxuXG5cdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LmpRdWVyeSA9IF9qUXVlcnk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5O1xufTtcblxuLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbiBBTURcbi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1Nylcbi8vIGFuZCBDb21tb25KUyBmb3IgYnJvd3NlciBlbXVsYXRvcnMgKCMxMzU2NilcbmlmICggIW5vR2xvYmFsICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cbnJldHVybiBqUXVlcnk7XG59ICk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2pxdWVyeS9kaXN0L2pxdWVyeS5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XHJcbn0gY2F0Y2goZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcclxuXHRcdGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3B1YmxpYy9hc3NldHMvYWRtaW4vdmVuZG9yL3Nhc3MvcGFwZXItZGFzaGJvYXJkLnNjc3Ncbi8vIG1vZHVsZSBpZCA9IC4vcHVibGljL2Fzc2V0cy9hZG1pbi92ZW5kb3Ivc2Fzcy9wYXBlci1kYXNoYm9hcmQuc2Nzc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcHVibGljL2Fzc2V0cy9mcm9udGVuZC9zYXNzL25vdy11aS1raXQuc2Nzc1xuLy8gbW9kdWxlIGlkID0gLi9wdWJsaWMvYXNzZXRzL2Zyb250ZW5kL3Nhc3Mvbm93LXVpLWtpdC5zY3NzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIiFmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBhKGkscyl7aWYoIW5baV0pe2lmKCF0W2ldKXt2YXIgbD1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFzJiZsKXJldHVybiBsKGksITApO2lmKG8pcmV0dXJuIG8oaSwhMCk7dmFyIHU9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyB1LmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsdX12YXIgYz1uW2ldPXtleHBvcnRzOnt9fTt0W2ldWzBdLmNhbGwoYy5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbaV1bMV1bZV07cmV0dXJuIGEobj9uOmUpfSxjLGMuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgbz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHIubGVuZ3RoO2krKylhKHJbaV0pO3JldHVybiBhfSh7MTpbZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIoKXt9ZnVuY3Rpb24gYShlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoXCJyZXNvbHZlciBtdXN0IGJlIGEgZnVuY3Rpb25cIik7dGhpcy5zdGF0ZT1qLHRoaXMucXVldWU9W10sdGhpcy5vdXRjb21lPXZvaWQgMCxlIT09ciYmbCh0aGlzLGUpfWZ1bmN0aW9uIG8oZSx0LG4pe3RoaXMucHJvbWlzZT1lLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJih0aGlzLm9uRnVsZmlsbGVkPXQsdGhpcy5jYWxsRnVsZmlsbGVkPXRoaXMub3RoZXJDYWxsRnVsZmlsbGVkKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBuJiYodGhpcy5vblJlamVjdGVkPW4sdGhpcy5jYWxsUmVqZWN0ZWQ9dGhpcy5vdGhlckNhbGxSZWplY3RlZCl9ZnVuY3Rpb24gaShlLHQsbil7cChmdW5jdGlvbigpe3ZhciByO3RyeXtyPXQobil9Y2F0Y2goYSl7cmV0dXJuIHYucmVqZWN0KGUsYSl9cj09PWU/di5yZWplY3QoZSxuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlc29sdmUgcHJvbWlzZSB3aXRoIGl0c2VsZlwiKSk6di5yZXNvbHZlKGUscil9KX1mdW5jdGlvbiBzKGUpe3ZhciB0PWUmJmUudGhlbjtyZXR1cm4gZSYmXCJvYmplY3RcIj09dHlwZW9mIGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/ZnVuY3Rpb24oKXt0LmFwcGx5KGUsYXJndW1lbnRzKX06dm9pZCAwfWZ1bmN0aW9uIGwoZSx0KXtmdW5jdGlvbiBuKHQpe298fChvPSEwLHYucmVqZWN0KGUsdCkpfWZ1bmN0aW9uIHIodCl7b3x8KG89ITAsdi5yZXNvbHZlKGUsdCkpfWZ1bmN0aW9uIGEoKXt0KHIsbil9dmFyIG89ITEsaT11KGEpO1wiZXJyb3JcIj09PWkuc3RhdHVzJiZuKGkudmFsdWUpfWZ1bmN0aW9uIHUoZSx0KXt2YXIgbj17fTt0cnl7bi52YWx1ZT1lKHQpLG4uc3RhdHVzPVwic3VjY2Vzc1wifWNhdGNoKHIpe24uc3RhdHVzPVwiZXJyb3JcIixuLnZhbHVlPXJ9cmV0dXJuIG59ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHRoaXM/ZTp2LnJlc29sdmUobmV3IHRoaXMociksZSl9ZnVuY3Rpb24gZihlKXt2YXIgdD1uZXcgdGhpcyhyKTtyZXR1cm4gdi5yZWplY3QodCxlKX1mdW5jdGlvbiBkKGUpe2Z1bmN0aW9uIHQoZSx0KXtmdW5jdGlvbiByKGUpe2lbdF09ZSwrK3MhPT1hfHxvfHwobz0hMCx2LnJlc29sdmUodSxpKSl9bi5yZXNvbHZlKGUpLnRoZW4ocixmdW5jdGlvbihlKXtvfHwobz0hMCx2LnJlamVjdCh1LGUpKX0pfXZhciBuPXRoaXM7aWYoXCJbb2JqZWN0IEFycmF5XVwiIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKFwibXVzdCBiZSBhbiBhcnJheVwiKSk7dmFyIGE9ZS5sZW5ndGgsbz0hMTtpZighYSlyZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTtmb3IodmFyIGk9bmV3IEFycmF5KGEpLHM9MCxsPS0xLHU9bmV3IHRoaXMocik7KytsPGE7KXQoZVtsXSxsKTtyZXR1cm4gdX1mdW5jdGlvbiBoKGUpe2Z1bmN0aW9uIHQoZSl7bi5yZXNvbHZlKGUpLnRoZW4oZnVuY3Rpb24oZSl7b3x8KG89ITAsdi5yZXNvbHZlKHMsZSkpfSxmdW5jdGlvbihlKXtvfHwobz0hMCx2LnJlamVjdChzLGUpKX0pfXZhciBuPXRoaXM7aWYoXCJbb2JqZWN0IEFycmF5XVwiIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKFwibXVzdCBiZSBhbiBhcnJheVwiKSk7dmFyIGE9ZS5sZW5ndGgsbz0hMTtpZighYSlyZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTtmb3IodmFyIGk9LTEscz1uZXcgdGhpcyhyKTsrK2k8YTspdChlW2ldKTtyZXR1cm4gc312YXIgcD1lKFwiaW1tZWRpYXRlXCIpLHY9e30seT1bXCJSRUpFQ1RFRFwiXSxtPVtcIkZVTEZJTExFRFwiXSxqPVtcIlBFTkRJTkdcIl07dC5leHBvcnRzPW49YSxhLnByb3RvdHlwZVtcImNhdGNoXCJdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4obnVsbCxlKX0sYS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihlLHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJnRoaXMuc3RhdGU9PT1tfHxcImZ1bmN0aW9uXCIhPXR5cGVvZiB0JiZ0aGlzLnN0YXRlPT09eSlyZXR1cm4gdGhpczt2YXIgbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihyKTtpZih0aGlzLnN0YXRlIT09ail7dmFyIGE9dGhpcy5zdGF0ZT09PW0/ZTp0O2kobixhLHRoaXMub3V0Y29tZSl9ZWxzZSB0aGlzLnF1ZXVlLnB1c2gobmV3IG8obixlLHQpKTtyZXR1cm4gbn0sby5wcm90b3R5cGUuY2FsbEZ1bGZpbGxlZD1mdW5jdGlvbihlKXt2LnJlc29sdmUodGhpcy5wcm9taXNlLGUpfSxvLnByb3RvdHlwZS5vdGhlckNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oZSl7aSh0aGlzLnByb21pc2UsdGhpcy5vbkZ1bGZpbGxlZCxlKX0sby5wcm90b3R5cGUuY2FsbFJlamVjdGVkPWZ1bmN0aW9uKGUpe3YucmVqZWN0KHRoaXMucHJvbWlzZSxlKX0sby5wcm90b3R5cGUub3RoZXJDYWxsUmVqZWN0ZWQ9ZnVuY3Rpb24oZSl7aSh0aGlzLnByb21pc2UsdGhpcy5vblJlamVjdGVkLGUpfSx2LnJlc29sdmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj11KHMsdCk7aWYoXCJlcnJvclwiPT09bi5zdGF0dXMpcmV0dXJuIHYucmVqZWN0KGUsbi52YWx1ZSk7dmFyIHI9bi52YWx1ZTtpZihyKWwoZSxyKTtlbHNle2Uuc3RhdGU9bSxlLm91dGNvbWU9dDtmb3IodmFyIGE9LTEsbz1lLnF1ZXVlLmxlbmd0aDsrK2E8bzspZS5xdWV1ZVthXS5jYWxsRnVsZmlsbGVkKHQpfXJldHVybiBlfSx2LnJlamVjdD1mdW5jdGlvbihlLHQpe2Uuc3RhdGU9eSxlLm91dGNvbWU9dDtmb3IodmFyIG49LTEscj1lLnF1ZXVlLmxlbmd0aDsrK248cjspZS5xdWV1ZVtuXS5jYWxsUmVqZWN0ZWQodCk7cmV0dXJuIGV9LG4ucmVzb2x2ZT1jLG4ucmVqZWN0PWYsbi5hbGw9ZCxuLnJhY2U9aH0se2ltbWVkaWF0ZToyfV0sMjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKCl7Yz0hMDtmb3IodmFyIGUsdCxuPWYubGVuZ3RoO247KXtmb3IodD1mLGY9W10sZT0tMTsrK2U8bjspdFtlXSgpO249Zi5sZW5ndGh9Yz0hMX1mdW5jdGlvbiByKGUpezEhPT1mLnB1c2goZSl8fGN8fGEoKX12YXIgYSxvPWUuTXV0YXRpb25PYnNlcnZlcnx8ZS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO2lmKG8pe3ZhciBpPTAscz1uZXcgbyhuKSxsPWUuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7cy5vYnNlcnZlKGwse2NoYXJhY3RlckRhdGE6ITB9KSxhPWZ1bmN0aW9uKCl7bC5kYXRhPWk9KytpJTJ9fWVsc2UgaWYoZS5zZXRJbW1lZGlhdGV8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBlLk1lc3NhZ2VDaGFubmVsKWE9XCJkb2N1bWVudFwiaW4gZSYmXCJvbnJlYWR5c3RhdGVjaGFuZ2VcImluIGUuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT9mdW5jdGlvbigpe3ZhciB0PWUuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTt0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe24oKSx0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9LGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHQpfTpmdW5jdGlvbigpe3NldFRpbWVvdXQobiwwKX07ZWxzZXt2YXIgdT1uZXcgZS5NZXNzYWdlQ2hhbm5lbDt1LnBvcnQxLm9ubWVzc2FnZT1uLGE9ZnVuY3Rpb24oKXt1LnBvcnQyLnBvc3RNZXNzYWdlKDApfX12YXIgYyxmPVtdO3QuZXhwb3J0cz1yfSkuY2FsbCh0aGlzLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7fV0sMzpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1lKFwiLi9qc29ucFwiKSxhPWUoXCJsaWVcIik7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYodD10fHx7fSx0Lmpzb25wKXJldHVybiByKGUsdCk7dmFyIG8saSxzPW5ldyBhKGZ1bmN0aW9uKHIsYSl7aT1hLHZvaWQgMD09PW4uWE1MSHR0cFJlcXVlc3QmJmEoXCJYTUxIdHRwUmVxdWVzdCBpcyBub3Qgc3VwcG9ydGVkXCIpO3ZhciBzO289bmV3IG4uWE1MSHR0cFJlcXVlc3Qsby5vcGVuKFwiR0VUXCIsZSksdC5oZWFkZXJzJiZPYmplY3Qua2V5cyh0LmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24oZSl7by5zZXRSZXF1ZXN0SGVhZGVyKGUsdC5oZWFkZXJzW2VdKX0pLG8ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PW8ucmVhZHlTdGF0ZSYmKG8uc3RhdHVzPDQwMCYmdC5sb2NhbHx8MjAwPT09by5zdGF0dXM/KG4uSlNPTj9zPUpTT04ucGFyc2Uoby5yZXNwb25zZVRleHQpOmEobmV3IEVycm9yKFwiSlNPTiBpcyBub3Qgc3VwcG9ydGVkXCIpKSxyKHMpKTphKG8uc3RhdHVzP28uc3RhdHVzVGV4dDpcIkF0dGVtcHRlZCBjcm9zcyBvcmlnaW4gcmVxdWVzdCB3aXRob3V0IENPUlMgZW5hYmxlZFwiKSl9LG8uc2VuZCgpfSk7cmV0dXJuIHNbXCJjYXRjaFwiXShmdW5jdGlvbihlKXtyZXR1cm4gby5hYm9ydCgpLGV9KSxzLmFib3J0PWksc319KS5jYWxsKHRoaXMsXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHtcIi4vanNvbnBcIjo1LGxpZToxfV0sNDpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgbj10Lkx8fGUoXCJsZWFmbGV0XCIpLHI9ZShcImxpZVwiKSxhPWUoXCIuL2FqYXhcIik7bi5HZW9KU09OLkFKQVg9bi5HZW9KU09OLmV4dGVuZCh7ZGVmYXVsdEFKQVhwYXJhbXM6e2RhdGFUeXBlOlwianNvblwiLGNhbGxiYWNrUGFyYW06XCJjYWxsYmFja1wiLGxvY2FsOiExLG1pZGRsZXdhcmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9fSxpbml0aWFsaXplOmZ1bmN0aW9uKGUsdCl7dGhpcy51cmxzPVtdLGUmJihcInN0cmluZ1wiPT10eXBlb2YgZT90aGlzLnVybHMucHVzaChlKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLnBvcD90aGlzLnVybHM9dGhpcy51cmxzLmNvbmNhdChlKToodD1lLGU9dm9pZCAwKSk7dmFyIGE9bi5VdGlsLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRBSkFYcGFyYW1zKTtmb3IodmFyIG8gaW4gdCl0aGlzLmRlZmF1bHRBSkFYcGFyYW1zLmhhc093blByb3BlcnR5KG8pJiYoYVtvXT10W29dKTt0aGlzLmFqYXhQYXJhbXM9YSx0aGlzLl9sYXllcnM9e30sbi5VdGlsLnNldE9wdGlvbnModGhpcyx0KSx0aGlzLm9uKFwiZGF0YTpsb2FkZWRcIixmdW5jdGlvbigpe3RoaXMuZmlsdGVyJiZ0aGlzLnJlZmlsdGVyKHRoaXMuZmlsdGVyKX0sdGhpcyk7dmFyIGk9dGhpczt0aGlzLnVybHMubGVuZ3RoPjAmJm5ldyByKGZ1bmN0aW9uKGUpe2UoKX0pLnRoZW4oZnVuY3Rpb24oKXtpLmFkZFVybCgpfSl9LGNsZWFyTGF5ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXJscz1bXSxuLkdlb0pTT04ucHJvdG90eXBlLmNsZWFyTGF5ZXJzLmNhbGwodGhpcyksdGhpc30sYWRkVXJsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZSYmKFwic3RyaW5nXCI9PXR5cGVvZiBlP3QudXJscy5wdXNoKGUpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGUucG9wJiYodC51cmxzPXQudXJscy5jb25jYXQoZSkpKTt2YXIgcj10LnVybHMubGVuZ3RoLG89MDt0LmZpcmUoXCJkYXRhOmxvYWRpbmdcIiksdC51cmxzLmZvckVhY2goZnVuY3Rpb24oZSl7XCJqc29uXCI9PT10LmFqYXhQYXJhbXMuZGF0YVR5cGUudG9Mb3dlckNhc2UoKT9hKGUsdC5hamF4UGFyYW1zKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciBuPXQuYWpheFBhcmFtcy5taWRkbGV3YXJlKGUpO3QuYWRkRGF0YShuKSx0LmZpcmUoXCJkYXRhOnByb2dyZXNzXCIsbil9LGZ1bmN0aW9uKGUpe3QuZmlyZShcImRhdGE6cHJvZ3Jlc3NcIix7ZXJyb3I6ZX0pfSk6XCJqc29ucFwiPT09dC5hamF4UGFyYW1zLmRhdGFUeXBlLnRvTG93ZXJDYXNlKCkmJm4uVXRpbC5qc29ucChlLHQuYWpheFBhcmFtcykudGhlbihmdW5jdGlvbihlKXt2YXIgbj10LmFqYXhQYXJhbXMubWlkZGxld2FyZShlKTt0LmFkZERhdGEobiksdC5maXJlKFwiZGF0YTpwcm9ncmVzc1wiLG4pfSxmdW5jdGlvbihlKXt0LmZpcmUoXCJkYXRhOnByb2dyZXNzXCIse2Vycm9yOmV9KX0pfSksdC5vbihcImRhdGE6cHJvZ3Jlc3NcIixmdW5jdGlvbigpeysrbz09PXImJnQuZmlyZShcImRhdGE6bG9hZGVkXCIpfSl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7ZT1lfHx0aGlzLnVybHMsdGhpcy5jbGVhckxheWVycygpLHRoaXMuYWRkVXJsKGUpfSxyZWZpbHRlcjpmdW5jdGlvbihlKXtcImZ1bmN0aW9uXCIhPXR5cGVvZiBlPyh0aGlzLmZpbHRlcj0hMSx0aGlzLmVhY2hMYXllcihmdW5jdGlvbihlKXtlLnNldFN0eWxlKHtzdHJva2U6ITAsY2xpY2thYmxlOiEwfSl9KSk6KHRoaXMuZmlsdGVyPWUsdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7ZSh0LmZlYXR1cmUpP3Quc2V0U3R5bGUoe3N0cm9rZTohMCxjbGlja2FibGU6ITB9KTp0LnNldFN0eWxlKHtzdHJva2U6ITEsY2xpY2thYmxlOiExfSl9KSl9fSksbi5VdGlsLlByb21pc2U9cixuLlV0aWwuYWpheD1hLG4uVXRpbC5qc29ucD1lKFwiLi9qc29ucFwiKSxuLmdlb0pzb24uYWpheD1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgbi5HZW9KU09OLkFKQVgoZSx0KX19KS5jYWxsKHRoaXMsXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHtcIi4vYWpheFwiOjMsXCIuL2pzb25wXCI6NSxsZWFmbGV0OnZvaWQgMCxsaWU6MX1dLDU6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bi5MfHxlKFwibGVhZmxldFwiKSxhPWUoXCJsaWVcIik7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgbyxpLHMsbCx1PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXSxjPXIuRG9tVXRpbC5jcmVhdGUoXCJzY3JpcHRcIixcIlwiLHUpLGY9bmV3IGEoZnVuY3Rpb24ocixhKXtsPWE7dmFyIGY9dC5jYlBhcmFtfHxcImNhbGxiYWNrXCI7dC5jYWxsYmFja05hbWU/bz10LmNhbGxiYWNrTmFtZToocz1cIl9cIisoXCJcIitNYXRoLnJhbmRvbSgpKS5zbGljZSgyKSxvPVwiX2xlYWZsZXRKU09OUGNhbGxiYWNrcy5cIitzKSxjLnR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIixzJiYobi5fbGVhZmxldEpTT05QY2FsbGJhY2tzfHwobi5fbGVhZmxldEpTT05QY2FsbGJhY2tzPXtsZW5ndGg6MH0pLG4uX2xlYWZsZXRKU09OUGNhbGxiYWNrcy5sZW5ndGgrKyxuLl9sZWFmbGV0SlNPTlBjYWxsYmFja3Nbc109ZnVuY3Rpb24oZSl7dS5yZW1vdmVDaGlsZChjKSxkZWxldGUgbi5fbGVhZmxldEpTT05QY2FsbGJhY2tzW3NdLG4uX2xlYWZsZXRKU09OUGNhbGxiYWNrcy5sZW5ndGgtLSxuLl9sZWFmbGV0SlNPTlBjYWxsYmFja3MubGVuZ3RofHxkZWxldGUgbi5fbGVhZmxldEpTT05QY2FsbGJhY2tzLHIoZSl9KSxpPS0xPT09ZS5pbmRleE9mKFwiP1wiKT9lK1wiP1wiK2YrXCI9XCIrbzplK1wiJlwiK2YrXCI9XCIrbyxjLnNyYz1pfSkudGhlbihudWxsLGZ1bmN0aW9uKGUpe3JldHVybiB1LnJlbW92ZUNoaWxkKGMpLGRlbGV0ZSByLlV0aWwuYWpheC5jYltzXSxlfSk7cmV0dXJuIGYuYWJvcnQ9bCxmfX0pLmNhbGwodGhpcyxcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0se2xlYWZsZXQ6dm9pZCAwLGxpZToxfV19LHt9LFs0XSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wdWJsaWMvYXNzZXRzL3ZlbmRvci9sZWFmbGV0LWFqYXgvZGlzdC9sZWFmbGV0LmFqYXgubWluLmpzIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExlYWZsZXQuR2VvZGVzaWMuXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTcgIEhlbnJ5IFRoYXNsZXJcbi8vIGJhc2VkIG9uIGNvZGUgYnkgQ2hyaXMgVmVuZXNzIENvcHlyaWdodCAoQykgMjAxNCBodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeVxuLy9cbi8vIExlYWZsZXQuR2VvZGVzaWMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4vLyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIExlYWZsZXQuR2VvZGVzaWMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIExlYWZsZXQuR2VvZGVzaWMuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG5cblxuLyoqIEV4dGVuZCBOdW1iZXIgb2JqZWN0IHdpdGggbWV0aG9kIHRvIGNvbnZlcnQgbnVtZXJpYyBkZWdyZWVzIHRvIHJhZGlhbnMgKi9cbmlmICh0eXBlb2YgTnVtYmVyLnByb3RvdHlwZS50b1JhZGlhbnMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBOdW1iZXIucHJvdG90eXBlLnRvUmFkaWFucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgKiBNYXRoLlBJIC8gMTgwXG4gICAgfVxufVxuXG4vKiogRXh0ZW5kIE51bWJlciBvYmplY3Qgd2l0aCBtZXRob2QgdG8gY29udmVydCByYWRpYW5zIHRvIG51bWVyaWMgKHNpZ25lZCkgZGVncmVlcyAqL1xuaWYgKHR5cGVvZiBOdW1iZXIucHJvdG90eXBlLnRvRGVncmVlcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIE51bWJlci5wcm90b3R5cGUudG9EZWdyZWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcyAqIDE4MCAvIE1hdGguUElcbiAgICB9XG59XG5cbmNvbnN0IElOVEVSU0VDVF9MTkcgPSAxNzkuOTk5IC8vIExuZyB1c2VkIGZvciBpbnRlcnNlY3Rpb24gYW5kIHdyYXAgYXJvdW5kIG9uIG1hcCBlZGdlc1xuXG5MLkdlb2Rlc2ljID0gTC5Qb2x5bGluZS5leHRlbmQoe1xuICAgIG9wdGlvbnM6IHtcbiAgICAgICAgY29sb3I6IFwiYmx1ZVwiLFxuICAgICAgICBzdGVwczogMTAsXG4gICAgICAgIGRhc2g6IDEsXG4gICAgICAgIHdyYXA6IHRydWVcbiAgICB9LFxuXG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGxhdGxuZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5fbWVyZ2Vfb3B0aW9ucyh0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXG4gICAgICAgIHRoaXMuZGF0dW0gPSB7fVxuICAgICAgICB0aGlzLmRhdHVtLmVsbGlwc29pZCA9IHtcbiAgICAgICAgICAgIGE6IDYzNzgxMzcsXG4gICAgICAgICAgICBiOiA2MzU2NzUyLjMxNDIsXG4gICAgICAgICAgICBmOiAxIC8gMjk4LjI1NzIyMzU2M1xuICAgICAgICB9IC8vIFdHUy04NFxuICAgICAgICB0aGlzLl9sYXRsbmdzID0gKHRoaXMub3B0aW9ucy5kYXNoIDwgMSkgPyB0aGlzLl9nZW5lcmF0ZV9HZW9kZXNpY0Rhc2hlZChcbiAgICAgICAgICAgIGxhdGxuZ3MpIDogdGhpcy5fZ2VuZXJhdGVfR2VvZGVzaWMobGF0bG5ncylcbiAgICAgICAgTC5Qb2x5bGluZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMuX2xhdGxuZ3MsIHRoaXMub3B0aW9ucylcbiAgICB9LFxuXG4gICAgc2V0TGF0TG5nczogZnVuY3Rpb24gKGxhdGxuZ3MpIHtcbiAgICAgICAgdGhpcy5fbGF0bG5ncyA9ICh0aGlzLm9wdGlvbnMuZGFzaCA8IDEpID8gdGhpcy5fZ2VuZXJhdGVfR2VvZGVzaWNEYXNoZWQoXG4gICAgICAgICAgICBsYXRsbmdzKSA6IHRoaXMuX2dlbmVyYXRlX0dlb2Rlc2ljKGxhdGxuZ3MpXG4gICAgICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHNvbWUgc3RhdGlzdGljIHZhbHVlcyBvZiBjdXJyZW50IGdlb2Rlc2ljIG11bHRpcG9seWxpbmVcbiAgICAgKiBAcmV0dXJucyAoT2JqZWN0fSBPYmplY3Qgd2l0aCBzZXZlcmFsIHByb3BlcnRpZXMgKGUuZy4gb3ZlcmFsbCBkaXN0YW5jZSlcbiAgICAgKi9cbiAgICBnZXRTdGF0czogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgIHBvaW50czogMCxcbiAgICAgICAgICAgICAgICBwb2x5Z29uczogdGhpcy5fbGF0bG5ncy5sZW5ndGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb2x5LCBwb2ludHNcblxuICAgICAgICBmb3IgKHBvbHkgPSAwOyBwb2x5IDwgdGhpcy5fbGF0bG5ncy5sZW5ndGg7IHBvbHkrKykge1xuICAgICAgICAgICAgb2JqLnBvaW50cyArPSB0aGlzLl9sYXRsbmdzW3BvbHldLmxlbmd0aFxuICAgICAgICAgICAgZm9yIChwb2ludHMgPSAwOyBwb2ludHMgPCAodGhpcy5fbGF0bG5nc1twb2x5XS5sZW5ndGggLSAxKTsgcG9pbnRzKyspIHtcbiAgICAgICAgICAgICAgICBvYmouZGlzdGFuY2UgKz0gdGhpcy5fdmluY2VudHlfaW52ZXJzZSh0aGlzLl9sYXRsbmdzW3BvbHldW3BvaW50c10sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seV1bcG9pbnRzICsgMV0pLmRpc3RhbmNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ialxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZ2VvZGVzaWMgbGluZXMgZnJvbSBnZW9Kc29uLiBSZXBsYWNlcyBhbGwgY3VycmVudCBmZWF0dXJlcyBvZiB0aGlzIGluc3RhbmNlLlxuICAgICAqIFN1cHBvcnRzIExpbmVTdHJpbmcsIE11bHRpTGluZVN0cmluZyBhbmQgUG9seWdvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBnZW9qc29uIC0gZ2Vvc2pvbiBhcyBvYmplY3QuXG4gICAgICovXG4gICAgZ2VvSnNvbjogZnVuY3Rpb24gKGdlb2pzb24pIHtcblxuICAgICAgICBsZXQgbm9ybWFsaXplZCA9IEwuR2VvSlNPTi5hc0ZlYXR1cmUoZ2VvanNvbilcbiAgICAgICAgbGV0IGZlYXR1cmVzID0gbm9ybWFsaXplZC50eXBlID09PSBcIkZlYXR1cmVDb2xsZWN0aW9uXCIgPyBub3JtYWxpemVkLmZlYXR1cmVzIDogW1xuICAgICAgICAgICAgbm9ybWFsaXplZFxuICAgICAgICBdXG4gICAgICAgIHRoaXMuX2xhdGxuZ3MgPSBbXVxuICAgICAgICBmb3IgKGxldCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgICAgICBsZXQgZ2VvbWV0cnkgPSBmZWF0dXJlLnR5cGUgPT09IFwiRmVhdHVyZVwiID8gZmVhdHVyZS5nZW9tZXRyeSA6XG4gICAgICAgICAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgICAgICAgICBjb29yZHMgPSBnZW9tZXRyeS5jb29yZGluYXRlc1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGdlb21ldHJ5LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiTGluZVN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXRsbmdzLnB1c2godGhpcy5fZ2VuZXJhdGVfR2VvZGVzaWMoW0wuR2VvSlNPTi5jb29yZHNUb0xhdExuZ3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZHMsIDApXSkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJQb2x5Z29uXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhdGxuZ3MucHVzaCh0aGlzLl9nZW5lcmF0ZV9HZW9kZXNpYyhMLkdlb0pTT04uY29vcmRzVG9MYXRMbmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzLCAxKSkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBvaW50XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIk11bHRpUG9pbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEdWRlLCBwb2ludHMgY2FuJ3QgYmUgZHJhd24gYXMgZ2VvZGVzaWMgbGluZXMuLi5cIilcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRyYXdpbmcgXCIgKyBnZW9tZXRyeS50eXBlICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGFzIGEgZ2VvZGVzaWMgaXMgbm90IHN1cHBvcnRlZC4gU2tpcHBpbmcuLi5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBMLlBvbHlsaW5lLnByb3RvdHlwZS5zZXRMYXRMbmdzLmNhbGwodGhpcywgdGhpcy5fbGF0bG5ncylcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGdyZWF0IGNpcmNsZS4gUmVwbGFjZXMgYWxsIGN1cnJlbnQgbGluZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNlbnRlciAtIGdlb2dyYXBoaWMgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gcmFkaXVzIG9mIHRoZSBjaXJjbGUgaW4gbWV0cmVzXG4gICAgICovXG4gICAgY3JlYXRlQ2lyY2xlOiBmdW5jdGlvbiAoY2VudGVyLCByYWRpdXMpIHtcbiAgICAgICAgbGV0IHBvbHlsaW5lSW5kZXggPSAwXG4gICAgICAgIGxldCBwcmV2ID0ge1xuICAgICAgICAgICAgbGF0OiAwLFxuICAgICAgICAgICAgbG5nOiAwLFxuICAgICAgICAgICAgYnJnOiAwXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0ZXBcblxuICAgICAgICB0aGlzLl9sYXRsbmdzID0gW11cbiAgICAgICAgdGhpcy5fbGF0bG5nc1twb2x5bGluZUluZGV4XSA9IFtdXG5cbiAgICAgICAgbGV0IGRpcmVjdCA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChMLmxhdExuZyhjZW50ZXIpLCAwLCByYWRpdXMsIHRoaXMub3B0aW9uc1xuICAgICAgICAgICAgLndyYXApXG4gICAgICAgIHByZXYgPSBMLmxhdExuZyhkaXJlY3QubGF0LCBkaXJlY3QubG5nKVxuICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2gocHJldilcbiAgICAgICAgZm9yIChzdGVwID0gMTsgc3RlcCA8PSB0aGlzLm9wdGlvbnMuc3RlcHM7KSB7XG4gICAgICAgICAgICBkaXJlY3QgPSB0aGlzLl92aW5jZW50eV9kaXJlY3QoTC5sYXRMbmcoY2VudGVyKSwgMzYwIC8gdGhpcy5vcHRpb25zXG4gICAgICAgICAgICAgICAgLnN0ZXBzICogc3RlcCwgcmFkaXVzLCB0aGlzLm9wdGlvbnMud3JhcClcbiAgICAgICAgICAgIGxldCBncCA9IEwubGF0TG5nKGRpcmVjdC5sYXQsIGRpcmVjdC5sbmcpXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZ3AubG5nIC0gcHJldi5sbmcpID4gMTgwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGludmVyc2UgPSB0aGlzLl92aW5jZW50eV9pbnZlcnNlKHByZXYsIGdwKVxuICAgICAgICAgICAgICAgIGxldCBzZWMgPSB0aGlzLl9pbnRlcnNlY3Rpb24ocHJldiwgaW52ZXJzZS5pbml0aWFsQmVhcmluZywge1xuICAgICAgICAgICAgICAgICAgICBsYXQ6IC04OSxcbiAgICAgICAgICAgICAgICAgICAgbG5nOiAoKGdwLmxuZyAtIHByZXYubG5nKSA+IDApID8gLUlOVEVSU0VDVF9MTkcgOiBJTlRFUlNFQ1RfTE5HXG4gICAgICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICAgICAgICBpZiAoc2VjKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChMLmxhdExuZyhzZWMubGF0LCBzZWMubG5nKSlcbiAgICAgICAgICAgICAgICAgICAgcG9seWxpbmVJbmRleCsrXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXVxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gTC5sYXRMbmcoc2VjLmxhdCwgLXNlYy5sbmcpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChwcmV2KVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvbHlsaW5lSW5kZXgrK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdID0gW11cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF0bG5nc1twb2x5bGluZUluZGV4XS5wdXNoKGdwKVxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gZ3BcbiAgICAgICAgICAgICAgICAgICAgc3RlcCsrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2goZ3ApXG4gICAgICAgICAgICAgICAgcHJldiA9IGdwXG4gICAgICAgICAgICAgICAgc3RlcCsrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBMLlBvbHlsaW5lLnByb3RvdHlwZS5zZXRMYXRMbmdzLmNhbGwodGhpcywgdGhpcy5fbGF0bG5ncylcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGdlb2Rlc2ljIFBvbHlsaW5lIGZyb20gZ2l2ZW4gY29vcmRpbmF0ZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGF0bG5ncyAtIE9uZSBvciBtb3JlIHBvbHlsaW5lcyBhcyBhbiBhcnJheS4gU2VlIExlYWZsZXQgZG9jIGFib3V0IFBvbHlsaW5lXG4gICAgICogQHJldHVybnMgKE9iamVjdH0gQW4gYXJyYXkgb2YgYXJyYXlzIG9mIGdlb2dyYXBoaWNhbCBwb2ludHMuXG4gICAgICovXG4gICAgX2dlbmVyYXRlX0dlb2Rlc2ljOiBmdW5jdGlvbiAobGF0bG5ncykge1xuICAgICAgICBsZXQgX2dlbyA9IFtdLFxuICAgICAgICAgICAgX2dlb2NudCA9IDAsXG4gICAgICAgICAgICBzLCBwb2x5LCBwb2ludHMsIHBvaW50QSwgcG9pbnRCXG5cbiAgICAgICAgZm9yIChwb2x5ID0gMDsgcG9seSA8IGxhdGxuZ3MubGVuZ3RoOyBwb2x5KyspIHtcbiAgICAgICAgICAgIF9nZW9bX2dlb2NudF0gPSBbXVxuICAgICAgICAgICAgZm9yIChwb2ludHMgPSAwOyBwb2ludHMgPCAobGF0bG5nc1twb2x5XS5sZW5ndGggLSAxKTsgcG9pbnRzKyspIHtcbiAgICAgICAgICAgICAgICBwb2ludEEgPSBMLmxhdExuZyhsYXRsbmdzW3BvbHldW3BvaW50c10pXG4gICAgICAgICAgICAgICAgcG9pbnRCID0gTC5sYXRMbmcobGF0bG5nc1twb2x5XVtwb2ludHMgKyAxXSlcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRBLmVxdWFscyhwb2ludEIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgaW52ZXJzZSA9IHRoaXMuX3ZpbmNlbnR5X2ludmVyc2UocG9pbnRBLCBwb2ludEIpXG4gICAgICAgICAgICAgICAgbGV0IHByZXYgPSBwb2ludEFcbiAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2gocHJldilcbiAgICAgICAgICAgICAgICBmb3IgKHMgPSAxOyBzIDw9IHRoaXMub3B0aW9ucy5zdGVwczspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdCA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlLmRpc3RhbmNlIC8gdGhpcy5vcHRpb25zLnN0ZXBzICogcywgdGhpcy5vcHRpb25zLndyYXBcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBsZXQgZ3AgPSBMLmxhdExuZyhkaXJlY3QubGF0LCBkaXJlY3QubG5nKVxuICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZ3AubG5nIC0gcHJldi5sbmcpID4gMTgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VjID0gdGhpcy5faW50ZXJzZWN0aW9uKHBvaW50QSwgaW52ZXJzZS5pbml0aWFsQmVhcmluZywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdDogLTg5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuZzogKChncC5sbmcgLSBwcmV2LmxuZykgPiAwKSA/IC1JTlRFUlNFQ1RfTE5HIDogSU5URVJTRUNUX0xOR1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goTC5sYXRMbmcoc2VjLmxhdCwgc2VjLmxuZykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dlb2NudCsrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dlb1tfZ2VvY250XSA9IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IEwubGF0TG5nKHNlYy5sYXQsIC1zZWMubG5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0ucHVzaChwcmV2KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2VvY250KytcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goZ3ApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IGdwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcysrXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goZ3ApXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gZ3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHMrK1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2dlb2NudCsrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9nZW9cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGFzaGVkIGdlb2Rlc2ljIFBvbHlsaW5lIGZyb20gZ2l2ZW4gY29vcmRpbmF0ZXMgLSB1bmRlciB3b3JrXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxhdGxuZ3MgLSBPbmUgb3IgbW9yZSBwb2x5bGluZXMgYXMgYW4gYXJyYXkuIFNlZSBMZWFmbGV0IGRvYyBhYm91dCBQb2x5bGluZVxuICAgICAqIEByZXR1cm5zIChPYmplY3R9IEFuIGFycmF5IG9mIGFycmF5cyBvZiBnZW9ncmFwaGljYWwgcG9pbnRzLlxuICAgICAqL1xuICAgIF9nZW5lcmF0ZV9HZW9kZXNpY0Rhc2hlZDogZnVuY3Rpb24gKGxhdGxuZ3MpIHtcbiAgICAgICAgbGV0IF9nZW8gPSBbXSxcbiAgICAgICAgICAgIF9nZW9jbnQgPSAwLFxuICAgICAgICAgICAgcywgcG9seSwgcG9pbnRzXG4gICAgICAgIC8vICAgICAgX2dlbyA9IGxhdGxuZ3M7ICAgIC8vIGJ5cGFzc1xuXG4gICAgICAgIGZvciAocG9seSA9IDA7IHBvbHkgPCBsYXRsbmdzLmxlbmd0aDsgcG9seSsrKSB7XG4gICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW11cbiAgICAgICAgICAgIGZvciAocG9pbnRzID0gMDsgcG9pbnRzIDwgKGxhdGxuZ3NbcG9seV0ubGVuZ3RoIC0gMSk7IHBvaW50cysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGludmVyc2UgPSB0aGlzLl92aW5jZW50eV9pbnZlcnNlKEwubGF0TG5nKGxhdGxuZ3NbcG9seV1bXG4gICAgICAgICAgICAgICAgICAgIHBvaW50c1xuICAgICAgICAgICAgICAgICAgICBdKSwgTC5sYXRMbmcobGF0bG5nc1twb2x5XVtwb2ludHMgKyAxXSkpXG4gICAgICAgICAgICAgICAgbGV0IHByZXYgPSBMLmxhdExuZyhsYXRsbmdzW3BvbHldW3BvaW50c10pXG4gICAgICAgICAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKHByZXYpXG4gICAgICAgICAgICAgICAgZm9yIChzID0gMTsgcyA8PSB0aGlzLm9wdGlvbnMuc3RlcHM7KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXJlY3QgPSB0aGlzLl92aW5jZW50eV9kaXJlY3QoTC5sYXRMbmcobGF0bG5nc1twb2x5XVtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgXSksIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIGludmVyc2UuZGlzdGFuY2UgLyB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdGVwcyAqIHMgLSBpbnZlcnNlLmRpc3RhbmNlIC8gdGhpcy5vcHRpb25zLnN0ZXBzICogKDEgLVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhc2gpLCB0aGlzLm9wdGlvbnMud3JhcClcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdwID0gTC5sYXRMbmcoZGlyZWN0LmxhdCwgZGlyZWN0LmxuZylcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGdwLmxuZyAtIHByZXYubG5nKSA+IDE4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYyA9IHRoaXMuX2ludGVyc2VjdGlvbihMLmxhdExuZyhsYXRsbmdzW3BvbHldW3BvaW50c10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0OiAtODksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuZzogKChncC5sbmcgLSBwcmV2LmxuZykgPiAwKSA/IC1JTlRFUlNFQ1RfTE5HIDogSU5URVJTRUNUX0xOR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKEwubGF0TG5nKHNlYy5sYXQsIHNlYy5sbmcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9nZW9jbnQrK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0gPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBMLmxhdExuZyhzZWMubGF0LCAtc2VjLmxuZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2gocHJldilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dlb2NudCsrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dlb1tfZ2VvY250XSA9IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKGdwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBncFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMrK1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKGdwKVxuICAgICAgICAgICAgICAgICAgICAgICAgX2dlb2NudCsrXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0MiA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChMLmxhdExuZyhsYXRsbmdzW3BvbHldW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBpbnZlcnNlLmluaXRpYWxCZWFyaW5nLCBpbnZlcnNlLmRpc3RhbmNlIC8gdGhpcy5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0ZXBzICogcywgdGhpcy5vcHRpb25zLndyYXApXG4gICAgICAgICAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0ucHVzaChMLmxhdExuZyhkaXJlY3QyLmxhdCwgZGlyZWN0Mi5sbmcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcysrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZ2VvY250KytcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2dlb1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFZpbmNlbnR5IGRpcmVjdCBjYWxjdWxhdGlvbi5cbiAgICAgKiBiYXNlZCBvbiB0aGUgd29yayBvZiBDaHJpcyBWZW5lc3MgKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3ZlbmVzcy9nZW9kZXN5KVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5pdGlhbEJlYXJpbmcgLSBJbml0aWFsIGJlYXJpbmcgaW4gZGVncmVlcyBmcm9tIG5vcnRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIERpc3RhbmNlIGFsb25nIGJlYXJpbmcgaW4gbWV0cmVzLlxuICAgICAqIEByZXR1cm5zIChPYmplY3R9IE9iamVjdCBpbmNsdWRpbmcgcG9pbnQgKGRlc3RpbmF0aW9uIHBvaW50KSwgZmluYWxCZWFyaW5nLlxuICAgICAqL1xuXG4gICAgX3ZpbmNlbnR5X2RpcmVjdDogZnVuY3Rpb24gKHAxLCBpbml0aWFsQmVhcmluZywgZGlzdGFuY2UsIHdyYXApIHtcbiAgICAgICAgdmFyIM+GMSA9IHAxLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgICAgICAgIM67MSA9IHAxLmxuZy50b1JhZGlhbnMoKTtcbiAgICAgICAgdmFyIM6xMSA9IGluaXRpYWxCZWFyaW5nLnRvUmFkaWFucygpO1xuICAgICAgICB2YXIgcyA9IGRpc3RhbmNlO1xuXG4gICAgICAgIHZhciBhID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuYSxcbiAgICAgICAgICAgIGIgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5iLFxuICAgICAgICAgICAgZiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmY7XG5cbiAgICAgICAgdmFyIHNpbs6xMSA9IE1hdGguc2luKM6xMSk7XG4gICAgICAgIHZhciBjb3POsTEgPSBNYXRoLmNvcyjOsTEpO1xuXG4gICAgICAgIHZhciB0YW5VMSA9ICgxIC0gZikgKiBNYXRoLnRhbijPhjEpLFxuICAgICAgICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxuICAgICAgICAgICAgc2luVTEgPSB0YW5VMSAqIGNvc1UxO1xuICAgICAgICB2YXIgz4MxID0gTWF0aC5hdGFuMih0YW5VMSwgY29zzrExKTtcbiAgICAgICAgdmFyIHNpbs6xID0gY29zVTEgKiBzaW7OsTE7XG4gICAgICAgIHZhciBjb3NTcc6xID0gMSAtIHNpbs6xICogc2luzrE7XG4gICAgICAgIHZhciB1U3EgPSBjb3NTcc6xICogKGEgKiBhIC0gYiAqIGIpIC8gKGIgKiBiKTtcbiAgICAgICAgdmFyIEEgPSAxICsgdVNxIC8gMTYzODQgKiAoNDA5NiArIHVTcSAqICgtNzY4ICsgdVNxICogKDMyMCAtIDE3NSAqXG4gICAgICAgICAgICB1U3EpKSk7XG4gICAgICAgIHZhciBCID0gdVNxIC8gMTAyNCAqICgyNTYgKyB1U3EgKiAoLTEyOCArIHVTcSAqICg3NCAtIDQ3ICogdVNxKSkpO1xuXG4gICAgICAgIHZhciDPgyA9IHMgLyAoYiAqIEEpLFxuICAgICAgICAgICAgz4PKuSwgaXRlcmF0aW9ucyA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciBjb3Myz4NNID0gTWF0aC5jb3MoMiAqIM+DMSArIM+DKTtcbiAgICAgICAgICAgIHZhciBzaW7PgyA9IE1hdGguc2luKM+DKTtcbiAgICAgICAgICAgIHZhciBjb3PPgyA9IE1hdGguY29zKM+DKTtcbiAgICAgICAgICAgIHZhciDOlM+DID0gQiAqIHNpbs+DICogKGNvczLPg00gKyBCIC8gNCAqIChjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICpcbiAgICAgICAgICAgICAgICBjb3Myz4NNKSAtXG4gICAgICAgICAgICAgICAgQiAvIDYgKiBjb3Myz4NNICogKC0zICsgNCAqIHNpbs+DICogc2luz4MpICogKC0zICsgNCAqIGNvczLPg00gKlxuICAgICAgICAgICAgICAgICAgICBjb3Myz4NNKSkpO1xuICAgICAgICAgICAgz4PKuSA9IM+DO1xuICAgICAgICAgICAgz4MgPSBzIC8gKGIgKiBBKSArIM6Uz4M7XG4gICAgICAgIH0gd2hpbGUgKE1hdGguYWJzKM+DIC0gz4PKuSkgPiAxZS0xMiAmJiArK2l0ZXJhdGlvbnMpO1xuXG4gICAgICAgIHZhciB4ID0gc2luVTEgKiBzaW7PgyAtIGNvc1UxICogY29zz4MgKiBjb3POsTE7XG4gICAgICAgIHZhciDPhjIgPSBNYXRoLmF0YW4yKHNpblUxICogY29zz4MgKyBjb3NVMSAqIHNpbs+DICogY29zzrExLCAoMSAtIGYpICpcbiAgICAgICAgICAgIE1hdGguc3FydChzaW7OsSAqIHNpbs6xICsgeCAqIHgpKTtcbiAgICAgICAgdmFyIM67ID0gTWF0aC5hdGFuMihzaW7PgyAqIHNpbs6xMSwgY29zVTEgKiBjb3PPgyAtIHNpblUxICogc2luz4MgKiBjb3POsTEpO1xuICAgICAgICB2YXIgQyA9IGYgLyAxNiAqIGNvc1NxzrEgKiAoNCArIGYgKiAoNCAtIDMgKiBjb3NTcc6xKSk7XG4gICAgICAgIHZhciBMID0gzrsgLSAoMSAtIEMpICogZiAqIHNpbs6xICpcbiAgICAgICAgICAgICjPgyArIEMgKiBzaW7PgyAqIChjb3Myz4NNICsgQyAqIGNvc8+DICogKC0xICsgMiAqIGNvczLPg00gKiBjb3Myz4NNKSkpO1xuXG4gICAgICAgIGlmICh3cmFwKVxuICAgICAgICAgICAgdmFyIM67MiA9ICjOuzEgKyBMICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSAtIE1hdGguUEk7IC8vIG5vcm1hbGlzZSB0byAtMTgwLi4uKzE4MFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB2YXIgzrsyID0gKM67MSArIEwpOyAvLyBkbyBub3Qgbm9ybWFsaXplXG5cbiAgICAgICAgdmFyIHJldkF6ID0gTWF0aC5hdGFuMihzaW7OsSwgLXgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXQ6IM+GMi50b0RlZ3JlZXMoKSxcbiAgICAgICAgICAgIGxuZzogzrsyLnRvRGVncmVlcygpLFxuICAgICAgICAgICAgZmluYWxCZWFyaW5nOiByZXZBei50b0RlZ3JlZXMoKVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBWaW5jZW50eSBpbnZlcnNlIGNhbGN1bGF0aW9uLlxuICAgICAqIGJhc2VkIG9uIHRoZSB3b3JrIG9mIENocmlzIFZlbmVzcyAoaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdmVuZXNzL2dlb2Rlc3kpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7TGF0TG5nfSBwMSAtIExhdGl0dWRlL2xvbmdpdHVkZSBvZiBzdGFydCBwb2ludC5cbiAgICAgKiBAcGFyYW0ge0xhdExuZ30gcDIgLSBMYXRpdHVkZS9sb25naXR1ZGUgb2YgZGVzdGluYXRpb24gcG9pbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gT2JqZWN0IGluY2x1ZGluZyBkaXN0YW5jZSwgaW5pdGlhbEJlYXJpbmcsIGZpbmFsQmVhcmluZy5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgZm9ybXVsYSBmYWlsZWQgdG8gY29udmVyZ2UuXG4gICAgICovXG4gICAgX3ZpbmNlbnR5X2ludmVyc2U6IGZ1bmN0aW9uIChwMSwgcDIpIHtcbiAgICAgICAgdmFyIM+GMSA9IHAxLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgICAgICAgIM67MSA9IHAxLmxuZy50b1JhZGlhbnMoKTtcbiAgICAgICAgdmFyIM+GMiA9IHAyLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgICAgICAgIM67MiA9IHAyLmxuZy50b1JhZGlhbnMoKTtcblxuICAgICAgICB2YXIgYSA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmEsXG4gICAgICAgICAgICBiID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuYixcbiAgICAgICAgICAgIGYgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5mO1xuXG4gICAgICAgIHZhciBMID0gzrsyIC0gzrsxO1xuICAgICAgICB2YXIgdGFuVTEgPSAoMSAtIGYpICogTWF0aC50YW4oz4YxKSxcbiAgICAgICAgICAgIGNvc1UxID0gMSAvIE1hdGguc3FydCgoMSArIHRhblUxICogdGFuVTEpKSxcbiAgICAgICAgICAgIHNpblUxID0gdGFuVTEgKiBjb3NVMTtcbiAgICAgICAgdmFyIHRhblUyID0gKDEgLSBmKSAqIE1hdGgudGFuKM+GMiksXG4gICAgICAgICAgICBjb3NVMiA9IDEgLyBNYXRoLnNxcnQoKDEgKyB0YW5VMiAqIHRhblUyKSksXG4gICAgICAgICAgICBzaW5VMiA9IHRhblUyICogY29zVTI7XG5cbiAgICAgICAgdmFyIM67ID0gTCxcbiAgICAgICAgICAgIM67yrksIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICB2YXIgc2luzrsgPSBNYXRoLnNpbijOuyksXG4gICAgICAgICAgICAgICAgY29zzrsgPSBNYXRoLmNvcyjOuyk7XG4gICAgICAgICAgICB2YXIgc2luU3HPgyA9IChjb3NVMiAqIHNpbs67KSAqIChjb3NVMiAqIHNpbs67KSArIChjb3NVMSAqIHNpblUyIC1cbiAgICAgICAgICAgICAgICBzaW5VMSAqIGNvc1UyICogY29zzrspICogKGNvc1UxICogc2luVTIgLSBzaW5VMSAqIGNvc1UyICogY29zzrspO1xuICAgICAgICAgICAgdmFyIHNpbs+DID0gTWF0aC5zcXJ0KHNpblNxz4MpO1xuICAgICAgICAgICAgaWYgKHNpbs+DID09IDApIHJldHVybiAwOyAvLyBjby1pbmNpZGVudCBwb2ludHNcbiAgICAgICAgICAgIHZhciBjb3PPgyA9IHNpblUxICogc2luVTIgKyBjb3NVMSAqIGNvc1UyICogY29zzrs7XG4gICAgICAgICAgICB2YXIgz4MgPSBNYXRoLmF0YW4yKHNpbs+DLCBjb3PPgyk7XG4gICAgICAgICAgICB2YXIgc2luzrEgPSBjb3NVMSAqIGNvc1UyICogc2luzrsgLyBzaW7PgztcbiAgICAgICAgICAgIHZhciBjb3NTcc6xID0gMSAtIHNpbs6xICogc2luzrE7XG4gICAgICAgICAgICB2YXIgY29zMs+DTSA9IGNvc8+DIC0gMiAqIHNpblUxICogc2luVTIgLyBjb3NTcc6xO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGNvczLPg00pKSBjb3Myz4NNID0gMDsgLy8gZXF1YXRvcmlhbCBsaW5lOiBjb3NTcc6xPTAgKMKnNilcbiAgICAgICAgICAgIHZhciBDID0gZiAvIDE2ICogY29zU3HOsSAqICg0ICsgZiAqICg0IC0gMyAqIGNvc1NxzrEpKTtcbiAgICAgICAgICAgIM67yrkgPSDOuztcbiAgICAgICAgICAgIM67ID0gTCArICgxIC0gQykgKiBmICogc2luzrEgKiAoz4MgKyBDICogc2luz4MgKiAoY29zMs+DTSArIEMgKiBjb3PPgyAqICgtXG4gICAgICAgICAgICAgICAgMSArIDIgKiBjb3Myz4NNICogY29zMs+DTSkpKTtcbiAgICAgICAgfSB3aGlsZSAoTWF0aC5hYnMozrsgLSDOu8q5KSA+IDFlLTEyICYmICsraXRlcmF0aW9ucyA8IDEwMCk7XG4gICAgICAgIGlmIChpdGVyYXRpb25zID49IDEwMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZS4gQWx0ZXJpbmcgdGFyZ2V0IHBvc2l0aW9uLlwiKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZpbmNlbnR5X2ludmVyc2UocDEsIHtcbiAgICAgICAgICAgICAgICBsYXQ6IHAyLmxhdCxcbiAgICAgICAgICAgICAgICBsbmc6IHAyLmxuZyAtIDAuMDFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKCdGb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHVTcSA9IGNvc1NxzrEgKiAoYSAqIGEgLSBiICogYikgLyAoYiAqIGIpO1xuICAgICAgICB2YXIgQSA9IDEgKyB1U3EgLyAxNjM4NCAqICg0MDk2ICsgdVNxICogKC03NjggKyB1U3EgKiAoMzIwIC0gMTc1ICpcbiAgICAgICAgICAgIHVTcSkpKTtcbiAgICAgICAgdmFyIEIgPSB1U3EgLyAxMDI0ICogKDI1NiArIHVTcSAqICgtMTI4ICsgdVNxICogKDc0IC0gNDcgKiB1U3EpKSk7XG4gICAgICAgIHZhciDOlM+DID0gQiAqIHNpbs+DICogKGNvczLPg00gKyBCIC8gNCAqIChjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICpcbiAgICAgICAgICAgIGNvczLPg00pIC1cbiAgICAgICAgICAgIEIgLyA2ICogY29zMs+DTSAqICgtMyArIDQgKiBzaW7PgyAqIHNpbs+DKSAqICgtMyArIDQgKiBjb3Myz4NNICpcbiAgICAgICAgICAgICAgICBjb3Myz4NNKSkpO1xuXG4gICAgICAgIHZhciBzID0gYiAqIEEgKiAoz4MgLSDOlM+DKTtcblxuICAgICAgICB2YXIgZndkQXogPSBNYXRoLmF0YW4yKGNvc1UyICogc2luzrssIGNvc1UxICogc2luVTIgLSBzaW5VMSAqIGNvc1UyICpcbiAgICAgICAgICAgIGNvc867KTtcbiAgICAgICAgdmFyIHJldkF6ID0gTWF0aC5hdGFuMihjb3NVMSAqIHNpbs67LCAtc2luVTEgKiBjb3NVMiArIGNvc1UxICogc2luVTIgKlxuICAgICAgICAgICAgY29zzrspO1xuXG4gICAgICAgIHMgPSBOdW1iZXIocy50b0ZpeGVkKDMpKTsgLy8gcm91bmQgdG8gMW1tIHByZWNpc2lvblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzdGFuY2U6IHMsXG4gICAgICAgICAgICBpbml0aWFsQmVhcmluZzogZndkQXoudG9EZWdyZWVzKCksXG4gICAgICAgICAgICBmaW5hbEJlYXJpbmc6IHJldkF6LnRvRGVncmVlcygpXG4gICAgICAgIH07XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcG9pbnQgb2YgaW50ZXJzZWN0aW9uIG9mIHR3byBwYXRocyBkZWZpbmVkIGJ5IHBvaW50IGFuZCBiZWFyaW5nLlxuICAgICAqIGJhc2VkIG9uIHRoZSB3b3JrIG9mIENocmlzIFZlbmVzcyAoaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdmVuZXNzL2dlb2Rlc3kpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xhdExvbn0gcDEgLSBGaXJzdCBwb2ludC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYnJuZzEgLSBJbml0aWFsIGJlYXJpbmcgZnJvbSBmaXJzdCBwb2ludC5cbiAgICAgKiBAcGFyYW0ge0xhdExvbn0gcDIgLSBTZWNvbmQgcG9pbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJybmcyIC0gSW5pdGlhbCBiZWFyaW5nIGZyb20gc2Vjb25kIHBvaW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGNvbnRhaW5pbmcgbGF0L2xuZyBpbmZvcm1hdGlvbiBvZiBpbnRlcnNlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwMSA9IExhdExvbig1MS44ODUzLCAwLjI1NDUpLCBicm5nMSA9IDEwOC41NTtcbiAgICAgKiB2YXIgcDIgPSBMYXRMb24oNDkuMDAzNCwgMi41NzM1KSwgYnJuZzIgPSAzMi40NDtcbiAgICAgKiB2YXIgcEludCA9IExhdExvbi5pbnRlcnNlY3Rpb24ocDEsIGJybmcxLCBwMiwgYnJuZzIpOyAvLyBwSW50LnRvU3RyaW5nKCk6IDUwLjkwNzjCsE4sIDQuNTA4NMKwRVxuICAgICAqL1xuICAgIF9pbnRlcnNlY3Rpb246IGZ1bmN0aW9uIChwMSwgYnJuZzEsIHAyLCBicm5nMikge1xuICAgICAgICAvLyBzZWUgaHR0cDovL3dpbGxpYW1zLmJlc3QudndoLm5ldC9hdmZvcm0uaHRtI0ludGVyc2VjdGlvblxuXG4gICAgICAgIHZhciDPhjEgPSBwMS5sYXQudG9SYWRpYW5zKCksXG4gICAgICAgICAgICDOuzEgPSBwMS5sbmcudG9SYWRpYW5zKCk7XG4gICAgICAgIHZhciDPhjIgPSBwMi5sYXQudG9SYWRpYW5zKCksXG4gICAgICAgICAgICDOuzIgPSBwMi5sbmcudG9SYWRpYW5zKCk7XG4gICAgICAgIHZhciDOuDEzID0gTnVtYmVyKGJybmcxKS50b1JhZGlhbnMoKSxcbiAgICAgICAgICAgIM64MjMgPSBOdW1iZXIoYnJuZzIpLnRvUmFkaWFucygpO1xuICAgICAgICB2YXIgzpTPhiA9IM+GMiAtIM+GMSxcbiAgICAgICAgICAgIM6UzrsgPSDOuzIgLSDOuzE7XG5cbiAgICAgICAgdmFyIM60MTIgPSAyICogTWF0aC5hc2luKE1hdGguc3FydChNYXRoLnNpbijOlM+GIC8gMikgKiBNYXRoLnNpbijOlM+GIC8gMikgK1xuICAgICAgICAgICAgTWF0aC5jb3Moz4YxKSAqIE1hdGguY29zKM+GMikgKiBNYXRoLnNpbijOlM67IC8gMikgKiBNYXRoLnNpbijOlM67IC9cbiAgICAgICAgICAgICAgICAyKSkpO1xuICAgICAgICBpZiAozrQxMiA9PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpbml0aWFsL2ZpbmFsIGJlYXJpbmdzIGJldHdlZW4gcG9pbnRzXG4gICAgICAgIHZhciDOuDEgPSBNYXRoLmFjb3MoKE1hdGguc2luKM+GMikgLSBNYXRoLnNpbijPhjEpICogTWF0aC5jb3MozrQxMikpIC9cbiAgICAgICAgICAgIChNYXRoLnNpbijOtDEyKSAqIE1hdGguY29zKM+GMSkpKTtcbiAgICAgICAgaWYgKGlzTmFOKM64MSkpIM64MSA9IDA7IC8vIHByb3RlY3QgYWdhaW5zdCByb3VuZGluZ1xuICAgICAgICB2YXIgzrgyID0gTWF0aC5hY29zKChNYXRoLnNpbijPhjEpIC0gTWF0aC5zaW4oz4YyKSAqIE1hdGguY29zKM60MTIpKSAvXG4gICAgICAgICAgICAoTWF0aC5zaW4ozrQxMikgKiBNYXRoLmNvcyjPhjIpKSk7XG5cbiAgICAgICAgaWYgKE1hdGguc2luKM67MiAtIM67MSkgPiAwKSB7XG4gICAgICAgICAgICB2YXIgzrgxMiA9IM64MTtcbiAgICAgICAgICAgIHZhciDOuDIxID0gMiAqIE1hdGguUEkgLSDOuDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgzrgxMiA9IDIgKiBNYXRoLlBJIC0gzrgxO1xuICAgICAgICAgICAgdmFyIM64MjEgPSDOuDI7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgzrExID0gKM64MTMgLSDOuDEyICsgTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gYW5nbGUgMi0xLTNcbiAgICAgICAgdmFyIM6xMiA9ICjOuDIxIC0gzrgyMyArIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSAtIE1hdGguUEk7IC8vIGFuZ2xlIDEtMi0zXG5cbiAgICAgICAgaWYgKE1hdGguc2luKM6xMSkgPT0gMCAmJiBNYXRoLnNpbijOsTIpID09IDApIHJldHVybiBudWxsOyAvLyBpbmZpbml0ZSBpbnRlcnNlY3Rpb25zXG4gICAgICAgIGlmIChNYXRoLnNpbijOsTEpICogTWF0aC5zaW4ozrEyKSA8IDApIHJldHVybiBudWxsOyAvLyBhbWJpZ3VvdXMgaW50ZXJzZWN0aW9uXG5cbiAgICAgICAgLy/OsTEgPSBNYXRoLmFicyjOsTEpO1xuICAgICAgICAvL86xMiA9IE1hdGguYWJzKM6xMik7XG4gICAgICAgIC8vIC4uLiBFZCBXaWxsaWFtcyB0YWtlcyBhYnMgb2YgzrExL86xMiwgYnV0IHNlZW1zIHRvIGJyZWFrIGNhbGN1bGF0aW9uP1xuXG4gICAgICAgIHZhciDOsTMgPSBNYXRoLmFjb3MoLU1hdGguY29zKM6xMSkgKiBNYXRoLmNvcyjOsTIpICtcbiAgICAgICAgICAgIE1hdGguc2luKM6xMSkgKiBNYXRoLnNpbijOsTIpICogTWF0aC5jb3MozrQxMikpO1xuICAgICAgICB2YXIgzrQxMyA9IE1hdGguYXRhbjIoTWF0aC5zaW4ozrQxMikgKiBNYXRoLnNpbijOsTEpICogTWF0aC5zaW4ozrEyKSxcbiAgICAgICAgICAgIE1hdGguY29zKM6xMikgKyBNYXRoLmNvcyjOsTEpICogTWF0aC5jb3MozrEzKSlcbiAgICAgICAgdmFyIM+GMyA9IE1hdGguYXNpbihNYXRoLnNpbijPhjEpICogTWF0aC5jb3MozrQxMykgK1xuICAgICAgICAgICAgTWF0aC5jb3Moz4YxKSAqIE1hdGguc2luKM60MTMpICogTWF0aC5jb3MozrgxMykpO1xuICAgICAgICB2YXIgzpTOuzEzID0gTWF0aC5hdGFuMihNYXRoLnNpbijOuDEzKSAqIE1hdGguc2luKM60MTMpICogTWF0aC5jb3Moz4YxKSxcbiAgICAgICAgICAgIE1hdGguY29zKM60MTMpIC0gTWF0aC5zaW4oz4YxKSAqIE1hdGguc2luKM+GMykpO1xuICAgICAgICB2YXIgzrszID0gzrsxICsgzpTOuzEzO1xuICAgICAgICDOuzMgPSAozrszICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSAtIE1hdGguUEk7IC8vIG5vcm1hbGlzZSB0byAtMTgwLi4rMTgwwrpcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0OiDPhjMudG9EZWdyZWVzKCksXG4gICAgICAgICAgICBsbmc6IM67My50b0RlZ3JlZXMoKVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBPdmVyd3JpdGVzIG9iajEncyB2YWx1ZXMgd2l0aCBvYmoyJ3MgYW5kIGFkZHMgb2JqMidzIGlmIG5vbiBleGlzdGVudCBpbiBvYmoxXG4gICAgICogQHBhcmFtIG9iajFcbiAgICAgKiBAcGFyYW0gb2JqMlxuICAgICAqIEByZXR1cm5zIG9iajMgYSBuZXcgb2JqZWN0IGJhc2VkIG9uIG9iajEgYW5kIG9iajJcbiAgICAgKi9cbiAgICBfbWVyZ2Vfb3B0aW9uczogZnVuY3Rpb24gKG9iajEsIG9iajIpIHtcbiAgICAgICAgbGV0IG9iajMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgYXR0cm5hbWUgaW4gb2JqMSkge1xuICAgICAgICAgICAgb2JqM1thdHRybmFtZV0gPSBvYmoxW2F0dHJuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBhdHRybmFtZSBpbiBvYmoyKSB7XG4gICAgICAgICAgICBvYmozW2F0dHJuYW1lXSA9IG9iajJbYXR0cm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmozO1xuICAgIH1cbn0pO1xuXG5MLmdlb2Rlc2ljID0gZnVuY3Rpb24gKGxhdGxuZ3MsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEwuR2VvZGVzaWMobGF0bG5ncywgb3B0aW9ucyk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcHVibGljL2Fzc2V0cy92ZW5kb3IvbGVhZmxldC1wbHVnaW5zL2xlYWZsZXQuZ2VvZGVzaWMuanMiLCIoZnVuY3Rpb24gKCkge1xuICAgIC8vIHNhdmUgdGhlc2Ugb3JpZ2luYWwgbWV0aG9kcyBiZWZvcmUgdGhleSBhcmUgb3ZlcndyaXR0ZW5cbiAgICB2YXIgcHJvdG9faW5pdEljb24gPSBMLk1hcmtlci5wcm90b3R5cGUuX2luaXRJY29uO1xuICAgIHZhciBwcm90b19zZXRQb3MgPSBMLk1hcmtlci5wcm90b3R5cGUuX3NldFBvcztcblxuICAgIHZhciBvbGRJRSA9IChMLkRvbVV0aWwuVFJBTlNGT1JNID09PSAnbXNUcmFuc2Zvcm0nKTtcblxuICAgIEwuTWFya2VyLmFkZEluaXRIb29rKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGljb25PcHRpb25zID0gdGhpcy5vcHRpb25zLmljb24gJiYgdGhpcy5vcHRpb25zLmljb24ub3B0aW9ucztcbiAgICAgICAgdmFyIGljb25BbmNob3IgPSBpY29uT3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuaWNvbi5vcHRpb25zLmljb25BbmNob3I7XG4gICAgICAgIGlmIChpY29uQW5jaG9yKSB7XG4gICAgICAgICAgICBpY29uQW5jaG9yID0gKGljb25BbmNob3JbMF0gKyAncHggJyArIGljb25BbmNob3JbMV0gKyAncHgnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMucm90YXRpb25PcmlnaW4gPSB0aGlzLm9wdGlvbnMucm90YXRpb25PcmlnaW4gfHwgaWNvbkFuY2hvciB8fCAnY2VudGVyIGJvdHRvbSc7XG4gICAgICAgIHRoaXMub3B0aW9ucy5yb3RhdGlvbkFuZ2xlID0gdGhpcy5vcHRpb25zLnJvdGF0aW9uQW5nbGUgfHwgMDtcblxuICAgICAgICAvLyBFbnN1cmUgbWFya2VyIGtlZXBzIHJvdGF0ZWQgZHVyaW5nIGRyYWdnaW5nXG4gICAgICAgIHRoaXMub24oJ2RyYWcnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS50YXJnZXQuX2FwcGx5Um90YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBMLk1hcmtlci5pbmNsdWRlKHtcbiAgICAgICAgX2luaXRJY29uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwcm90b19pbml0SWNvbi5jYWxsKHRoaXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9zZXRQb3M6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgICAgIHByb3RvX3NldFBvcy5jYWxsKHRoaXMsIHBvcyk7XG4gICAgICAgICAgICB0aGlzLl9hcHBseVJvdGF0aW9uKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2FwcGx5Um90YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucm90YXRpb25BbmdsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ljb24uc3R5bGVbTC5Eb21VdGlsLlRSQU5TRk9STSArICdPcmlnaW4nXSA9IHRoaXMub3B0aW9ucy5yb3RhdGlvbk9yaWdpbjtcblxuICAgICAgICAgICAgICAgIGlmIChvbGRJRSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgSUUgOSwgdXNlIHRoZSAyRCByb3RhdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pY29uLnN0eWxlW0wuRG9tVXRpbC5UUkFOU0ZPUk1dID0gJ3JvdGF0ZSgnICsgdGhpcy5vcHRpb25zLnJvdGF0aW9uQW5nbGUgKyAnZGVnKSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG1vZGVybiBicm93c2VycywgcHJlZmVyIHRoZSAzRCBhY2NlbGVyYXRlZCB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ljb24uc3R5bGVbTC5Eb21VdGlsLlRSQU5TRk9STV0gKz0gJyByb3RhdGVaKCcgKyB0aGlzLm9wdGlvbnMucm90YXRpb25BbmdsZSArICdkZWcpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0Um90YXRpb25BbmdsZTogZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucm90YXRpb25BbmdsZSA9IGFuZ2xlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldFJvdGF0aW9uT3JpZ2luOiBmdW5jdGlvbiAob3JpZ2luKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucm90YXRpb25PcmlnaW4gPSBvcmlnaW47XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wdWJsaWMvYXNzZXRzL3ZlbmRvci9sZWFmbGV0LXBsdWdpbnMvbGVhZmxldC5yb3RhdGVkTWFya2VyLmpzIiwiLyogQHByZXNlcnZlXG4gKiBMZWFmbGV0IDEuMi4wLCBhIEpTIGxpYnJhcnkgZm9yIGludGVyYWN0aXZlIG1hcHMuIGh0dHA6Ly9sZWFmbGV0anMuY29tXG4gKiAoYykgMjAxMC0yMDE3IFZsYWRpbWlyIEFnYWZvbmtpbiwgKGMpIDIwMTAtMjAxMSBDbG91ZE1hZGVcbiAqL1xuIWZ1bmN0aW9uKHQsaSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/aShleHBvcnRzKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImV4cG9ydHNcIl0saSk6aSh0Lkw9e30pfSh0aGlzLGZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGkodCl7dmFyIGksZSxuLG87Zm9yKGU9MSxuPWFyZ3VtZW50cy5sZW5ndGg7ZTxuO2UrKyl7bz1hcmd1bWVudHNbZV07Zm9yKGkgaW4gbyl0W2ldPW9baV19cmV0dXJuIHR9ZnVuY3Rpb24gZSh0LGkpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZTtpZih0LmJpbmQpcmV0dXJuIHQuYmluZC5hcHBseSh0LGUuY2FsbChhcmd1bWVudHMsMSkpO3ZhciBuPWUuY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoaSxuLmxlbmd0aD9uLmNvbmNhdChlLmNhbGwoYXJndW1lbnRzKSk6YXJndW1lbnRzKX19ZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5fbGVhZmxldF9pZD10Ll9sZWFmbGV0X2lkfHwrK3RpLHQuX2xlYWZsZXRfaWR9ZnVuY3Rpb24gbyh0LGksZSl7dmFyIG4sbyxzLHI7cmV0dXJuIHI9ZnVuY3Rpb24oKXtuPSExLG8mJihzLmFwcGx5KGUsbyksbz0hMSl9LHM9ZnVuY3Rpb24oKXtuP289YXJndW1lbnRzOih0LmFwcGx5KGUsYXJndW1lbnRzKSxzZXRUaW1lb3V0KHIsaSksbj0hMCl9fWZ1bmN0aW9uIHModCxpLGUpe3ZhciBuPWlbMV0sbz1pWzBdLHM9bi1vO3JldHVybiB0PT09biYmZT90OigodC1vKSVzK3MpJXMrb31mdW5jdGlvbiByKCl7cmV0dXJuITF9ZnVuY3Rpb24gYSh0LGkpe3ZhciBlPU1hdGgucG93KDEwLGl8fDUpO3JldHVybiBNYXRoLnJvdW5kKHQqZSkvZX1mdW5jdGlvbiBoKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLFwiXCIpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIGgodCkuc3BsaXQoL1xccysvKX1mdW5jdGlvbiBsKHQsaSl7dC5oYXNPd25Qcm9wZXJ0eShcIm9wdGlvbnNcIil8fCh0Lm9wdGlvbnM9dC5vcHRpb25zP1F0KHQub3B0aW9ucyk6e30pO2Zvcih2YXIgZSBpbiBpKXQub3B0aW9uc1tlXT1pW2VdO3JldHVybiB0Lm9wdGlvbnN9ZnVuY3Rpb24gYyh0LGksZSl7dmFyIG49W107Zm9yKHZhciBvIGluIHQpbi5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChlP28udG9VcHBlckNhc2UoKTpvKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQodFtvXSkpO3JldHVybihpJiYtMSE9PWkuaW5kZXhPZihcIj9cIik/XCImXCI6XCI/XCIpK24uam9pbihcIiZcIil9ZnVuY3Rpb24gXyh0LGkpe3JldHVybiB0LnJlcGxhY2UoaWksZnVuY3Rpb24odCxlKXt2YXIgbj1pW2VdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKFwiTm8gdmFsdWUgcHJvdmlkZWQgZm9yIHZhcmlhYmxlIFwiK3QpO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIG4mJihuPW4oaSkpLG59KX1mdW5jdGlvbiBkKHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXT09PWkpcmV0dXJuIGU7cmV0dXJuLTF9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gd2luZG93W1wid2Via2l0XCIrdF18fHdpbmRvd1tcIm1velwiK3RdfHx3aW5kb3dbXCJtc1wiK3RdfWZ1bmN0aW9uIG0odCl7dmFyIGk9K25ldyBEYXRlLGU9TWF0aC5tYXgoMCwxNi0oaS1vaSkpO3JldHVybiBvaT1pK2Usd2luZG93LnNldFRpbWVvdXQodCxlKX1mdW5jdGlvbiBmKHQsaSxuKXtpZighbnx8c2khPT1tKXJldHVybiBzaS5jYWxsKHdpbmRvdyxlKHQsaSkpO3QuY2FsbChpKX1mdW5jdGlvbiBnKHQpe3QmJnJpLmNhbGwod2luZG93LHQpfWZ1bmN0aW9uIHYoKXt9ZnVuY3Rpb24geSh0KXtpZihMJiZMLk1peGluKXt0PWVpKHQpP3Q6W3RdO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV09PT1MLk1peGluLkV2ZW50cyYmY29uc29sZS53YXJuKFwiRGVwcmVjYXRlZCBpbmNsdWRlIG9mIEwuTWl4aW4uRXZlbnRzOiB0aGlzIHByb3BlcnR5IHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgcmVsZWFzZXMsIHBsZWFzZSBpbmhlcml0IGZyb20gTC5FdmVudGVkIGluc3RlYWQuXCIsKG5ldyBFcnJvcikuc3RhY2spfX1mdW5jdGlvbiB4KHQsaSxlKXt0aGlzLng9ZT9NYXRoLnJvdW5kKHQpOnQsdGhpcy55PWU/TWF0aC5yb3VuZChpKTppfWZ1bmN0aW9uIHcodCxpLGUpe3JldHVybiB0IGluc3RhbmNlb2YgeD90OmVpKHQpP25ldyB4KHRbMF0sdFsxXSk6dm9pZCAwPT09dHx8bnVsbD09PXQ/dDpcIm9iamVjdFwiPT10eXBlb2YgdCYmXCJ4XCJpbiB0JiZcInlcImluIHQ/bmV3IHgodC54LHQueSk6bmV3IHgodCxpLGUpfWZ1bmN0aW9uIFAodCxpKXtpZih0KWZvcih2YXIgZT1pP1t0LGldOnQsbj0wLG89ZS5sZW5ndGg7bjxvO24rKyl0aGlzLmV4dGVuZChlW25dKX1mdW5jdGlvbiBiKHQsaSl7cmV0dXJuIXR8fHQgaW5zdGFuY2VvZiBQP3Q6bmV3IFAodCxpKX1mdW5jdGlvbiBUKHQsaSl7aWYodClmb3IodmFyIGU9aT9bdCxpXTp0LG49MCxvPWUubGVuZ3RoO248bztuKyspdGhpcy5leHRlbmQoZVtuXSl9ZnVuY3Rpb24geih0LGkpe3JldHVybiB0IGluc3RhbmNlb2YgVD90Om5ldyBUKHQsaSl9ZnVuY3Rpb24gTSh0LGksZSl7aWYoaXNOYU4odCl8fGlzTmFOKGkpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTGF0TG5nIG9iamVjdDogKFwiK3QrXCIsIFwiK2krXCIpXCIpO3RoaXMubGF0PSt0LHRoaXMubG5nPStpLHZvaWQgMCE9PWUmJih0aGlzLmFsdD0rZSl9ZnVuY3Rpb24gQyh0LGksZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNP3Q6ZWkodCkmJlwib2JqZWN0XCIhPXR5cGVvZiB0WzBdPzM9PT10Lmxlbmd0aD9uZXcgTSh0WzBdLHRbMV0sdFsyXSk6Mj09PXQubGVuZ3RoP25ldyBNKHRbMF0sdFsxXSk6bnVsbDp2b2lkIDA9PT10fHxudWxsPT09dD90Olwib2JqZWN0XCI9PXR5cGVvZiB0JiZcImxhdFwiaW4gdD9uZXcgTSh0LmxhdCxcImxuZ1wiaW4gdD90LmxuZzp0Lmxvbix0LmFsdCk6dm9pZCAwPT09aT9udWxsOm5ldyBNKHQsaSxlKX1mdW5jdGlvbiBaKHQsaSxlLG4pe2lmKGVpKHQpKXJldHVybiB0aGlzLl9hPXRbMF0sdGhpcy5fYj10WzFdLHRoaXMuX2M9dFsyXSx2b2lkKHRoaXMuX2Q9dFszXSk7dGhpcy5fYT10LHRoaXMuX2I9aSx0aGlzLl9jPWUsdGhpcy5fZD1ufWZ1bmN0aW9uIEUodCxpLGUsbil7cmV0dXJuIG5ldyBaKHQsaSxlLG4pfWZ1bmN0aW9uIFModCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsdCl9ZnVuY3Rpb24gayh0LGkpe3ZhciBlLG4sbyxzLHIsYSxoPVwiXCI7Zm9yKGU9MCxvPXQubGVuZ3RoO2U8bztlKyspe2ZvcihuPTAscz0ocj10W2VdKS5sZW5ndGg7bjxzO24rKylhPXJbbl0saCs9KG4/XCJMXCI6XCJNXCIpK2EueCtcIiBcIithLnk7aCs9aT9xaT9cInpcIjpcInhcIjpcIlwifXJldHVybiBofHxcIk0wIDBcIn1mdW5jdGlvbiBCKHQpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0KT49MH1mdW5jdGlvbiBJKHQsaSxlLG4pe3JldHVyblwidG91Y2hzdGFydFwiPT09aT9PKHQsZSxuKTpcInRvdWNobW92ZVwiPT09aT9XKHQsZSxuKTpcInRvdWNoZW5kXCI9PT1pJiZIKHQsZSxuKSx0aGlzfWZ1bmN0aW9uIEEodCxpLGUpe3ZhciBuPXRbXCJfbGVhZmxldF9cIitpK2VdO3JldHVyblwidG91Y2hzdGFydFwiPT09aT90LnJlbW92ZUV2ZW50TGlzdGVuZXIoWGksbiwhMSk6XCJ0b3VjaG1vdmVcIj09PWk/dC5yZW1vdmVFdmVudExpc3RlbmVyKEppLG4sITEpOlwidG91Y2hlbmRcIj09PWkmJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJGksbiwhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKFFpLG4sITEpKSx0aGlzfWZ1bmN0aW9uIE8odCxpLG4pe3ZhciBvPWUoZnVuY3Rpb24odCl7aWYoXCJtb3VzZVwiIT09dC5wb2ludGVyVHlwZSYmdC5wb2ludGVyVHlwZSE9PXQuTVNQT0lOVEVSX1RZUEVfTU9VU0UmJnQucG9pbnRlclR5cGUhPT10Lk1TUE9JTlRFUl9UWVBFX01PVVNFKXtpZighKHRlLmluZGV4T2YodC50YXJnZXQudGFnTmFtZSk8MCkpcmV0dXJuOyQodCl9aih0LGkpfSk7dFtcIl9sZWFmbGV0X3RvdWNoc3RhcnRcIituXT1vLHQuYWRkRXZlbnRMaXN0ZW5lcihYaSxvLCExKSxlZXx8KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFhpLFIsITApLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKEppLEQsITApLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCRpLE4sITApLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFFpLE4sITApLGVlPSEwKX1mdW5jdGlvbiBSKHQpe2llW3QucG9pbnRlcklkXT10LG5lKyt9ZnVuY3Rpb24gRCh0KXtpZVt0LnBvaW50ZXJJZF0mJihpZVt0LnBvaW50ZXJJZF09dCl9ZnVuY3Rpb24gTih0KXtkZWxldGUgaWVbdC5wb2ludGVySWRdLG5lLS19ZnVuY3Rpb24gaih0LGkpe3QudG91Y2hlcz1bXTtmb3IodmFyIGUgaW4gaWUpdC50b3VjaGVzLnB1c2goaWVbZV0pO3QuY2hhbmdlZFRvdWNoZXM9W3RdLGkodCl9ZnVuY3Rpb24gVyh0LGksZSl7dmFyIG49ZnVuY3Rpb24odCl7KHQucG9pbnRlclR5cGUhPT10Lk1TUE9JTlRFUl9UWVBFX01PVVNFJiZcIm1vdXNlXCIhPT10LnBvaW50ZXJUeXBlfHwwIT09dC5idXR0b25zKSYmaih0LGkpfTt0W1wiX2xlYWZsZXRfdG91Y2htb3ZlXCIrZV09bix0LmFkZEV2ZW50TGlzdGVuZXIoSmksbiwhMSl9ZnVuY3Rpb24gSCh0LGksZSl7dmFyIG49ZnVuY3Rpb24odCl7aih0LGkpfTt0W1wiX2xlYWZsZXRfdG91Y2hlbmRcIitlXT1uLHQuYWRkRXZlbnRMaXN0ZW5lcigkaSxuLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoUWksbiwhMSl9ZnVuY3Rpb24gRih0LGksZSl7ZnVuY3Rpb24gbih0KXt2YXIgaTtpZihXaSl7aWYoIUxpfHxcIm1vdXNlXCI9PT10LnBvaW50ZXJUeXBlKXJldHVybjtpPW5lfWVsc2UgaT10LnRvdWNoZXMubGVuZ3RoO2lmKCEoaT4xKSl7dmFyIGU9RGF0ZS5ub3coKSxuPWUtKHN8fGUpO3I9dC50b3VjaGVzP3QudG91Y2hlc1swXTp0LGE9bj4wJiZuPD1oLHM9ZX19ZnVuY3Rpb24gbyh0KXtpZihhJiYhci5jYW5jZWxCdWJibGUpe2lmKFdpKXtpZighTGl8fFwibW91c2VcIj09PXQucG9pbnRlclR5cGUpcmV0dXJuO3ZhciBlLG4sbz17fTtmb3IobiBpbiByKWU9cltuXSxvW25dPWUmJmUuYmluZD9lLmJpbmQocik6ZTtyPW99ci50eXBlPVwiZGJsY2xpY2tcIixpKHIpLHM9bnVsbH19dmFyIHMscixhPSExLGg9MjUwO3JldHVybiB0W3JlK29lK2VdPW4sdFtyZStzZStlXT1vLHRbcmUrXCJkYmxjbGlja1wiK2VdPWksdC5hZGRFdmVudExpc3RlbmVyKG9lLG4sITEpLHQuYWRkRXZlbnRMaXN0ZW5lcihzZSxvLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLGksITEpLHRoaXN9ZnVuY3Rpb24gVSh0LGkpe3ZhciBlPXRbcmUrb2UraV0sbj10W3JlK3NlK2ldLG89dFtyZStcImRibGNsaWNrXCIraV07cmV0dXJuIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihvZSxlLCExKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoc2UsbiwhMSksTGl8fHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsbywhMSksdGhpc31mdW5jdGlvbiBWKHQsaSxlLG4pe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBpKWZvcih2YXIgbyBpbiBpKXEodCxvLGlbb10sZSk7ZWxzZSBmb3IodmFyIHM9MCxyPShpPXUoaSkpLmxlbmd0aDtzPHI7cysrKXEodCxpW3NdLGUsbik7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gRyh0LGksZSxuKXtpZihcIm9iamVjdFwiPT10eXBlb2YgaSlmb3IodmFyIG8gaW4gaSlLKHQsbyxpW29dLGUpO2Vsc2UgaWYoaSlmb3IodmFyIHM9MCxyPShpPXUoaSkpLmxlbmd0aDtzPHI7cysrKUsodCxpW3NdLGUsbik7ZWxzZXtmb3IodmFyIGEgaW4gdFthZV0pSyh0LGEsdFthZV1bYV0pO2RlbGV0ZSB0W2FlXX1yZXR1cm4gdGhpc31mdW5jdGlvbiBxKHQsaSxlLG8pe3ZhciBzPWkrbihlKSsobz9cIl9cIituKG8pOlwiXCIpO2lmKHRbYWVdJiZ0W2FlXVtzXSlyZXR1cm4gdGhpczt2YXIgcj1mdW5jdGlvbihpKXtyZXR1cm4gZS5jYWxsKG98fHQsaXx8d2luZG93LmV2ZW50KX0sYT1yO1dpJiYwPT09aS5pbmRleE9mKFwidG91Y2hcIik/SSh0LGkscixzKTohSGl8fFwiZGJsY2xpY2tcIiE9PWl8fCFGfHxXaSYmTWk/XCJhZGRFdmVudExpc3RlbmVyXCJpbiB0P1wibW91c2V3aGVlbFwiPT09aT90LmFkZEV2ZW50TGlzdGVuZXIoXCJvbndoZWVsXCJpbiB0P1wid2hlZWxcIjpcIm1vdXNld2hlZWxcIixyLCExKTpcIm1vdXNlZW50ZXJcIj09PWl8fFwibW91c2VsZWF2ZVwiPT09aT8ocj1mdW5jdGlvbihpKXtpPWl8fHdpbmRvdy5ldmVudCxvdCh0LGkpJiZhKGkpfSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCI9PT1pP1wibW91c2VvdmVyXCI6XCJtb3VzZW91dFwiLHIsITEpKTooXCJjbGlja1wiPT09aSYmYmkmJihyPWZ1bmN0aW9uKHQpe3N0KHQsYSl9KSx0LmFkZEV2ZW50TGlzdGVuZXIoaSxyLCExKSk6XCJhdHRhY2hFdmVudFwiaW4gdCYmdC5hdHRhY2hFdmVudChcIm9uXCIraSxyKTpGKHQscixzKSx0W2FlXT10W2FlXXx8e30sdFthZV1bc109cn1mdW5jdGlvbiBLKHQsaSxlLG8pe3ZhciBzPWkrbihlKSsobz9cIl9cIituKG8pOlwiXCIpLHI9dFthZV0mJnRbYWVdW3NdO2lmKCFyKXJldHVybiB0aGlzO1dpJiYwPT09aS5pbmRleE9mKFwidG91Y2hcIik/QSh0LGkscyk6SGkmJlwiZGJsY2xpY2tcIj09PWkmJlU/VSh0LHMpOlwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiaW4gdD9cIm1vdXNld2hlZWxcIj09PWk/dC5yZW1vdmVFdmVudExpc3RlbmVyKFwib253aGVlbFwiaW4gdD9cIndoZWVsXCI6XCJtb3VzZXdoZWVsXCIsciwhMSk6dC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiPT09aT9cIm1vdXNlb3ZlclwiOlwibW91c2VsZWF2ZVwiPT09aT9cIm1vdXNlb3V0XCI6aSxyLCExKTpcImRldGFjaEV2ZW50XCJpbiB0JiZ0LmRldGFjaEV2ZW50KFwib25cIitpLHIpLHRbYWVdW3NdPW51bGx9ZnVuY3Rpb24gWSh0KXtyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24/dC5zdG9wUHJvcGFnYXRpb24oKTp0Lm9yaWdpbmFsRXZlbnQ/dC5vcmlnaW5hbEV2ZW50Ll9zdG9wcGVkPSEwOnQuY2FuY2VsQnViYmxlPSEwLG50KHQpLHRoaXN9ZnVuY3Rpb24gWCh0KXtyZXR1cm4gcSh0LFwibW91c2V3aGVlbFwiLFkpLHRoaXN9ZnVuY3Rpb24gSih0KXtyZXR1cm4gVih0LFwibW91c2Vkb3duIHRvdWNoc3RhcnQgZGJsY2xpY2tcIixZKSxxKHQsXCJjbGlja1wiLGV0KSx0aGlzfWZ1bmN0aW9uICQodCl7cmV0dXJuIHQucHJldmVudERlZmF1bHQ/dC5wcmV2ZW50RGVmYXVsdCgpOnQucmV0dXJuVmFsdWU9ITEsdGhpc31mdW5jdGlvbiBRKHQpe3JldHVybiAkKHQpLFkodCksdGhpc31mdW5jdGlvbiB0dCh0LGkpe2lmKCFpKXJldHVybiBuZXcgeCh0LmNsaWVudFgsdC5jbGllbnRZKTt2YXIgZT1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBuZXcgeCh0LmNsaWVudFgtZS5sZWZ0LWkuY2xpZW50TGVmdCx0LmNsaWVudFktZS50b3AtaS5jbGllbnRUb3ApfWZ1bmN0aW9uIGl0KHQpe3JldHVybiBMaT90LndoZWVsRGVsdGFZLzI6dC5kZWx0YVkmJjA9PT10LmRlbHRhTW9kZT8tdC5kZWx0YVkvaGU6dC5kZWx0YVkmJjE9PT10LmRlbHRhTW9kZT8yMCotdC5kZWx0YVk6dC5kZWx0YVkmJjI9PT10LmRlbHRhTW9kZT82MCotdC5kZWx0YVk6dC5kZWx0YVh8fHQuZGVsdGFaPzA6dC53aGVlbERlbHRhPyh0LndoZWVsRGVsdGFZfHx0LndoZWVsRGVsdGEpLzI6dC5kZXRhaWwmJk1hdGguYWJzKHQuZGV0YWlsKTwzMjc2NT8yMCotdC5kZXRhaWw6dC5kZXRhaWw/dC5kZXRhaWwvLTMyNzY1KjYwOjB9ZnVuY3Rpb24gZXQodCl7dWVbdC50eXBlXT0hMH1mdW5jdGlvbiBudCh0KXt2YXIgaT11ZVt0LnR5cGVdO3JldHVybiB1ZVt0LnR5cGVdPSExLGl9ZnVuY3Rpb24gb3QodCxpKXt2YXIgZT1pLnJlbGF0ZWRUYXJnZXQ7aWYoIWUpcmV0dXJuITA7dHJ5e2Zvcig7ZSYmZSE9PXQ7KWU9ZS5wYXJlbnROb2RlfWNhdGNoKHQpe3JldHVybiExfXJldHVybiBlIT09dH1mdW5jdGlvbiBzdCh0LGkpe3ZhciBlPXQudGltZVN0YW1wfHx0Lm9yaWdpbmFsRXZlbnQmJnQub3JpZ2luYWxFdmVudC50aW1lU3RhbXAsbj1kaSYmZS1kaTtuJiZuPjEwMCYmbjw1MDB8fHQudGFyZ2V0Ll9zaW11bGF0ZWRDbGljayYmIXQuX3NpbXVsYXRlZD9RKHQpOihkaT1lLGkodCkpfWZ1bmN0aW9uIHJ0KHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0P2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpOnR9ZnVuY3Rpb24gYXQodCxpKXt2YXIgZT10LnN0eWxlW2ldfHx0LmN1cnJlbnRTdHlsZSYmdC5jdXJyZW50U3R5bGVbaV07aWYoKCFlfHxcImF1dG9cIj09PWUpJiZkb2N1bWVudC5kZWZhdWx0Vmlldyl7dmFyIG49ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpO2U9bj9uW2ldOm51bGx9cmV0dXJuXCJhdXRvXCI9PT1lP251bGw6ZX1mdW5jdGlvbiBodCh0LGksZSl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KTtyZXR1cm4gbi5jbGFzc05hbWU9aXx8XCJcIixlJiZlLmFwcGVuZENoaWxkKG4pLG59ZnVuY3Rpb24gdXQodCl7dmFyIGk9dC5wYXJlbnROb2RlO2kmJmkucmVtb3ZlQ2hpbGQodCl9ZnVuY3Rpb24gbHQodCl7Zm9yKDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKX1mdW5jdGlvbiBjdCh0KXt2YXIgaT10LnBhcmVudE5vZGU7aS5sYXN0Q2hpbGQhPT10JiZpLmFwcGVuZENoaWxkKHQpfWZ1bmN0aW9uIF90KHQpe3ZhciBpPXQucGFyZW50Tm9kZTtpLmZpcnN0Q2hpbGQhPT10JiZpLmluc2VydEJlZm9yZSh0LGkuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gZHQodCxpKXtpZih2b2lkIDAhPT10LmNsYXNzTGlzdClyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoaSk7dmFyIGU9Z3QodCk7cmV0dXJuIGUubGVuZ3RoPjAmJm5ldyBSZWdFeHAoXCIoXnxcXFxccylcIitpK1wiKFxcXFxzfCQpXCIpLnRlc3QoZSl9ZnVuY3Rpb24gcHQodCxpKXtpZih2b2lkIDAhPT10LmNsYXNzTGlzdClmb3IodmFyIGU9dShpKSxuPTAsbz1lLmxlbmd0aDtuPG87bisrKXQuY2xhc3NMaXN0LmFkZChlW25dKTtlbHNlIGlmKCFkdCh0LGkpKXt2YXIgcz1ndCh0KTtmdCh0LChzP3MrXCIgXCI6XCJcIikraSl9fWZ1bmN0aW9uIG10KHQsaSl7dm9pZCAwIT09dC5jbGFzc0xpc3Q/dC5jbGFzc0xpc3QucmVtb3ZlKGkpOmZ0KHQsaCgoXCIgXCIrZ3QodCkrXCIgXCIpLnJlcGxhY2UoXCIgXCIraStcIiBcIixcIiBcIikpKX1mdW5jdGlvbiBmdCh0LGkpe3ZvaWQgMD09PXQuY2xhc3NOYW1lLmJhc2VWYWw/dC5jbGFzc05hbWU9aTp0LmNsYXNzTmFtZS5iYXNlVmFsPWl9ZnVuY3Rpb24gZ3QodCl7cmV0dXJuIHZvaWQgMD09PXQuY2xhc3NOYW1lLmJhc2VWYWw/dC5jbGFzc05hbWU6dC5jbGFzc05hbWUuYmFzZVZhbH1mdW5jdGlvbiB2dCh0LGkpe1wib3BhY2l0eVwiaW4gdC5zdHlsZT90LnN0eWxlLm9wYWNpdHk9aTpcImZpbHRlclwiaW4gdC5zdHlsZSYmeXQodCxpKX1mdW5jdGlvbiB5dCh0LGkpe3ZhciBlPSExLG49XCJEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYVwiO3RyeXtlPXQuZmlsdGVycy5pdGVtKG4pfWNhdGNoKHQpe2lmKDE9PT1pKXJldHVybn1pPU1hdGgucm91bmQoMTAwKmkpLGU/KGUuRW5hYmxlZD0xMDAhPT1pLGUuT3BhY2l0eT1pKTp0LnN0eWxlLmZpbHRlcis9XCIgcHJvZ2lkOlwiK24rXCIob3BhY2l0eT1cIitpK1wiKVwifWZ1bmN0aW9uIHh0KHQpe2Zvcih2YXIgaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV1pbiBpKXJldHVybiB0W2VdO3JldHVybiExfWZ1bmN0aW9uIHd0KHQsaSxlKXt2YXIgbj1pfHxuZXcgeCgwLDApO3Quc3R5bGVbY2VdPShCaT9cInRyYW5zbGF0ZShcIituLngrXCJweCxcIituLnkrXCJweClcIjpcInRyYW5zbGF0ZTNkKFwiK24ueCtcInB4LFwiK24ueStcInB4LDApXCIpKyhlP1wiIHNjYWxlKFwiK2UrXCIpXCI6XCJcIil9ZnVuY3Rpb24gTHQodCxpKXt0Ll9sZWFmbGV0X3Bvcz1pLE9pP3d0KHQsaSk6KHQuc3R5bGUubGVmdD1pLngrXCJweFwiLHQuc3R5bGUudG9wPWkueStcInB4XCIpfWZ1bmN0aW9uIFB0KHQpe3JldHVybiB0Ll9sZWFmbGV0X3Bvc3x8bmV3IHgoMCwwKX1mdW5jdGlvbiBidCgpe1Yod2luZG93LFwiZHJhZ3N0YXJ0XCIsJCl9ZnVuY3Rpb24gVHQoKXtHKHdpbmRvdyxcImRyYWdzdGFydFwiLCQpfWZ1bmN0aW9uIHp0KHQpe2Zvcig7LTE9PT10LnRhYkluZGV4Oyl0PXQucGFyZW50Tm9kZTt0LnN0eWxlJiYoTXQoKSxtZT10LGZlPXQuc3R5bGUub3V0bGluZSx0LnN0eWxlLm91dGxpbmU9XCJub25lXCIsVih3aW5kb3csXCJrZXlkb3duXCIsTXQpKX1mdW5jdGlvbiBNdCgpe21lJiYobWUuc3R5bGUub3V0bGluZT1mZSxtZT12b2lkIDAsZmU9dm9pZCAwLEcod2luZG93LFwia2V5ZG93blwiLE10KSl9ZnVuY3Rpb24gQ3QodCxpKXtpZighaXx8IXQubGVuZ3RoKXJldHVybiB0LnNsaWNlKCk7dmFyIGU9aSppO3JldHVybiB0PWt0KHQsZSksdD1FdCh0LGUpfWZ1bmN0aW9uIFp0KHQsaSxlKXtyZXR1cm4gTWF0aC5zcXJ0KFJ0KHQsaSxlLCEwKSl9ZnVuY3Rpb24gRXQodCxpKXt2YXIgZT10Lmxlbmd0aCxuPW5ldyh0eXBlb2YgVWludDhBcnJheSE9dm9pZCAwK1wiXCI/VWludDhBcnJheTpBcnJheSkoZSk7blswXT1uW2UtMV09MSxTdCh0LG4saSwwLGUtMSk7dmFyIG8scz1bXTtmb3Iobz0wO288ZTtvKyspbltvXSYmcy5wdXNoKHRbb10pO3JldHVybiBzfWZ1bmN0aW9uIFN0KHQsaSxlLG4sbyl7dmFyIHMscixhLGg9MDtmb3Iocj1uKzE7cjw9by0xO3IrKykoYT1SdCh0W3JdLHRbbl0sdFtvXSwhMCkpPmgmJihzPXIsaD1hKTtoPmUmJihpW3NdPTEsU3QodCxpLGUsbixzKSxTdCh0LGksZSxzLG8pKX1mdW5jdGlvbiBrdCh0LGkpe2Zvcih2YXIgZT1bdFswXV0sbj0xLG89MCxzPXQubGVuZ3RoO248cztuKyspT3QodFtuXSx0W29dKT5pJiYoZS5wdXNoKHRbbl0pLG89bik7cmV0dXJuIG88cy0xJiZlLnB1c2godFtzLTFdKSxlfWZ1bmN0aW9uIEJ0KHQsaSxlLG4sbyl7dmFyIHMscixhLGg9bj96ZTpBdCh0LGUpLHU9QXQoaSxlKTtmb3IoemU9dTs7KXtpZighKGh8dSkpcmV0dXJuW3QsaV07aWYoaCZ1KXJldHVybiExO2E9QXQocj1JdCh0LGkscz1ofHx1LGUsbyksZSkscz09PWg/KHQ9cixoPWEpOihpPXIsdT1hKX19ZnVuY3Rpb24gSXQodCxpLGUsbixvKXt2YXIgcyxyLGE9aS54LXQueCxoPWkueS10LnksdT1uLm1pbixsPW4ubWF4O3JldHVybiA4JmU/KHM9dC54K2EqKGwueS10LnkpL2gscj1sLnkpOjQmZT8ocz10LngrYSoodS55LXQueSkvaCxyPXUueSk6MiZlPyhzPWwueCxyPXQueStoKihsLngtdC54KS9hKToxJmUmJihzPXUueCxyPXQueStoKih1LngtdC54KS9hKSxuZXcgeChzLHIsbyl9ZnVuY3Rpb24gQXQodCxpKXt2YXIgZT0wO3JldHVybiB0Lng8aS5taW4ueD9lfD0xOnQueD5pLm1heC54JiYoZXw9MiksdC55PGkubWluLnk/ZXw9NDp0Lnk+aS5tYXgueSYmKGV8PTgpLGV9ZnVuY3Rpb24gT3QodCxpKXt2YXIgZT1pLngtdC54LG49aS55LXQueTtyZXR1cm4gZSplK24qbn1mdW5jdGlvbiBSdCh0LGksZSxuKXt2YXIgbyxzPWkueCxyPWkueSxhPWUueC1zLGg9ZS55LXIsdT1hKmEraCpoO3JldHVybiB1PjAmJigobz0oKHQueC1zKSphKyh0LnktcikqaCkvdSk+MT8ocz1lLngscj1lLnkpOm8+MCYmKHMrPWEqbyxyKz1oKm8pKSxhPXQueC1zLGg9dC55LXIsbj9hKmEraCpoOm5ldyB4KHMscil9ZnVuY3Rpb24gRHQodCl7cmV0dXJuIWVpKHRbMF0pfHxcIm9iamVjdFwiIT10eXBlb2YgdFswXVswXSYmdm9pZCAwIT09dFswXVswXX1mdW5jdGlvbiBOdCh0KXtyZXR1cm4gY29uc29sZS53YXJuKFwiRGVwcmVjYXRlZCB1c2Ugb2YgX2ZsYXQsIHBsZWFzZSB1c2UgTC5MaW5lVXRpbC5pc0ZsYXQgaW5zdGVhZC5cIiksRHQodCl9ZnVuY3Rpb24ganQodCxpLGUpe3ZhciBuLG8scyxyLGEsaCx1LGwsYyxfPVsxLDQsMiw4XTtmb3Iobz0wLHU9dC5sZW5ndGg7bzx1O28rKyl0W29dLl9jb2RlPUF0KHRbb10saSk7Zm9yKHI9MDtyPDQ7cisrKXtmb3IobD1fW3JdLG49W10sbz0wLHM9KHU9dC5sZW5ndGgpLTE7bzx1O3M9bysrKWE9dFtvXSxoPXRbc10sYS5fY29kZSZsP2guX2NvZGUmbHx8KChjPUl0KGgsYSxsLGksZSkpLl9jb2RlPUF0KGMsaSksbi5wdXNoKGMpKTooaC5fY29kZSZsJiYoKGM9SXQoaCxhLGwsaSxlKSkuX2NvZGU9QXQoYyxpKSxuLnB1c2goYykpLG4ucHVzaChhKSk7dD1ufXJldHVybiB0fWZ1bmN0aW9uIFd0KHQsaSl7dmFyIGUsbixvLHMscj1cIkZlYXR1cmVcIj09PXQudHlwZT90Lmdlb21ldHJ5OnQsYT1yP3IuY29vcmRpbmF0ZXM6bnVsbCxoPVtdLHU9aSYmaS5wb2ludFRvTGF5ZXIsbD1pJiZpLmNvb3Jkc1RvTGF0TG5nfHxIdDtpZighYSYmIXIpcmV0dXJuIG51bGw7c3dpdGNoKHIudHlwZSl7Y2FzZVwiUG9pbnRcIjpyZXR1cm4gZT1sKGEpLHU/dSh0LGUpOm5ldyBxZShlKTtjYXNlXCJNdWx0aVBvaW50XCI6Zm9yKG89MCxzPWEubGVuZ3RoO288cztvKyspZT1sKGFbb10pLGgucHVzaCh1P3UodCxlKTpuZXcgcWUoZSkpO3JldHVybiBuZXcgRmUoaCk7Y2FzZVwiTGluZVN0cmluZ1wiOmNhc2VcIk11bHRpTGluZVN0cmluZ1wiOnJldHVybiBuPUZ0KGEsXCJMaW5lU3RyaW5nXCI9PT1yLnR5cGU/MDoxLGwpLG5ldyBKZShuLGkpO2Nhc2VcIlBvbHlnb25cIjpjYXNlXCJNdWx0aVBvbHlnb25cIjpyZXR1cm4gbj1GdChhLFwiUG9seWdvblwiPT09ci50eXBlPzE6MixsKSxuZXcgJGUobixpKTtjYXNlXCJHZW9tZXRyeUNvbGxlY3Rpb25cIjpmb3Iobz0wLHM9ci5nZW9tZXRyaWVzLmxlbmd0aDtvPHM7bysrKXt2YXIgYz1XdCh7Z2VvbWV0cnk6ci5nZW9tZXRyaWVzW29dLHR5cGU6XCJGZWF0dXJlXCIscHJvcGVydGllczp0LnByb3BlcnRpZXN9LGkpO2MmJmgucHVzaChjKX1yZXR1cm4gbmV3IEZlKGgpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBHZW9KU09OIG9iamVjdC5cIil9fWZ1bmN0aW9uIEh0KHQpe3JldHVybiBuZXcgTSh0WzFdLHRbMF0sdFsyXSl9ZnVuY3Rpb24gRnQodCxpLGUpe2Zvcih2YXIgbixvPVtdLHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspbj1pP0Z0KHRbc10saS0xLGUpOihlfHxIdCkodFtzXSksby5wdXNoKG4pO3JldHVybiBvfWZ1bmN0aW9uIFV0KHQsaSl7cmV0dXJuIGk9XCJudW1iZXJcIj09dHlwZW9mIGk/aTo2LHZvaWQgMCE9PXQuYWx0P1thKHQubG5nLGkpLGEodC5sYXQsaSksYSh0LmFsdCxpKV06W2EodC5sbmcsaSksYSh0LmxhdCxpKV19ZnVuY3Rpb24gVnQodCxpLGUsbil7Zm9yKHZhciBvPVtdLHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspby5wdXNoKGk/VnQodFtzXSxpLTEsZSxuKTpVdCh0W3NdLG4pKTtyZXR1cm4haSYmZSYmby5wdXNoKG9bMF0pLG99ZnVuY3Rpb24gR3QodCxlKXtyZXR1cm4gdC5mZWF0dXJlP2koe30sdC5mZWF0dXJlLHtnZW9tZXRyeTplfSk6cXQoZSl9ZnVuY3Rpb24gcXQodCl7cmV0dXJuXCJGZWF0dXJlXCI9PT10LnR5cGV8fFwiRmVhdHVyZUNvbGxlY3Rpb25cIj09PXQudHlwZT90Ont0eXBlOlwiRmVhdHVyZVwiLHByb3BlcnRpZXM6e30sZ2VvbWV0cnk6dH19ZnVuY3Rpb24gS3QodCxpKXtyZXR1cm4gbmV3IFFlKHQsaSl9ZnVuY3Rpb24gWXQodCxpKXtyZXR1cm4gbmV3IGxuKHQsaSl9ZnVuY3Rpb24gWHQodCl7cmV0dXJuIEdpP25ldyBkbih0KTpudWxsfWZ1bmN0aW9uIEp0KHQpe3JldHVybiBxaXx8S2k/bmV3IGduKHQpOm51bGx9dmFyICR0PU9iamVjdC5mcmVlemU7T2JqZWN0LmZyZWV6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIFF0PU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIHQucHJvdG90eXBlPWksbmV3IHR9fSgpLHRpPTAsaWk9L1xceyAqKFtcXHdfXFwtXSspICpcXH0vZyxlaT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm5cIltvYmplY3QgQXJyYXldXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9LG5pPVwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzPVwiLG9pPTAsc2k9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8cChcIlJlcXVlc3RBbmltYXRpb25GcmFtZVwiKXx8bSxyaT13aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHAoXCJDYW5jZWxBbmltYXRpb25GcmFtZVwiKXx8cChcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiKXx8ZnVuY3Rpb24odCl7d2luZG93LmNsZWFyVGltZW91dCh0KX0sYWk9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe2ZyZWV6ZTokdCxleHRlbmQ6aSxjcmVhdGU6UXQsYmluZDplLGxhc3RJZDp0aSxzdGFtcDpuLHRocm90dGxlOm8sd3JhcE51bTpzLGZhbHNlRm46cixmb3JtYXROdW06YSx0cmltOmgsc3BsaXRXb3Jkczp1LHNldE9wdGlvbnM6bCxnZXRQYXJhbVN0cmluZzpjLHRlbXBsYXRlOl8saXNBcnJheTplaSxpbmRleE9mOmQsZW1wdHlJbWFnZVVybDpuaSxyZXF1ZXN0Rm46c2ksY2FuY2VsRm46cmkscmVxdWVzdEFuaW1GcmFtZTpmLGNhbmNlbEFuaW1GcmFtZTpnfSk7di5leHRlbmQ9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxpemUmJnRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5jYWxsSW5pdEhvb2tzKCl9LG49ZS5fX3N1cGVyX189dGhpcy5wcm90b3R5cGUsbz1RdChuKTtvLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGU9bztmb3IodmFyIHMgaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KHMpJiZcInByb3RvdHlwZVwiIT09cyYmXCJfX3N1cGVyX19cIiE9PXMmJihlW3NdPXRoaXNbc10pO3JldHVybiB0LnN0YXRpY3MmJihpKGUsdC5zdGF0aWNzKSxkZWxldGUgdC5zdGF0aWNzKSx0LmluY2x1ZGVzJiYoeSh0LmluY2x1ZGVzKSxpLmFwcGx5KG51bGwsW29dLmNvbmNhdCh0LmluY2x1ZGVzKSksZGVsZXRlIHQuaW5jbHVkZXMpLG8ub3B0aW9ucyYmKHQub3B0aW9ucz1pKFF0KG8ub3B0aW9ucyksdC5vcHRpb25zKSksaShvLHQpLG8uX2luaXRIb29rcz1bXSxvLmNhbGxJbml0SG9va3M9ZnVuY3Rpb24oKXtpZighdGhpcy5faW5pdEhvb2tzQ2FsbGVkKXtuLmNhbGxJbml0SG9va3MmJm4uY2FsbEluaXRIb29rcy5jYWxsKHRoaXMpLHRoaXMuX2luaXRIb29rc0NhbGxlZD0hMDtmb3IodmFyIHQ9MCxpPW8uX2luaXRIb29rcy5sZW5ndGg7dDxpO3QrKylvLl9pbml0SG9va3NbdF0uY2FsbCh0aGlzKX19LGV9LHYuaW5jbHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLnByb3RvdHlwZSx0KSx0aGlzfSx2Lm1lcmdlT3B0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLnByb3RvdHlwZS5vcHRpb25zLHQpLHRoaXN9LHYuYWRkSW5pdEhvb2s9ZnVuY3Rpb24odCl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGU9XCJmdW5jdGlvblwiPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7dGhpc1t0XS5hcHBseSh0aGlzLGkpfTtyZXR1cm4gdGhpcy5wcm90b3R5cGUuX2luaXRIb29rcz10aGlzLnByb3RvdHlwZS5faW5pdEhvb2tzfHxbXSx0aGlzLnByb3RvdHlwZS5faW5pdEhvb2tzLnB1c2goZSksdGhpc307dmFyIGhpPXtvbjpmdW5jdGlvbih0LGksZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpZm9yKHZhciBuIGluIHQpdGhpcy5fb24obix0W25dLGkpO2Vsc2UgZm9yKHZhciBvPTAscz0odD11KHQpKS5sZW5ndGg7bzxzO28rKyl0aGlzLl9vbih0W29dLGksZSk7cmV0dXJuIHRoaXN9LG9mZjpmdW5jdGlvbih0LGksZSl7aWYodClpZihcIm9iamVjdFwiPT10eXBlb2YgdClmb3IodmFyIG4gaW4gdCl0aGlzLl9vZmYobix0W25dLGkpO2Vsc2UgZm9yKHZhciBvPTAscz0odD11KHQpKS5sZW5ndGg7bzxzO28rKyl0aGlzLl9vZmYodFtvXSxpLGUpO2Vsc2UgZGVsZXRlIHRoaXMuX2V2ZW50cztyZXR1cm4gdGhpc30sX29uOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fTt2YXIgbj10aGlzLl9ldmVudHNbdF07bnx8KG49W10sdGhpcy5fZXZlbnRzW3RdPW4pLGU9PT10aGlzJiYoZT12b2lkIDApO2Zvcih2YXIgbz17Zm46aSxjdHg6ZX0scz1uLHI9MCxhPXMubGVuZ3RoO3I8YTtyKyspaWYoc1tyXS5mbj09PWkmJnNbcl0uY3R4PT09ZSlyZXR1cm47cy5wdXNoKG8pfSxfb2ZmOmZ1bmN0aW9uKHQsaSxlKXt2YXIgbixvLHM7aWYodGhpcy5fZXZlbnRzJiYobj10aGlzLl9ldmVudHNbdF0pKWlmKGkpe2lmKGU9PT10aGlzJiYoZT12b2lkIDApLG4pZm9yKG89MCxzPW4ubGVuZ3RoO288cztvKyspe3ZhciBhPW5bb107aWYoYS5jdHg9PT1lJiZhLmZuPT09aSlyZXR1cm4gYS5mbj1yLHRoaXMuX2ZpcmluZ0NvdW50JiYodGhpcy5fZXZlbnRzW3RdPW49bi5zbGljZSgpKSx2b2lkIG4uc3BsaWNlKG8sMSl9fWVsc2V7Zm9yKG89MCxzPW4ubGVuZ3RoO288cztvKyspbltvXS5mbj1yO2RlbGV0ZSB0aGlzLl9ldmVudHNbdF19fSxmaXJlOmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5saXN0ZW5zKHQsbikpcmV0dXJuIHRoaXM7dmFyIG89aSh7fSxlLHt0eXBlOnQsdGFyZ2V0OnRoaXN9KTtpZih0aGlzLl9ldmVudHMpe3ZhciBzPXRoaXMuX2V2ZW50c1t0XTtpZihzKXt0aGlzLl9maXJpbmdDb3VudD10aGlzLl9maXJpbmdDb3VudCsxfHwxO2Zvcih2YXIgcj0wLGE9cy5sZW5ndGg7cjxhO3IrKyl7dmFyIGg9c1tyXTtoLmZuLmNhbGwoaC5jdHh8fHRoaXMsbyl9dGhpcy5fZmlyaW5nQ291bnQtLX19cmV0dXJuIG4mJnRoaXMuX3Byb3BhZ2F0ZUV2ZW50KG8pLHRoaXN9LGxpc3RlbnM6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50c1t0XTtpZihlJiZlLmxlbmd0aClyZXR1cm4hMDtpZihpKWZvcih2YXIgbiBpbiB0aGlzLl9ldmVudFBhcmVudHMpaWYodGhpcy5fZXZlbnRQYXJlbnRzW25dLmxpc3RlbnModCxpKSlyZXR1cm4hMDtyZXR1cm4hMX0sb25jZTpmdW5jdGlvbih0LGksbil7aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpe2Zvcih2YXIgbyBpbiB0KXRoaXMub25jZShvLHRbb10saSk7cmV0dXJuIHRoaXN9dmFyIHM9ZShmdW5jdGlvbigpe3RoaXMub2ZmKHQsaSxuKS5vZmYodCxzLG4pfSx0aGlzKTtyZXR1cm4gdGhpcy5vbih0LGksbikub24odCxzLG4pfSxhZGRFdmVudFBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRQYXJlbnRzPXRoaXMuX2V2ZW50UGFyZW50c3x8e30sdGhpcy5fZXZlbnRQYXJlbnRzW24odCldPXQsdGhpc30scmVtb3ZlRXZlbnRQYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50UGFyZW50cyYmZGVsZXRlIHRoaXMuX2V2ZW50UGFyZW50c1tuKHQpXSx0aGlzfSxfcHJvcGFnYXRlRXZlbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuX2V2ZW50UGFyZW50cyl0aGlzLl9ldmVudFBhcmVudHNbZV0uZmlyZSh0LnR5cGUsaSh7bGF5ZXI6dC50YXJnZXR9LHQpLCEwKX19O2hpLmFkZEV2ZW50TGlzdGVuZXI9aGkub24saGkucmVtb3ZlRXZlbnRMaXN0ZW5lcj1oaS5jbGVhckFsbEV2ZW50TGlzdGVuZXJzPWhpLm9mZixoaS5hZGRPbmVUaW1lRXZlbnRMaXN0ZW5lcj1oaS5vbmNlLGhpLmZpcmVFdmVudD1oaS5maXJlLGhpLmhhc0V2ZW50TGlzdGVuZXJzPWhpLmxpc3RlbnM7dmFyIHVpPXYuZXh0ZW5kKGhpKTt4LnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHgodGhpcy54LHRoaXMueSl9LGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQodyh0KSl9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LHN1YnRyYWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1YnRyYWN0KHcodCkpfSxfc3VidHJhY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LGRpdmlkZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2RpdmlkZUJ5KHQpfSxfZGl2aWRlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0aXBseUJ5KHQpfSxfbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfSxzY2FsZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeCh0aGlzLngqdC54LHRoaXMueSp0LnkpfSx1bnNjYWxlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KHRoaXMueC90LngsdGhpcy55L3QueSl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfSxmbG9vcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX2Zsb29yKCl9LF9mbG9vcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc30sY2VpbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX2NlaWwoKX0sX2NlaWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHQpe3ZhciBpPSh0PXcodCkpLngtdGhpcy54LGU9dC55LXRoaXMueTtyZXR1cm4gTWF0aC5zcXJ0KGkqaStlKmUpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9dyh0KSkueD09PXRoaXMueCYmdC55PT09dGhpcy55fSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdD13KHQpLE1hdGguYWJzKHQueCk8PU1hdGguYWJzKHRoaXMueCkmJk1hdGguYWJzKHQueSk8PU1hdGguYWJzKHRoaXMueSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuXCJQb2ludChcIithKHRoaXMueCkrXCIsIFwiK2EodGhpcy55KStcIilcIn19LFAucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dyh0KSx0aGlzLm1pbnx8dGhpcy5tYXg/KHRoaXMubWluLng9TWF0aC5taW4odC54LHRoaXMubWluLngpLHRoaXMubWF4Lng9TWF0aC5tYXgodC54LHRoaXMubWF4LngpLHRoaXMubWluLnk9TWF0aC5taW4odC55LHRoaXMubWluLnkpLHRoaXMubWF4Lnk9TWF0aC5tYXgodC55LHRoaXMubWF4LnkpKToodGhpcy5taW49dC5jbG9uZSgpLHRoaXMubWF4PXQuY2xvbmUoKSksdGhpc30sZ2V0Q2VudGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeCgodGhpcy5taW4ueCt0aGlzLm1heC54KS8yLCh0aGlzLm1pbi55K3RoaXMubWF4LnkpLzIsdCl9LGdldEJvdHRvbUxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHgodGhpcy5taW4ueCx0aGlzLm1heC55KX0sZ2V0VG9wUmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHgodGhpcy5tYXgueCx0aGlzLm1pbi55KX0sZ2V0VG9wTGVmdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1pbn0sZ2V0Qm90dG9tUmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXh9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXguc3VidHJhY3QodGhpcy5taW4pfSxjb250YWluczpmdW5jdGlvbih0KXt2YXIgaSxlO3JldHVybih0PVwibnVtYmVyXCI9PXR5cGVvZiB0WzBdfHx0IGluc3RhbmNlb2YgeD93KHQpOmIodCkpaW5zdGFuY2VvZiBQPyhpPXQubWluLGU9dC5tYXgpOmk9ZT10LGkueD49dGhpcy5taW4ueCYmZS54PD10aGlzLm1heC54JiZpLnk+PXRoaXMubWluLnkmJmUueTw9dGhpcy5tYXgueX0saW50ZXJzZWN0czpmdW5jdGlvbih0KXt0PWIodCk7dmFyIGk9dGhpcy5taW4sZT10aGlzLm1heCxuPXQubWluLG89dC5tYXgscz1vLng+PWkueCYmbi54PD1lLngscj1vLnk+PWkueSYmbi55PD1lLnk7cmV0dXJuIHMmJnJ9LG92ZXJsYXBzOmZ1bmN0aW9uKHQpe3Q9Yih0KTt2YXIgaT10aGlzLm1pbixlPXRoaXMubWF4LG49dC5taW4sbz10Lm1heCxzPW8ueD5pLngmJm4ueDxlLngscj1vLnk+aS55JiZuLnk8ZS55O3JldHVybiBzJiZyfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5taW58fCF0aGlzLm1heCl9fSxULnByb3RvdHlwZT17ZXh0ZW5kOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbj10aGlzLl9zb3V0aFdlc3Qsbz10aGlzLl9ub3J0aEVhc3Q7aWYodCBpbnN0YW5jZW9mIE0paT10LGU9dDtlbHNle2lmKCEodCBpbnN0YW5jZW9mIFQpKXJldHVybiB0P3RoaXMuZXh0ZW5kKEModCl8fHoodCkpOnRoaXM7aWYoaT10Ll9zb3V0aFdlc3QsZT10Ll9ub3J0aEVhc3QsIWl8fCFlKXJldHVybiB0aGlzfXJldHVybiBufHxvPyhuLmxhdD1NYXRoLm1pbihpLmxhdCxuLmxhdCksbi5sbmc9TWF0aC5taW4oaS5sbmcsbi5sbmcpLG8ubGF0PU1hdGgubWF4KGUubGF0LG8ubGF0KSxvLmxuZz1NYXRoLm1heChlLmxuZyxvLmxuZykpOih0aGlzLl9zb3V0aFdlc3Q9bmV3IE0oaS5sYXQsaS5sbmcpLHRoaXMuX25vcnRoRWFzdD1uZXcgTShlLmxhdCxlLmxuZykpLHRoaXN9LHBhZDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9zb3V0aFdlc3QsZT10aGlzLl9ub3J0aEVhc3Qsbj1NYXRoLmFicyhpLmxhdC1lLmxhdCkqdCxvPU1hdGguYWJzKGkubG5nLWUubG5nKSp0O3JldHVybiBuZXcgVChuZXcgTShpLmxhdC1uLGkubG5nLW8pLG5ldyBNKGUubGF0K24sZS5sbmcrbykpfSxnZXRDZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0oKHRoaXMuX3NvdXRoV2VzdC5sYXQrdGhpcy5fbm9ydGhFYXN0LmxhdCkvMiwodGhpcy5fc291dGhXZXN0LmxuZyt0aGlzLl9ub3J0aEVhc3QubG5nKS8yKX0sZ2V0U291dGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdH0sZ2V0Tm9ydGhFYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vcnRoRWFzdH0sZ2V0Tm9ydGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNKHRoaXMuZ2V0Tm9ydGgoKSx0aGlzLmdldFdlc3QoKSl9LGdldFNvdXRoRWFzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTSh0aGlzLmdldFNvdXRoKCksdGhpcy5nZXRFYXN0KCkpfSxnZXRXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sbmd9LGdldFNvdXRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sYXR9LGdldEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxuZ30sZ2V0Tm9ydGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxhdH0sY29udGFpbnM6ZnVuY3Rpb24odCl7dD1cIm51bWJlclwiPT10eXBlb2YgdFswXXx8dCBpbnN0YW5jZW9mIE18fFwibGF0XCJpbiB0P0ModCk6eih0KTt2YXIgaSxlLG49dGhpcy5fc291dGhXZXN0LG89dGhpcy5fbm9ydGhFYXN0O3JldHVybiB0IGluc3RhbmNlb2YgVD8oaT10LmdldFNvdXRoV2VzdCgpLGU9dC5nZXROb3J0aEVhc3QoKSk6aT1lPXQsaS5sYXQ+PW4ubGF0JiZlLmxhdDw9by5sYXQmJmkubG5nPj1uLmxuZyYmZS5sbmc8PW8ubG5nfSxpbnRlcnNlY3RzOmZ1bmN0aW9uKHQpe3Q9eih0KTt2YXIgaT10aGlzLl9zb3V0aFdlc3QsZT10aGlzLl9ub3J0aEVhc3Qsbj10LmdldFNvdXRoV2VzdCgpLG89dC5nZXROb3J0aEVhc3QoKSxzPW8ubGF0Pj1pLmxhdCYmbi5sYXQ8PWUubGF0LHI9by5sbmc+PWkubG5nJiZuLmxuZzw9ZS5sbmc7cmV0dXJuIHMmJnJ9LG92ZXJsYXBzOmZ1bmN0aW9uKHQpe3Q9eih0KTt2YXIgaT10aGlzLl9zb3V0aFdlc3QsZT10aGlzLl9ub3J0aEVhc3Qsbj10LmdldFNvdXRoV2VzdCgpLG89dC5nZXROb3J0aEVhc3QoKSxzPW8ubGF0PmkubGF0JiZuLmxhdDxlLmxhdCxyPW8ubG5nPmkubG5nJiZuLmxuZzxlLmxuZztyZXR1cm4gcyYmcn0sdG9CQm94U3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZ2V0V2VzdCgpLHRoaXMuZ2V0U291dGgoKSx0aGlzLmdldEVhc3QoKSx0aGlzLmdldE5vcnRoKCldLmpvaW4oXCIsXCIpfSxlcXVhbHM6ZnVuY3Rpb24odCxpKXtyZXR1cm4hIXQmJih0PXoodCksdGhpcy5fc291dGhXZXN0LmVxdWFscyh0LmdldFNvdXRoV2VzdCgpLGkpJiZ0aGlzLl9ub3J0aEVhc3QuZXF1YWxzKHQuZ2V0Tm9ydGhFYXN0KCksaSkpfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5fc291dGhXZXN0fHwhdGhpcy5fbm9ydGhFYXN0KX19LE0ucHJvdG90eXBlPXtlcXVhbHM6ZnVuY3Rpb24odCxpKXtyZXR1cm4hIXQmJih0PUModCksTWF0aC5tYXgoTWF0aC5hYnModGhpcy5sYXQtdC5sYXQpLE1hdGguYWJzKHRoaXMubG5nLXQubG5nKSk8PSh2b2lkIDA9PT1pPzFlLTk6aSkpfSx0b1N0cmluZzpmdW5jdGlvbih0KXtyZXR1cm5cIkxhdExuZyhcIithKHRoaXMubGF0LHQpK1wiLCBcIithKHRoaXMubG5nLHQpK1wiKVwifSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHQpe3JldHVybiBjaS5kaXN0YW5jZSh0aGlzLEModCkpfSx3cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIGNpLndyYXBMYXRMbmcodGhpcyl9LHRvQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBpPTE4MCp0LzQwMDc1MDE3LGU9aS9NYXRoLmNvcyhNYXRoLlBJLzE4MCp0aGlzLmxhdCk7cmV0dXJuIHooW3RoaXMubGF0LWksdGhpcy5sbmctZV0sW3RoaXMubGF0K2ksdGhpcy5sbmcrZV0pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgTSh0aGlzLmxhdCx0aGlzLmxuZyx0aGlzLmFsdCl9fTt2YXIgbGk9e2xhdExuZ1RvUG9pbnQ6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLnByb2plY3Rpb24ucHJvamVjdCh0KSxuPXRoaXMuc2NhbGUoaSk7cmV0dXJuIHRoaXMudHJhbnNmb3JtYXRpb24uX3RyYW5zZm9ybShlLG4pfSxwb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5zY2FsZShpKSxuPXRoaXMudHJhbnNmb3JtYXRpb24udW50cmFuc2Zvcm0odCxlKTtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdChuKX0scHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnByb2plY3QodCl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdCh0KX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDI1NipNYXRoLnBvdygyLHQpfSx6b29tOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0LzI1NikvTWF0aC5MTjJ9LGdldFByb2plY3RlZEJvdW5kczpmdW5jdGlvbih0KXtpZih0aGlzLmluZmluaXRlKXJldHVybiBudWxsO3ZhciBpPXRoaXMucHJvamVjdGlvbi5ib3VuZHMsZT10aGlzLnNjYWxlKHQpO3JldHVybiBuZXcgUCh0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShpLm1pbixlKSx0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShpLm1heCxlKSl9LGluZmluaXRlOiExLHdyYXBMYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy53cmFwTG5nP3ModC5sbmcsdGhpcy53cmFwTG5nLCEwKTp0LmxuZztyZXR1cm4gbmV3IE0odGhpcy53cmFwTGF0P3ModC5sYXQsdGhpcy53cmFwTGF0LCEwKTp0LmxhdCxpLHQuYWx0KX0sd3JhcExhdExuZ0JvdW5kczpmdW5jdGlvbih0KXt2YXIgaT10LmdldENlbnRlcigpLGU9dGhpcy53cmFwTGF0TG5nKGkpLG49aS5sYXQtZS5sYXQsbz1pLmxuZy1lLmxuZztpZigwPT09biYmMD09PW8pcmV0dXJuIHQ7dmFyIHM9dC5nZXRTb3V0aFdlc3QoKSxyPXQuZ2V0Tm9ydGhFYXN0KCk7cmV0dXJuIG5ldyBUKG5ldyBNKHMubGF0LW4scy5sbmctbyksbmV3IE0oci5sYXQtbixyLmxuZy1vKSl9fSxjaT1pKHt9LGxpLHt3cmFwTG5nOlstMTgwLDE4MF0sUjo2MzcxZTMsZGlzdGFuY2U6ZnVuY3Rpb24odCxpKXt2YXIgZT1NYXRoLlBJLzE4MCxuPXQubGF0KmUsbz1pLmxhdCplLHM9TWF0aC5zaW4obikqTWF0aC5zaW4obykrTWF0aC5jb3MobikqTWF0aC5jb3MobykqTWF0aC5jb3MoKGkubG5nLXQubG5nKSplKTtyZXR1cm4gdGhpcy5SKk1hdGguYWNvcyhNYXRoLm1pbihzLDEpKX19KSxfaT17Ujo2Mzc4MTM3LE1BWF9MQVRJVFVERTo4NS4wNTExMjg3Nzk4LHByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5QSS8xODAsZT10aGlzLk1BWF9MQVRJVFVERSxuPU1hdGgubWF4KE1hdGgubWluKGUsdC5sYXQpLC1lKSxvPU1hdGguc2luKG4qaSk7cmV0dXJuIG5ldyB4KHRoaXMuUip0LmxuZyppLHRoaXMuUipNYXRoLmxvZygoMStvKS8oMS1vKSkvMil9LHVucHJvamVjdDpmdW5jdGlvbih0KXt2YXIgaT0xODAvTWF0aC5QSTtyZXR1cm4gbmV3IE0oKDIqTWF0aC5hdGFuKE1hdGguZXhwKHQueS90aGlzLlIpKS1NYXRoLlBJLzIpKmksdC54KmkvdGhpcy5SKX0sYm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9NjM3ODEzNypNYXRoLlBJO3JldHVybiBuZXcgUChbLXQsLXRdLFt0LHRdKX0oKX07Wi5wcm90b3R5cGU9e3RyYW5zZm9ybTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLl90cmFuc2Zvcm0odC5jbG9uZSgpLGkpfSxfdHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8MSx0Lng9aSoodGhpcy5fYSp0LngrdGhpcy5fYiksdC55PWkqKHRoaXMuX2MqdC55K3RoaXMuX2QpLHR9LHVudHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8MSxuZXcgeCgodC54L2ktdGhpcy5fYikvdGhpcy5fYSwodC55L2ktdGhpcy5fZCkvdGhpcy5fYyl9fTt2YXIgZGkscGksbWksZmksZ2k9aSh7fSxjaSx7Y29kZTpcIkVQU0c6Mzg1N1wiLHByb2plY3Rpb246X2ksdHJhbnNmb3JtYXRpb246ZnVuY3Rpb24oKXt2YXIgdD0uNS8oTWF0aC5QSSpfaS5SKTtyZXR1cm4gRSh0LC41LC10LC41KX0oKX0pLHZpPWkoe30sZ2kse2NvZGU6XCJFUFNHOjkwMDkxM1wifSkseWk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLHhpPVwiQWN0aXZlWE9iamVjdFwiaW4gd2luZG93LHdpPXhpJiYhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcixMaT1cIm1zTGF1bmNoVXJpXCJpbiBuYXZpZ2F0b3ImJiEoXCJkb2N1bWVudE1vZGVcImluIGRvY3VtZW50KSxQaT1CKFwid2Via2l0XCIpLGJpPUIoXCJhbmRyb2lkXCIpLFRpPUIoXCJhbmRyb2lkIDJcIil8fEIoXCJhbmRyb2lkIDNcIiksemk9ISF3aW5kb3cub3BlcmEsTWk9QihcImNocm9tZVwiKSxDaT1CKFwiZ2Vja29cIikmJiFQaSYmIXppJiYheGksWmk9IU1pJiZCKFwic2FmYXJpXCIpLEVpPUIoXCJwaGFudG9tXCIpLFNpPVwiT1RyYW5zaXRpb25cImluIHlpLGtpPTA9PT1uYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZihcIldpblwiKSxCaT14aSYmXCJ0cmFuc2l0aW9uXCJpbiB5aSxJaT1cIldlYktpdENTU01hdHJpeFwiaW4gd2luZG93JiZcIm0xMVwiaW4gbmV3IHdpbmRvdy5XZWJLaXRDU1NNYXRyaXgmJiFUaSxBaT1cIk1velBlcnNwZWN0aXZlXCJpbiB5aSxPaT0hd2luZG93LkxfRElTQUJMRV8zRCYmKEJpfHxJaXx8QWkpJiYhU2kmJiFFaSxSaT1cInVuZGVmaW5lZFwiIT10eXBlb2Ygb3JpZW50YXRpb258fEIoXCJtb2JpbGVcIiksRGk9UmkmJlBpLE5pPVJpJiZJaSxqaT0hd2luZG93LlBvaW50ZXJFdmVudCYmd2luZG93Lk1TUG9pbnRlckV2ZW50LFdpPSEoIXdpbmRvdy5Qb2ludGVyRXZlbnQmJiFqaSksSGk9IXdpbmRvdy5MX05PX1RPVUNIJiYoV2l8fFwib250b3VjaHN0YXJ0XCJpbiB3aW5kb3d8fHdpbmRvdy5Eb2N1bWVudFRvdWNoJiZkb2N1bWVudCBpbnN0YW5jZW9mIHdpbmRvdy5Eb2N1bWVudFRvdWNoKSxGaT1SaSYmemksVWk9UmkmJkNpLFZpPSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8d2luZG93LnNjcmVlbi5kZXZpY2VYRFBJL3dpbmRvdy5zY3JlZW4ubG9naWNhbFhEUEkpPjEsR2k9ISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQscWk9ISghZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TfHwhUyhcInN2Z1wiKS5jcmVhdGVTVkdSZWN0KSxLaT0hcWkmJmZ1bmN0aW9uKCl7dHJ5e3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5pbm5lckhUTUw9Jzx2OnNoYXBlIGFkaj1cIjFcIi8+Jzt2YXIgaT10LmZpcnN0Q2hpbGQ7cmV0dXJuIGkuc3R5bGUuYmVoYXZpb3I9XCJ1cmwoI2RlZmF1bHQjVk1MKVwiLGkmJlwib2JqZWN0XCI9PXR5cGVvZiBpLmFkan1jYXRjaCh0KXtyZXR1cm4hMX19KCksWWk9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe2llOnhpLGllbHQ5OndpLGVkZ2U6TGksd2Via2l0OlBpLGFuZHJvaWQ6YmksYW5kcm9pZDIzOlRpLG9wZXJhOnppLGNocm9tZTpNaSxnZWNrbzpDaSxzYWZhcmk6WmkscGhhbnRvbTpFaSxvcGVyYTEyOlNpLHdpbjpraSxpZTNkOkJpLHdlYmtpdDNkOklpLGdlY2tvM2Q6QWksYW55M2Q6T2ksbW9iaWxlOlJpLG1vYmlsZVdlYmtpdDpEaSxtb2JpbGVXZWJraXQzZDpOaSxtc1BvaW50ZXI6amkscG9pbnRlcjpXaSx0b3VjaDpIaSxtb2JpbGVPcGVyYTpGaSxtb2JpbGVHZWNrbzpVaSxyZXRpbmE6VmksY2FudmFzOkdpLHN2ZzpxaSx2bWw6S2l9KSxYaT1qaT9cIk1TUG9pbnRlckRvd25cIjpcInBvaW50ZXJkb3duXCIsSmk9amk/XCJNU1BvaW50ZXJNb3ZlXCI6XCJwb2ludGVybW92ZVwiLCRpPWppP1wiTVNQb2ludGVyVXBcIjpcInBvaW50ZXJ1cFwiLFFpPWppP1wiTVNQb2ludGVyQ2FuY2VsXCI6XCJwb2ludGVyY2FuY2VsXCIsdGU9W1wiSU5QVVRcIixcIlNFTEVDVFwiLFwiT1BUSU9OXCJdLGllPXt9LGVlPSExLG5lPTAsb2U9amk/XCJNU1BvaW50ZXJEb3duXCI6V2k/XCJwb2ludGVyZG93blwiOlwidG91Y2hzdGFydFwiLHNlPWppP1wiTVNQb2ludGVyVXBcIjpXaT9cInBvaW50ZXJ1cFwiOlwidG91Y2hlbmRcIixyZT1cIl9sZWFmbGV0X1wiLGFlPVwiX2xlYWZsZXRfZXZlbnRzXCIsaGU9a2kmJk1pPzIqd2luZG93LmRldmljZVBpeGVsUmF0aW86Q2k/d2luZG93LmRldmljZVBpeGVsUmF0aW86MSx1ZT17fSxsZT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7b246VixvZmY6RyxzdG9wUHJvcGFnYXRpb246WSxkaXNhYmxlU2Nyb2xsUHJvcGFnYXRpb246WCxkaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbjpKLHByZXZlbnREZWZhdWx0OiQsc3RvcDpRLGdldE1vdXNlUG9zaXRpb246dHQsZ2V0V2hlZWxEZWx0YTppdCxmYWtlU3RvcDpldCxza2lwcGVkOm50LGlzRXh0ZXJuYWxUYXJnZXQ6b3QsYWRkTGlzdGVuZXI6VixyZW1vdmVMaXN0ZW5lcjpHfSksY2U9eHQoW1widHJhbnNmb3JtXCIsXCJXZWJraXRUcmFuc2Zvcm1cIixcIk9UcmFuc2Zvcm1cIixcIk1velRyYW5zZm9ybVwiLFwibXNUcmFuc2Zvcm1cIl0pLF9lPXh0KFtcIndlYmtpdFRyYW5zaXRpb25cIixcInRyYW5zaXRpb25cIixcIk9UcmFuc2l0aW9uXCIsXCJNb3pUcmFuc2l0aW9uXCIsXCJtc1RyYW5zaXRpb25cIl0pLGRlPVwid2Via2l0VHJhbnNpdGlvblwiPT09X2V8fFwiT1RyYW5zaXRpb25cIj09PV9lP19lK1wiRW5kXCI6XCJ0cmFuc2l0aW9uZW5kXCI7aWYoXCJvbnNlbGVjdHN0YXJ0XCJpbiBkb2N1bWVudClwaT1mdW5jdGlvbigpe1Yod2luZG93LFwic2VsZWN0c3RhcnRcIiwkKX0sbWk9ZnVuY3Rpb24oKXtHKHdpbmRvdyxcInNlbGVjdHN0YXJ0XCIsJCl9O2Vsc2V7dmFyIHBlPXh0KFtcInVzZXJTZWxlY3RcIixcIldlYmtpdFVzZXJTZWxlY3RcIixcIk9Vc2VyU2VsZWN0XCIsXCJNb3pVc2VyU2VsZWN0XCIsXCJtc1VzZXJTZWxlY3RcIl0pO3BpPWZ1bmN0aW9uKCl7aWYocGUpe3ZhciB0PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtmaT10W3BlXSx0W3BlXT1cIm5vbmVcIn19LG1pPWZ1bmN0aW9uKCl7cGUmJihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGVbcGVdPWZpLGZpPXZvaWQgMCl9fXZhciBtZSxmZSxnZT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7VFJBTlNGT1JNOmNlLFRSQU5TSVRJT046X2UsVFJBTlNJVElPTl9FTkQ6ZGUsZ2V0OnJ0LGdldFN0eWxlOmF0LGNyZWF0ZTpodCxyZW1vdmU6dXQsZW1wdHk6bHQsdG9Gcm9udDpjdCx0b0JhY2s6X3QsaGFzQ2xhc3M6ZHQsYWRkQ2xhc3M6cHQscmVtb3ZlQ2xhc3M6bXQsc2V0Q2xhc3M6ZnQsZ2V0Q2xhc3M6Z3Qsc2V0T3BhY2l0eTp2dCx0ZXN0UHJvcDp4dCxzZXRUcmFuc2Zvcm06d3Qsc2V0UG9zaXRpb246THQsZ2V0UG9zaXRpb246UHQsZGlzYWJsZVRleHRTZWxlY3Rpb246cGksZW5hYmxlVGV4dFNlbGVjdGlvbjptaSxkaXNhYmxlSW1hZ2VEcmFnOmJ0LGVuYWJsZUltYWdlRHJhZzpUdCxwcmV2ZW50T3V0bGluZTp6dCxyZXN0b3JlT3V0bGluZTpNdH0pLHZlPXVpLmV4dGVuZCh7cnVuOmZ1bmN0aW9uKHQsaSxlLG4pe3RoaXMuc3RvcCgpLHRoaXMuX2VsPXQsdGhpcy5faW5Qcm9ncmVzcz0hMCx0aGlzLl9kdXJhdGlvbj1lfHwuMjUsdGhpcy5fZWFzZU91dFBvd2VyPTEvTWF0aC5tYXgobnx8LjUsLjIpLHRoaXMuX3N0YXJ0UG9zPVB0KHQpLHRoaXMuX29mZnNldD1pLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9zKSx0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlLHRoaXMuZmlyZShcInN0YXJ0XCIpLHRoaXMuX2FuaW1hdGUoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2luUHJvZ3Jlc3MmJih0aGlzLl9zdGVwKCEwKSx0aGlzLl9jb21wbGV0ZSgpKX0sX2FuaW1hdGU6ZnVuY3Rpb24oKXt0aGlzLl9hbmltSWQ9Zih0aGlzLl9hbmltYXRlLHRoaXMpLHRoaXMuX3N0ZXAoKX0sX3N0ZXA6ZnVuY3Rpb24odCl7dmFyIGk9K25ldyBEYXRlLXRoaXMuX3N0YXJ0VGltZSxlPTFlMyp0aGlzLl9kdXJhdGlvbjtpPGU/dGhpcy5fcnVuRnJhbWUodGhpcy5fZWFzZU91dChpL2UpLHQpOih0aGlzLl9ydW5GcmFtZSgxKSx0aGlzLl9jb21wbGV0ZSgpKX0sX3J1bkZyYW1lOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5fc3RhcnRQb3MuYWRkKHRoaXMuX29mZnNldC5tdWx0aXBseUJ5KHQpKTtpJiZlLl9yb3VuZCgpLEx0KHRoaXMuX2VsLGUpLHRoaXMuZmlyZShcInN0ZXBcIil9LF9jb21wbGV0ZTpmdW5jdGlvbigpe2codGhpcy5fYW5pbUlkKSx0aGlzLl9pblByb2dyZXNzPSExLHRoaXMuZmlyZShcImVuZFwiKX0sX2Vhc2VPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LHRoaXMuX2Vhc2VPdXRQb3dlcil9fSkseWU9dWkuZXh0ZW5kKHtvcHRpb25zOntjcnM6Z2ksY2VudGVyOnZvaWQgMCx6b29tOnZvaWQgMCxtaW5ab29tOnZvaWQgMCxtYXhab29tOnZvaWQgMCxsYXllcnM6W10sbWF4Qm91bmRzOnZvaWQgMCxyZW5kZXJlcjp2b2lkIDAsem9vbUFuaW1hdGlvbjohMCx6b29tQW5pbWF0aW9uVGhyZXNob2xkOjQsZmFkZUFuaW1hdGlvbjohMCxtYXJrZXJab29tQW5pbWF0aW9uOiEwLHRyYW5zZm9ybTNETGltaXQ6ODM4ODYwOCx6b29tU25hcDoxLHpvb21EZWx0YToxLHRyYWNrUmVzaXplOiEwfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7aT1sKHRoaXMsaSksdGhpcy5faW5pdENvbnRhaW5lcih0KSx0aGlzLl9pbml0TGF5b3V0KCksdGhpcy5fb25SZXNpemU9ZSh0aGlzLl9vblJlc2l6ZSx0aGlzKSx0aGlzLl9pbml0RXZlbnRzKCksaS5tYXhCb3VuZHMmJnRoaXMuc2V0TWF4Qm91bmRzKGkubWF4Qm91bmRzKSx2b2lkIDAhPT1pLnpvb20mJih0aGlzLl96b29tPXRoaXMuX2xpbWl0Wm9vbShpLnpvb20pKSxpLmNlbnRlciYmdm9pZCAwIT09aS56b29tJiZ0aGlzLnNldFZpZXcoQyhpLmNlbnRlciksaS56b29tLHtyZXNldDohMH0pLHRoaXMuX2hhbmRsZXJzPVtdLHRoaXMuX2xheWVycz17fSx0aGlzLl96b29tQm91bmRMYXllcnM9e30sdGhpcy5fc2l6ZUNoYW5nZWQ9ITAsdGhpcy5jYWxsSW5pdEhvb2tzKCksdGhpcy5fem9vbUFuaW1hdGVkPV9lJiZPaSYmIUZpJiZ0aGlzLm9wdGlvbnMuem9vbUFuaW1hdGlvbix0aGlzLl96b29tQW5pbWF0ZWQmJih0aGlzLl9jcmVhdGVBbmltUHJveHkoKSxWKHRoaXMuX3Byb3h5LGRlLHRoaXMuX2NhdGNoVHJhbnNpdGlvbkVuZCx0aGlzKSksdGhpcy5fYWRkTGF5ZXJzKHRoaXMub3B0aW9ucy5sYXllcnMpfSxzZXRWaWV3OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZT12b2lkIDA9PT1lP3RoaXMuX3pvb206dGhpcy5fbGltaXRab29tKGUpLHQ9dGhpcy5fbGltaXRDZW50ZXIoQyh0KSxlLHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpLG49bnx8e30sdGhpcy5fc3RvcCgpLHRoaXMuX2xvYWRlZCYmIW4ucmVzZXQmJiEwIT09biYmKHZvaWQgMCE9PW4uYW5pbWF0ZSYmKG4uem9vbT1pKHthbmltYXRlOm4uYW5pbWF0ZX0sbi56b29tKSxuLnBhbj1pKHthbmltYXRlOm4uYW5pbWF0ZSxkdXJhdGlvbjpuLmR1cmF0aW9ufSxuLnBhbikpLHRoaXMuX3pvb20hPT1lP3RoaXMuX3RyeUFuaW1hdGVkWm9vbSYmdGhpcy5fdHJ5QW5pbWF0ZWRab29tKHQsZSxuLnpvb20pOnRoaXMuX3RyeUFuaW1hdGVkUGFuKHQsbi5wYW4pKT8oY2xlYXJUaW1lb3V0KHRoaXMuX3NpemVUaW1lciksdGhpcyk6KHRoaXMuX3Jlc2V0Vmlldyh0LGUpLHRoaXMpfSxzZXRab29tOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuX2xvYWRlZD90aGlzLnNldFZpZXcodGhpcy5nZXRDZW50ZXIoKSx0LHt6b29tOml9KToodGhpcy5fem9vbT10LHRoaXMpfSx6b29tSW46ZnVuY3Rpb24odCxpKXtyZXR1cm4gdD10fHwoT2k/dGhpcy5vcHRpb25zLnpvb21EZWx0YToxKSx0aGlzLnNldFpvb20odGhpcy5fem9vbSt0LGkpfSx6b29tT3V0OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQ9dHx8KE9pP3RoaXMub3B0aW9ucy56b29tRGVsdGE6MSksdGhpcy5zZXRab29tKHRoaXMuX3pvb20tdCxpKX0sc2V0Wm9vbUFyb3VuZDpmdW5jdGlvbih0LGksZSl7dmFyIG49dGhpcy5nZXRab29tU2NhbGUoaSksbz10aGlzLmdldFNpemUoKS5kaXZpZGVCeSgyKSxzPSh0IGluc3RhbmNlb2YgeD90OnRoaXMubGF0TG5nVG9Db250YWluZXJQb2ludCh0KSkuc3VidHJhY3QobykubXVsdGlwbHlCeSgxLTEvbikscj10aGlzLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoby5hZGQocykpO3JldHVybiB0aGlzLnNldFZpZXcocixpLHt6b29tOmV9KX0sX2dldEJvdW5kc0NlbnRlclpvb206ZnVuY3Rpb24odCxpKXtpPWl8fHt9LHQ9dC5nZXRCb3VuZHM/dC5nZXRCb3VuZHMoKTp6KHQpO3ZhciBlPXcoaS5wYWRkaW5nVG9wTGVmdHx8aS5wYWRkaW5nfHxbMCwwXSksbj13KGkucGFkZGluZ0JvdHRvbVJpZ2h0fHxpLnBhZGRpbmd8fFswLDBdKSxvPXRoaXMuZ2V0Qm91bmRzWm9vbSh0LCExLGUuYWRkKG4pKTtpZigobz1cIm51bWJlclwiPT10eXBlb2YgaS5tYXhab29tP01hdGgubWluKGkubWF4Wm9vbSxvKTpvKT09PTEvMClyZXR1cm57Y2VudGVyOnQuZ2V0Q2VudGVyKCksem9vbTpvfTt2YXIgcz1uLnN1YnRyYWN0KGUpLmRpdmlkZUJ5KDIpLHI9dGhpcy5wcm9qZWN0KHQuZ2V0U291dGhXZXN0KCksbyksYT10aGlzLnByb2plY3QodC5nZXROb3J0aEVhc3QoKSxvKTtyZXR1cm57Y2VudGVyOnRoaXMudW5wcm9qZWN0KHIuYWRkKGEpLmRpdmlkZUJ5KDIpLmFkZChzKSxvKSx6b29tOm99fSxmaXRCb3VuZHM6ZnVuY3Rpb24odCxpKXtpZighKHQ9eih0KSkuaXNWYWxpZCgpKXRocm93IG5ldyBFcnJvcihcIkJvdW5kcyBhcmUgbm90IHZhbGlkLlwiKTt2YXIgZT10aGlzLl9nZXRCb3VuZHNDZW50ZXJab29tKHQsaSk7cmV0dXJuIHRoaXMuc2V0VmlldyhlLmNlbnRlcixlLnpvb20saSl9LGZpdFdvcmxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpdEJvdW5kcyhbWy05MCwtMTgwXSxbOTAsMTgwXV0sdCl9LHBhblRvOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuc2V0Vmlldyh0LHRoaXMuX3pvb20se3BhbjppfSl9LHBhbkJ5OmZ1bmN0aW9uKHQsaSl7aWYodD13KHQpLnJvdW5kKCksaT1pfHx7fSwhdC54JiYhdC55KXJldHVybiB0aGlzLmZpcmUoXCJtb3ZlZW5kXCIpO2lmKCEwIT09aS5hbmltYXRlJiYhdGhpcy5nZXRTaXplKCkuY29udGFpbnModCkpcmV0dXJuIHRoaXMuX3Jlc2V0Vmlldyh0aGlzLnVucHJvamVjdCh0aGlzLnByb2plY3QodGhpcy5nZXRDZW50ZXIoKSkuYWRkKHQpKSx0aGlzLmdldFpvb20oKSksdGhpcztpZih0aGlzLl9wYW5BbmltfHwodGhpcy5fcGFuQW5pbT1uZXcgdmUsdGhpcy5fcGFuQW5pbS5vbih7c3RlcDp0aGlzLl9vblBhblRyYW5zaXRpb25TdGVwLGVuZDp0aGlzLl9vblBhblRyYW5zaXRpb25FbmR9LHRoaXMpKSxpLm5vTW92ZVN0YXJ0fHx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIiksITEhPT1pLmFuaW1hdGUpe3B0KHRoaXMuX21hcFBhbmUsXCJsZWFmbGV0LXBhbi1hbmltXCIpO3ZhciBlPXRoaXMuX2dldE1hcFBhbmVQb3MoKS5zdWJ0cmFjdCh0KS5yb3VuZCgpO3RoaXMuX3BhbkFuaW0ucnVuKHRoaXMuX21hcFBhbmUsZSxpLmR1cmF0aW9ufHwuMjUsaS5lYXNlTGluZWFyaXR5KX1lbHNlIHRoaXMuX3Jhd1BhbkJ5KHQpLHRoaXMuZmlyZShcIm1vdmVcIikuZmlyZShcIm1vdmVlbmRcIik7cmV0dXJuIHRoaXN9LGZseVRvOmZ1bmN0aW9uKHQsaSxlKXtmdW5jdGlvbiBuKHQpe3ZhciBpPShnKmctbSptKyh0Py0xOjEpKngqeCp2KnYpLygyKih0P2c6bSkqeCp2KSxlPU1hdGguc3FydChpKmkrMSktaTtyZXR1cm4gZTwxZS05Py0xODpNYXRoLmxvZyhlKX1mdW5jdGlvbiBvKHQpe3JldHVybihNYXRoLmV4cCh0KS1NYXRoLmV4cCgtdCkpLzJ9ZnVuY3Rpb24gcyh0KXtyZXR1cm4oTWF0aC5leHAodCkrTWF0aC5leHAoLXQpKS8yfWZ1bmN0aW9uIHIodCl7cmV0dXJuIG8odCkvcyh0KX1mdW5jdGlvbiBhKHQpe3JldHVybiBtKihzKHcpL3Modyt5KnQpKX1mdW5jdGlvbiBoKHQpe3JldHVybiBtKihzKHcpKnIodyt5KnQpLW8odykpL3h9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsMS41KX1mdW5jdGlvbiBsKCl7dmFyIGU9KERhdGUubm93KCktTCkvYixuPXUoZSkqUDtlPD0xPyh0aGlzLl9mbHlUb0ZyYW1lPWYobCx0aGlzKSx0aGlzLl9tb3ZlKHRoaXMudW5wcm9qZWN0KGMuYWRkKF8uc3VidHJhY3QoYykubXVsdGlwbHlCeShoKG4pL3YpKSxwKSx0aGlzLmdldFNjYWxlWm9vbShtL2EobikscCkse2ZseVRvOiEwfSkpOnRoaXMuX21vdmUodCxpKS5fbW92ZUVuZCghMCl9aWYoITE9PT0oZT1lfHx7fSkuYW5pbWF0ZXx8IU9pKXJldHVybiB0aGlzLnNldFZpZXcodCxpLGUpO3RoaXMuX3N0b3AoKTt2YXIgYz10aGlzLnByb2plY3QodGhpcy5nZXRDZW50ZXIoKSksXz10aGlzLnByb2plY3QodCksZD10aGlzLmdldFNpemUoKSxwPXRoaXMuX3pvb207dD1DKHQpLGk9dm9pZCAwPT09aT9wOmk7dmFyIG09TWF0aC5tYXgoZC54LGQueSksZz1tKnRoaXMuZ2V0Wm9vbVNjYWxlKHAsaSksdj1fLmRpc3RhbmNlVG8oYyl8fDEseT0xLjQyLHg9eSp5LHc9bigwKSxMPURhdGUubm93KCksUD0obigxKS13KS95LGI9ZS5kdXJhdGlvbj8xZTMqZS5kdXJhdGlvbjoxZTMqUCouODtyZXR1cm4gdGhpcy5fbW92ZVN0YXJ0KCEwKSxsLmNhbGwodGhpcyksdGhpc30sZmx5VG9Cb3VuZHM6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9nZXRCb3VuZHNDZW50ZXJab29tKHQsaSk7cmV0dXJuIHRoaXMuZmx5VG8oZS5jZW50ZXIsZS56b29tLGkpfSxzZXRNYXhCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eih0KSkuaXNWYWxpZCgpPyh0aGlzLm9wdGlvbnMubWF4Qm91bmRzJiZ0aGlzLm9mZihcIm1vdmVlbmRcIix0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMpLHRoaXMub3B0aW9ucy5tYXhCb3VuZHM9dCx0aGlzLl9sb2FkZWQmJnRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcygpLHRoaXMub24oXCJtb3ZlZW5kXCIsdGhpcy5fcGFuSW5zaWRlTWF4Qm91bmRzKSk6KHRoaXMub3B0aW9ucy5tYXhCb3VuZHM9bnVsbCx0aGlzLm9mZihcIm1vdmVlbmRcIix0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMpKX0sc2V0TWluWm9vbTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLm1pblpvb209dCx0aGlzLl9sb2FkZWQmJnRoaXMuZ2V0Wm9vbSgpPHRoaXMub3B0aW9ucy5taW5ab29tP3RoaXMuc2V0Wm9vbSh0KTp0aGlzfSxzZXRNYXhab29tOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMubWF4Wm9vbT10LHRoaXMuX2xvYWRlZCYmdGhpcy5nZXRab29tKCk+dGhpcy5vcHRpb25zLm1heFpvb20/dGhpcy5zZXRab29tKHQpOnRoaXN9LHBhbkluc2lkZUJvdW5kczpmdW5jdGlvbih0LGkpe3RoaXMuX2VuZm9yY2luZ0JvdW5kcz0hMDt2YXIgZT10aGlzLmdldENlbnRlcigpLG49dGhpcy5fbGltaXRDZW50ZXIoZSx0aGlzLl96b29tLHoodCkpO3JldHVybiBlLmVxdWFscyhuKXx8dGhpcy5wYW5UbyhuLGkpLHRoaXMuX2VuZm9yY2luZ0JvdW5kcz0hMSx0aGlzfSxpbnZhbGlkYXRlU2l6ZTpmdW5jdGlvbih0KXtpZighdGhpcy5fbG9hZGVkKXJldHVybiB0aGlzO3Q9aSh7YW5pbWF0ZTohMSxwYW46ITB9LCEwPT09dD97YW5pbWF0ZTohMH06dCk7dmFyIG49dGhpcy5nZXRTaXplKCk7dGhpcy5fc2l6ZUNoYW5nZWQ9ITAsdGhpcy5fbGFzdENlbnRlcj1udWxsO3ZhciBvPXRoaXMuZ2V0U2l6ZSgpLHM9bi5kaXZpZGVCeSgyKS5yb3VuZCgpLHI9by5kaXZpZGVCeSgyKS5yb3VuZCgpLGE9cy5zdWJ0cmFjdChyKTtyZXR1cm4gYS54fHxhLnk/KHQuYW5pbWF0ZSYmdC5wYW4/dGhpcy5wYW5CeShhKToodC5wYW4mJnRoaXMuX3Jhd1BhbkJ5KGEpLHRoaXMuZmlyZShcIm1vdmVcIiksdC5kZWJvdW5jZU1vdmVlbmQ/KGNsZWFyVGltZW91dCh0aGlzLl9zaXplVGltZXIpLHRoaXMuX3NpemVUaW1lcj1zZXRUaW1lb3V0KGUodGhpcy5maXJlLHRoaXMsXCJtb3ZlZW5kXCIpLDIwMCkpOnRoaXMuZmlyZShcIm1vdmVlbmRcIikpLHRoaXMuZmlyZShcInJlc2l6ZVwiLHtvbGRTaXplOm4sbmV3U2l6ZTpvfSkpOnRoaXN9LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXRab29tKHRoaXMuX2xpbWl0Wm9vbSh0aGlzLl96b29tKSksdGhpcy5vcHRpb25zLnpvb21TbmFwfHx0aGlzLmZpcmUoXCJ2aWV3cmVzZXRcIiksdGhpcy5fc3RvcCgpfSxsb2NhdGU6ZnVuY3Rpb24odCl7aWYodD10aGlzLl9sb2NhdGVPcHRpb25zPWkoe3RpbWVvdXQ6MWU0LHdhdGNoOiExfSx0KSwhKFwiZ2VvbG9jYXRpb25cImluIG5hdmlnYXRvcikpcmV0dXJuIHRoaXMuX2hhbmRsZUdlb2xvY2F0aW9uRXJyb3Ioe2NvZGU6MCxtZXNzYWdlOlwiR2VvbG9jYXRpb24gbm90IHN1cHBvcnRlZC5cIn0pLHRoaXM7dmFyIG49ZSh0aGlzLl9oYW5kbGVHZW9sb2NhdGlvblJlc3BvbnNlLHRoaXMpLG89ZSh0aGlzLl9oYW5kbGVHZW9sb2NhdGlvbkVycm9yLHRoaXMpO3JldHVybiB0LndhdGNoP3RoaXMuX2xvY2F0aW9uV2F0Y2hJZD1uYXZpZ2F0b3IuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihuLG8sdCk6bmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihuLG8sdCksdGhpc30sc3RvcExvY2F0ZTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24mJm5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoJiZuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9sb2NhdGlvbldhdGNoSWQpLHRoaXMuX2xvY2F0ZU9wdGlvbnMmJih0aGlzLl9sb2NhdGVPcHRpb25zLnNldFZpZXc9ITEpLHRoaXN9LF9oYW5kbGVHZW9sb2NhdGlvbkVycm9yOmZ1bmN0aW9uKHQpe3ZhciBpPXQuY29kZSxlPXQubWVzc2FnZXx8KDE9PT1pP1wicGVybWlzc2lvbiBkZW5pZWRcIjoyPT09aT9cInBvc2l0aW9uIHVuYXZhaWxhYmxlXCI6XCJ0aW1lb3V0XCIpO3RoaXMuX2xvY2F0ZU9wdGlvbnMuc2V0VmlldyYmIXRoaXMuX2xvYWRlZCYmdGhpcy5maXRXb3JsZCgpLHRoaXMuZmlyZShcImxvY2F0aW9uZXJyb3JcIix7Y29kZTppLG1lc3NhZ2U6XCJHZW9sb2NhdGlvbiBlcnJvcjogXCIrZStcIi5cIn0pfSxfaGFuZGxlR2VvbG9jYXRpb25SZXNwb25zZTpmdW5jdGlvbih0KXt2YXIgaT1uZXcgTSh0LmNvb3Jkcy5sYXRpdHVkZSx0LmNvb3Jkcy5sb25naXR1ZGUpLGU9aS50b0JvdW5kcyh0LmNvb3Jkcy5hY2N1cmFjeSksbj10aGlzLl9sb2NhdGVPcHRpb25zO2lmKG4uc2V0Vmlldyl7dmFyIG89dGhpcy5nZXRCb3VuZHNab29tKGUpO3RoaXMuc2V0VmlldyhpLG4ubWF4Wm9vbT9NYXRoLm1pbihvLG4ubWF4Wm9vbSk6byl9dmFyIHM9e2xhdGxuZzppLGJvdW5kczplLHRpbWVzdGFtcDp0LnRpbWVzdGFtcH07Zm9yKHZhciByIGluIHQuY29vcmRzKVwibnVtYmVyXCI9PXR5cGVvZiB0LmNvb3Jkc1tyXSYmKHNbcl09dC5jb29yZHNbcl0pO3RoaXMuZmlyZShcImxvY2F0aW9uZm91bmRcIixzKX0sYWRkSGFuZGxlcjpmdW5jdGlvbih0LGkpe2lmKCFpKXJldHVybiB0aGlzO3ZhciBlPXRoaXNbdF09bmV3IGkodGhpcyk7cmV0dXJuIHRoaXMuX2hhbmRsZXJzLnB1c2goZSksdGhpcy5vcHRpb25zW3RdJiZlLmVuYWJsZSgpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2luaXRFdmVudHMoITApLHRoaXMuX2NvbnRhaW5lcklkIT09dGhpcy5fY29udGFpbmVyLl9sZWFmbGV0X2lkKXRocm93IG5ldyBFcnJvcihcIk1hcCBjb250YWluZXIgaXMgYmVpbmcgcmV1c2VkIGJ5IGFub3RoZXIgaW5zdGFuY2VcIik7dHJ5e2RlbGV0ZSB0aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQsZGVsZXRlIHRoaXMuX2NvbnRhaW5lcklkfWNhdGNoKHQpe3RoaXMuX2NvbnRhaW5lci5fbGVhZmxldF9pZD12b2lkIDAsdGhpcy5fY29udGFpbmVySWQ9dm9pZCAwfXV0KHRoaXMuX21hcFBhbmUpLHRoaXMuX2NsZWFyQ29udHJvbFBvcyYmdGhpcy5fY2xlYXJDb250cm9sUG9zKCksdGhpcy5fY2xlYXJIYW5kbGVycygpLHRoaXMuX2xvYWRlZCYmdGhpcy5maXJlKFwidW5sb2FkXCIpO3ZhciB0O2Zvcih0IGluIHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0ucmVtb3ZlKCk7Zm9yKHQgaW4gdGhpcy5fcGFuZXMpdXQodGhpcy5fcGFuZXNbdF0pO3JldHVybiB0aGlzLl9sYXllcnM9W10sdGhpcy5fcGFuZXM9W10sZGVsZXRlIHRoaXMuX21hcFBhbmUsZGVsZXRlIHRoaXMuX3JlbmRlcmVyLHRoaXN9LGNyZWF0ZVBhbmU6ZnVuY3Rpb24odCxpKXt2YXIgZT1odChcImRpdlwiLFwibGVhZmxldC1wYW5lXCIrKHQ/XCIgbGVhZmxldC1cIit0LnJlcGxhY2UoXCJQYW5lXCIsXCJcIikrXCItcGFuZVwiOlwiXCIpLGl8fHRoaXMuX21hcFBhbmUpO3JldHVybiB0JiYodGhpcy5fcGFuZXNbdF09ZSksZX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoZWNrSWZMb2FkZWQoKSx0aGlzLl9sYXN0Q2VudGVyJiYhdGhpcy5fbW92ZWQoKT90aGlzLl9sYXN0Q2VudGVyOnRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX2dldENlbnRlckxheWVyUG9pbnQoKSl9LGdldFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9vbX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRQaXhlbEJvdW5kcygpO3JldHVybiBuZXcgVCh0aGlzLnVucHJvamVjdCh0LmdldEJvdHRvbUxlZnQoKSksdGhpcy51bnByb2plY3QodC5nZXRUb3BSaWdodCgpKSl9LGdldE1pblpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5vcHRpb25zLm1pblpvb20/dGhpcy5fbGF5ZXJzTWluWm9vbXx8MDp0aGlzLm9wdGlvbnMubWluWm9vbX0sZ2V0TWF4Wm9vbTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLm9wdGlvbnMubWF4Wm9vbT92b2lkIDA9PT10aGlzLl9sYXllcnNNYXhab29tPzEvMDp0aGlzLl9sYXllcnNNYXhab29tOnRoaXMub3B0aW9ucy5tYXhab29tfSxnZXRCb3VuZHNab29tOmZ1bmN0aW9uKHQsaSxlKXt0PXoodCksZT13KGV8fFswLDBdKTt2YXIgbj10aGlzLmdldFpvb20oKXx8MCxvPXRoaXMuZ2V0TWluWm9vbSgpLHM9dGhpcy5nZXRNYXhab29tKCkscj10LmdldE5vcnRoV2VzdCgpLGE9dC5nZXRTb3V0aEVhc3QoKSxoPXRoaXMuZ2V0U2l6ZSgpLnN1YnRyYWN0KGUpLHU9Yih0aGlzLnByb2plY3QoYSxuKSx0aGlzLnByb2plY3QocixuKSkuZ2V0U2l6ZSgpLGw9T2k/dGhpcy5vcHRpb25zLnpvb21TbmFwOjEsYz1oLngvdS54LF89aC55L3UueSxkPWk/TWF0aC5tYXgoYyxfKTpNYXRoLm1pbihjLF8pO3JldHVybiBuPXRoaXMuZ2V0U2NhbGVab29tKGQsbiksbCYmKG49TWF0aC5yb3VuZChuLyhsLzEwMCkpKihsLzEwMCksbj1pP01hdGguY2VpbChuL2wpKmw6TWF0aC5mbG9vcihuL2wpKmwpLE1hdGgubWF4KG8sTWF0aC5taW4ocyxuKSl9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZSYmIXRoaXMuX3NpemVDaGFuZ2VkfHwodGhpcy5fc2l6ZT1uZXcgeCh0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGh8fDAsdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodHx8MCksdGhpcy5fc2l6ZUNoYW5nZWQ9ITEpLHRoaXMuX3NpemUuY2xvbmUoKX0sZ2V0UGl4ZWxCb3VuZHM6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9nZXRUb3BMZWZ0UG9pbnQodCxpKTtyZXR1cm4gbmV3IFAoZSxlLmFkZCh0aGlzLmdldFNpemUoKSkpfSxnZXRQaXhlbE9yaWdpbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGVja0lmTG9hZGVkKCksdGhpcy5fcGl4ZWxPcmlnaW59LGdldFBpeGVsV29ybGRCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5jcnMuZ2V0UHJvamVjdGVkQm91bmRzKHZvaWQgMD09PXQ/dGhpcy5nZXRab29tKCk6dCl9LGdldFBhbmU6ZnVuY3Rpb24odCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/dGhpcy5fcGFuZXNbdF06dH0sZ2V0UGFuZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFuZXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LGdldFpvb21TY2FsZTpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMub3B0aW9ucy5jcnM7cmV0dXJuIGk9dm9pZCAwPT09aT90aGlzLl96b29tOmksZS5zY2FsZSh0KS9lLnNjYWxlKGkpfSxnZXRTY2FsZVpvb206ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLm9wdGlvbnMuY3JzO2k9dm9pZCAwPT09aT90aGlzLl96b29tOmk7dmFyIG49ZS56b29tKHQqZS5zY2FsZShpKSk7cmV0dXJuIGlzTmFOKG4pPzEvMDpufSxwcm9qZWN0OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9dm9pZCAwPT09aT90aGlzLl96b29tOmksdGhpcy5vcHRpb25zLmNycy5sYXRMbmdUb1BvaW50KEModCksaSl9LHVucHJvamVjdDpmdW5jdGlvbih0LGkpe3JldHVybiBpPXZvaWQgMD09PWk/dGhpcy5fem9vbTppLHRoaXMub3B0aW9ucy5jcnMucG9pbnRUb0xhdExuZyh3KHQpLGkpfSxsYXllclBvaW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGk9dyh0KS5hZGQodGhpcy5nZXRQaXhlbE9yaWdpbigpKTtyZXR1cm4gdGhpcy51bnByb2plY3QoaSl9LGxhdExuZ1RvTGF5ZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0KEModCkpLl9yb3VuZCgpLl9zdWJ0cmFjdCh0aGlzLmdldFBpeGVsT3JpZ2luKCkpfSx3cmFwTGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLndyYXBMYXRMbmcoQyh0KSl9LHdyYXBMYXRMbmdCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5jcnMud3JhcExhdExuZ0JvdW5kcyh6KHQpKX0sZGlzdGFuY2U6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5vcHRpb25zLmNycy5kaXN0YW5jZShDKHQpLEMoaSkpfSxjb250YWluZXJQb2ludFRvTGF5ZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdyh0KS5zdWJ0cmFjdCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpfSxsYXllclBvaW50VG9Db250YWluZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdyh0KS5hZGQodGhpcy5fZ2V0TWFwUGFuZVBvcygpKX0sY29udGFpbmVyUG9pbnRUb0xhdExuZzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KHcodCkpO3JldHVybiB0aGlzLmxheWVyUG9pbnRUb0xhdExuZyhpKX0sbGF0TG5nVG9Db250YWluZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXllclBvaW50VG9Db250YWluZXJQb2ludCh0aGlzLmxhdExuZ1RvTGF5ZXJQb2ludChDKHQpKSl9LG1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0dCh0LHRoaXMuX2NvbnRhaW5lcil9LG1vdXNlRXZlbnRUb0xheWVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodGhpcy5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSl9LG1vdXNlRXZlbnRUb0xhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXllclBvaW50VG9MYXRMbmcodGhpcy5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpKX0sX2luaXRDb250YWluZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fY29udGFpbmVyPXJ0KHQpO2lmKCFpKXRocm93IG5ldyBFcnJvcihcIk1hcCBjb250YWluZXIgbm90IGZvdW5kLlwiKTtpZihpLl9sZWFmbGV0X2lkKXRocm93IG5ldyBFcnJvcihcIk1hcCBjb250YWluZXIgaXMgYWxyZWFkeSBpbml0aWFsaXplZC5cIik7VihpLFwic2Nyb2xsXCIsdGhpcy5fb25TY3JvbGwsdGhpcyksdGhpcy5fY29udGFpbmVySWQ9bihpKX0sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250YWluZXI7dGhpcy5fZmFkZUFuaW1hdGVkPXRoaXMub3B0aW9ucy5mYWRlQW5pbWF0aW9uJiZPaSxwdCh0LFwibGVhZmxldC1jb250YWluZXJcIisoSGk/XCIgbGVhZmxldC10b3VjaFwiOlwiXCIpKyhWaT9cIiBsZWFmbGV0LXJldGluYVwiOlwiXCIpKyh3aT9cIiBsZWFmbGV0LW9sZGllXCI6XCJcIikrKFppP1wiIGxlYWZsZXQtc2FmYXJpXCI6XCJcIikrKHRoaXMuX2ZhZGVBbmltYXRlZD9cIiBsZWFmbGV0LWZhZGUtYW5pbVwiOlwiXCIpKTt2YXIgaT1hdCh0LFwicG9zaXRpb25cIik7XCJhYnNvbHV0ZVwiIT09aSYmXCJyZWxhdGl2ZVwiIT09aSYmXCJmaXhlZFwiIT09aSYmKHQuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiKSx0aGlzLl9pbml0UGFuZXMoKSx0aGlzLl9pbml0Q29udHJvbFBvcyYmdGhpcy5faW5pdENvbnRyb2xQb3MoKX0sX2luaXRQYW5lczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BhbmVzPXt9O3RoaXMuX3BhbmVSZW5kZXJlcnM9e30sdGhpcy5fbWFwUGFuZT10aGlzLmNyZWF0ZVBhbmUoXCJtYXBQYW5lXCIsdGhpcy5fY29udGFpbmVyKSxMdCh0aGlzLl9tYXBQYW5lLG5ldyB4KDAsMCkpLHRoaXMuY3JlYXRlUGFuZShcInRpbGVQYW5lXCIpLHRoaXMuY3JlYXRlUGFuZShcInNoYWRvd1BhbmVcIiksdGhpcy5jcmVhdGVQYW5lKFwib3ZlcmxheVBhbmVcIiksdGhpcy5jcmVhdGVQYW5lKFwibWFya2VyUGFuZVwiKSx0aGlzLmNyZWF0ZVBhbmUoXCJ0b29sdGlwUGFuZVwiKSx0aGlzLmNyZWF0ZVBhbmUoXCJwb3B1cFBhbmVcIiksdGhpcy5vcHRpb25zLm1hcmtlclpvb21BbmltYXRpb258fChwdCh0Lm1hcmtlclBhbmUsXCJsZWFmbGV0LXpvb20taGlkZVwiKSxwdCh0LnNoYWRvd1BhbmUsXCJsZWFmbGV0LXpvb20taGlkZVwiKSl9LF9yZXNldFZpZXc6ZnVuY3Rpb24odCxpKXtMdCh0aGlzLl9tYXBQYW5lLG5ldyB4KDAsMCkpO3ZhciBlPSF0aGlzLl9sb2FkZWQ7dGhpcy5fbG9hZGVkPSEwLGk9dGhpcy5fbGltaXRab29tKGkpLHRoaXMuZmlyZShcInZpZXdwcmVyZXNldFwiKTt2YXIgbj10aGlzLl96b29tIT09aTt0aGlzLl9tb3ZlU3RhcnQobikuX21vdmUodCxpKS5fbW92ZUVuZChuKSx0aGlzLmZpcmUoXCJ2aWV3cmVzZXRcIiksZSYmdGhpcy5maXJlKFwibG9hZFwiKX0sX21vdmVTdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5maXJlKFwiem9vbXN0YXJ0XCIpLHRoaXMuZmlyZShcIm1vdmVzdGFydFwiKX0sX21vdmU6ZnVuY3Rpb24odCxpLGUpe3ZvaWQgMD09PWkmJihpPXRoaXMuX3pvb20pO3ZhciBuPXRoaXMuX3pvb20hPT1pO3JldHVybiB0aGlzLl96b29tPWksdGhpcy5fbGFzdENlbnRlcj10LHRoaXMuX3BpeGVsT3JpZ2luPXRoaXMuX2dldE5ld1BpeGVsT3JpZ2luKHQpLChufHxlJiZlLnBpbmNoKSYmdGhpcy5maXJlKFwiem9vbVwiLGUpLHRoaXMuZmlyZShcIm1vdmVcIixlKX0sX21vdmVFbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuZmlyZShcInpvb21lbmRcIiksdGhpcy5maXJlKFwibW92ZWVuZFwiKX0sX3N0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gZyh0aGlzLl9mbHlUb0ZyYW1lKSx0aGlzLl9wYW5BbmltJiZ0aGlzLl9wYW5BbmltLnN0b3AoKSx0aGlzfSxfcmF3UGFuQnk6ZnVuY3Rpb24odCl7THQodGhpcy5fbWFwUGFuZSx0aGlzLl9nZXRNYXBQYW5lUG9zKCkuc3VidHJhY3QodCkpfSxfZ2V0Wm9vbVNwYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNYXhab29tKCktdGhpcy5nZXRNaW5ab29tKCl9LF9wYW5JbnNpZGVNYXhCb3VuZHM6ZnVuY3Rpb24oKXt0aGlzLl9lbmZvcmNpbmdCb3VuZHN8fHRoaXMucGFuSW5zaWRlQm91bmRzKHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpfSxfY2hlY2tJZkxvYWRlZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9sb2FkZWQpdGhyb3cgbmV3IEVycm9yKFwiU2V0IG1hcCBjZW50ZXIgYW5kIHpvb20gZmlyc3QuXCIpfSxfaW5pdEV2ZW50czpmdW5jdGlvbih0KXt0aGlzLl90YXJnZXRzPXt9LHRoaXMuX3RhcmdldHNbbih0aGlzLl9jb250YWluZXIpXT10aGlzO3ZhciBpPXQ/RzpWO2kodGhpcy5fY29udGFpbmVyLFwiY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBjb250ZXh0bWVudSBrZXlwcmVzc1wiLHRoaXMuX2hhbmRsZURPTUV2ZW50LHRoaXMpLHRoaXMub3B0aW9ucy50cmFja1Jlc2l6ZSYmaSh3aW5kb3csXCJyZXNpemVcIix0aGlzLl9vblJlc2l6ZSx0aGlzKSxPaSYmdGhpcy5vcHRpb25zLnRyYW5zZm9ybTNETGltaXQmJih0P3RoaXMub2ZmOnRoaXMub24pLmNhbGwodGhpcyxcIm1vdmVlbmRcIix0aGlzLl9vbk1vdmVFbmQpfSxfb25SZXNpemU6ZnVuY3Rpb24oKXtnKHRoaXMuX3Jlc2l6ZVJlcXVlc3QpLHRoaXMuX3Jlc2l6ZVJlcXVlc3Q9ZihmdW5jdGlvbigpe3RoaXMuaW52YWxpZGF0ZVNpemUoe2RlYm91bmNlTW92ZWVuZDohMH0pfSx0aGlzKX0sX29uU2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcD0wLHRoaXMuX2NvbnRhaW5lci5zY3JvbGxMZWZ0PTB9LF9vbk1vdmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRNYXBQYW5lUG9zKCk7TWF0aC5tYXgoTWF0aC5hYnModC54KSxNYXRoLmFicyh0LnkpKT49dGhpcy5vcHRpb25zLnRyYW5zZm9ybTNETGltaXQmJnRoaXMuX3Jlc2V0Vmlldyh0aGlzLmdldENlbnRlcigpLHRoaXMuZ2V0Wm9vbSgpKX0sX2ZpbmRFdmVudFRhcmdldHM6ZnVuY3Rpb24odCxpKXtmb3IodmFyIGUsbz1bXSxzPVwibW91c2VvdXRcIj09PWl8fFwibW91c2VvdmVyXCI9PT1pLHI9dC50YXJnZXR8fHQuc3JjRWxlbWVudCxhPSExO3I7KXtpZigoZT10aGlzLl90YXJnZXRzW24ocildKSYmKFwiY2xpY2tcIj09PWl8fFwicHJlY2xpY2tcIj09PWkpJiYhdC5fc2ltdWxhdGVkJiZ0aGlzLl9kcmFnZ2FibGVNb3ZlZChlKSl7YT0hMDticmVha31pZihlJiZlLmxpc3RlbnMoaSwhMCkpe2lmKHMmJiFvdChyLHQpKWJyZWFrO2lmKG8ucHVzaChlKSxzKWJyZWFrfWlmKHI9PT10aGlzLl9jb250YWluZXIpYnJlYWs7cj1yLnBhcmVudE5vZGV9cmV0dXJuIG8ubGVuZ3RofHxhfHxzfHwhb3Qocix0KXx8KG89W3RoaXNdKSxvfSxfaGFuZGxlRE9NRXZlbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy5fbG9hZGVkJiYhbnQodCkpe3ZhciBpPXQudHlwZTtcIm1vdXNlZG93blwiIT09aSYmXCJrZXlwcmVzc1wiIT09aXx8enQodC50YXJnZXR8fHQuc3JjRWxlbWVudCksdGhpcy5fZmlyZURPTUV2ZW50KHQsaSl9fSxfbW91c2VFdmVudHM6W1wiY2xpY2tcIixcImRibGNsaWNrXCIsXCJtb3VzZW92ZXJcIixcIm1vdXNlb3V0XCIsXCJjb250ZXh0bWVudVwiXSxfZmlyZURPTUV2ZW50OmZ1bmN0aW9uKHQsZSxuKXtpZihcImNsaWNrXCI9PT10LnR5cGUpe3ZhciBvPWkoe30sdCk7by50eXBlPVwicHJlY2xpY2tcIix0aGlzLl9maXJlRE9NRXZlbnQobyxvLnR5cGUsbil9aWYoIXQuX3N0b3BwZWQmJihuPShufHxbXSkuY29uY2F0KHRoaXMuX2ZpbmRFdmVudFRhcmdldHModCxlKSkpLmxlbmd0aCl7dmFyIHM9blswXTtcImNvbnRleHRtZW51XCI9PT1lJiZzLmxpc3RlbnMoZSwhMCkmJiQodCk7dmFyIHI9e29yaWdpbmFsRXZlbnQ6dH07aWYoXCJrZXlwcmVzc1wiIT09dC50eXBlKXt2YXIgYT1zLm9wdGlvbnMmJlwiaWNvblwiaW4gcy5vcHRpb25zO3IuY29udGFpbmVyUG9pbnQ9YT90aGlzLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQocy5nZXRMYXRMbmcoKSk6dGhpcy5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSxyLmxheWVyUG9pbnQ9dGhpcy5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChyLmNvbnRhaW5lclBvaW50KSxyLmxhdGxuZz1hP3MuZ2V0TGF0TG5nKCk6dGhpcy5sYXllclBvaW50VG9MYXRMbmcoci5sYXllclBvaW50KX1mb3IodmFyIGg9MDtoPG4ubGVuZ3RoO2grKylpZihuW2hdLmZpcmUoZSxyLCEwKSxyLm9yaWdpbmFsRXZlbnQuX3N0b3BwZWR8fCExPT09bltoXS5vcHRpb25zLmJ1YmJsaW5nTW91c2VFdmVudHMmJi0xIT09ZCh0aGlzLl9tb3VzZUV2ZW50cyxlKSlyZXR1cm59fSxfZHJhZ2dhYmxlTW92ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9dC5kcmFnZ2luZyYmdC5kcmFnZ2luZy5lbmFibGVkKCk/dDp0aGlzKS5kcmFnZ2luZyYmdC5kcmFnZ2luZy5tb3ZlZCgpfHx0aGlzLmJveFpvb20mJnRoaXMuYm94Wm9vbS5tb3ZlZCgpfSxfY2xlYXJIYW5kbGVyczpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGk9dGhpcy5faGFuZGxlcnMubGVuZ3RoO3Q8aTt0KyspdGhpcy5faGFuZGxlcnNbdF0uZGlzYWJsZSgpfSx3aGVuUmVhZHk6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5fbG9hZGVkP3QuY2FsbChpfHx0aGlzLHt0YXJnZXQ6dGhpc30pOnRoaXMub24oXCJsb2FkXCIsdCxpKSx0aGlzfSxfZ2V0TWFwUGFuZVBvczpmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLl9tYXBQYW5lKXx8bmV3IHgoMCwwKX0sX21vdmVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TWFwUGFuZVBvcygpO3JldHVybiB0JiYhdC5lcXVhbHMoWzAsMF0pfSxfZ2V0VG9wTGVmdFBvaW50OmZ1bmN0aW9uKHQsaSl7cmV0dXJuKHQmJnZvaWQgMCE9PWk/dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4odCxpKTp0aGlzLmdldFBpeGVsT3JpZ2luKCkpLnN1YnRyYWN0KHRoaXMuX2dldE1hcFBhbmVQb3MoKSl9LF9nZXROZXdQaXhlbE9yaWdpbjpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuZ2V0U2l6ZSgpLl9kaXZpZGVCeSgyKTtyZXR1cm4gdGhpcy5wcm9qZWN0KHQsaSkuX3N1YnRyYWN0KGUpLl9hZGQodGhpcy5fZ2V0TWFwUGFuZVBvcygpKS5fcm91bmQoKX0sX2xhdExuZ1RvTmV3TGF5ZXJQb2ludDpmdW5jdGlvbih0LGksZSl7dmFyIG49dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4oZSxpKTtyZXR1cm4gdGhpcy5wcm9qZWN0KHQsaSkuX3N1YnRyYWN0KG4pfSxfbGF0TG5nQm91bmRzVG9OZXdMYXllckJvdW5kczpmdW5jdGlvbih0LGksZSl7dmFyIG49dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4oZSxpKTtyZXR1cm4gYihbdGhpcy5wcm9qZWN0KHQuZ2V0U291dGhXZXN0KCksaSkuX3N1YnRyYWN0KG4pLHRoaXMucHJvamVjdCh0LmdldE5vcnRoV2VzdCgpLGkpLl9zdWJ0cmFjdChuKSx0aGlzLnByb2plY3QodC5nZXRTb3V0aEVhc3QoKSxpKS5fc3VidHJhY3QobiksdGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhFYXN0KCksaSkuX3N1YnRyYWN0KG4pXSl9LF9nZXRDZW50ZXJMYXllclBvaW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpKX0sX2dldENlbnRlck9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYXRMbmdUb0xheWVyUG9pbnQodCkuc3VidHJhY3QodGhpcy5fZ2V0Q2VudGVyTGF5ZXJQb2ludCgpKX0sX2xpbWl0Q2VudGVyOmZ1bmN0aW9uKHQsaSxlKXtpZighZSlyZXR1cm4gdDt2YXIgbj10aGlzLnByb2plY3QodCxpKSxvPXRoaXMuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLHM9bmV3IFAobi5zdWJ0cmFjdChvKSxuLmFkZChvKSkscj10aGlzLl9nZXRCb3VuZHNPZmZzZXQocyxlLGkpO3JldHVybiByLnJvdW5kKCkuZXF1YWxzKFswLDBdKT90OnRoaXMudW5wcm9qZWN0KG4uYWRkKHIpLGkpfSxfbGltaXRPZmZzZXQ6ZnVuY3Rpb24odCxpKXtpZighaSlyZXR1cm4gdDt2YXIgZT10aGlzLmdldFBpeGVsQm91bmRzKCksbj1uZXcgUChlLm1pbi5hZGQodCksZS5tYXguYWRkKHQpKTtyZXR1cm4gdC5hZGQodGhpcy5fZ2V0Qm91bmRzT2Zmc2V0KG4saSkpfSxfZ2V0Qm91bmRzT2Zmc2V0OmZ1bmN0aW9uKHQsaSxlKXt2YXIgbj1iKHRoaXMucHJvamVjdChpLmdldE5vcnRoRWFzdCgpLGUpLHRoaXMucHJvamVjdChpLmdldFNvdXRoV2VzdCgpLGUpKSxvPW4ubWluLnN1YnRyYWN0KHQubWluKSxzPW4ubWF4LnN1YnRyYWN0KHQubWF4KTtyZXR1cm4gbmV3IHgodGhpcy5fcmVib3VuZChvLngsLXMueCksdGhpcy5fcmVib3VuZChvLnksLXMueSkpfSxfcmVib3VuZDpmdW5jdGlvbih0LGkpe3JldHVybiB0K2k+MD9NYXRoLnJvdW5kKHQtaSkvMjpNYXRoLm1heCgwLE1hdGguY2VpbCh0KSktTWF0aC5tYXgoMCxNYXRoLmZsb29yKGkpKX0sX2xpbWl0Wm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmdldE1pblpvb20oKSxlPXRoaXMuZ2V0TWF4Wm9vbSgpLG49T2k/dGhpcy5vcHRpb25zLnpvb21TbmFwOjE7cmV0dXJuIG4mJih0PU1hdGgucm91bmQodC9uKSpuKSxNYXRoLm1heChpLE1hdGgubWluKGUsdCkpfSxfb25QYW5UcmFuc2l0aW9uU3RlcDpmdW5jdGlvbigpe3RoaXMuZmlyZShcIm1vdmVcIil9LF9vblBhblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXttdCh0aGlzLl9tYXBQYW5lLFwibGVhZmxldC1wYW4tYW5pbVwiKSx0aGlzLmZpcmUoXCJtb3ZlZW5kXCIpfSxfdHJ5QW5pbWF0ZWRQYW46ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9nZXRDZW50ZXJPZmZzZXQodCkuX2Zsb29yKCk7cmV0dXJuISghMCE9PShpJiZpLmFuaW1hdGUpJiYhdGhpcy5nZXRTaXplKCkuY29udGFpbnMoZSkpJiYodGhpcy5wYW5CeShlLGkpLCEwKX0sX2NyZWF0ZUFuaW1Qcm94eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Byb3h5PWh0KFwiZGl2XCIsXCJsZWFmbGV0LXByb3h5IGxlYWZsZXQtem9vbS1hbmltYXRlZFwiKTt0aGlzLl9wYW5lcy5tYXBQYW5lLmFwcGVuZENoaWxkKHQpLHRoaXMub24oXCJ6b29tYW5pbVwiLGZ1bmN0aW9uKHQpe3ZhciBpPWNlLGU9dGhpcy5fcHJveHkuc3R5bGVbaV07d3QodGhpcy5fcHJveHksdGhpcy5wcm9qZWN0KHQuY2VudGVyLHQuem9vbSksdGhpcy5nZXRab29tU2NhbGUodC56b29tLDEpKSxlPT09dGhpcy5fcHJveHkuc3R5bGVbaV0mJnRoaXMuX2FuaW1hdGluZ1pvb20mJnRoaXMuX29uWm9vbVRyYW5zaXRpb25FbmQoKX0sdGhpcyksdGhpcy5vbihcImxvYWQgbW92ZWVuZFwiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRDZW50ZXIoKSxpPXRoaXMuZ2V0Wm9vbSgpO3d0KHRoaXMuX3Byb3h5LHRoaXMucHJvamVjdCh0LGkpLHRoaXMuZ2V0Wm9vbVNjYWxlKGksMSkpfSx0aGlzKSx0aGlzLl9vbihcInVubG9hZFwiLHRoaXMuX2Rlc3Ryb3lBbmltUHJveHksdGhpcyl9LF9kZXN0cm95QW5pbVByb3h5OmZ1bmN0aW9uKCl7dXQodGhpcy5fcHJveHkpLGRlbGV0ZSB0aGlzLl9wcm94eX0sX2NhdGNoVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXt0aGlzLl9hbmltYXRpbmdab29tJiZ0LnByb3BlcnR5TmFtZS5pbmRleE9mKFwidHJhbnNmb3JtXCIpPj0wJiZ0aGlzLl9vblpvb21UcmFuc2l0aW9uRW5kKCl9LF9ub3RoaW5nVG9BbmltYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGVhZmxldC16b29tLWFuaW1hdGVkXCIpLmxlbmd0aH0sX3RyeUFuaW1hdGVkWm9vbTpmdW5jdGlvbih0LGksZSl7aWYodGhpcy5fYW5pbWF0aW5nWm9vbSlyZXR1cm4hMDtpZihlPWV8fHt9LCF0aGlzLl96b29tQW5pbWF0ZWR8fCExPT09ZS5hbmltYXRlfHx0aGlzLl9ub3RoaW5nVG9BbmltYXRlKCl8fE1hdGguYWJzKGktdGhpcy5fem9vbSk+dGhpcy5vcHRpb25zLnpvb21BbmltYXRpb25UaHJlc2hvbGQpcmV0dXJuITE7dmFyIG49dGhpcy5nZXRab29tU2NhbGUoaSksbz10aGlzLl9nZXRDZW50ZXJPZmZzZXQodCkuX2RpdmlkZUJ5KDEtMS9uKTtyZXR1cm4hKCEwIT09ZS5hbmltYXRlJiYhdGhpcy5nZXRTaXplKCkuY29udGFpbnMobykpJiYoZihmdW5jdGlvbigpe3RoaXMuX21vdmVTdGFydCghMCkuX2FuaW1hdGVab29tKHQsaSwhMCl9LHRoaXMpLCEwKX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQsaSxuLG8pe24mJih0aGlzLl9hbmltYXRpbmdab29tPSEwLHRoaXMuX2FuaW1hdGVUb0NlbnRlcj10LHRoaXMuX2FuaW1hdGVUb1pvb209aSxwdCh0aGlzLl9tYXBQYW5lLFwibGVhZmxldC16b29tLWFuaW1cIikpLHRoaXMuZmlyZShcInpvb21hbmltXCIse2NlbnRlcjp0LHpvb206aSxub1VwZGF0ZTpvfSksc2V0VGltZW91dChlKHRoaXMuX29uWm9vbVRyYW5zaXRpb25FbmQsdGhpcyksMjUwKX0sX29uWm9vbVRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRpbmdab29tJiYobXQodGhpcy5fbWFwUGFuZSxcImxlYWZsZXQtem9vbS1hbmltXCIpLHRoaXMuX2FuaW1hdGluZ1pvb209ITEsdGhpcy5fbW92ZSh0aGlzLl9hbmltYXRlVG9DZW50ZXIsdGhpcy5fYW5pbWF0ZVRvWm9vbSksZihmdW5jdGlvbigpe3RoaXMuX21vdmVFbmQoITApfSx0aGlzKSl9fSkseGU9di5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOlwidG9wcmlnaHRcIn0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtsKHRoaXMsdCl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbn0sc2V0UG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwO3JldHVybiBpJiZpLnJlbW92ZUNvbnRyb2wodGhpcyksdGhpcy5vcHRpb25zLnBvc2l0aW9uPXQsaSYmaS5hZGRDb250cm9sKHRoaXMpLHRoaXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LGFkZFRvOmZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlKCksdGhpcy5fbWFwPXQ7dmFyIGk9dGhpcy5fY29udGFpbmVyPXRoaXMub25BZGQodCksZT10aGlzLmdldFBvc2l0aW9uKCksbj10Ll9jb250cm9sQ29ybmVyc1tlXTtyZXR1cm4gcHQoaSxcImxlYWZsZXQtY29udHJvbFwiKSwtMSE9PWUuaW5kZXhPZihcImJvdHRvbVwiKT9uLmluc2VydEJlZm9yZShpLG4uZmlyc3RDaGlsZCk6bi5hcHBlbmRDaGlsZChpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwPyh1dCh0aGlzLl9jb250YWluZXIpLHRoaXMub25SZW1vdmUmJnRoaXMub25SZW1vdmUodGhpcy5fbWFwKSx0aGlzLl9tYXA9bnVsbCx0aGlzKTp0aGlzfSxfcmVmb2N1c09uTWFwOmZ1bmN0aW9uKHQpe3RoaXMuX21hcCYmdCYmdC5zY3JlZW5YPjAmJnQuc2NyZWVuWT4wJiZ0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkuZm9jdXMoKX19KSx3ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHhlKHQpfTt5ZS5pbmNsdWRlKHthZGRDb250cm9sOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZFRvKHRoaXMpLHRoaXN9LHJlbW92ZUNvbnRyb2w6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVtb3ZlKCksdGhpc30sX2luaXRDb250cm9sUG9zOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LG8pe3ZhciBzPWUrdCtcIiBcIitlK287aVt0K29dPWh0KFwiZGl2XCIscyxuKX12YXIgaT10aGlzLl9jb250cm9sQ29ybmVycz17fSxlPVwibGVhZmxldC1cIixuPXRoaXMuX2NvbnRyb2xDb250YWluZXI9aHQoXCJkaXZcIixlK1wiY29udHJvbC1jb250YWluZXJcIix0aGlzLl9jb250YWluZXIpO3QoXCJ0b3BcIixcImxlZnRcIiksdChcInRvcFwiLFwicmlnaHRcIiksdChcImJvdHRvbVwiLFwibGVmdFwiKSx0KFwiYm90dG9tXCIsXCJyaWdodFwiKX0sX2NsZWFyQ29udHJvbFBvczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9jb250cm9sQ29ybmVycyl1dCh0aGlzLl9jb250cm9sQ29ybmVyc1t0XSk7dXQodGhpcy5fY29udHJvbENvbnRhaW5lciksZGVsZXRlIHRoaXMuX2NvbnRyb2xDb3JuZXJzLGRlbGV0ZSB0aGlzLl9jb250cm9sQ29udGFpbmVyfX0pO3ZhciBMZT14ZS5leHRlbmQoe29wdGlvbnM6e2NvbGxhcHNlZDohMCxwb3NpdGlvbjpcInRvcHJpZ2h0XCIsYXV0b1pJbmRleDohMCxoaWRlU2luZ2xlQmFzZTohMSxzb3J0TGF5ZXJzOiExLHNvcnRGdW5jdGlvbjpmdW5jdGlvbih0LGksZSxuKXtyZXR1cm4gZTxuPy0xOm48ZT8xOjB9fSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSxlKXtsKHRoaXMsZSksdGhpcy5fbGF5ZXJDb250cm9sSW5wdXRzPVtdLHRoaXMuX2xheWVycz1bXSx0aGlzLl9sYXN0WkluZGV4PTAsdGhpcy5faGFuZGxpbmdDbGljaz0hMTtmb3IodmFyIG4gaW4gdCl0aGlzLl9hZGRMYXllcih0W25dLG4pO2ZvcihuIGluIGkpdGhpcy5fYWRkTGF5ZXIoaVtuXSxuLCEwKX0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5faW5pdExheW91dCgpLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX21hcD10LHQub24oXCJ6b29tZW5kXCIsdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycyx0aGlzKTtmb3IodmFyIGk9MDtpPHRoaXMuX2xheWVycy5sZW5ndGg7aSsrKXRoaXMuX2xheWVyc1tpXS5sYXllci5vbihcImFkZCByZW1vdmVcIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpO3JldHVybiB0aGlzLl9jb250YWluZXJ9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiB4ZS5wcm90b3R5cGUuYWRkVG8uY2FsbCh0aGlzLHQpLHRoaXMuX2V4cGFuZElmTm90Q29sbGFwc2VkKCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZihcInpvb21lbmRcIix0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzLHRoaXMpO2Zvcih2YXIgdD0wO3Q8dGhpcy5fbGF5ZXJzLmxlbmd0aDt0KyspdGhpcy5fbGF5ZXJzW3RdLmxheWVyLm9mZihcImFkZCByZW1vdmVcIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpfSxhZGRCYXNlTGF5ZXI6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5fYWRkTGF5ZXIodCxpKSx0aGlzLl9tYXA/dGhpcy5fdXBkYXRlKCk6dGhpc30sYWRkT3ZlcmxheTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLl9hZGRMYXllcih0LGksITApLHRoaXMuX21hcD90aGlzLl91cGRhdGUoKTp0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt0Lm9mZihcImFkZCByZW1vdmVcIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpO3ZhciBpPXRoaXMuX2dldExheWVyKG4odCkpO3JldHVybiBpJiZ0aGlzLl9sYXllcnMuc3BsaWNlKHRoaXMuX2xheWVycy5pbmRleE9mKGkpLDEpLHRoaXMuX21hcD90aGlzLl91cGRhdGUoKTp0aGlzfSxleHBhbmQ6ZnVuY3Rpb24oKXtwdCh0aGlzLl9jb250YWluZXIsXCJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzLWV4cGFuZGVkXCIpLHRoaXMuX2Zvcm0uc3R5bGUuaGVpZ2h0PW51bGw7dmFyIHQ9dGhpcy5fbWFwLmdldFNpemUoKS55LSh0aGlzLl9jb250YWluZXIub2Zmc2V0VG9wKzUwKTtyZXR1cm4gdDx0aGlzLl9mb3JtLmNsaWVudEhlaWdodD8ocHQodGhpcy5fZm9ybSxcImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2Nyb2xsYmFyXCIpLHRoaXMuX2Zvcm0uc3R5bGUuaGVpZ2h0PXQrXCJweFwiKTptdCh0aGlzLl9mb3JtLFwibGVhZmxldC1jb250cm9sLWxheWVycy1zY3JvbGxiYXJcIiksdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycygpLHRoaXN9LGNvbGxhcHNlOmZ1bmN0aW9uKCl7cmV0dXJuIG10KHRoaXMuX2NvbnRhaW5lcixcImxlYWZsZXQtY29udHJvbC1sYXllcnMtZXhwYW5kZWRcIiksdGhpc30sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD1cImxlYWZsZXQtY29udHJvbC1sYXllcnNcIixpPXRoaXMuX2NvbnRhaW5lcj1odChcImRpdlwiLHQpLGU9dGhpcy5vcHRpb25zLmNvbGxhcHNlZDtpLnNldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIiwhMCksSihpKSxYKGkpO3ZhciBuPXRoaXMuX2Zvcm09aHQoXCJmb3JtXCIsdCtcIi1saXN0XCIpO2UmJih0aGlzLl9tYXAub24oXCJjbGlja1wiLHRoaXMuY29sbGFwc2UsdGhpcyksYml8fFYoaSx7bW91c2VlbnRlcjp0aGlzLmV4cGFuZCxtb3VzZWxlYXZlOnRoaXMuY29sbGFwc2V9LHRoaXMpKTt2YXIgbz10aGlzLl9sYXllcnNMaW5rPWh0KFwiYVwiLHQrXCItdG9nZ2xlXCIsaSk7by5ocmVmPVwiI1wiLG8udGl0bGU9XCJMYXllcnNcIixIaT8oVihvLFwiY2xpY2tcIixRKSxWKG8sXCJjbGlja1wiLHRoaXMuZXhwYW5kLHRoaXMpKTpWKG8sXCJmb2N1c1wiLHRoaXMuZXhwYW5kLHRoaXMpLGV8fHRoaXMuZXhwYW5kKCksdGhpcy5fYmFzZUxheWVyc0xpc3Q9aHQoXCJkaXZcIix0K1wiLWJhc2VcIixuKSx0aGlzLl9zZXBhcmF0b3I9aHQoXCJkaXZcIix0K1wiLXNlcGFyYXRvclwiLG4pLHRoaXMuX292ZXJsYXlzTGlzdD1odChcImRpdlwiLHQrXCItb3ZlcmxheXNcIixuKSxpLmFwcGVuZENoaWxkKG4pfSxfZ2V0TGF5ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPTA7aTx0aGlzLl9sYXllcnMubGVuZ3RoO2krKylpZih0aGlzLl9sYXllcnNbaV0mJm4odGhpcy5fbGF5ZXJzW2ldLmxheWVyKT09PXQpcmV0dXJuIHRoaXMuX2xheWVyc1tpXX0sX2FkZExheWVyOmZ1bmN0aW9uKHQsaSxuKXt0aGlzLl9tYXAmJnQub24oXCJhZGQgcmVtb3ZlXCIsdGhpcy5fb25MYXllckNoYW5nZSx0aGlzKSx0aGlzLl9sYXllcnMucHVzaCh7bGF5ZXI6dCxuYW1lOmksb3ZlcmxheTpufSksdGhpcy5vcHRpb25zLnNvcnRMYXllcnMmJnRoaXMuX2xheWVycy5zb3J0KGUoZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5vcHRpb25zLnNvcnRGdW5jdGlvbih0LmxheWVyLGkubGF5ZXIsdC5uYW1lLGkubmFtZSl9LHRoaXMpKSx0aGlzLm9wdGlvbnMuYXV0b1pJbmRleCYmdC5zZXRaSW5kZXgmJih0aGlzLl9sYXN0WkluZGV4KyssdC5zZXRaSW5kZXgodGhpcy5fbGFzdFpJbmRleCkpLHRoaXMuX2V4cGFuZElmTm90Q29sbGFwc2VkKCl9LF91cGRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5fY29udGFpbmVyKXJldHVybiB0aGlzO2x0KHRoaXMuX2Jhc2VMYXllcnNMaXN0KSxsdCh0aGlzLl9vdmVybGF5c0xpc3QpLHRoaXMuX2xheWVyQ29udHJvbElucHV0cz1bXTt2YXIgdCxpLGUsbixvPTA7Zm9yKGU9MDtlPHRoaXMuX2xheWVycy5sZW5ndGg7ZSsrKW49dGhpcy5fbGF5ZXJzW2VdLHRoaXMuX2FkZEl0ZW0obiksaT1pfHxuLm92ZXJsYXksdD10fHwhbi5vdmVybGF5LG8rPW4ub3ZlcmxheT8wOjE7cmV0dXJuIHRoaXMub3B0aW9ucy5oaWRlU2luZ2xlQmFzZSYmKHQ9dCYmbz4xLHRoaXMuX2Jhc2VMYXllcnNMaXN0LnN0eWxlLmRpc3BsYXk9dD9cIlwiOlwibm9uZVwiKSx0aGlzLl9zZXBhcmF0b3Iuc3R5bGUuZGlzcGxheT1pJiZ0P1wiXCI6XCJub25lXCIsdGhpc30sX29uTGF5ZXJDaGFuZ2U6ZnVuY3Rpb24odCl7dGhpcy5faGFuZGxpbmdDbGlja3x8dGhpcy5fdXBkYXRlKCk7dmFyIGk9dGhpcy5fZ2V0TGF5ZXIobih0LnRhcmdldCkpLGU9aS5vdmVybGF5P1wiYWRkXCI9PT10LnR5cGU/XCJvdmVybGF5YWRkXCI6XCJvdmVybGF5cmVtb3ZlXCI6XCJhZGRcIj09PXQudHlwZT9cImJhc2VsYXllcmNoYW5nZVwiOm51bGw7ZSYmdGhpcy5fbWFwLmZpcmUoZSxpKX0sX2NyZWF0ZVJhZGlvRWxlbWVudDpmdW5jdGlvbih0LGkpe3ZhciBlPSc8aW5wdXQgdHlwZT1cInJhZGlvXCIgY2xhc3M9XCJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzLXNlbGVjdG9yXCIgbmFtZT1cIicrdCsnXCInKyhpPycgY2hlY2tlZD1cImNoZWNrZWRcIic6XCJcIikrXCIvPlwiLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gbi5pbm5lckhUTUw9ZSxuLmZpcnN0Q2hpbGR9LF9hZGRJdGVtOmZ1bmN0aW9uKHQpe3ZhciBpLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpLG89dGhpcy5fbWFwLmhhc0xheWVyKHQubGF5ZXIpO3Qub3ZlcmxheT8oKGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpKS50eXBlPVwiY2hlY2tib3hcIixpLmNsYXNzTmFtZT1cImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2VsZWN0b3JcIixpLmRlZmF1bHRDaGVja2VkPW8pOmk9dGhpcy5fY3JlYXRlUmFkaW9FbGVtZW50KFwibGVhZmxldC1iYXNlLWxheWVyc1wiLG8pLHRoaXMuX2xheWVyQ29udHJvbElucHV0cy5wdXNoKGkpLGkubGF5ZXJJZD1uKHQubGF5ZXIpLFYoaSxcImNsaWNrXCIsdGhpcy5fb25JbnB1dENsaWNrLHRoaXMpO3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3MuaW5uZXJIVE1MPVwiIFwiK3QubmFtZTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3JldHVybiBlLmFwcGVuZENoaWxkKHIpLHIuYXBwZW5kQ2hpbGQoaSksci5hcHBlbmRDaGlsZChzKSwodC5vdmVybGF5P3RoaXMuX292ZXJsYXlzTGlzdDp0aGlzLl9iYXNlTGF5ZXJzTGlzdCkuYXBwZW5kQ2hpbGQoZSksdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycygpLGV9LF9vbklucHV0Q2xpY2s6ZnVuY3Rpb24oKXt2YXIgdCxpLGU9dGhpcy5fbGF5ZXJDb250cm9sSW5wdXRzLG49W10sbz1bXTt0aGlzLl9oYW5kbGluZ0NsaWNrPSEwO2Zvcih2YXIgcz1lLmxlbmd0aC0xO3M+PTA7cy0tKXQ9ZVtzXSxpPXRoaXMuX2dldExheWVyKHQubGF5ZXJJZCkubGF5ZXIsdC5jaGVja2VkP24ucHVzaChpKTp0LmNoZWNrZWR8fG8ucHVzaChpKTtmb3Iocz0wO3M8by5sZW5ndGg7cysrKXRoaXMuX21hcC5oYXNMYXllcihvW3NdKSYmdGhpcy5fbWFwLnJlbW92ZUxheWVyKG9bc10pO2ZvcihzPTA7czxuLmxlbmd0aDtzKyspdGhpcy5fbWFwLmhhc0xheWVyKG5bc10pfHx0aGlzLl9tYXAuYWRkTGF5ZXIobltzXSk7dGhpcy5faGFuZGxpbmdDbGljaz0hMSx0aGlzLl9yZWZvY3VzT25NYXAoKX0sX2NoZWNrRGlzYWJsZWRMYXllcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQsaSxlPXRoaXMuX2xheWVyQ29udHJvbElucHV0cyxuPXRoaXMuX21hcC5nZXRab29tKCksbz1lLmxlbmd0aC0xO28+PTA7by0tKXQ9ZVtvXSxpPXRoaXMuX2dldExheWVyKHQubGF5ZXJJZCkubGF5ZXIsdC5kaXNhYmxlZD12b2lkIDAhPT1pLm9wdGlvbnMubWluWm9vbSYmbjxpLm9wdGlvbnMubWluWm9vbXx8dm9pZCAwIT09aS5vcHRpb25zLm1heFpvb20mJm4+aS5vcHRpb25zLm1heFpvb219LF9leHBhbmRJZk5vdENvbGxhcHNlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJiF0aGlzLm9wdGlvbnMuY29sbGFwc2VkJiZ0aGlzLmV4cGFuZCgpLHRoaXN9LF9leHBhbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leHBhbmQoKX0sX2NvbGxhcHNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sbGFwc2UoKX19KSxQZT14ZS5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOlwidG9wbGVmdFwiLHpvb21JblRleHQ6XCIrXCIsem9vbUluVGl0bGU6XCJab29tIGluXCIsem9vbU91dFRleHQ6XCImI3gyMjEyO1wiLHpvb21PdXRUaXRsZTpcIlpvb20gb3V0XCJ9LG9uQWRkOmZ1bmN0aW9uKHQpe3ZhciBpPVwibGVhZmxldC1jb250cm9sLXpvb21cIixlPWh0KFwiZGl2XCIsaStcIiBsZWFmbGV0LWJhclwiKSxuPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5fem9vbUluQnV0dG9uPXRoaXMuX2NyZWF0ZUJ1dHRvbihuLnpvb21JblRleHQsbi56b29tSW5UaXRsZSxpK1wiLWluXCIsZSx0aGlzLl96b29tSW4pLHRoaXMuX3pvb21PdXRCdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG4uem9vbU91dFRleHQsbi56b29tT3V0VGl0bGUsaStcIi1vdXRcIixlLHRoaXMuX3pvb21PdXQpLHRoaXMuX3VwZGF0ZURpc2FibGVkKCksdC5vbihcInpvb21lbmQgem9vbWxldmVsc2NoYW5nZVwiLHRoaXMuX3VwZGF0ZURpc2FibGVkLHRoaXMpLGV9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3Qub2ZmKFwiem9vbWVuZCB6b29tbGV2ZWxzY2hhbmdlXCIsdGhpcy5fdXBkYXRlRGlzYWJsZWQsdGhpcyl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWQ9ITAsdGhpcy5fdXBkYXRlRGlzYWJsZWQoKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5fdXBkYXRlRGlzYWJsZWQoKSx0aGlzfSxfem9vbUluOmZ1bmN0aW9uKHQpeyF0aGlzLl9kaXNhYmxlZCYmdGhpcy5fbWFwLl96b29tPHRoaXMuX21hcC5nZXRNYXhab29tKCkmJnRoaXMuX21hcC56b29tSW4odGhpcy5fbWFwLm9wdGlvbnMuem9vbURlbHRhKih0LnNoaWZ0S2V5PzM6MSkpfSxfem9vbU91dDpmdW5jdGlvbih0KXshdGhpcy5fZGlzYWJsZWQmJnRoaXMuX21hcC5fem9vbT50aGlzLl9tYXAuZ2V0TWluWm9vbSgpJiZ0aGlzLl9tYXAuem9vbU91dCh0aGlzLl9tYXAub3B0aW9ucy56b29tRGVsdGEqKHQuc2hpZnRLZXk/MzoxKSl9LF9jcmVhdGVCdXR0b246ZnVuY3Rpb24odCxpLGUsbixvKXt2YXIgcz1odChcImFcIixlLG4pO3JldHVybiBzLmlubmVySFRNTD10LHMuaHJlZj1cIiNcIixzLnRpdGxlPWkscy5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsXCJidXR0b25cIikscy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsaSksSihzKSxWKHMsXCJjbGlja1wiLFEpLFYocyxcImNsaWNrXCIsbyx0aGlzKSxWKHMsXCJjbGlja1wiLHRoaXMuX3JlZm9jdXNPbk1hcCx0aGlzKSxzfSxfdXBkYXRlRGlzYWJsZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsaT1cImxlYWZsZXQtZGlzYWJsZWRcIjttdCh0aGlzLl96b29tSW5CdXR0b24saSksbXQodGhpcy5fem9vbU91dEJ1dHRvbixpKSwodGhpcy5fZGlzYWJsZWR8fHQuX3pvb209PT10LmdldE1pblpvb20oKSkmJnB0KHRoaXMuX3pvb21PdXRCdXR0b24saSksKHRoaXMuX2Rpc2FibGVkfHx0Ll96b29tPT09dC5nZXRNYXhab29tKCkpJiZwdCh0aGlzLl96b29tSW5CdXR0b24saSl9fSk7eWUubWVyZ2VPcHRpb25zKHt6b29tQ29udHJvbDohMH0pLHllLmFkZEluaXRIb29rKGZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnpvb21Db250cm9sJiYodGhpcy56b29tQ29udHJvbD1uZXcgUGUsdGhpcy5hZGRDb250cm9sKHRoaXMuem9vbUNvbnRyb2wpKX0pO3ZhciBiZT14ZS5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOlwiYm90dG9tbGVmdFwiLG1heFdpZHRoOjEwMCxtZXRyaWM6ITAsaW1wZXJpYWw6ITB9LG9uQWRkOmZ1bmN0aW9uKHQpe3ZhciBpPWh0KFwiZGl2XCIsXCJsZWFmbGV0LWNvbnRyb2wtc2NhbGVcIiksZT10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuX2FkZFNjYWxlcyhlLFwibGVhZmxldC1jb250cm9sLXNjYWxlLWxpbmVcIixpKSx0Lm9uKGUudXBkYXRlV2hlbklkbGU/XCJtb3ZlZW5kXCI6XCJtb3ZlXCIsdGhpcy5fdXBkYXRlLHRoaXMpLHQud2hlblJlYWR5KHRoaXMuX3VwZGF0ZSx0aGlzKSxpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZih0aGlzLm9wdGlvbnMudXBkYXRlV2hlbklkbGU/XCJtb3ZlZW5kXCI6XCJtb3ZlXCIsdGhpcy5fdXBkYXRlLHRoaXMpfSxfYWRkU2NhbGVzOmZ1bmN0aW9uKHQsaSxlKXt0Lm1ldHJpYyYmKHRoaXMuX21TY2FsZT1odChcImRpdlwiLGksZSkpLHQuaW1wZXJpYWwmJih0aGlzLl9pU2NhbGU9aHQoXCJkaXZcIixpLGUpKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxpPXQuZ2V0U2l6ZSgpLnkvMixlPXQuZGlzdGFuY2UodC5jb250YWluZXJQb2ludFRvTGF0TG5nKFswLGldKSx0LmNvbnRhaW5lclBvaW50VG9MYXRMbmcoW3RoaXMub3B0aW9ucy5tYXhXaWR0aCxpXSkpO3RoaXMuX3VwZGF0ZVNjYWxlcyhlKX0sX3VwZGF0ZVNjYWxlczpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubWV0cmljJiZ0JiZ0aGlzLl91cGRhdGVNZXRyaWModCksdGhpcy5vcHRpb25zLmltcGVyaWFsJiZ0JiZ0aGlzLl91cGRhdGVJbXBlcmlhbCh0KX0sX3VwZGF0ZU1ldHJpYzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9nZXRSb3VuZE51bSh0KSxlPWk8MWUzP2krXCIgbVwiOmkvMWUzK1wiIGttXCI7dGhpcy5fdXBkYXRlU2NhbGUodGhpcy5fbVNjYWxlLGUsaS90KX0sX3VwZGF0ZUltcGVyaWFsOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbixvPTMuMjgwODM5OSp0O28+NTI4MD8oaT1vLzUyODAsZT10aGlzLl9nZXRSb3VuZE51bShpKSx0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9pU2NhbGUsZStcIiBtaVwiLGUvaSkpOihuPXRoaXMuX2dldFJvdW5kTnVtKG8pLHRoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX2lTY2FsZSxuK1wiIGZ0XCIsbi9vKSl9LF91cGRhdGVTY2FsZTpmdW5jdGlvbih0LGksZSl7dC5zdHlsZS53aWR0aD1NYXRoLnJvdW5kKHRoaXMub3B0aW9ucy5tYXhXaWR0aCplKStcInB4XCIsdC5pbm5lckhUTUw9aX0sX2dldFJvdW5kTnVtOmZ1bmN0aW9uKHQpe3ZhciBpPU1hdGgucG93KDEwLChNYXRoLmZsb29yKHQpK1wiXCIpLmxlbmd0aC0xKSxlPXQvaTtyZXR1cm4gZT1lPj0xMD8xMDplPj01PzU6ZT49Mz8zOmU+PTI/MjoxLGkqZX19KSxUZT14ZS5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOlwiYm90dG9tcmlnaHRcIixwcmVmaXg6JzxhIGhyZWY9XCJodHRwOi8vbGVhZmxldGpzLmNvbVwiIHRpdGxlPVwiQSBKUyBsaWJyYXJ5IGZvciBpbnRlcmFjdGl2ZSBtYXBzXCI+TGVhZmxldDwvYT4nfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2wodGhpcyx0KSx0aGlzLl9hdHRyaWJ1dGlvbnM9e319LG9uQWRkOmZ1bmN0aW9uKHQpe3QuYXR0cmlidXRpb25Db250cm9sPXRoaXMsdGhpcy5fY29udGFpbmVyPWh0KFwiZGl2XCIsXCJsZWFmbGV0LWNvbnRyb2wtYXR0cmlidXRpb25cIiksSih0aGlzLl9jb250YWluZXIpO2Zvcih2YXIgaSBpbiB0Ll9sYXllcnMpdC5fbGF5ZXJzW2ldLmdldEF0dHJpYnV0aW9uJiZ0aGlzLmFkZEF0dHJpYnV0aW9uKHQuX2xheWVyc1tpXS5nZXRBdHRyaWJ1dGlvbigpKTtyZXR1cm4gdGhpcy5fdXBkYXRlKCksdGhpcy5fY29udGFpbmVyfSxzZXRQcmVmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wcmVmaXg9dCx0aGlzLl91cGRhdGUoKSx0aGlzfSxhZGRBdHRyaWJ1dGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdD8odGhpcy5fYXR0cmlidXRpb25zW3RdfHwodGhpcy5fYXR0cmlidXRpb25zW3RdPTApLHRoaXMuX2F0dHJpYnV0aW9uc1t0XSsrLHRoaXMuX3VwZGF0ZSgpLHRoaXMpOnRoaXN9LHJlbW92ZUF0dHJpYnV0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0Pyh0aGlzLl9hdHRyaWJ1dGlvbnNbdF0mJih0aGlzLl9hdHRyaWJ1dGlvbnNbdF0tLSx0aGlzLl91cGRhdGUoKSksdGhpcyk6dGhpc30sX3VwZGF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX21hcCl7dmFyIHQ9W107Zm9yKHZhciBpIGluIHRoaXMuX2F0dHJpYnV0aW9ucyl0aGlzLl9hdHRyaWJ1dGlvbnNbaV0mJnQucHVzaChpKTt2YXIgZT1bXTt0aGlzLm9wdGlvbnMucHJlZml4JiZlLnB1c2godGhpcy5vcHRpb25zLnByZWZpeCksdC5sZW5ndGgmJmUucHVzaCh0LmpvaW4oXCIsIFwiKSksdGhpcy5fY29udGFpbmVyLmlubmVySFRNTD1lLmpvaW4oXCIgfCBcIil9fX0pO3llLm1lcmdlT3B0aW9ucyh7YXR0cmlidXRpb25Db250cm9sOiEwfSkseWUuYWRkSW5pdEhvb2soZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXR0cmlidXRpb25Db250cm9sJiYobmV3IFRlKS5hZGRUbyh0aGlzKX0pO3hlLkxheWVycz1MZSx4ZS5ab29tPVBlLHhlLlNjYWxlPWJlLHhlLkF0dHJpYnV0aW9uPVRlLHdlLmxheWVycz1mdW5jdGlvbih0LGksZSl7cmV0dXJuIG5ldyBMZSh0LGksZSl9LHdlLnpvb209ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBQZSh0KX0sd2Uuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBiZSh0KX0sd2UuYXR0cmlidXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBUZSh0KX07dmFyIHplLE1lPXYuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10fSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW5hYmxlZD90aGlzOih0aGlzLl9lbmFibGVkPSEwLHRoaXMuYWRkSG9va3MoKSx0aGlzKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmFibGVkPyh0aGlzLl9lbmFibGVkPSExLHRoaXMucmVtb3ZlSG9va3MoKSx0aGlzKTp0aGlzfSxlbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9lbmFibGVkfX0pLENlPXtFdmVudHM6aGl9LFplPUhpP1widG91Y2hzdGFydCBtb3VzZWRvd25cIjpcIm1vdXNlZG93blwiLEVlPXttb3VzZWRvd246XCJtb3VzZXVwXCIsdG91Y2hzdGFydDpcInRvdWNoZW5kXCIscG9pbnRlcmRvd246XCJ0b3VjaGVuZFwiLE1TUG9pbnRlckRvd246XCJ0b3VjaGVuZFwifSxTZT17bW91c2Vkb3duOlwibW91c2Vtb3ZlXCIsdG91Y2hzdGFydDpcInRvdWNobW92ZVwiLHBvaW50ZXJkb3duOlwidG91Y2htb3ZlXCIsTVNQb2ludGVyRG93bjpcInRvdWNobW92ZVwifSxrZT11aS5leHRlbmQoe29wdGlvbnM6e2NsaWNrVG9sZXJhbmNlOjN9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpLGUsbil7bCh0aGlzLG4pLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9kcmFnU3RhcnRUYXJnZXQ9aXx8dCx0aGlzLl9wcmV2ZW50T3V0bGluZT1lfSxlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLl9lbmFibGVkfHwoVih0aGlzLl9kcmFnU3RhcnRUYXJnZXQsWmUsdGhpcy5fb25Eb3duLHRoaXMpLHRoaXMuX2VuYWJsZWQ9ITApfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZW5hYmxlZCYmKGtlLl9kcmFnZ2luZz09PXRoaXMmJnRoaXMuZmluaXNoRHJhZygpLEcodGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0LFplLHRoaXMuX29uRG93bix0aGlzKSx0aGlzLl9lbmFibGVkPSExLHRoaXMuX21vdmVkPSExKX0sX29uRG93bjpmdW5jdGlvbih0KXtpZighdC5fc2ltdWxhdGVkJiZ0aGlzLl9lbmFibGVkJiYodGhpcy5fbW92ZWQ9ITEsIWR0KHRoaXMuX2VsZW1lbnQsXCJsZWFmbGV0LXpvb20tYW5pbVwiKSYmIShrZS5fZHJhZ2dpbmd8fHQuc2hpZnRLZXl8fDEhPT10LndoaWNoJiYxIT09dC5idXR0b24mJiF0LnRvdWNoZXN8fChrZS5fZHJhZ2dpbmc9dGhpcyx0aGlzLl9wcmV2ZW50T3V0bGluZSYmenQodGhpcy5fZWxlbWVudCksYnQoKSxwaSgpLHRoaXMuX21vdmluZykpKSl7dGhpcy5maXJlKFwiZG93blwiKTt2YXIgaT10LnRvdWNoZXM/dC50b3VjaGVzWzBdOnQ7dGhpcy5fc3RhcnRQb2ludD1uZXcgeChpLmNsaWVudFgsaS5jbGllbnRZKSxWKGRvY3VtZW50LFNlW3QudHlwZV0sdGhpcy5fb25Nb3ZlLHRoaXMpLFYoZG9jdW1lbnQsRWVbdC50eXBlXSx0aGlzLl9vblVwLHRoaXMpfX0sX29uTW92ZTpmdW5jdGlvbih0KXtpZighdC5fc2ltdWxhdGVkJiZ0aGlzLl9lbmFibGVkKWlmKHQudG91Y2hlcyYmdC50b3VjaGVzLmxlbmd0aD4xKXRoaXMuX21vdmVkPSEwO2Vsc2V7dmFyIGk9dC50b3VjaGVzJiYxPT09dC50b3VjaGVzLmxlbmd0aD90LnRvdWNoZXNbMF06dCxlPW5ldyB4KGkuY2xpZW50WCxpLmNsaWVudFkpLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9pbnQpOyhlLnh8fGUueSkmJihNYXRoLmFicyhlLngpK01hdGguYWJzKGUueSk8dGhpcy5vcHRpb25zLmNsaWNrVG9sZXJhbmNlfHwoJCh0KSx0aGlzLl9tb3ZlZHx8KHRoaXMuZmlyZShcImRyYWdzdGFydFwiKSx0aGlzLl9tb3ZlZD0hMCx0aGlzLl9zdGFydFBvcz1QdCh0aGlzLl9lbGVtZW50KS5zdWJ0cmFjdChlKSxwdChkb2N1bWVudC5ib2R5LFwibGVhZmxldC1kcmFnZ2luZ1wiKSx0aGlzLl9sYXN0VGFyZ2V0PXQudGFyZ2V0fHx0LnNyY0VsZW1lbnQsd2luZG93LlNWR0VsZW1lbnRJbnN0YW5jZSYmdGhpcy5fbGFzdFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnRJbnN0YW5jZSYmKHRoaXMuX2xhc3RUYXJnZXQ9dGhpcy5fbGFzdFRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkscHQodGhpcy5fbGFzdFRhcmdldCxcImxlYWZsZXQtZHJhZy10YXJnZXRcIikpLHRoaXMuX25ld1Bvcz10aGlzLl9zdGFydFBvcy5hZGQoZSksdGhpcy5fbW92aW5nPSEwLGcodGhpcy5fYW5pbVJlcXVlc3QpLHRoaXMuX2xhc3RFdmVudD10LHRoaXMuX2FuaW1SZXF1ZXN0PWYodGhpcy5fdXBkYXRlUG9zaXRpb24sdGhpcywhMCkpKX19LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXtvcmlnaW5hbEV2ZW50OnRoaXMuX2xhc3RFdmVudH07dGhpcy5maXJlKFwicHJlZHJhZ1wiLHQpLEx0KHRoaXMuX2VsZW1lbnQsdGhpcy5fbmV3UG9zKSx0aGlzLmZpcmUoXCJkcmFnXCIsdCl9LF9vblVwOmZ1bmN0aW9uKHQpeyF0Ll9zaW11bGF0ZWQmJnRoaXMuX2VuYWJsZWQmJnRoaXMuZmluaXNoRHJhZygpfSxmaW5pc2hEcmFnOmZ1bmN0aW9uKCl7bXQoZG9jdW1lbnQuYm9keSxcImxlYWZsZXQtZHJhZ2dpbmdcIiksdGhpcy5fbGFzdFRhcmdldCYmKG10KHRoaXMuX2xhc3RUYXJnZXQsXCJsZWFmbGV0LWRyYWctdGFyZ2V0XCIpLHRoaXMuX2xhc3RUYXJnZXQ9bnVsbCk7Zm9yKHZhciB0IGluIFNlKUcoZG9jdW1lbnQsU2VbdF0sdGhpcy5fb25Nb3ZlLHRoaXMpLEcoZG9jdW1lbnQsRWVbdF0sdGhpcy5fb25VcCx0aGlzKTtUdCgpLG1pKCksdGhpcy5fbW92ZWQmJnRoaXMuX21vdmluZyYmKGcodGhpcy5fYW5pbVJlcXVlc3QpLHRoaXMuZmlyZShcImRyYWdlbmRcIix7ZGlzdGFuY2U6dGhpcy5fbmV3UG9zLmRpc3RhbmNlVG8odGhpcy5fc3RhcnRQb3MpfSkpLHRoaXMuX21vdmluZz0hMSxrZS5fZHJhZ2dpbmc9ITF9fSksQmU9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe3NpbXBsaWZ5OkN0LHBvaW50VG9TZWdtZW50RGlzdGFuY2U6WnQsY2xvc2VzdFBvaW50T25TZWdtZW50OmZ1bmN0aW9uKHQsaSxlKXtyZXR1cm4gUnQodCxpLGUpfSxjbGlwU2VnbWVudDpCdCxfZ2V0RWRnZUludGVyc2VjdGlvbjpJdCxfZ2V0Qml0Q29kZTpBdCxfc3FDbG9zZXN0UG9pbnRPblNlZ21lbnQ6UnQsaXNGbGF0OkR0LF9mbGF0Ok50fSksSWU9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe2NsaXBQb2x5Z29uOmp0fSksQWU9e3Byb2plY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KHQubG5nLHQubGF0KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgTSh0LnksdC54KX0sYm91bmRzOm5ldyBQKFstMTgwLC05MF0sWzE4MCw5MF0pfSxPZT17Ujo2Mzc4MTM3LFJfTUlOT1I6NjM1Njc1Mi4zMTQyNDUxNzksYm91bmRzOm5ldyBQKFstMjAwMzc1MDguMzQyNzksLTE1NDk2NTcwLjczOTcyXSxbMjAwMzc1MDguMzQyNzksMTg3NjQ2NTYuMjMxMzhdKSxwcm9qZWN0OmZ1bmN0aW9uKHQpe3ZhciBpPU1hdGguUEkvMTgwLGU9dGhpcy5SLG49dC5sYXQqaSxvPXRoaXMuUl9NSU5PUi9lLHM9TWF0aC5zcXJ0KDEtbypvKSxyPXMqTWF0aC5zaW4obiksYT1NYXRoLnRhbihNYXRoLlBJLzQtbi8yKS9NYXRoLnBvdygoMS1yKS8oMStyKSxzLzIpO3JldHVybiBuPS1lKk1hdGgubG9nKE1hdGgubWF4KGEsMWUtMTApKSxuZXcgeCh0LmxuZyppKmUsbil9LHVucHJvamVjdDpmdW5jdGlvbih0KXtmb3IodmFyIGksZT0xODAvTWF0aC5QSSxuPXRoaXMuUixvPXRoaXMuUl9NSU5PUi9uLHM9TWF0aC5zcXJ0KDEtbypvKSxyPU1hdGguZXhwKC10LnkvbiksYT1NYXRoLlBJLzItMipNYXRoLmF0YW4ociksaD0wLHU9LjE7aDwxNSYmTWF0aC5hYnModSk+MWUtNztoKyspaT1zKk1hdGguc2luKGEpLGk9TWF0aC5wb3coKDEtaSkvKDEraSkscy8yKSxhKz11PU1hdGguUEkvMi0yKk1hdGguYXRhbihyKmkpLWE7cmV0dXJuIG5ldyBNKGEqZSx0LngqZS9uKX19LFJlPShPYmplY3QuZnJlZXplfHxPYmplY3QpKHtMb25MYXQ6QWUsTWVyY2F0b3I6T2UsU3BoZXJpY2FsTWVyY2F0b3I6X2l9KSxEZT1pKHt9LGNpLHtjb2RlOlwiRVBTRzozMzk1XCIscHJvamVjdGlvbjpPZSx0cmFuc2Zvcm1hdGlvbjpmdW5jdGlvbigpe3ZhciB0PS41LyhNYXRoLlBJKk9lLlIpO3JldHVybiBFKHQsLjUsLXQsLjUpfSgpfSksTmU9aSh7fSxjaSx7Y29kZTpcIkVQU0c6NDMyNlwiLHByb2plY3Rpb246QWUsdHJhbnNmb3JtYXRpb246RSgxLzE4MCwxLC0xLzE4MCwuNSl9KSxqZT1pKHt9LGxpLHtwcm9qZWN0aW9uOkFlLHRyYW5zZm9ybWF0aW9uOkUoMSwwLC0xLDApLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfSx6b29tOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLkxOMn0sZGlzdGFuY2U6ZnVuY3Rpb24odCxpKXt2YXIgZT1pLmxuZy10LmxuZyxuPWkubGF0LXQubGF0O3JldHVybiBNYXRoLnNxcnQoZSplK24qbil9LGluZmluaXRlOiEwfSk7bGkuRWFydGg9Y2ksbGkuRVBTRzMzOTU9RGUsbGkuRVBTRzM4NTc9Z2ksbGkuRVBTRzkwMDkxMz12aSxsaS5FUFNHNDMyNj1OZSxsaS5TaW1wbGU9amU7dmFyIFdlPXVpLmV4dGVuZCh7b3B0aW9uczp7cGFuZTpcIm92ZXJsYXlQYW5lXCIsYXR0cmlidXRpb246bnVsbCxidWJibGluZ01vdXNlRXZlbnRzOiEwfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRMYXllcih0aGlzKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmVGcm9tKHRoaXMuX21hcHx8dGhpcy5fbWFwVG9BZGQpfSxyZW1vdmVGcm9tOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0LnJlbW92ZUxheWVyKHRoaXMpLHRoaXN9LGdldFBhbmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcC5nZXRQYW5lKHQ/dGhpcy5vcHRpb25zW3RdfHx0OnRoaXMub3B0aW9ucy5wYW5lKX0sYWRkSW50ZXJhY3RpdmVUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcC5fdGFyZ2V0c1tuKHQpXT10aGlzLHRoaXN9LHJlbW92ZUludGVyYWN0aXZlVGFyZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBkZWxldGUgdGhpcy5fbWFwLl90YXJnZXRzW24odCldLHRoaXN9LGdldEF0dHJpYnV0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbn0sX2xheWVyQWRkOmZ1bmN0aW9uKHQpe3ZhciBpPXQudGFyZ2V0O2lmKGkuaGFzTGF5ZXIodGhpcykpe2lmKHRoaXMuX21hcD1pLHRoaXMuX3pvb21BbmltYXRlZD1pLl96b29tQW5pbWF0ZWQsdGhpcy5nZXRFdmVudHMpe3ZhciBlPXRoaXMuZ2V0RXZlbnRzKCk7aS5vbihlLHRoaXMpLHRoaXMub25jZShcInJlbW92ZVwiLGZ1bmN0aW9uKCl7aS5vZmYoZSx0aGlzKX0sdGhpcyl9dGhpcy5vbkFkZChpKSx0aGlzLmdldEF0dHJpYnV0aW9uJiZpLmF0dHJpYnV0aW9uQ29udHJvbCYmaS5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24odGhpcy5nZXRBdHRyaWJ1dGlvbigpKSx0aGlzLmZpcmUoXCJhZGRcIiksaS5maXJlKFwibGF5ZXJhZGRcIix7bGF5ZXI6dGhpc30pfX19KTt5ZS5pbmNsdWRlKHthZGRMYXllcjpmdW5jdGlvbih0KXtpZighdC5fbGF5ZXJBZGQpdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIG9iamVjdCBpcyBub3QgYSBMYXllci5cIik7dmFyIGk9bih0KTtyZXR1cm4gdGhpcy5fbGF5ZXJzW2ldP3RoaXM6KHRoaXMuX2xheWVyc1tpXT10LHQuX21hcFRvQWRkPXRoaXMsdC5iZWZvcmVBZGQmJnQuYmVmb3JlQWRkKHRoaXMpLHRoaXMud2hlblJlYWR5KHQuX2xheWVyQWRkLHQpLHRoaXMpfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgaT1uKHQpO3JldHVybiB0aGlzLl9sYXllcnNbaV0/KHRoaXMuX2xvYWRlZCYmdC5vblJlbW92ZSh0aGlzKSx0LmdldEF0dHJpYnV0aW9uJiZ0aGlzLmF0dHJpYnV0aW9uQ29udHJvbCYmdGhpcy5hdHRyaWJ1dGlvbkNvbnRyb2wucmVtb3ZlQXR0cmlidXRpb24odC5nZXRBdHRyaWJ1dGlvbigpKSxkZWxldGUgdGhpcy5fbGF5ZXJzW2ldLHRoaXMuX2xvYWRlZCYmKHRoaXMuZmlyZShcImxheWVycmVtb3ZlXCIse2xheWVyOnR9KSx0LmZpcmUoXCJyZW1vdmVcIikpLHQuX21hcD10Ll9tYXBUb0FkZD1udWxsLHRoaXMpOnRoaXN9LGhhc0xheWVyOmZ1bmN0aW9uKHQpe3JldHVybiEhdCYmbih0KWluIHRoaXMuX2xheWVyc30sZWFjaExheWVyOmZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlIGluIHRoaXMuX2xheWVycyl0LmNhbGwoaSx0aGlzLl9sYXllcnNbZV0pO3JldHVybiB0aGlzfSxfYWRkTGF5ZXJzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgaT0wLGU9KHQ9dD9laSh0KT90Olt0XTpbXSkubGVuZ3RoO2k8ZTtpKyspdGhpcy5hZGRMYXllcih0W2ldKX0sX2FkZFpvb21MaW1pdDpmdW5jdGlvbih0KXshaXNOYU4odC5vcHRpb25zLm1heFpvb20pJiZpc05hTih0Lm9wdGlvbnMubWluWm9vbSl8fCh0aGlzLl96b29tQm91bmRMYXllcnNbbih0KV09dCx0aGlzLl91cGRhdGVab29tTGV2ZWxzKCkpfSxfcmVtb3ZlWm9vbUxpbWl0OmZ1bmN0aW9uKHQpe3ZhciBpPW4odCk7dGhpcy5fem9vbUJvdW5kTGF5ZXJzW2ldJiYoZGVsZXRlIHRoaXMuX3pvb21Cb3VuZExheWVyc1tpXSx0aGlzLl91cGRhdGVab29tTGV2ZWxzKCkpfSxfdXBkYXRlWm9vbUxldmVsczpmdW5jdGlvbigpe3ZhciB0PTEvMCxpPS0xLzAsZT10aGlzLl9nZXRab29tU3BhbigpO2Zvcih2YXIgbiBpbiB0aGlzLl96b29tQm91bmRMYXllcnMpe3ZhciBvPXRoaXMuX3pvb21Cb3VuZExheWVyc1tuXS5vcHRpb25zO3Q9dm9pZCAwPT09by5taW5ab29tP3Q6TWF0aC5taW4odCxvLm1pblpvb20pLGk9dm9pZCAwPT09by5tYXhab29tP2k6TWF0aC5tYXgoaSxvLm1heFpvb20pfXRoaXMuX2xheWVyc01heFpvb209aT09PS0xLzA/dm9pZCAwOmksdGhpcy5fbGF5ZXJzTWluWm9vbT10PT09MS8wP3ZvaWQgMDp0LGUhPT10aGlzLl9nZXRab29tU3BhbigpJiZ0aGlzLmZpcmUoXCJ6b29tbGV2ZWxzY2hhbmdlXCIpLHZvaWQgMD09PXRoaXMub3B0aW9ucy5tYXhab29tJiZ0aGlzLl9sYXllcnNNYXhab29tJiZ0aGlzLmdldFpvb20oKT50aGlzLl9sYXllcnNNYXhab29tJiZ0aGlzLnNldFpvb20odGhpcy5fbGF5ZXJzTWF4Wm9vbSksdm9pZCAwPT09dGhpcy5vcHRpb25zLm1pblpvb20mJnRoaXMuX2xheWVyc01pblpvb20mJnRoaXMuZ2V0Wm9vbSgpPHRoaXMuX2xheWVyc01pblpvb20mJnRoaXMuc2V0Wm9vbSh0aGlzLl9sYXllcnNNaW5ab29tKX19KTt2YXIgSGU9V2UuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX2xheWVycz17fTt2YXIgaSxlO2lmKHQpZm9yKGk9MCxlPXQubGVuZ3RoO2k8ZTtpKyspdGhpcy5hZGRMYXllcih0W2ldKX0sYWRkTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5nZXRMYXllcklkKHQpO3JldHVybiB0aGlzLl9sYXllcnNbaV09dCx0aGlzLl9tYXAmJnRoaXMuX21hcC5hZGRMYXllcih0KSx0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgaT10IGluIHRoaXMuX2xheWVycz90OnRoaXMuZ2V0TGF5ZXJJZCh0KTtyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9sYXllcnNbaV0mJnRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9sYXllcnNbaV0pLGRlbGV0ZSB0aGlzLl9sYXllcnNbaV0sdGhpc30saGFzTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuISF0JiYodCBpbiB0aGlzLl9sYXllcnN8fHRoaXMuZ2V0TGF5ZXJJZCh0KWluIHRoaXMuX2xheWVycyl9LGNsZWFyTGF5ZXJzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2xheWVycyl0aGlzLnJlbW92ZUxheWVyKHRoaXMuX2xheWVyc1t0XSk7cmV0dXJuIHRoaXN9LGludm9rZTpmdW5jdGlvbih0KXt2YXIgaSxlLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2ZvcihpIGluIHRoaXMuX2xheWVycykoZT10aGlzLl9sYXllcnNbaV0pW3RdJiZlW3RdLmFwcGx5KGUsbik7cmV0dXJuIHRoaXN9LG9uQWRkOmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSBpbiB0aGlzLl9sYXllcnMpdC5hZGRMYXllcih0aGlzLl9sYXllcnNbaV0pfSxvblJlbW92ZTpmdW5jdGlvbih0KXtmb3IodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKXQucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2ldKX0sZWFjaExheWVyOmZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlIGluIHRoaXMuX2xheWVycyl0LmNhbGwoaSx0aGlzLl9sYXllcnNbZV0pO3JldHVybiB0aGlzfSxnZXRMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF5ZXJzW3RdfSxnZXRMYXllcnM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKXQucHVzaCh0aGlzLl9sYXllcnNbaV0pO3JldHVybiB0fSxzZXRaSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52b2tlKFwic2V0WkluZGV4XCIsdCl9LGdldExheWVySWQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9fSksRmU9SGUuZXh0ZW5kKHthZGRMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXNMYXllcih0KT90aGlzOih0LmFkZEV2ZW50UGFyZW50KHRoaXMpLEhlLnByb3RvdHlwZS5hZGRMYXllci5jYWxsKHRoaXMsdCksdGhpcy5maXJlKFwibGF5ZXJhZGRcIix7bGF5ZXI6dH0pKX0scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGFzTGF5ZXIodCk/KHQgaW4gdGhpcy5fbGF5ZXJzJiYodD10aGlzLl9sYXllcnNbdF0pLHQucmVtb3ZlRXZlbnRQYXJlbnQodGhpcyksSGUucHJvdG90eXBlLnJlbW92ZUxheWVyLmNhbGwodGhpcyx0KSx0aGlzLmZpcmUoXCJsYXllcnJlbW92ZVwiLHtsYXllcjp0fSkpOnRoaXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludm9rZShcInNldFN0eWxlXCIsdCl9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludm9rZShcImJyaW5nVG9Gcm9udFwiKX0sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnZva2UoXCJicmluZ1RvQmFja1wiKX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFQ7Zm9yKHZhciBpIGluIHRoaXMuX2xheWVycyl7dmFyIGU9dGhpcy5fbGF5ZXJzW2ldO3QuZXh0ZW5kKGUuZ2V0Qm91bmRzP2UuZ2V0Qm91bmRzKCk6ZS5nZXRMYXRMbmcoKSl9cmV0dXJuIHR9fSksVWU9di5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7bCh0aGlzLHQpfSxjcmVhdGVJY29uOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jcmVhdGVJY29uKFwiaWNvblwiLHQpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NyZWF0ZUljb24oXCJzaGFkb3dcIix0KX0sX2NyZWF0ZUljb246ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9nZXRJY29uVXJsKHQpO2lmKCFlKXtpZihcImljb25cIj09PXQpdGhyb3cgbmV3IEVycm9yKFwiaWNvblVybCBub3Qgc2V0IGluIEljb24gb3B0aW9ucyAoc2VlIHRoZSBkb2NzKS5cIik7cmV0dXJuIG51bGx9dmFyIG49dGhpcy5fY3JlYXRlSW1nKGUsaSYmXCJJTUdcIj09PWkudGFnTmFtZT9pOm51bGwpO3JldHVybiB0aGlzLl9zZXRJY29uU3R5bGVzKG4sdCksbn0sX3NldEljb25TdHlsZXM6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLm9wdGlvbnMsbj1lW2krXCJTaXplXCJdO1wibnVtYmVyXCI9PXR5cGVvZiBuJiYobj1bbixuXSk7dmFyIG89dyhuKSxzPXcoXCJzaGFkb3dcIj09PWkmJmUuc2hhZG93QW5jaG9yfHxlLmljb25BbmNob3J8fG8mJm8uZGl2aWRlQnkoMiwhMCkpO3QuY2xhc3NOYW1lPVwibGVhZmxldC1tYXJrZXItXCIraStcIiBcIisoZS5jbGFzc05hbWV8fFwiXCIpLHMmJih0LnN0eWxlLm1hcmdpbkxlZnQ9LXMueCtcInB4XCIsdC5zdHlsZS5tYXJnaW5Ub3A9LXMueStcInB4XCIpLG8mJih0LnN0eWxlLndpZHRoPW8ueCtcInB4XCIsdC5zdHlsZS5oZWlnaHQ9by55K1wicHhcIil9LF9jcmVhdGVJbWc6ZnVuY3Rpb24odCxpKXtyZXR1cm4gaT1pfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLGkuc3JjPXQsaX0sX2dldEljb25Vcmw6ZnVuY3Rpb24odCl7cmV0dXJuIFZpJiZ0aGlzLm9wdGlvbnNbdCtcIlJldGluYVVybFwiXXx8dGhpcy5vcHRpb25zW3QrXCJVcmxcIl19fSksVmU9VWUuZXh0ZW5kKHtvcHRpb25zOntpY29uVXJsOlwibWFya2VyLWljb24ucG5nXCIsaWNvblJldGluYVVybDpcIm1hcmtlci1pY29uLTJ4LnBuZ1wiLHNoYWRvd1VybDpcIm1hcmtlci1zaGFkb3cucG5nXCIsaWNvblNpemU6WzI1LDQxXSxpY29uQW5jaG9yOlsxMiw0MV0scG9wdXBBbmNob3I6WzEsLTM0XSx0b29sdGlwQW5jaG9yOlsxNiwtMjhdLHNoYWRvd1NpemU6WzQxLDQxXX0sX2dldEljb25Vcmw6ZnVuY3Rpb24odCl7cmV0dXJuIFZlLmltYWdlUGF0aHx8KFZlLmltYWdlUGF0aD10aGlzLl9kZXRlY3RJY29uUGF0aCgpKSwodGhpcy5vcHRpb25zLmltYWdlUGF0aHx8VmUuaW1hZ2VQYXRoKStVZS5wcm90b3R5cGUuX2dldEljb25VcmwuY2FsbCh0aGlzLHQpfSxfZGV0ZWN0SWNvblBhdGg6ZnVuY3Rpb24oKXt2YXIgdD1odChcImRpdlwiLFwibGVhZmxldC1kZWZhdWx0LWljb24tcGF0aFwiLGRvY3VtZW50LmJvZHkpLGk9YXQodCxcImJhY2tncm91bmQtaW1hZ2VcIil8fGF0KHQsXCJiYWNrZ3JvdW5kSW1hZ2VcIik7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCksaT1udWxsPT09aXx8MCE9PWkuaW5kZXhPZihcInVybFwiKT9cIlwiOmkucmVwbGFjZSgvXnVybFxcKFtcXFwiXFwnXT8vLFwiXCIpLnJlcGxhY2UoL21hcmtlci1pY29uXFwucG5nW1xcXCJcXCddP1xcKSQvLFwiXCIpfX0pLEdlPU1lLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLl9tYXJrZXI9dH0sYWRkSG9va3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXJrZXIuX2ljb247dGhpcy5fZHJhZ2dhYmxlfHwodGhpcy5fZHJhZ2dhYmxlPW5ldyBrZSh0LHQsITApKSx0aGlzLl9kcmFnZ2FibGUub24oe2RyYWdzdGFydDp0aGlzLl9vbkRyYWdTdGFydCxkcmFnOnRoaXMuX29uRHJhZyxkcmFnZW5kOnRoaXMuX29uRHJhZ0VuZH0sdGhpcykuZW5hYmxlKCkscHQodCxcImxlYWZsZXQtbWFya2VyLWRyYWdnYWJsZVwiKX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXt0aGlzLl9kcmFnZ2FibGUub2ZmKHtkcmFnc3RhcnQ6dGhpcy5fb25EcmFnU3RhcnQsZHJhZzp0aGlzLl9vbkRyYWcsZHJhZ2VuZDp0aGlzLl9vbkRyYWdFbmR9LHRoaXMpLmRpc2FibGUoKSx0aGlzLl9tYXJrZXIuX2ljb24mJm10KHRoaXMuX21hcmtlci5faWNvbixcImxlYWZsZXQtbWFya2VyLWRyYWdnYWJsZVwiKX0sbW92ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ2dhYmxlJiZ0aGlzLl9kcmFnZ2FibGUuX21vdmVkfSxfb25EcmFnU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9vbGRMYXRMbmc9dGhpcy5fbWFya2VyLmdldExhdExuZygpLHRoaXMuX21hcmtlci5jbG9zZVBvcHVwKCkuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwiZHJhZ3N0YXJ0XCIpfSxfb25EcmFnOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcmtlcixlPWkuX3NoYWRvdyxuPVB0KGkuX2ljb24pLG89aS5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhuKTtlJiZMdChlLG4pLGkuX2xhdGxuZz1vLHQubGF0bG5nPW8sdC5vbGRMYXRMbmc9dGhpcy5fb2xkTGF0TG5nLGkuZmlyZShcIm1vdmVcIix0KS5maXJlKFwiZHJhZ1wiLHQpfSxfb25EcmFnRW5kOmZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLl9vbGRMYXRMbmcsdGhpcy5fbWFya2VyLmZpcmUoXCJtb3ZlZW5kXCIpLmZpcmUoXCJkcmFnZW5kXCIsdCl9fSkscWU9V2UuZXh0ZW5kKHtvcHRpb25zOntpY29uOm5ldyBWZSxpbnRlcmFjdGl2ZTohMCxkcmFnZ2FibGU6ITEsa2V5Ym9hcmQ6ITAsdGl0bGU6XCJcIixhbHQ6XCJcIix6SW5kZXhPZmZzZXQ6MCxvcGFjaXR5OjEscmlzZU9uSG92ZXI6ITEscmlzZU9mZnNldDoyNTAscGFuZTpcIm1hcmtlclBhbmVcIixidWJibGluZ01vdXNlRXZlbnRzOiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7bCh0aGlzLGkpLHRoaXMuX2xhdGxuZz1DKHQpfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl96b29tQW5pbWF0ZWQ9dGhpcy5fem9vbUFuaW1hdGVkJiZ0Lm9wdGlvbnMubWFya2VyWm9vbUFuaW1hdGlvbix0aGlzLl96b29tQW5pbWF0ZWQmJnQub24oXCJ6b29tYW5pbVwiLHRoaXMuX2FuaW1hdGVab29tLHRoaXMpLHRoaXMuX2luaXRJY29uKCksdGhpcy51cGRhdGUoKX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5kcmFnZ2luZyYmdGhpcy5kcmFnZ2luZy5lbmFibGVkKCkmJih0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlPSEwLHRoaXMuZHJhZ2dpbmcucmVtb3ZlSG9va3MoKSksZGVsZXRlIHRoaXMuZHJhZ2dpbmcsdGhpcy5fem9vbUFuaW1hdGVkJiZ0Lm9mZihcInpvb21hbmltXCIsdGhpcy5fYW5pbWF0ZVpvb20sdGhpcyksdGhpcy5fcmVtb3ZlSWNvbigpLHRoaXMuX3JlbW92ZVNoYWRvdygpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXtyZXR1cm57em9vbTp0aGlzLnVwZGF0ZSx2aWV3cmVzZXQ6dGhpcy51cGRhdGV9fSxnZXRMYXRMbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbGF0bG5nO3JldHVybiB0aGlzLl9sYXRsbmc9Qyh0KSx0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZShcIm1vdmVcIix7b2xkTGF0TG5nOmksbGF0bG5nOnRoaXMuX2xhdGxuZ30pfSxzZXRaSW5kZXhPZmZzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy56SW5kZXhPZmZzZXQ9dCx0aGlzLnVwZGF0ZSgpfSxzZXRJY29uOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuaWNvbj10LHRoaXMuX21hcCYmKHRoaXMuX2luaXRJY29uKCksdGhpcy51cGRhdGUoKSksdGhpcy5fcG9wdXAmJnRoaXMuYmluZFBvcHVwKHRoaXMuX3BvcHVwLHRoaXMuX3BvcHVwLm9wdGlvbnMpLHRoaXN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbn0sdXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5faWNvbil7dmFyIHQ9dGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpLnJvdW5kKCk7dGhpcy5fc2V0UG9zKHQpfXJldHVybiB0aGlzfSxfaW5pdEljb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsaT1cImxlYWZsZXQtem9vbS1cIisodGhpcy5fem9vbUFuaW1hdGVkP1wiYW5pbWF0ZWRcIjpcImhpZGVcIiksZT10Lmljb24uY3JlYXRlSWNvbih0aGlzLl9pY29uKSxuPSExO2UhPT10aGlzLl9pY29uJiYodGhpcy5faWNvbiYmdGhpcy5fcmVtb3ZlSWNvbigpLG49ITAsdC50aXRsZSYmKGUudGl0bGU9dC50aXRsZSksdC5hbHQmJihlLmFsdD10LmFsdCkpLHB0KGUsaSksdC5rZXlib2FyZCYmKGUudGFiSW5kZXg9XCIwXCIpLHRoaXMuX2ljb249ZSx0LnJpc2VPbkhvdmVyJiZ0aGlzLm9uKHttb3VzZW92ZXI6dGhpcy5fYnJpbmdUb0Zyb250LG1vdXNlb3V0OnRoaXMuX3Jlc2V0WkluZGV4fSk7dmFyIG89dC5pY29uLmNyZWF0ZVNoYWRvdyh0aGlzLl9zaGFkb3cpLHM9ITE7byE9PXRoaXMuX3NoYWRvdyYmKHRoaXMuX3JlbW92ZVNoYWRvdygpLHM9ITApLG8mJihwdChvLGkpLG8uYWx0PVwiXCIpLHRoaXMuX3NoYWRvdz1vLHQub3BhY2l0eTwxJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCksbiYmdGhpcy5nZXRQYW5lKCkuYXBwZW5kQ2hpbGQodGhpcy5faWNvbiksdGhpcy5faW5pdEludGVyYWN0aW9uKCksbyYmcyYmdGhpcy5nZXRQYW5lKFwic2hhZG93UGFuZVwiKS5hcHBlbmRDaGlsZCh0aGlzLl9zaGFkb3cpfSxfcmVtb3ZlSWNvbjpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5yaXNlT25Ib3ZlciYmdGhpcy5vZmYoe21vdXNlb3Zlcjp0aGlzLl9icmluZ1RvRnJvbnQsbW91c2VvdXQ6dGhpcy5fcmVzZXRaSW5kZXh9KSx1dCh0aGlzLl9pY29uKSx0aGlzLnJlbW92ZUludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2ljb24pLHRoaXMuX2ljb249bnVsbH0sX3JlbW92ZVNoYWRvdzpmdW5jdGlvbigpe3RoaXMuX3NoYWRvdyYmdXQodGhpcy5fc2hhZG93KSx0aGlzLl9zaGFkb3c9bnVsbH0sX3NldFBvczpmdW5jdGlvbih0KXtMdCh0aGlzLl9pY29uLHQpLHRoaXMuX3NoYWRvdyYmTHQodGhpcy5fc2hhZG93LHQpLHRoaXMuX3pJbmRleD10LnkrdGhpcy5vcHRpb25zLnpJbmRleE9mZnNldCx0aGlzLl9yZXNldFpJbmRleCgpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuX2ljb24uc3R5bGUuekluZGV4PXRoaXMuX3pJbmRleCt0fSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlcikucm91bmQoKTt0aGlzLl9zZXRQb3MoaSl9LF9pbml0SW50ZXJhY3Rpb246ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUmJihwdCh0aGlzLl9pY29uLFwibGVhZmxldC1pbnRlcmFjdGl2ZVwiKSx0aGlzLmFkZEludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2ljb24pLEdlKSl7dmFyIHQ9dGhpcy5vcHRpb25zLmRyYWdnYWJsZTt0aGlzLmRyYWdnaW5nJiYodD10aGlzLmRyYWdnaW5nLmVuYWJsZWQoKSx0aGlzLmRyYWdnaW5nLmRpc2FibGUoKSksdGhpcy5kcmFnZ2luZz1uZXcgR2UodGhpcyksdCYmdGhpcy5kcmFnZ2luZy5lbmFibGUoKX19LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5fbWFwJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCksdGhpc30sX3VwZGF0ZU9wYWNpdHk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3BhY2l0eTt2dCh0aGlzLl9pY29uLHQpLHRoaXMuX3NoYWRvdyYmdnQodGhpcy5fc2hhZG93LHQpfSxfYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWkluZGV4KHRoaXMub3B0aW9ucy5yaXNlT2Zmc2V0KX0sX3Jlc2V0WkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWkluZGV4KDApfSxfZ2V0UG9wdXBBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmljb24ub3B0aW9ucy5wb3B1cEFuY2hvcnx8WzAsMF19LF9nZXRUb29sdGlwQW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pY29uLm9wdGlvbnMudG9vbHRpcEFuY2hvcnx8WzAsMF19fSksS2U9V2UuZXh0ZW5kKHtvcHRpb25zOntzdHJva2U6ITAsY29sb3I6XCIjMzM4OGZmXCIsd2VpZ2h0OjMsb3BhY2l0eToxLGxpbmVDYXA6XCJyb3VuZFwiLGxpbmVKb2luOlwicm91bmRcIixkYXNoQXJyYXk6bnVsbCxkYXNoT2Zmc2V0Om51bGwsZmlsbDohMSxmaWxsQ29sb3I6bnVsbCxmaWxsT3BhY2l0eTouMixmaWxsUnVsZTpcImV2ZW5vZGRcIixpbnRlcmFjdGl2ZTohMCxidWJibGluZ01vdXNlRXZlbnRzOiEwfSxiZWZvcmVBZGQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVuZGVyZXI9dC5nZXRSZW5kZXJlcih0aGlzKX0sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJlci5faW5pdFBhdGgodGhpcyksdGhpcy5fcmVzZXQoKSx0aGlzLl9yZW5kZXJlci5fYWRkUGF0aCh0aGlzKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJlci5fcmVtb3ZlUGF0aCh0aGlzKX0scmVkcmF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmdGhpcy5fcmVuZGVyZXIuX3VwZGF0ZVBhdGgodGhpcyksdGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIGwodGhpcyx0KSx0aGlzLl9yZW5kZXJlciYmdGhpcy5fcmVuZGVyZXIuX3VwZGF0ZVN0eWxlKHRoaXMpLHRoaXN9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJlciYmdGhpcy5fcmVuZGVyZXIuX2JyaW5nVG9Gcm9udCh0aGlzKSx0aGlzfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJlciYmdGhpcy5fcmVuZGVyZXIuX2JyaW5nVG9CYWNrKHRoaXMpLHRoaXN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGF0aH0sX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdCgpLHRoaXMuX3VwZGF0ZSgpfSxfY2xpY2tUb2xlcmFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5vcHRpb25zLnN0cm9rZT90aGlzLm9wdGlvbnMud2VpZ2h0LzI6MCkrKEhpPzEwOjApfX0pLFllPUtlLmV4dGVuZCh7b3B0aW9uczp7ZmlsbDohMCxyYWRpdXM6MTB9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fbGF0bG5nPUModCksdGhpcy5fcmFkaXVzPXRoaXMub3B0aW9ucy5yYWRpdXN9LHNldExhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF0bG5nPUModCksdGhpcy5yZWRyYXcoKSx0aGlzLmZpcmUoXCJtb3ZlXCIse2xhdGxuZzp0aGlzLl9sYXRsbmd9KX0sZ2V0TGF0TG5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhdGxuZ30sc2V0UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMucmFkaXVzPXRoaXMuX3JhZGl1cz10LHRoaXMucmVkcmF3KCl9LGdldFJhZGl1czpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpdXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBpPXQmJnQucmFkaXVzfHx0aGlzLl9yYWRpdXM7cmV0dXJuIEtlLnByb3RvdHlwZS5zZXRTdHlsZS5jYWxsKHRoaXMsdCksdGhpcy5zZXRSYWRpdXMoaSksdGhpc30sX3Byb2plY3Q6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksdGhpcy5fdXBkYXRlQm91bmRzKCl9LF91cGRhdGVCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yYWRpdXMsaT10aGlzLl9yYWRpdXNZfHx0LGU9dGhpcy5fY2xpY2tUb2xlcmFuY2UoKSxuPVt0K2UsaStlXTt0aGlzLl9weEJvdW5kcz1uZXcgUCh0aGlzLl9wb2ludC5zdWJ0cmFjdChuKSx0aGlzLl9wb2ludC5hZGQobikpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiZ0aGlzLl91cGRhdGVQYXRoKCl9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX3VwZGF0ZUNpcmNsZSh0aGlzKX0sX2VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGl1cyYmIXRoaXMuX3JlbmRlcmVyLl9ib3VuZHMuaW50ZXJzZWN0cyh0aGlzLl9weEJvdW5kcyl9LF9jb250YWluc1BvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5fcG9pbnQpPD10aGlzLl9yYWRpdXMrdGhpcy5fY2xpY2tUb2xlcmFuY2UoKX19KSxYZT1ZZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxlLG4pe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlJiYoZT1pKHt9LG4se3JhZGl1czplfSkpLGwodGhpcyxlKSx0aGlzLl9sYXRsbmc9Qyh0KSxpc05hTih0aGlzLm9wdGlvbnMucmFkaXVzKSl0aHJvdyBuZXcgRXJyb3IoXCJDaXJjbGUgcmFkaXVzIGNhbm5vdCBiZSBOYU5cIik7dGhpcy5fbVJhZGl1cz10aGlzLm9wdGlvbnMucmFkaXVzfSxzZXRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21SYWRpdXM9dCx0aGlzLnJlZHJhdygpfSxnZXRSYWRpdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbVJhZGl1c30sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9W3RoaXMuX3JhZGl1cyx0aGlzLl9yYWRpdXNZfHx0aGlzLl9yYWRpdXNdO3JldHVybiBuZXcgVCh0aGlzLl9tYXAubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX3BvaW50LnN1YnRyYWN0KHQpKSx0aGlzLl9tYXAubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX3BvaW50LmFkZCh0KSkpfSxzZXRTdHlsZTpLZS5wcm90b3R5cGUuc2V0U3R5bGUsX3Byb2plY3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9sYXRsbmcubG5nLGk9dGhpcy5fbGF0bG5nLmxhdCxlPXRoaXMuX21hcCxuPWUub3B0aW9ucy5jcnM7aWYobi5kaXN0YW5jZT09PWNpLmRpc3RhbmNlKXt2YXIgbz1NYXRoLlBJLzE4MCxzPXRoaXMuX21SYWRpdXMvY2kuUi9vLHI9ZS5wcm9qZWN0KFtpK3MsdF0pLGE9ZS5wcm9qZWN0KFtpLXMsdF0pLGg9ci5hZGQoYSkuZGl2aWRlQnkoMiksdT1lLnVucHJvamVjdChoKS5sYXQsbD1NYXRoLmFjb3MoKE1hdGguY29zKHMqbyktTWF0aC5zaW4oaSpvKSpNYXRoLnNpbih1Km8pKS8oTWF0aC5jb3MoaSpvKSpNYXRoLmNvcyh1Km8pKSkvbzsoaXNOYU4obCl8fDA9PT1sKSYmKGw9cy9NYXRoLmNvcyhNYXRoLlBJLzE4MCppKSksdGhpcy5fcG9pbnQ9aC5zdWJ0cmFjdChlLmdldFBpeGVsT3JpZ2luKCkpLHRoaXMuX3JhZGl1cz1pc05hTihsKT8wOk1hdGgubWF4KE1hdGgucm91bmQoaC54LWUucHJvamVjdChbdSx0LWxdKS54KSwxKSx0aGlzLl9yYWRpdXNZPU1hdGgubWF4KE1hdGgucm91bmQoaC55LXIueSksMSl9ZWxzZXt2YXIgYz1uLnVucHJvamVjdChuLnByb2plY3QodGhpcy5fbGF0bG5nKS5zdWJ0cmFjdChbdGhpcy5fbVJhZGl1cywwXSkpO3RoaXMuX3BvaW50PWUubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksdGhpcy5fcmFkaXVzPXRoaXMuX3BvaW50LngtZS5sYXRMbmdUb0xheWVyUG9pbnQoYykueH10aGlzLl91cGRhdGVCb3VuZHMoKX19KSxKZT1LZS5leHRlbmQoe29wdGlvbnM6e3Ntb290aEZhY3RvcjoxLG5vQ2xpcDohMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGkpe2wodGhpcyxpKSx0aGlzLl9zZXRMYXRMbmdzKHQpfSxnZXRMYXRMbmdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhdGxuZ3N9LHNldExhdExuZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NldExhdExuZ3ModCksdGhpcy5yZWRyYXcoKX0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiF0aGlzLl9sYXRsbmdzLmxlbmd0aH0sY2xvc2VzdExheWVyUG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBpLGUsbj0xLzAsbz1udWxsLHM9UnQscj0wLGE9dGhpcy5fcGFydHMubGVuZ3RoO3I8YTtyKyspZm9yKHZhciBoPXRoaXMuX3BhcnRzW3JdLHU9MSxsPWgubGVuZ3RoO3U8bDt1Kyspe3ZhciBjPXModCxpPWhbdS0xXSxlPWhbdV0sITApO2M8biYmKG49YyxvPXModCxpLGUpKX1yZXR1cm4gbyYmKG8uZGlzdGFuY2U9TWF0aC5zcXJ0KG4pKSxvfSxnZXRDZW50ZXI6ZnVuY3Rpb24oKXtpZighdGhpcy5fbWFwKXRocm93IG5ldyBFcnJvcihcIk11c3QgYWRkIGxheWVyIHRvIG1hcCBiZWZvcmUgdXNpbmcgZ2V0Q2VudGVyKClcIik7dmFyIHQsaSxlLG4sbyxzLHIsYT10aGlzLl9yaW5nc1swXSxoPWEubGVuZ3RoO2lmKCFoKXJldHVybiBudWxsO2Zvcih0PTAsaT0wO3Q8aC0xO3QrKylpKz1hW3RdLmRpc3RhbmNlVG8oYVt0KzFdKS8yO2lmKDA9PT1pKXJldHVybiB0aGlzLl9tYXAubGF5ZXJQb2ludFRvTGF0TG5nKGFbMF0pO2Zvcih0PTAsbj0wO3Q8aC0xO3QrKylpZihvPWFbdF0scz1hW3QrMV0sZT1vLmRpc3RhbmNlVG8ocyksKG4rPWUpPmkpcmV0dXJuIHI9KG4taSkvZSx0aGlzLl9tYXAubGF5ZXJQb2ludFRvTGF0TG5nKFtzLngtcioocy54LW8ueCkscy55LXIqKHMueS1vLnkpXSl9LGdldEJvdW5kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib3VuZHN9LGFkZExhdExuZzpmdW5jdGlvbih0LGkpe3JldHVybiBpPWl8fHRoaXMuX2RlZmF1bHRTaGFwZSgpLHQ9Qyh0KSxpLnB1c2godCksdGhpcy5fYm91bmRzLmV4dGVuZCh0KSx0aGlzLnJlZHJhdygpfSxfc2V0TGF0TG5nczpmdW5jdGlvbih0KXt0aGlzLl9ib3VuZHM9bmV3IFQsdGhpcy5fbGF0bG5ncz10aGlzLl9jb252ZXJ0TGF0TG5ncyh0KX0sX2RlZmF1bHRTaGFwZTpmdW5jdGlvbigpe3JldHVybiBEdCh0aGlzLl9sYXRsbmdzKT90aGlzLl9sYXRsbmdzOnRoaXMuX2xhdGxuZ3NbMF19LF9jb252ZXJ0TGF0TG5nczpmdW5jdGlvbih0KXtmb3IodmFyIGk9W10sZT1EdCh0KSxuPTAsbz10Lmxlbmd0aDtuPG87bisrKWU/KGlbbl09Qyh0W25dKSx0aGlzLl9ib3VuZHMuZXh0ZW5kKGlbbl0pKTppW25dPXRoaXMuX2NvbnZlcnRMYXRMbmdzKHRbbl0pO3JldHVybiBpfSxfcHJvamVjdDpmdW5jdGlvbigpe3ZhciB0PW5ldyBQO3RoaXMuX3JpbmdzPVtdLHRoaXMuX3Byb2plY3RMYXRsbmdzKHRoaXMuX2xhdGxuZ3MsdGhpcy5fcmluZ3MsdCk7dmFyIGk9dGhpcy5fY2xpY2tUb2xlcmFuY2UoKSxlPW5ldyB4KGksaSk7dGhpcy5fYm91bmRzLmlzVmFsaWQoKSYmdC5pc1ZhbGlkKCkmJih0Lm1pbi5fc3VidHJhY3QoZSksdC5tYXguX2FkZChlKSx0aGlzLl9weEJvdW5kcz10KX0sX3Byb2plY3RMYXRsbmdzOmZ1bmN0aW9uKHQsaSxlKXt2YXIgbixvLHM9dFswXWluc3RhbmNlb2YgTSxyPXQubGVuZ3RoO2lmKHMpe2ZvcihvPVtdLG49MDtuPHI7bisrKW9bbl09dGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0W25dKSxlLmV4dGVuZChvW25dKTtpLnB1c2gobyl9ZWxzZSBmb3Iobj0wO248cjtuKyspdGhpcy5fcHJvamVjdExhdGxuZ3ModFtuXSxpLGUpfSxfY2xpcFBvaW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlbmRlcmVyLl9ib3VuZHM7aWYodGhpcy5fcGFydHM9W10sdGhpcy5fcHhCb3VuZHMmJnRoaXMuX3B4Qm91bmRzLmludGVyc2VjdHModCkpaWYodGhpcy5vcHRpb25zLm5vQ2xpcCl0aGlzLl9wYXJ0cz10aGlzLl9yaW5ncztlbHNle3ZhciBpLGUsbixvLHMscixhLGg9dGhpcy5fcGFydHM7Zm9yKGk9MCxuPTAsbz10aGlzLl9yaW5ncy5sZW5ndGg7aTxvO2krKylmb3IoZT0wLHM9KGE9dGhpcy5fcmluZ3NbaV0pLmxlbmd0aDtlPHMtMTtlKyspKHI9QnQoYVtlXSxhW2UrMV0sdCxlLCEwKSkmJihoW25dPWhbbl18fFtdLGhbbl0ucHVzaChyWzBdKSxyWzFdPT09YVtlKzFdJiZlIT09cy0yfHwoaFtuXS5wdXNoKHJbMV0pLG4rKykpfX0sX3NpbXBsaWZ5UG9pbnRzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3BhcnRzLGk9dGhpcy5vcHRpb25zLnNtb290aEZhY3RvcixlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRbZV09Q3QodFtlXSxpKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX2NsaXBQb2ludHMoKSx0aGlzLl9zaW1wbGlmeVBvaW50cygpLHRoaXMuX3VwZGF0ZVBhdGgoKSl9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX3VwZGF0ZVBvbHkodGhpcyl9LF9jb250YWluc1BvaW50OmZ1bmN0aW9uKHQsaSl7dmFyIGUsbixvLHMscixhLGg9dGhpcy5fY2xpY2tUb2xlcmFuY2UoKTtpZighdGhpcy5fcHhCb3VuZHN8fCF0aGlzLl9weEJvdW5kcy5jb250YWlucyh0KSlyZXR1cm4hMTtmb3IoZT0wLHM9dGhpcy5fcGFydHMubGVuZ3RoO2U8cztlKyspZm9yKG49MCxvPShyPShhPXRoaXMuX3BhcnRzW2VdKS5sZW5ndGgpLTE7bjxyO289bisrKWlmKChpfHwwIT09bikmJlp0KHQsYVtvXSxhW25dKTw9aClyZXR1cm4hMDtyZXR1cm4hMX19KTtKZS5fZmxhdD1OdDt2YXIgJGU9SmUuZXh0ZW5kKHtvcHRpb25zOntmaWxsOiEwfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2xhdGxuZ3MubGVuZ3RofHwhdGhpcy5fbGF0bG5nc1swXS5sZW5ndGh9LGdldENlbnRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLl9tYXApdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBhZGQgbGF5ZXIgdG8gbWFwIGJlZm9yZSB1c2luZyBnZXRDZW50ZXIoKVwiKTt2YXIgdCxpLGUsbixvLHMscixhLGgsdT10aGlzLl9yaW5nc1swXSxsPXUubGVuZ3RoO2lmKCFsKXJldHVybiBudWxsO2ZvcihzPXI9YT0wLHQ9MCxpPWwtMTt0PGw7aT10KyspZT11W3RdLG49dVtpXSxvPWUueSpuLngtbi55KmUueCxyKz0oZS54K24ueCkqbyxhKz0oZS55K24ueSkqbyxzKz0zKm87cmV0dXJuIGg9MD09PXM/dVswXTpbci9zLGEvc10sdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhoKX0sX2NvbnZlcnRMYXRMbmdzOmZ1bmN0aW9uKHQpe3ZhciBpPUplLnByb3RvdHlwZS5fY29udmVydExhdExuZ3MuY2FsbCh0aGlzLHQpLGU9aS5sZW5ndGg7cmV0dXJuIGU+PTImJmlbMF1pbnN0YW5jZW9mIE0mJmlbMF0uZXF1YWxzKGlbZS0xXSkmJmkucG9wKCksaX0sX3NldExhdExuZ3M6ZnVuY3Rpb24odCl7SmUucHJvdG90eXBlLl9zZXRMYXRMbmdzLmNhbGwodGhpcyx0KSxEdCh0aGlzLl9sYXRsbmdzKSYmKHRoaXMuX2xhdGxuZ3M9W3RoaXMuX2xhdGxuZ3NdKX0sX2RlZmF1bHRTaGFwZTpmdW5jdGlvbigpe3JldHVybiBEdCh0aGlzLl9sYXRsbmdzWzBdKT90aGlzLl9sYXRsbmdzWzBdOnRoaXMuX2xhdGxuZ3NbMF1bMF19LF9jbGlwUG9pbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVuZGVyZXIuX2JvdW5kcyxpPXRoaXMub3B0aW9ucy53ZWlnaHQsZT1uZXcgeChpLGkpO2lmKHQ9bmV3IFAodC5taW4uc3VidHJhY3QoZSksdC5tYXguYWRkKGUpKSx0aGlzLl9wYXJ0cz1bXSx0aGlzLl9weEJvdW5kcyYmdGhpcy5fcHhCb3VuZHMuaW50ZXJzZWN0cyh0KSlpZih0aGlzLm9wdGlvbnMubm9DbGlwKXRoaXMuX3BhcnRzPXRoaXMuX3JpbmdzO2Vsc2UgZm9yKHZhciBuLG89MCxzPXRoaXMuX3JpbmdzLmxlbmd0aDtvPHM7bysrKShuPWp0KHRoaXMuX3JpbmdzW29dLHQsITApKS5sZW5ndGgmJnRoaXMuX3BhcnRzLnB1c2gobil9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX3VwZGF0ZVBvbHkodGhpcywhMCl9LF9jb250YWluc1BvaW50OmZ1bmN0aW9uKHQpe3ZhciBpLGUsbixvLHMscixhLGgsdT0hMTtpZighdGhpcy5fcHhCb3VuZHMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKG89MCxhPXRoaXMuX3BhcnRzLmxlbmd0aDtvPGE7bysrKWZvcihzPTAscj0oaD0oaT10aGlzLl9wYXJ0c1tvXSkubGVuZ3RoKS0xO3M8aDtyPXMrKyllPWlbc10sbj1pW3JdLGUueT50LnkhPW4ueT50LnkmJnQueDwobi54LWUueCkqKHQueS1lLnkpLyhuLnktZS55KStlLngmJih1PSF1KTtyZXR1cm4gdXx8SmUucHJvdG90eXBlLl9jb250YWluc1BvaW50LmNhbGwodGhpcyx0LCEwKX19KSxRZT1GZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fbGF5ZXJzPXt9LHQmJnRoaXMuYWRkRGF0YSh0KX0sYWRkRGF0YTpmdW5jdGlvbih0KXt2YXIgaSxlLG4sbz1laSh0KT90OnQuZmVhdHVyZXM7aWYobyl7Zm9yKGk9MCxlPW8ubGVuZ3RoO2k8ZTtpKyspKChuPW9baV0pLmdlb21ldHJpZXN8fG4uZ2VvbWV0cnl8fG4uZmVhdHVyZXN8fG4uY29vcmRpbmF0ZXMpJiZ0aGlzLmFkZERhdGEobik7cmV0dXJuIHRoaXN9dmFyIHM9dGhpcy5vcHRpb25zO2lmKHMuZmlsdGVyJiYhcy5maWx0ZXIodCkpcmV0dXJuIHRoaXM7dmFyIHI9V3QodCxzKTtyZXR1cm4gcj8oci5mZWF0dXJlPXF0KHQpLHIuZGVmYXVsdE9wdGlvbnM9ci5vcHRpb25zLHRoaXMucmVzZXRTdHlsZShyKSxzLm9uRWFjaEZlYXR1cmUmJnMub25FYWNoRmVhdHVyZSh0LHIpLHRoaXMuYWRkTGF5ZXIocikpOnRoaXN9LHJlc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQub3B0aW9ucz1pKHt9LHQuZGVmYXVsdE9wdGlvbnMpLHRoaXMuX3NldExheWVyU3R5bGUodCx0aGlzLm9wdGlvbnMuc3R5bGUpLHRoaXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbihpKXt0aGlzLl9zZXRMYXllclN0eWxlKGksdCl9LHRoaXMpfSxfc2V0TGF5ZXJTdHlsZTpmdW5jdGlvbih0LGkpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGkmJihpPWkodC5mZWF0dXJlKSksdC5zZXRTdHlsZSYmdC5zZXRTdHlsZShpKX19KSx0bj17dG9HZW9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiBHdCh0aGlzLHt0eXBlOlwiUG9pbnRcIixjb29yZGluYXRlczpVdCh0aGlzLmdldExhdExuZygpLHQpfSl9fTtxZS5pbmNsdWRlKHRuKSxYZS5pbmNsdWRlKHRuKSxZZS5pbmNsdWRlKHRuKSxKZS5pbmNsdWRlKHt0b0dlb0pTT046ZnVuY3Rpb24odCl7dmFyIGk9IUR0KHRoaXMuX2xhdGxuZ3MpLGU9VnQodGhpcy5fbGF0bG5ncyxpPzE6MCwhMSx0KTtyZXR1cm4gR3QodGhpcyx7dHlwZTooaT9cIk11bHRpXCI6XCJcIikrXCJMaW5lU3RyaW5nXCIsY29vcmRpbmF0ZXM6ZX0pfX0pLCRlLmluY2x1ZGUoe3RvR2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgaT0hRHQodGhpcy5fbGF0bG5ncyksZT1pJiYhRHQodGhpcy5fbGF0bG5nc1swXSksbj1WdCh0aGlzLl9sYXRsbmdzLGU/MjppPzE6MCwhMCx0KTtyZXR1cm4gaXx8KG49W25dKSxHdCh0aGlzLHt0eXBlOihlP1wiTXVsdGlcIjpcIlwiKStcIlBvbHlnb25cIixjb29yZGluYXRlczpufSl9fSksSGUuaW5jbHVkZSh7dG9NdWx0aVBvaW50OmZ1bmN0aW9uKHQpe3ZhciBpPVtdO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbihlKXtpLnB1c2goZS50b0dlb0pTT04odCkuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpfSksR3QodGhpcyx7dHlwZTpcIk11bHRpUG9pbnRcIixjb29yZGluYXRlczppfSl9LHRvR2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmZlYXR1cmUmJnRoaXMuZmVhdHVyZS5nZW9tZXRyeSYmdGhpcy5mZWF0dXJlLmdlb21ldHJ5LnR5cGU7aWYoXCJNdWx0aVBvaW50XCI9PT1pKXJldHVybiB0aGlzLnRvTXVsdGlQb2ludCh0KTt2YXIgZT1cIkdlb21ldHJ5Q29sbGVjdGlvblwiPT09aSxuPVtdO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbihpKXtpZihpLnRvR2VvSlNPTil7dmFyIG89aS50b0dlb0pTT04odCk7aWYoZSluLnB1c2goby5nZW9tZXRyeSk7ZWxzZXt2YXIgcz1xdChvKTtcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT1zLnR5cGU/bi5wdXNoLmFwcGx5KG4scy5mZWF0dXJlcyk6bi5wdXNoKHMpfX19KSxlP0d0KHRoaXMse2dlb21ldHJpZXM6bix0eXBlOlwiR2VvbWV0cnlDb2xsZWN0aW9uXCJ9KTp7dHlwZTpcIkZlYXR1cmVDb2xsZWN0aW9uXCIsZmVhdHVyZXM6bn19fSk7dmFyIGVuPUt0LG5uPVdlLmV4dGVuZCh7b3B0aW9uczp7b3BhY2l0eToxLGFsdDpcIlwiLGludGVyYWN0aXZlOiExLGNyb3NzT3JpZ2luOiExLGVycm9yT3ZlcmxheVVybDpcIlwiLHpJbmRleDoxLGNsYXNzTmFtZTpcIlwifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLl91cmw9dCx0aGlzLl9ib3VuZHM9eihpKSxsKHRoaXMsZSl9LG9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5faW1hZ2V8fCh0aGlzLl9pbml0SW1hZ2UoKSx0aGlzLm9wdGlvbnMub3BhY2l0eTwxJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCkpLHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmKHB0KHRoaXMuX2ltYWdlLFwibGVhZmxldC1pbnRlcmFjdGl2ZVwiKSx0aGlzLmFkZEludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2ltYWdlKSksdGhpcy5nZXRQYW5lKCkuYXBwZW5kQ2hpbGQodGhpcy5faW1hZ2UpLHRoaXMuX3Jlc2V0KCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKCl7dXQodGhpcy5faW1hZ2UpLHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdGhpcy5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pbWFnZSl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5faW1hZ2UmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5vcGFjaXR5JiZ0aGlzLnNldE9wYWNpdHkodC5vcGFjaXR5KSx0aGlzfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZjdCh0aGlzLl9pbWFnZSksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZfdCh0aGlzLl9pbWFnZSksdGhpc30sc2V0VXJsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl91cmw9dCx0aGlzLl9pbWFnZSYmKHRoaXMuX2ltYWdlLnNyYz10KSx0aGlzfSxzZXRCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JvdW5kcz16KHQpLHRoaXMuX21hcCYmdGhpcy5fcmVzZXQoKSx0aGlzfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD17em9vbTp0aGlzLl9yZXNldCx2aWV3cmVzZXQ6dGhpcy5fcmVzZXR9O3JldHVybiB0aGlzLl96b29tQW5pbWF0ZWQmJih0Lnpvb21hbmltPXRoaXMuX2FuaW1hdGVab29tKSx0fSxzZXRaSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy56SW5kZXg9dCx0aGlzLl91cGRhdGVaSW5kZXgoKSx0aGlzfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRzfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ltYWdlfSxfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW1hZ2U9aHQoXCJpbWdcIixcImxlYWZsZXQtaW1hZ2UtbGF5ZXIgXCIrKHRoaXMuX3pvb21BbmltYXRlZD9cImxlYWZsZXQtem9vbS1hbmltYXRlZFwiOlwiXCIpKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHxcIlwiKSk7dC5vbnNlbGVjdHN0YXJ0PXIsdC5vbm1vdXNlbW92ZT1yLHQub25sb2FkPWUodGhpcy5maXJlLHRoaXMsXCJsb2FkXCIpLHQub25lcnJvcj1lKHRoaXMuX292ZXJsYXlPbkVycm9yLHRoaXMsXCJlcnJvclwiKSx0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4mJih0LmNyb3NzT3JpZ2luPVwiXCIpLHRoaXMub3B0aW9ucy56SW5kZXgmJnRoaXMuX3VwZGF0ZVpJbmRleCgpLHQuc3JjPXRoaXMuX3VybCx0LmFsdD10aGlzLm9wdGlvbnMuYWx0fSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLmdldFpvb21TY2FsZSh0Lnpvb20pLGU9dGhpcy5fbWFwLl9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzKHRoaXMuX2JvdW5kcyx0Lnpvb20sdC5jZW50ZXIpLm1pbjt3dCh0aGlzLl9pbWFnZSxlLGkpfSxfcmVzZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbWFnZSxpPW5ldyBQKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fYm91bmRzLmdldE5vcnRoV2VzdCgpKSx0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2JvdW5kcy5nZXRTb3V0aEVhc3QoKSkpLGU9aS5nZXRTaXplKCk7THQodCxpLm1pbiksdC5zdHlsZS53aWR0aD1lLngrXCJweFwiLHQuc3R5bGUuaGVpZ2h0PWUueStcInB4XCJ9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7dnQodGhpcy5faW1hZ2UsdGhpcy5vcHRpb25zLm9wYWNpdHkpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5faW1hZ2UmJnZvaWQgMCE9PXRoaXMub3B0aW9ucy56SW5kZXgmJm51bGwhPT10aGlzLm9wdGlvbnMuekluZGV4JiYodGhpcy5faW1hZ2Uuc3R5bGUuekluZGV4PXRoaXMub3B0aW9ucy56SW5kZXgpfSxfb3ZlcmxheU9uRXJyb3I6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoXCJlcnJvclwiKTt2YXIgdD10aGlzLm9wdGlvbnMuZXJyb3JPdmVybGF5VXJsO3QmJnRoaXMuX3VybCE9PXQmJih0aGlzLl91cmw9dCx0aGlzLl9pbWFnZS5zcmM9dCl9fSksb249bm4uZXh0ZW5kKHtvcHRpb25zOnthdXRvcGxheTohMCxsb29wOiEwfSxfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9XCJWSURFT1wiPT09dGhpcy5fdXJsLnRhZ05hbWUsaT10aGlzLl9pbWFnZT10P3RoaXMuX3VybDpodChcInZpZGVvXCIpO2lmKGkuY2xhc3M9aS5jbGFzc3x8XCJcIixpLmNsYXNzKz1cImxlYWZsZXQtaW1hZ2UtbGF5ZXIgXCIrKHRoaXMuX3pvb21BbmltYXRlZD9cImxlYWZsZXQtem9vbS1hbmltYXRlZFwiOlwiXCIpLGkub25zZWxlY3RzdGFydD1yLGkub25tb3VzZW1vdmU9cixpLm9ubG9hZGVkZGF0YT1lKHRoaXMuZmlyZSx0aGlzLFwibG9hZFwiKSwhdCl7ZWkodGhpcy5fdXJsKXx8KHRoaXMuX3VybD1bdGhpcy5fdXJsXSksaS5hdXRvcGxheT0hIXRoaXMub3B0aW9ucy5hdXRvcGxheSxpLmxvb3A9ISF0aGlzLm9wdGlvbnMubG9vcDtmb3IodmFyIG49MDtuPHRoaXMuX3VybC5sZW5ndGg7bisrKXt2YXIgbz1odChcInNvdXJjZVwiKTtvLnNyYz10aGlzLl91cmxbbl0saS5hcHBlbmRDaGlsZChvKX19fX0pLHNuPVdlLmV4dGVuZCh7b3B0aW9uczp7b2Zmc2V0OlswLDddLGNsYXNzTmFtZTpcIlwiLHBhbmU6XCJwb3B1cFBhbmVcIn0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGkpe2wodGhpcyx0KSx0aGlzLl9zb3VyY2U9aX0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5fem9vbUFuaW1hdGVkPXQuX3pvb21BbmltYXRlZCx0aGlzLl9jb250YWluZXJ8fHRoaXMuX2luaXRMYXlvdXQoKSx0Ll9mYWRlQW5pbWF0ZWQmJnZ0KHRoaXMuX2NvbnRhaW5lciwwKSxjbGVhclRpbWVvdXQodGhpcy5fcmVtb3ZlVGltZW91dCksdGhpcy5nZXRQYW5lKCkuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLnVwZGF0ZSgpLHQuX2ZhZGVBbmltYXRlZCYmdnQodGhpcy5fY29udGFpbmVyLDEpLHRoaXMuYnJpbmdUb0Zyb250KCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3QuX2ZhZGVBbmltYXRlZD8odnQodGhpcy5fY29udGFpbmVyLDApLHRoaXMuX3JlbW92ZVRpbWVvdXQ9c2V0VGltZW91dChlKHV0LHZvaWQgMCx0aGlzLl9jb250YWluZXIpLDIwMCkpOnV0KHRoaXMuX2NvbnRhaW5lcil9LGdldExhdExuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmd9LHNldExhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF0bG5nPUModCksdGhpcy5fbWFwJiYodGhpcy5fdXBkYXRlUG9zaXRpb24oKSx0aGlzLl9hZGp1c3RQYW4oKSksdGhpc30sZ2V0Q29udGVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250ZW50fSxzZXRDb250ZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jb250ZW50PXQsdGhpcy51cGRhdGUoKSx0aGlzfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lcn0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYodGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIix0aGlzLl91cGRhdGVDb250ZW50KCksdGhpcy5fdXBkYXRlTGF5b3V0KCksdGhpcy5fdXBkYXRlUG9zaXRpb24oKSx0aGlzLl9jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eT1cIlwiLHRoaXMuX2FkanVzdFBhbigpKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3pvb206dGhpcy5fdXBkYXRlUG9zaXRpb24sdmlld3Jlc2V0OnRoaXMuX3VwZGF0ZVBvc2l0aW9ufTtyZXR1cm4gdGhpcy5fem9vbUFuaW1hdGVkJiYodC56b29tYW5pbT10aGlzLl9hbmltYXRlWm9vbSksdH0saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9tYXAmJnRoaXMuX21hcC5oYXNMYXllcih0aGlzKX0sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmY3QodGhpcy5fY29udGFpbmVyKSx0aGlzfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJl90KHRoaXMuX2NvbnRhaW5lciksdGhpc30sX3VwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9jb250ZW50KXt2YXIgdD10aGlzLl9jb250ZW50Tm9kZSxpPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuX2NvbnRlbnQ/dGhpcy5fY29udGVudCh0aGlzLl9zb3VyY2V8fHRoaXMpOnRoaXMuX2NvbnRlbnQ7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkpdC5pbm5lckhUTUw9aTtlbHNle2Zvcig7dC5oYXNDaGlsZE5vZGVzKCk7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0LmFwcGVuZENoaWxkKGkpfXRoaXMuZmlyZShcImNvbnRlbnR1cGRhdGVcIil9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXApe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSxpPXcodGhpcy5vcHRpb25zLm9mZnNldCksZT10aGlzLl9nZXRBbmNob3IoKTt0aGlzLl96b29tQW5pbWF0ZWQ/THQodGhpcy5fY29udGFpbmVyLHQuYWRkKGUpKTppPWkuYWRkKHQpLmFkZChlKTt2YXIgbj10aGlzLl9jb250YWluZXJCb3R0b209LWkueSxvPXRoaXMuX2NvbnRhaW5lckxlZnQ9LU1hdGgucm91bmQodGhpcy5fY29udGFpbmVyV2lkdGgvMikraS54O3RoaXMuX2NvbnRhaW5lci5zdHlsZS5ib3R0b209bitcInB4XCIsdGhpcy5fY29udGFpbmVyLnN0eWxlLmxlZnQ9bytcInB4XCJ9fSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuWzAsMF19fSkscm49c24uZXh0ZW5kKHtvcHRpb25zOnttYXhXaWR0aDozMDAsbWluV2lkdGg6NTAsbWF4SGVpZ2h0Om51bGwsYXV0b1BhbjohMCxhdXRvUGFuUGFkZGluZ1RvcExlZnQ6bnVsbCxhdXRvUGFuUGFkZGluZ0JvdHRvbVJpZ2h0Om51bGwsYXV0b1BhblBhZGRpbmc6WzUsNV0sa2VlcEluVmlldzohMSxjbG9zZUJ1dHRvbjohMCxhdXRvQ2xvc2U6ITAsY2xhc3NOYW1lOlwiXCJ9LG9wZW5PbjpmdW5jdGlvbih0KXtyZXR1cm4gdC5vcGVuUG9wdXAodGhpcyksdGhpc30sb25BZGQ6ZnVuY3Rpb24odCl7c24ucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyx0KSx0LmZpcmUoXCJwb3B1cG9wZW5cIix7cG9wdXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmKHRoaXMuX3NvdXJjZS5maXJlKFwicG9wdXBvcGVuXCIse3BvcHVwOnRoaXN9LCEwKSx0aGlzLl9zb3VyY2UgaW5zdGFuY2VvZiBLZXx8dGhpcy5fc291cmNlLm9uKFwicHJlY2xpY2tcIixZKSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3NuLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsdCksdC5maXJlKFwicG9wdXBjbG9zZVwiLHtwb3B1cDp0aGlzfSksdGhpcy5fc291cmNlJiYodGhpcy5fc291cmNlLmZpcmUoXCJwb3B1cGNsb3NlXCIse3BvcHVwOnRoaXN9LCEwKSx0aGlzLl9zb3VyY2UgaW5zdGFuY2VvZiBLZXx8dGhpcy5fc291cmNlLm9mZihcInByZWNsaWNrXCIsWSkpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1zbi5wcm90b3R5cGUuZ2V0RXZlbnRzLmNhbGwodGhpcyk7cmV0dXJuKHZvaWQgMCE9PXRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2s/dGhpcy5vcHRpb25zLmNsb3NlT25DbGljazp0aGlzLl9tYXAub3B0aW9ucy5jbG9zZVBvcHVwT25DbGljaykmJih0LnByZWNsaWNrPXRoaXMuX2Nsb3NlKSx0aGlzLm9wdGlvbnMua2VlcEluVmlldyYmKHQubW92ZWVuZD10aGlzLl9hZGp1c3RQYW4pLHR9LF9jbG9zZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmdGhpcy5fbWFwLmNsb3NlUG9wdXAodGhpcyl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9XCJsZWFmbGV0LXBvcHVwXCIsaT10aGlzLl9jb250YWluZXI9aHQoXCJkaXZcIix0K1wiIFwiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHxcIlwiKStcIiBsZWFmbGV0LXpvb20tYW5pbWF0ZWRcIiksZT10aGlzLl93cmFwcGVyPWh0KFwiZGl2XCIsdCtcIi1jb250ZW50LXdyYXBwZXJcIixpKTtpZih0aGlzLl9jb250ZW50Tm9kZT1odChcImRpdlwiLHQrXCItY29udGVudFwiLGUpLEooZSksWCh0aGlzLl9jb250ZW50Tm9kZSksVihlLFwiY29udGV4dG1lbnVcIixZKSx0aGlzLl90aXBDb250YWluZXI9aHQoXCJkaXZcIix0K1wiLXRpcC1jb250YWluZXJcIixpKSx0aGlzLl90aXA9aHQoXCJkaXZcIix0K1wiLXRpcFwiLHRoaXMuX3RpcENvbnRhaW5lciksdGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uKXt2YXIgbj10aGlzLl9jbG9zZUJ1dHRvbj1odChcImFcIix0K1wiLWNsb3NlLWJ1dHRvblwiLGkpO24uaHJlZj1cIiNjbG9zZVwiLG4uaW5uZXJIVE1MPVwiJiMyMTU7XCIsVihuLFwiY2xpY2tcIix0aGlzLl9vbkNsb3NlQnV0dG9uQ2xpY2ssdGhpcyl9fSxfdXBkYXRlTGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGVudE5vZGUsaT10LnN0eWxlO2kud2lkdGg9XCJcIixpLndoaXRlU3BhY2U9XCJub3dyYXBcIjt2YXIgZT10Lm9mZnNldFdpZHRoO2U9TWF0aC5taW4oZSx0aGlzLm9wdGlvbnMubWF4V2lkdGgpLGU9TWF0aC5tYXgoZSx0aGlzLm9wdGlvbnMubWluV2lkdGgpLGkud2lkdGg9ZSsxK1wicHhcIixpLndoaXRlU3BhY2U9XCJcIixpLmhlaWdodD1cIlwiO3ZhciBuPXQub2Zmc2V0SGVpZ2h0LG89dGhpcy5vcHRpb25zLm1heEhlaWdodDtvJiZuPm8/KGkuaGVpZ2h0PW8rXCJweFwiLHB0KHQsXCJsZWFmbGV0LXBvcHVwLXNjcm9sbGVkXCIpKTptdCh0LFwibGVhZmxldC1wb3B1cC1zY3JvbGxlZFwiKSx0aGlzLl9jb250YWluZXJXaWR0aD10aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGh9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcsdC56b29tLHQuY2VudGVyKSxlPXRoaXMuX2dldEFuY2hvcigpO0x0KHRoaXMuX2NvbnRhaW5lcixpLmFkZChlKSl9LF9hZGp1c3RQYW46ZnVuY3Rpb24oKXtpZighKCF0aGlzLm9wdGlvbnMuYXV0b1Bhbnx8dGhpcy5fbWFwLl9wYW5BbmltJiZ0aGlzLl9tYXAuX3BhbkFuaW0uX2luUHJvZ3Jlc3MpKXt2YXIgdD10aGlzLl9tYXAsaT1wYXJzZUludChhdCh0aGlzLl9jb250YWluZXIsXCJtYXJnaW5Cb3R0b21cIiksMTApfHwwLGU9dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodCtpLG49dGhpcy5fY29udGFpbmVyV2lkdGgsbz1uZXcgeCh0aGlzLl9jb250YWluZXJMZWZ0LC1lLXRoaXMuX2NvbnRhaW5lckJvdHRvbSk7by5fYWRkKFB0KHRoaXMuX2NvbnRhaW5lcikpO3ZhciBzPXQubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQobykscj13KHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZyksYT13KHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZ1RvcExlZnR8fHIpLGg9dyh0aGlzLm9wdGlvbnMuYXV0b1BhblBhZGRpbmdCb3R0b21SaWdodHx8ciksdT10LmdldFNpemUoKSxsPTAsYz0wO3MueCtuK2gueD51LngmJihsPXMueCtuLXUueCtoLngpLHMueC1sLWEueDwwJiYobD1zLngtYS54KSxzLnkrZStoLnk+dS55JiYoYz1zLnkrZS11LnkraC55KSxzLnktYy1hLnk8MCYmKGM9cy55LWEueSksKGx8fGMpJiZ0LmZpcmUoXCJhdXRvcGFuc3RhcnRcIikucGFuQnkoW2wsY10pfX0sX29uQ2xvc2VCdXR0b25DbGljazpmdW5jdGlvbih0KXt0aGlzLl9jbG9zZSgpLFEodCl9LF9nZXRBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4gdyh0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5fZ2V0UG9wdXBBbmNob3I/dGhpcy5fc291cmNlLl9nZXRQb3B1cEFuY2hvcigpOlswLDBdKX19KTt5ZS5tZXJnZU9wdGlvbnMoe2Nsb3NlUG9wdXBPbkNsaWNrOiEwfSkseWUuaW5jbHVkZSh7b3BlblBvcHVwOmZ1bmN0aW9uKHQsaSxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHJufHwodD1uZXcgcm4oZSkuc2V0Q29udGVudCh0KSksaSYmdC5zZXRMYXRMbmcoaSksdGhpcy5oYXNMYXllcih0KT90aGlzOih0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAub3B0aW9ucy5hdXRvQ2xvc2UmJnRoaXMuY2xvc2VQb3B1cCgpLHRoaXMuX3BvcHVwPXQsdGhpcy5hZGRMYXllcih0KSl9LGNsb3NlUG9wdXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQhPT10aGlzLl9wb3B1cHx8KHQ9dGhpcy5fcG9wdXAsdGhpcy5fcG9wdXA9bnVsbCksdCYmdGhpcy5yZW1vdmVMYXllcih0KSx0aGlzfX0pLFdlLmluY2x1ZGUoe2JpbmRQb3B1cDpmdW5jdGlvbih0LGkpe3JldHVybiB0IGluc3RhbmNlb2Ygcm4/KGwodCxpKSx0aGlzLl9wb3B1cD10LHQuX3NvdXJjZT10aGlzKToodGhpcy5fcG9wdXAmJiFpfHwodGhpcy5fcG9wdXA9bmV3IHJuKGksdGhpcykpLHRoaXMuX3BvcHVwLnNldENvbnRlbnQodCkpLHRoaXMuX3BvcHVwSGFuZGxlcnNBZGRlZHx8KHRoaXMub24oe2NsaWNrOnRoaXMuX29wZW5Qb3B1cCxrZXlwcmVzczp0aGlzLl9vbktleVByZXNzLHJlbW92ZTp0aGlzLmNsb3NlUG9wdXAsbW92ZTp0aGlzLl9tb3ZlUG9wdXB9KSx0aGlzLl9wb3B1cEhhbmRsZXJzQWRkZWQ9ITApLHRoaXN9LHVuYmluZFBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwJiYodGhpcy5vZmYoe2NsaWNrOnRoaXMuX29wZW5Qb3B1cCxrZXlwcmVzczp0aGlzLl9vbktleVByZXNzLHJlbW92ZTp0aGlzLmNsb3NlUG9wdXAsbW92ZTp0aGlzLl9tb3ZlUG9wdXB9KSx0aGlzLl9wb3B1cEhhbmRsZXJzQWRkZWQ9ITEsdGhpcy5fcG9wdXA9bnVsbCksdGhpc30sb3BlblBvcHVwOmZ1bmN0aW9uKHQsaSl7aWYodCBpbnN0YW5jZW9mIFdlfHwoaT10LHQ9dGhpcyksdCBpbnN0YW5jZW9mIEZlKWZvcih2YXIgZSBpbiB0aGlzLl9sYXllcnMpe3Q9dGhpcy5fbGF5ZXJzW2VdO2JyZWFrfXJldHVybiBpfHwoaT10LmdldENlbnRlcj90LmdldENlbnRlcigpOnQuZ2V0TGF0TG5nKCkpLHRoaXMuX3BvcHVwJiZ0aGlzLl9tYXAmJih0aGlzLl9wb3B1cC5fc291cmNlPXQsdGhpcy5fcG9wdXAudXBkYXRlKCksdGhpcy5fbWFwLm9wZW5Qb3B1cCh0aGlzLl9wb3B1cCxpKSksdGhpc30sY2xvc2VQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuX2Nsb3NlKCksdGhpc30sdG9nZ2xlUG9wdXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvcHVwJiYodGhpcy5fcG9wdXAuX21hcD90aGlzLmNsb3NlUG9wdXAoKTp0aGlzLm9wZW5Qb3B1cCh0KSksdGhpc30saXNQb3B1cE9wZW46ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5pc09wZW4oKX0sc2V0UG9wdXBDb250ZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuc2V0Q29udGVudCh0KSx0aGlzfSxnZXRQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cH0sX29wZW5Qb3B1cDpmdW5jdGlvbih0KXt2YXIgaT10LmxheWVyfHx0LnRhcmdldDt0aGlzLl9wb3B1cCYmdGhpcy5fbWFwJiYoUSh0KSxpIGluc3RhbmNlb2YgS2U/dGhpcy5vcGVuUG9wdXAodC5sYXllcnx8dC50YXJnZXQsdC5sYXRsbmcpOnRoaXMuX21hcC5oYXNMYXllcih0aGlzLl9wb3B1cCkmJnRoaXMuX3BvcHVwLl9zb3VyY2U9PT1pP3RoaXMuY2xvc2VQb3B1cCgpOnRoaXMub3BlblBvcHVwKGksdC5sYXRsbmcpKX0sX21vdmVQb3B1cDpmdW5jdGlvbih0KXt0aGlzLl9wb3B1cC5zZXRMYXRMbmcodC5sYXRsbmcpfSxfb25LZXlQcmVzczpmdW5jdGlvbih0KXsxMz09PXQub3JpZ2luYWxFdmVudC5rZXlDb2RlJiZ0aGlzLl9vcGVuUG9wdXAodCl9fSk7dmFyIGFuPXNuLmV4dGVuZCh7b3B0aW9uczp7cGFuZTpcInRvb2x0aXBQYW5lXCIsb2Zmc2V0OlswLDBdLGRpcmVjdGlvbjpcImF1dG9cIixwZXJtYW5lbnQ6ITEsc3RpY2t5OiExLGludGVyYWN0aXZlOiExLG9wYWNpdHk6Ljl9LG9uQWRkOmZ1bmN0aW9uKHQpe3NuLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsdCksdGhpcy5zZXRPcGFjaXR5KHRoaXMub3B0aW9ucy5vcGFjaXR5KSx0LmZpcmUoXCJ0b29sdGlwb3BlblwiLHt0b29sdGlwOnRoaXN9KSx0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5maXJlKFwidG9vbHRpcG9wZW5cIix7dG9vbHRpcDp0aGlzfSwhMCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3NuLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsdCksdC5maXJlKFwidG9vbHRpcGNsb3NlXCIse3Rvb2x0aXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmdGhpcy5fc291cmNlLmZpcmUoXCJ0b29sdGlwY2xvc2VcIix7dG9vbHRpcDp0aGlzfSwhMCl9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXNuLnByb3RvdHlwZS5nZXRFdmVudHMuY2FsbCh0aGlzKTtyZXR1cm4gSGkmJiF0aGlzLm9wdGlvbnMucGVybWFuZW50JiYodC5wcmVjbGljaz10aGlzLl9jbG9zZSksdH0sX2Nsb3NlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiZ0aGlzLl9tYXAuY2xvc2VUb29sdGlwKHRoaXMpfSxfaW5pdExheW91dDpmdW5jdGlvbigpe3ZhciB0PVwibGVhZmxldC10b29sdGlwIFwiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHxcIlwiKStcIiBsZWFmbGV0LXpvb20tXCIrKHRoaXMuX3pvb21BbmltYXRlZD9cImFuaW1hdGVkXCI6XCJoaWRlXCIpO3RoaXMuX2NvbnRlbnROb2RlPXRoaXMuX2NvbnRhaW5lcj1odChcImRpdlwiLHQpfSxfdXBkYXRlTGF5b3V0OmZ1bmN0aW9uKCl7fSxfYWRqdXN0UGFuOmZ1bmN0aW9uKCl7fSxfc2V0UG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLGU9dGhpcy5fY29udGFpbmVyLG49aS5sYXRMbmdUb0NvbnRhaW5lclBvaW50KGkuZ2V0Q2VudGVyKCkpLG89aS5sYXllclBvaW50VG9Db250YWluZXJQb2ludCh0KSxzPXRoaXMub3B0aW9ucy5kaXJlY3Rpb24scj1lLm9mZnNldFdpZHRoLGE9ZS5vZmZzZXRIZWlnaHQsaD13KHRoaXMub3B0aW9ucy5vZmZzZXQpLHU9dGhpcy5fZ2V0QW5jaG9yKCk7XCJ0b3BcIj09PXM/dD10LmFkZCh3KC1yLzIraC54LC1hK2gueSt1LnksITApKTpcImJvdHRvbVwiPT09cz90PXQuc3VidHJhY3QodyhyLzItaC54LC1oLnksITApKTpcImNlbnRlclwiPT09cz90PXQuc3VidHJhY3QodyhyLzIraC54LGEvMi11LnkraC55LCEwKSk6XCJyaWdodFwiPT09c3x8XCJhdXRvXCI9PT1zJiZvLng8bi54PyhzPVwicmlnaHRcIix0PXQuYWRkKHcoaC54K3UueCx1LnktYS8yK2gueSwhMCkpKToocz1cImxlZnRcIix0PXQuc3VidHJhY3QodyhyK3UueC1oLngsYS8yLXUueS1oLnksITApKSksbXQoZSxcImxlYWZsZXQtdG9vbHRpcC1yaWdodFwiKSxtdChlLFwibGVhZmxldC10b29sdGlwLWxlZnRcIiksbXQoZSxcImxlYWZsZXQtdG9vbHRpcC10b3BcIiksbXQoZSxcImxlYWZsZXQtdG9vbHRpcC1ib3R0b21cIikscHQoZSxcImxlYWZsZXQtdG9vbHRpcC1cIitzKSxMdChlLHQpfSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7dGhpcy5fc2V0UG9zaXRpb24odCl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9jb250YWluZXImJnZ0KHRoaXMuX2NvbnRhaW5lcix0KX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpO3RoaXMuX3NldFBvc2l0aW9uKGkpfSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHcodGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2UuX2dldFRvb2x0aXBBbmNob3ImJiF0aGlzLm9wdGlvbnMuc3RpY2t5P3RoaXMuX3NvdXJjZS5fZ2V0VG9vbHRpcEFuY2hvcigpOlswLDBdKX19KTt5ZS5pbmNsdWRlKHtvcGVuVG9vbHRpcDpmdW5jdGlvbih0LGksZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBhbnx8KHQ9bmV3IGFuKGUpLnNldENvbnRlbnQodCkpLGkmJnQuc2V0TGF0TG5nKGkpLHRoaXMuaGFzTGF5ZXIodCk/dGhpczp0aGlzLmFkZExheWVyKHQpfSxjbG9zZVRvb2x0aXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMucmVtb3ZlTGF5ZXIodCksdGhpc319KSxXZS5pbmNsdWRlKHtiaW5kVG9vbHRpcDpmdW5jdGlvbih0LGkpe3JldHVybiB0IGluc3RhbmNlb2YgYW4/KGwodCxpKSx0aGlzLl90b29sdGlwPXQsdC5fc291cmNlPXRoaXMpOih0aGlzLl90b29sdGlwJiYhaXx8KHRoaXMuX3Rvb2x0aXA9bmV3IGFuKGksdGhpcykpLHRoaXMuX3Rvb2x0aXAuc2V0Q29udGVudCh0KSksdGhpcy5faW5pdFRvb2x0aXBJbnRlcmFjdGlvbnMoKSx0aGlzLl90b29sdGlwLm9wdGlvbnMucGVybWFuZW50JiZ0aGlzLl9tYXAmJnRoaXMuX21hcC5oYXNMYXllcih0aGlzKSYmdGhpcy5vcGVuVG9vbHRpcCgpLHRoaXN9LHVuYmluZFRvb2x0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmKHRoaXMuX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zKCEwKSx0aGlzLmNsb3NlVG9vbHRpcCgpLHRoaXMuX3Rvb2x0aXA9bnVsbCksdGhpc30sX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zOmZ1bmN0aW9uKHQpe2lmKHR8fCF0aGlzLl90b29sdGlwSGFuZGxlcnNBZGRlZCl7dmFyIGk9dD9cIm9mZlwiOlwib25cIixlPXtyZW1vdmU6dGhpcy5jbG9zZVRvb2x0aXAsbW92ZTp0aGlzLl9tb3ZlVG9vbHRpcH07dGhpcy5fdG9vbHRpcC5vcHRpb25zLnBlcm1hbmVudD9lLmFkZD10aGlzLl9vcGVuVG9vbHRpcDooZS5tb3VzZW92ZXI9dGhpcy5fb3BlblRvb2x0aXAsZS5tb3VzZW91dD10aGlzLmNsb3NlVG9vbHRpcCx0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5JiYoZS5tb3VzZW1vdmU9dGhpcy5fbW92ZVRvb2x0aXApLEhpJiYoZS5jbGljaz10aGlzLl9vcGVuVG9vbHRpcCkpLHRoaXNbaV0oZSksdGhpcy5fdG9vbHRpcEhhbmRsZXJzQWRkZWQ9IXR9fSxvcGVuVG9vbHRpcDpmdW5jdGlvbih0LGkpe2lmKHQgaW5zdGFuY2VvZiBXZXx8KGk9dCx0PXRoaXMpLHQgaW5zdGFuY2VvZiBGZSlmb3IodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKXt0PXRoaXMuX2xheWVyc1tlXTticmVha31yZXR1cm4gaXx8KGk9dC5nZXRDZW50ZXI/dC5nZXRDZW50ZXIoKTp0LmdldExhdExuZygpKSx0aGlzLl90b29sdGlwJiZ0aGlzLl9tYXAmJih0aGlzLl90b29sdGlwLl9zb3VyY2U9dCx0aGlzLl90b29sdGlwLnVwZGF0ZSgpLHRoaXMuX21hcC5vcGVuVG9vbHRpcCh0aGlzLl90b29sdGlwLGkpLHRoaXMuX3Rvb2x0aXAub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdGhpcy5fdG9vbHRpcC5fY29udGFpbmVyJiYocHQodGhpcy5fdG9vbHRpcC5fY29udGFpbmVyLFwibGVhZmxldC1jbGlja2FibGVcIiksdGhpcy5hZGRJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl90b29sdGlwLl9jb250YWluZXIpKSksdGhpc30sY2xvc2VUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJih0aGlzLl90b29sdGlwLl9jbG9zZSgpLHRoaXMuX3Rvb2x0aXAub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdGhpcy5fdG9vbHRpcC5fY29udGFpbmVyJiYobXQodGhpcy5fdG9vbHRpcC5fY29udGFpbmVyLFwibGVhZmxldC1jbGlja2FibGVcIiksdGhpcy5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl90b29sdGlwLl9jb250YWluZXIpKSksdGhpc30sdG9nZ2xlVG9vbHRpcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmKHRoaXMuX3Rvb2x0aXAuX21hcD90aGlzLmNsb3NlVG9vbHRpcCgpOnRoaXMub3BlblRvb2x0aXAodCkpLHRoaXN9LGlzVG9vbHRpcE9wZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcC5pc09wZW4oKX0sc2V0VG9vbHRpcENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJnRoaXMuX3Rvb2x0aXAuc2V0Q29udGVudCh0KSx0aGlzfSxnZXRUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXB9LF9vcGVuVG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgaT10LmxheWVyfHx0LnRhcmdldDt0aGlzLl90b29sdGlwJiZ0aGlzLl9tYXAmJnRoaXMub3BlblRvb2x0aXAoaSx0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5P3QubGF0bG5nOnZvaWQgMCl9LF9tb3ZlVG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgaSxlLG49dC5sYXRsbmc7dGhpcy5fdG9vbHRpcC5vcHRpb25zLnN0aWNreSYmdC5vcmlnaW5hbEV2ZW50JiYoaT10aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodC5vcmlnaW5hbEV2ZW50KSxlPXRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChpKSxuPXRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcoZSkpLHRoaXMuX3Rvb2x0aXAuc2V0TGF0TG5nKG4pfX0pO3ZhciBobj1VZS5leHRlbmQoe29wdGlvbnM6e2ljb25TaXplOlsxMiwxMl0saHRtbDohMSxiZ1BvczpudWxsLGNsYXNzTmFtZTpcImxlYWZsZXQtZGl2LWljb25cIn0sY3JlYXRlSWNvbjpmdW5jdGlvbih0KXt2YXIgaT10JiZcIkRJVlwiPT09dC50YWdOYW1lP3Q6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxlPXRoaXMub3B0aW9ucztpZihpLmlubmVySFRNTD0hMSE9PWUuaHRtbD9lLmh0bWw6XCJcIixlLmJnUG9zKXt2YXIgbj13KGUuYmdQb3MpO2kuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uPS1uLngrXCJweCBcIistbi55K1wicHhcIn1yZXR1cm4gdGhpcy5fc2V0SWNvblN0eWxlcyhpLFwiaWNvblwiKSxpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19KTtVZS5EZWZhdWx0PVZlO3ZhciB1bj1XZS5leHRlbmQoe29wdGlvbnM6e3RpbGVTaXplOjI1NixvcGFjaXR5OjEsdXBkYXRlV2hlbklkbGU6UmksdXBkYXRlV2hlblpvb21pbmc6ITAsdXBkYXRlSW50ZXJ2YWw6MjAwLHpJbmRleDoxLGJvdW5kczpudWxsLG1pblpvb206MCxtYXhab29tOnZvaWQgMCxtYXhOYXRpdmVab29tOnZvaWQgMCxtaW5OYXRpdmVab29tOnZvaWQgMCxub1dyYXA6ITEscGFuZTpcInRpbGVQYW5lXCIsY2xhc3NOYW1lOlwiXCIsa2VlcEJ1ZmZlcjoyfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2wodGhpcyx0KX0sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9pbml0Q29udGFpbmVyKCksdGhpcy5fbGV2ZWxzPXt9LHRoaXMuX3RpbGVzPXt9LHRoaXMuX3Jlc2V0VmlldygpLHRoaXMuX3VwZGF0ZSgpfSxiZWZvcmVBZGQ6ZnVuY3Rpb24odCl7dC5fYWRkWm9vbUxpbWl0KHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl9yZW1vdmVBbGxUaWxlcygpLHV0KHRoaXMuX2NvbnRhaW5lciksdC5fcmVtb3ZlWm9vbUxpbWl0KHRoaXMpLHRoaXMuX2NvbnRhaW5lcj1udWxsLHRoaXMuX3RpbGVab29tPW51bGx9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJihjdCh0aGlzLl9jb250YWluZXIpLHRoaXMuX3NldEF1dG9aSW5kZXgoTWF0aC5tYXgpKSx0aGlzfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJihfdCh0aGlzLl9jb250YWluZXIpLHRoaXMuX3NldEF1dG9aSW5kZXgoTWF0aC5taW4pKSx0aGlzfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxzZXRPcGFjaXR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMub3BhY2l0eT10LHRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzfSxzZXRaSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy56SW5kZXg9dCx0aGlzLl91cGRhdGVaSW5kZXgoKSx0aGlzfSxpc0xvYWRpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9hZGluZ30scmVkcmF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmKHRoaXMuX3JlbW92ZUFsbFRpbGVzKCksdGhpcy5fdXBkYXRlKCkpLHRoaXN9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXt2aWV3cHJlcmVzZXQ6dGhpcy5faW52YWxpZGF0ZUFsbCx2aWV3cmVzZXQ6dGhpcy5fcmVzZXRWaWV3LHpvb206dGhpcy5fcmVzZXRWaWV3LG1vdmVlbmQ6dGhpcy5fb25Nb3ZlRW5kfTtyZXR1cm4gdGhpcy5vcHRpb25zLnVwZGF0ZVdoZW5JZGxlfHwodGhpcy5fb25Nb3ZlfHwodGhpcy5fb25Nb3ZlPW8odGhpcy5fb25Nb3ZlRW5kLHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCx0aGlzKSksdC5tb3ZlPXRoaXMuX29uTW92ZSksdGhpcy5fem9vbUFuaW1hdGVkJiYodC56b29tYW5pbT10aGlzLl9hbmltYXRlWm9vbSksdH0sY3JlYXRlVGlsZTpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpfSxnZXRUaWxlU2l6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy50aWxlU2l6ZTtyZXR1cm4gdCBpbnN0YW5jZW9mIHg/dDpuZXcgeCh0LHQpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyJiZ2b2lkIDAhPT10aGlzLm9wdGlvbnMuekluZGV4JiZudWxsIT09dGhpcy5vcHRpb25zLnpJbmRleCYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS56SW5kZXg9dGhpcy5vcHRpb25zLnpJbmRleCl9LF9zZXRBdXRvWkluZGV4OmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxlPXRoaXMuZ2V0UGFuZSgpLmNoaWxkcmVuLG49LXQoLTEvMCwxLzApLG89MCxzPWUubGVuZ3RoO288cztvKyspaT1lW29dLnN0eWxlLnpJbmRleCxlW29dIT09dGhpcy5fY29udGFpbmVyJiZpJiYobj10KG4sK2kpKTtpc0Zpbml0ZShuKSYmKHRoaXMub3B0aW9ucy56SW5kZXg9bit0KC0xLDEpLHRoaXMuX3VwZGF0ZVpJbmRleCgpKX0sX3VwZGF0ZU9wYWNpdHk6ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXAmJiF3aSl7dnQodGhpcy5fY29udGFpbmVyLHRoaXMub3B0aW9ucy5vcGFjaXR5KTt2YXIgdD0rbmV3IERhdGUsaT0hMSxlPSExO2Zvcih2YXIgbiBpbiB0aGlzLl90aWxlcyl7dmFyIG89dGhpcy5fdGlsZXNbbl07aWYoby5jdXJyZW50JiZvLmxvYWRlZCl7dmFyIHM9TWF0aC5taW4oMSwodC1vLmxvYWRlZCkvMjAwKTt2dChvLmVsLHMpLHM8MT9pPSEwOihvLmFjdGl2ZT9lPSEwOnRoaXMuX29uT3BhcXVlVGlsZShvKSxvLmFjdGl2ZT0hMCl9fWUmJiF0aGlzLl9ub1BydW5lJiZ0aGlzLl9wcnVuZVRpbGVzKCksaSYmKGcodGhpcy5fZmFkZUZyYW1lKSx0aGlzLl9mYWRlRnJhbWU9Zih0aGlzLl91cGRhdGVPcGFjaXR5LHRoaXMpKX19LF9vbk9wYXF1ZVRpbGU6cixfaW5pdENvbnRhaW5lcjpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2NvbnRhaW5lcj1odChcImRpdlwiLFwibGVhZmxldC1sYXllciBcIisodGhpcy5vcHRpb25zLmNsYXNzTmFtZXx8XCJcIikpLHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpKX0sX3VwZGF0ZUxldmVsczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpbGVab29tLGk9dGhpcy5vcHRpb25zLm1heFpvb207aWYodm9pZCAwIT09dCl7Zm9yKHZhciBlIGluIHRoaXMuX2xldmVscyl0aGlzLl9sZXZlbHNbZV0uZWwuY2hpbGRyZW4ubGVuZ3RofHxlPT09dD8odGhpcy5fbGV2ZWxzW2VdLmVsLnN0eWxlLnpJbmRleD1pLU1hdGguYWJzKHQtZSksdGhpcy5fb25VcGRhdGVMZXZlbChlKSk6KHV0KHRoaXMuX2xldmVsc1tlXS5lbCksdGhpcy5fcmVtb3ZlVGlsZXNBdFpvb20oZSksdGhpcy5fb25SZW1vdmVMZXZlbChlKSxkZWxldGUgdGhpcy5fbGV2ZWxzW2VdKTt2YXIgbj10aGlzLl9sZXZlbHNbdF0sbz10aGlzLl9tYXA7cmV0dXJuIG58fCgobj10aGlzLl9sZXZlbHNbdF09e30pLmVsPWh0KFwiZGl2XCIsXCJsZWFmbGV0LXRpbGUtY29udGFpbmVyIGxlYWZsZXQtem9vbS1hbmltYXRlZFwiLHRoaXMuX2NvbnRhaW5lciksbi5lbC5zdHlsZS56SW5kZXg9aSxuLm9yaWdpbj1vLnByb2plY3Qoby51bnByb2plY3Qoby5nZXRQaXhlbE9yaWdpbigpKSx0KS5yb3VuZCgpLG4uem9vbT10LHRoaXMuX3NldFpvb21UcmFuc2Zvcm0obixvLmdldENlbnRlcigpLG8uZ2V0Wm9vbSgpKSxuLmVsLm9mZnNldFdpZHRoLHRoaXMuX29uQ3JlYXRlTGV2ZWwobikpLHRoaXMuX2xldmVsPW4sbn19LF9vblVwZGF0ZUxldmVsOnIsX29uUmVtb3ZlTGV2ZWw6cixfb25DcmVhdGVMZXZlbDpyLF9wcnVuZVRpbGVzOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwKXt2YXIgdCxpLGU9dGhpcy5fbWFwLmdldFpvb20oKTtpZihlPnRoaXMub3B0aW9ucy5tYXhab29tfHxlPHRoaXMub3B0aW9ucy5taW5ab29tKXRoaXMuX3JlbW92ZUFsbFRpbGVzKCk7ZWxzZXtmb3IodCBpbiB0aGlzLl90aWxlcykoaT10aGlzLl90aWxlc1t0XSkucmV0YWluPWkuY3VycmVudDtmb3IodCBpbiB0aGlzLl90aWxlcylpZigoaT10aGlzLl90aWxlc1t0XSkuY3VycmVudCYmIWkuYWN0aXZlKXt2YXIgbj1pLmNvb3Jkczt0aGlzLl9yZXRhaW5QYXJlbnQobi54LG4ueSxuLnosbi56LTUpfHx0aGlzLl9yZXRhaW5DaGlsZHJlbihuLngsbi55LG4ueixuLnorMil9Zm9yKHQgaW4gdGhpcy5fdGlsZXMpdGhpcy5fdGlsZXNbdF0ucmV0YWlufHx0aGlzLl9yZW1vdmVUaWxlKHQpfX19LF9yZW1vdmVUaWxlc0F0Wm9vbTpmdW5jdGlvbih0KXtmb3IodmFyIGkgaW4gdGhpcy5fdGlsZXMpdGhpcy5fdGlsZXNbaV0uY29vcmRzLno9PT10JiZ0aGlzLl9yZW1vdmVUaWxlKGkpfSxfcmVtb3ZlQWxsVGlsZXM6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fdGlsZXMpdGhpcy5fcmVtb3ZlVGlsZSh0KX0sX2ludmFsaWRhdGVBbGw6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fbGV2ZWxzKXV0KHRoaXMuX2xldmVsc1t0XS5lbCksdGhpcy5fb25SZW1vdmVMZXZlbCh0KSxkZWxldGUgdGhpcy5fbGV2ZWxzW3RdO3RoaXMuX3JlbW92ZUFsbFRpbGVzKCksdGhpcy5fdGlsZVpvb209bnVsbH0sX3JldGFpblBhcmVudDpmdW5jdGlvbih0LGksZSxuKXt2YXIgbz1NYXRoLmZsb29yKHQvMikscz1NYXRoLmZsb29yKGkvMikscj1lLTEsYT1uZXcgeCgrbywrcyk7YS56PStyO3ZhciBoPXRoaXMuX3RpbGVDb29yZHNUb0tleShhKSx1PXRoaXMuX3RpbGVzW2hdO3JldHVybiB1JiZ1LmFjdGl2ZT8odS5yZXRhaW49ITAsITApOih1JiZ1LmxvYWRlZCYmKHUucmV0YWluPSEwKSxyPm4mJnRoaXMuX3JldGFpblBhcmVudChvLHMscixuKSl9LF9yZXRhaW5DaGlsZHJlbjpmdW5jdGlvbih0LGksZSxuKXtmb3IodmFyIG89Mip0O288Mip0KzI7bysrKWZvcih2YXIgcz0yKmk7czwyKmkrMjtzKyspe3ZhciByPW5ldyB4KG8scyk7ci56PWUrMTt2YXIgYT10aGlzLl90aWxlQ29vcmRzVG9LZXkociksaD10aGlzLl90aWxlc1thXTtoJiZoLmFjdGl2ZT9oLnJldGFpbj0hMDooaCYmaC5sb2FkZWQmJihoLnJldGFpbj0hMCksZSsxPG4mJnRoaXMuX3JldGFpbkNoaWxkcmVuKG8scyxlKzEsbikpfX0sX3Jlc2V0VmlldzpmdW5jdGlvbih0KXt2YXIgaT10JiYodC5waW5jaHx8dC5mbHlUbyk7dGhpcy5fc2V0Vmlldyh0aGlzLl9tYXAuZ2V0Q2VudGVyKCksdGhpcy5fbWFwLmdldFpvb20oKSxpLGkpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dGhpcy5fc2V0Vmlldyh0LmNlbnRlcix0Lnpvb20sITAsdC5ub1VwZGF0ZSl9LF9jbGFtcFpvb206ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zO3JldHVybiB2b2lkIDAhPT1pLm1pbk5hdGl2ZVpvb20mJnQ8aS5taW5OYXRpdmVab29tP2kubWluTmF0aXZlWm9vbTp2b2lkIDAhPT1pLm1heE5hdGl2ZVpvb20mJmkubWF4TmF0aXZlWm9vbTx0P2kubWF4TmF0aXZlWm9vbTp0fSxfc2V0VmlldzpmdW5jdGlvbih0LGksZSxuKXt2YXIgbz10aGlzLl9jbGFtcFpvb20oTWF0aC5yb3VuZChpKSk7KHZvaWQgMCE9PXRoaXMub3B0aW9ucy5tYXhab29tJiZvPnRoaXMub3B0aW9ucy5tYXhab29tfHx2b2lkIDAhPT10aGlzLm9wdGlvbnMubWluWm9vbSYmbzx0aGlzLm9wdGlvbnMubWluWm9vbSkmJihvPXZvaWQgMCk7dmFyIHM9dGhpcy5vcHRpb25zLnVwZGF0ZVdoZW5ab29taW5nJiZvIT09dGhpcy5fdGlsZVpvb207biYmIXN8fCh0aGlzLl90aWxlWm9vbT1vLHRoaXMuX2Fib3J0TG9hZGluZyYmdGhpcy5fYWJvcnRMb2FkaW5nKCksdGhpcy5fdXBkYXRlTGV2ZWxzKCksdGhpcy5fcmVzZXRHcmlkKCksdm9pZCAwIT09byYmdGhpcy5fdXBkYXRlKHQpLGV8fHRoaXMuX3BydW5lVGlsZXMoKSx0aGlzLl9ub1BydW5lPSEhZSksdGhpcy5fc2V0Wm9vbVRyYW5zZm9ybXModCxpKX0sX3NldFpvb21UcmFuc2Zvcm1zOmZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlIGluIHRoaXMuX2xldmVscyl0aGlzLl9zZXRab29tVHJhbnNmb3JtKHRoaXMuX2xldmVsc1tlXSx0LGkpfSxfc2V0Wm9vbVRyYW5zZm9ybTpmdW5jdGlvbih0LGksZSl7dmFyIG49dGhpcy5fbWFwLmdldFpvb21TY2FsZShlLHQuem9vbSksbz10Lm9yaWdpbi5tdWx0aXBseUJ5KG4pLnN1YnRyYWN0KHRoaXMuX21hcC5fZ2V0TmV3UGl4ZWxPcmlnaW4oaSxlKSkucm91bmQoKTtPaT93dCh0LmVsLG8sbik6THQodC5lbCxvKX0sX3Jlc2V0R3JpZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxpPXQub3B0aW9ucy5jcnMsZT10aGlzLl90aWxlU2l6ZT10aGlzLmdldFRpbGVTaXplKCksbj10aGlzLl90aWxlWm9vbSxvPXRoaXMuX21hcC5nZXRQaXhlbFdvcmxkQm91bmRzKHRoaXMuX3RpbGVab29tKTtvJiYodGhpcy5fZ2xvYmFsVGlsZVJhbmdlPXRoaXMuX3B4Qm91bmRzVG9UaWxlUmFuZ2UobykpLHRoaXMuX3dyYXBYPWkud3JhcExuZyYmIXRoaXMub3B0aW9ucy5ub1dyYXAmJltNYXRoLmZsb29yKHQucHJvamVjdChbMCxpLndyYXBMbmdbMF1dLG4pLngvZS54KSxNYXRoLmNlaWwodC5wcm9qZWN0KFswLGkud3JhcExuZ1sxXV0sbikueC9lLnkpXSx0aGlzLl93cmFwWT1pLndyYXBMYXQmJiF0aGlzLm9wdGlvbnMubm9XcmFwJiZbTWF0aC5mbG9vcih0LnByb2plY3QoW2kud3JhcExhdFswXSwwXSxuKS55L2UueCksTWF0aC5jZWlsKHQucHJvamVjdChbaS53cmFwTGF0WzFdLDBdLG4pLnkvZS55KV19LF9vbk1vdmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJiF0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb20mJnRoaXMuX3VwZGF0ZSgpfSxfZ2V0VGlsZWRQaXhlbEJvdW5kczpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAsZT1pLl9hbmltYXRpbmdab29tP01hdGgubWF4KGkuX2FuaW1hdGVUb1pvb20saS5nZXRab29tKCkpOmkuZ2V0Wm9vbSgpLG49aS5nZXRab29tU2NhbGUoZSx0aGlzLl90aWxlWm9vbSksbz1pLnByb2plY3QodCx0aGlzLl90aWxlWm9vbSkuZmxvb3IoKSxzPWkuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIqbik7cmV0dXJuIG5ldyBQKG8uc3VidHJhY3Qocyksby5hZGQocykpfSxfdXBkYXRlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcDtpZihpKXt2YXIgZT10aGlzLl9jbGFtcFpvb20oaS5nZXRab29tKCkpO2lmKHZvaWQgMD09PXQmJih0PWkuZ2V0Q2VudGVyKCkpLHZvaWQgMCE9PXRoaXMuX3RpbGVab29tKXt2YXIgbj10aGlzLl9nZXRUaWxlZFBpeGVsQm91bmRzKHQpLG89dGhpcy5fcHhCb3VuZHNUb1RpbGVSYW5nZShuKSxzPW8uZ2V0Q2VudGVyKCkscj1bXSxhPXRoaXMub3B0aW9ucy5rZWVwQnVmZmVyLGg9bmV3IFAoby5nZXRCb3R0b21MZWZ0KCkuc3VidHJhY3QoW2EsLWFdKSxvLmdldFRvcFJpZ2h0KCkuYWRkKFthLC1hXSkpO2lmKCEoaXNGaW5pdGUoby5taW4ueCkmJmlzRmluaXRlKG8ubWluLnkpJiZpc0Zpbml0ZShvLm1heC54KSYmaXNGaW5pdGUoby5tYXgueSkpKXRocm93IG5ldyBFcnJvcihcIkF0dGVtcHRlZCB0byBsb2FkIGFuIGluZmluaXRlIG51bWJlciBvZiB0aWxlc1wiKTtmb3IodmFyIHUgaW4gdGhpcy5fdGlsZXMpe3ZhciBsPXRoaXMuX3RpbGVzW3VdLmNvb3JkcztsLno9PT10aGlzLl90aWxlWm9vbSYmaC5jb250YWlucyhuZXcgeChsLngsbC55KSl8fCh0aGlzLl90aWxlc1t1XS5jdXJyZW50PSExKX1pZihNYXRoLmFicyhlLXRoaXMuX3RpbGVab29tKT4xKXRoaXMuX3NldFZpZXcodCxlKTtlbHNle2Zvcih2YXIgYz1vLm1pbi55O2M8PW8ubWF4Lnk7YysrKWZvcih2YXIgXz1vLm1pbi54O188PW8ubWF4Lng7XysrKXt2YXIgZD1uZXcgeChfLGMpO2Quej10aGlzLl90aWxlWm9vbSx0aGlzLl9pc1ZhbGlkVGlsZShkKSYmKHRoaXMuX3RpbGVzW3RoaXMuX3RpbGVDb29yZHNUb0tleShkKV18fHIucHVzaChkKSl9aWYoci5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQuZGlzdGFuY2VUbyhzKS1pLmRpc3RhbmNlVG8ocyl9KSwwIT09ci5sZW5ndGgpe3RoaXMuX2xvYWRpbmd8fCh0aGlzLl9sb2FkaW5nPSEwLHRoaXMuZmlyZShcImxvYWRpbmdcIikpO3ZhciBwPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IoXz0wO188ci5sZW5ndGg7XysrKXRoaXMuX2FkZFRpbGUocltfXSxwKTt0aGlzLl9sZXZlbC5lbC5hcHBlbmRDaGlsZChwKX19fX19LF9pc1ZhbGlkVGlsZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAub3B0aW9ucy5jcnM7aWYoIWkuaW5maW5pdGUpe3ZhciBlPXRoaXMuX2dsb2JhbFRpbGVSYW5nZTtpZighaS53cmFwTG5nJiYodC54PGUubWluLnh8fHQueD5lLm1heC54KXx8IWkud3JhcExhdCYmKHQueTxlLm1pbi55fHx0Lnk+ZS5tYXgueSkpcmV0dXJuITF9aWYoIXRoaXMub3B0aW9ucy5ib3VuZHMpcmV0dXJuITA7dmFyIG49dGhpcy5fdGlsZUNvb3Jkc1RvQm91bmRzKHQpO3JldHVybiB6KHRoaXMub3B0aW9ucy5ib3VuZHMpLm92ZXJsYXBzKG4pfSxfa2V5VG9Cb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3RpbGVDb29yZHNUb0JvdW5kcyh0aGlzLl9rZXlUb1RpbGVDb29yZHModCkpfSxfdGlsZUNvb3Jkc1RvQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcCxlPXRoaXMuZ2V0VGlsZVNpemUoKSxuPXQuc2NhbGVCeShlKSxvPW4uYWRkKGUpLHM9bmV3IFQoaS51bnByb2plY3Qobix0LnopLGkudW5wcm9qZWN0KG8sdC56KSk7cmV0dXJuIHRoaXMub3B0aW9ucy5ub1dyYXB8fGkud3JhcExhdExuZ0JvdW5kcyhzKSxzfSxfdGlsZUNvb3Jkc1RvS2V5OmZ1bmN0aW9uKHQpe3JldHVybiB0LngrXCI6XCIrdC55K1wiOlwiK3Quen0sX2tleVRvVGlsZUNvb3JkczpmdW5jdGlvbih0KXt2YXIgaT10LnNwbGl0KFwiOlwiKSxlPW5ldyB4KCtpWzBdLCtpWzFdKTtyZXR1cm4gZS56PStpWzJdLGV9LF9yZW1vdmVUaWxlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX3RpbGVzW3RdO2kmJih1dChpLmVsKSxkZWxldGUgdGhpcy5fdGlsZXNbdF0sdGhpcy5maXJlKFwidGlsZXVubG9hZFwiLHt0aWxlOmkuZWwsY29vcmRzOnRoaXMuX2tleVRvVGlsZUNvb3Jkcyh0KX0pKX0sX2luaXRUaWxlOmZ1bmN0aW9uKHQpe3B0KHQsXCJsZWFmbGV0LXRpbGVcIik7dmFyIGk9dGhpcy5nZXRUaWxlU2l6ZSgpO3Quc3R5bGUud2lkdGg9aS54K1wicHhcIix0LnN0eWxlLmhlaWdodD1pLnkrXCJweFwiLHQub25zZWxlY3RzdGFydD1yLHQub25tb3VzZW1vdmU9cix3aSYmdGhpcy5vcHRpb25zLm9wYWNpdHk8MSYmdnQodCx0aGlzLm9wdGlvbnMub3BhY2l0eSksYmkmJiFUaSYmKHQuc3R5bGUuV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5PVwiaGlkZGVuXCIpfSxfYWRkVGlsZTpmdW5jdGlvbih0LGkpe3ZhciBuPXRoaXMuX2dldFRpbGVQb3ModCksbz10aGlzLl90aWxlQ29vcmRzVG9LZXkodCkscz10aGlzLmNyZWF0ZVRpbGUodGhpcy5fd3JhcENvb3Jkcyh0KSxlKHRoaXMuX3RpbGVSZWFkeSx0aGlzLHQpKTt0aGlzLl9pbml0VGlsZShzKSx0aGlzLmNyZWF0ZVRpbGUubGVuZ3RoPDImJmYoZSh0aGlzLl90aWxlUmVhZHksdGhpcyx0LG51bGwscykpLEx0KHMsbiksdGhpcy5fdGlsZXNbb109e2VsOnMsY29vcmRzOnQsY3VycmVudDohMH0saS5hcHBlbmRDaGlsZChzKSx0aGlzLmZpcmUoXCJ0aWxlbG9hZHN0YXJ0XCIse3RpbGU6cyxjb29yZHM6dH0pfSxfdGlsZVJlYWR5OmZ1bmN0aW9uKHQsaSxuKXtpZih0aGlzLl9tYXApe2kmJnRoaXMuZmlyZShcInRpbGVlcnJvclwiLHtlcnJvcjppLHRpbGU6bixjb29yZHM6dH0pO3ZhciBvPXRoaXMuX3RpbGVDb29yZHNUb0tleSh0KTsobj10aGlzLl90aWxlc1tvXSkmJihuLmxvYWRlZD0rbmV3IERhdGUsdGhpcy5fbWFwLl9mYWRlQW5pbWF0ZWQ/KHZ0KG4uZWwsMCksZyh0aGlzLl9mYWRlRnJhbWUpLHRoaXMuX2ZhZGVGcmFtZT1mKHRoaXMuX3VwZGF0ZU9wYWNpdHksdGhpcykpOihuLmFjdGl2ZT0hMCx0aGlzLl9wcnVuZVRpbGVzKCkpLGl8fChwdChuLmVsLFwibGVhZmxldC10aWxlLWxvYWRlZFwiKSx0aGlzLmZpcmUoXCJ0aWxlbG9hZFwiLHt0aWxlOm4uZWwsY29vcmRzOnR9KSksdGhpcy5fbm9UaWxlc1RvTG9hZCgpJiYodGhpcy5fbG9hZGluZz0hMSx0aGlzLmZpcmUoXCJsb2FkXCIpLHdpfHwhdGhpcy5fbWFwLl9mYWRlQW5pbWF0ZWQ/Zih0aGlzLl9wcnVuZVRpbGVzLHRoaXMpOnNldFRpbWVvdXQoZSh0aGlzLl9wcnVuZVRpbGVzLHRoaXMpLDI1MCkpKX19LF9nZXRUaWxlUG9zOmZ1bmN0aW9uKHQpe3JldHVybiB0LnNjYWxlQnkodGhpcy5nZXRUaWxlU2l6ZSgpKS5zdWJ0cmFjdCh0aGlzLl9sZXZlbC5vcmlnaW4pfSxfd3JhcENvb3JkczpmdW5jdGlvbih0KXt2YXIgaT1uZXcgeCh0aGlzLl93cmFwWD9zKHQueCx0aGlzLl93cmFwWCk6dC54LHRoaXMuX3dyYXBZP3ModC55LHRoaXMuX3dyYXBZKTp0LnkpO3JldHVybiBpLno9dC56LGl9LF9weEJvdW5kc1RvVGlsZVJhbmdlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZ2V0VGlsZVNpemUoKTtyZXR1cm4gbmV3IFAodC5taW4udW5zY2FsZUJ5KGkpLmZsb29yKCksdC5tYXgudW5zY2FsZUJ5KGkpLmNlaWwoKS5zdWJ0cmFjdChbMSwxXSkpfSxfbm9UaWxlc1RvTG9hZDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl90aWxlcylpZighdGhpcy5fdGlsZXNbdF0ubG9hZGVkKXJldHVybiExO3JldHVybiEwfX0pLGxuPXVuLmV4dGVuZCh7b3B0aW9uczp7bWluWm9vbTowLG1heFpvb206MTgsc3ViZG9tYWluczpcImFiY1wiLGVycm9yVGlsZVVybDpcIlwiLHpvb21PZmZzZXQ6MCx0bXM6ITEsem9vbVJldmVyc2U6ITEsZGV0ZWN0UmV0aW5hOiExLGNyb3NzT3JpZ2luOiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7dGhpcy5fdXJsPXQsKGk9bCh0aGlzLGkpKS5kZXRlY3RSZXRpbmEmJlZpJiZpLm1heFpvb20+MCYmKGkudGlsZVNpemU9TWF0aC5mbG9vcihpLnRpbGVTaXplLzIpLGkuem9vbVJldmVyc2U/KGkuem9vbU9mZnNldC0tLGkubWluWm9vbSsrKTooaS56b29tT2Zmc2V0KyssaS5tYXhab29tLS0pLGkubWluWm9vbT1NYXRoLm1heCgwLGkubWluWm9vbSkpLFwic3RyaW5nXCI9PXR5cGVvZiBpLnN1YmRvbWFpbnMmJihpLnN1YmRvbWFpbnM9aS5zdWJkb21haW5zLnNwbGl0KFwiXCIpKSxiaXx8dGhpcy5vbihcInRpbGV1bmxvYWRcIix0aGlzLl9vblRpbGVSZW1vdmUpfSxzZXRVcmw6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5fdXJsPXQsaXx8dGhpcy5yZWRyYXcoKSx0aGlzfSxjcmVhdGVUaWxlOmZ1bmN0aW9uKHQsaSl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtyZXR1cm4gVihuLFwibG9hZFwiLGUodGhpcy5fdGlsZU9uTG9hZCx0aGlzLGksbikpLFYobixcImVycm9yXCIsZSh0aGlzLl90aWxlT25FcnJvcix0aGlzLGksbikpLHRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiYmKG4uY3Jvc3NPcmlnaW49XCJcIiksbi5hbHQ9XCJcIixuLnNldEF0dHJpYnV0ZShcInJvbGVcIixcInByZXNlbnRhdGlvblwiKSxuLnNyYz10aGlzLmdldFRpbGVVcmwodCksbn0sZ2V0VGlsZVVybDpmdW5jdGlvbih0KXt2YXIgZT17cjpWaT9cIkAyeFwiOlwiXCIsczp0aGlzLl9nZXRTdWJkb21haW4odCkseDp0LngseTp0Lnksejp0aGlzLl9nZXRab29tRm9yVXJsKCl9O2lmKHRoaXMuX21hcCYmIXRoaXMuX21hcC5vcHRpb25zLmNycy5pbmZpbml0ZSl7dmFyIG49dGhpcy5fZ2xvYmFsVGlsZVJhbmdlLm1heC55LXQueTt0aGlzLm9wdGlvbnMudG1zJiYoZS55PW4pLGVbXCIteVwiXT1ufXJldHVybiBfKHRoaXMuX3VybCxpKGUsdGhpcy5vcHRpb25zKSl9LF90aWxlT25Mb2FkOmZ1bmN0aW9uKHQsaSl7d2k/c2V0VGltZW91dChlKHQsdGhpcyxudWxsLGkpLDApOnQobnVsbCxpKX0sX3RpbGVPbkVycm9yOmZ1bmN0aW9uKHQsaSxlKXt2YXIgbj10aGlzLm9wdGlvbnMuZXJyb3JUaWxlVXJsO24mJmkuc3JjIT09biYmKGkuc3JjPW4pLHQoZSxpKX0sX29uVGlsZVJlbW92ZTpmdW5jdGlvbih0KXt0LnRpbGUub25sb2FkPW51bGx9LF9nZXRab29tRm9yVXJsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGlsZVpvb20saT10aGlzLm9wdGlvbnMubWF4Wm9vbSxlPXRoaXMub3B0aW9ucy56b29tUmV2ZXJzZSxuPXRoaXMub3B0aW9ucy56b29tT2Zmc2V0O3JldHVybiBlJiYodD1pLXQpLHQrbn0sX2dldFN1YmRvbWFpbjpmdW5jdGlvbih0KXt2YXIgaT1NYXRoLmFicyh0LngrdC55KSV0aGlzLm9wdGlvbnMuc3ViZG9tYWlucy5sZW5ndGg7cmV0dXJuIHRoaXMub3B0aW9ucy5zdWJkb21haW5zW2ldfSxfYWJvcnRMb2FkaW5nOmZ1bmN0aW9uKCl7dmFyIHQsaTtmb3IodCBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1t0XS5jb29yZHMueiE9PXRoaXMuX3RpbGVab29tJiYoKGk9dGhpcy5fdGlsZXNbdF0uZWwpLm9ubG9hZD1yLGkub25lcnJvcj1yLGkuY29tcGxldGV8fChpLnNyYz1uaSx1dChpKSkpfX0pLGNuPWxuLmV4dGVuZCh7ZGVmYXVsdFdtc1BhcmFtczp7c2VydmljZTpcIldNU1wiLHJlcXVlc3Q6XCJHZXRNYXBcIixsYXllcnM6XCJcIixzdHlsZXM6XCJcIixmb3JtYXQ6XCJpbWFnZS9qcGVnXCIsdHJhbnNwYXJlbnQ6ITEsdmVyc2lvbjpcIjEuMS4xXCJ9LG9wdGlvbnM6e2NyczpudWxsLHVwcGVyY2FzZTohMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3VybD10O3ZhciBuPWkoe30sdGhpcy5kZWZhdWx0V21zUGFyYW1zKTtmb3IodmFyIG8gaW4gZSlvIGluIHRoaXMub3B0aW9uc3x8KG5bb109ZVtvXSk7ZT1sKHRoaXMsZSksbi53aWR0aD1uLmhlaWdodD1lLnRpbGVTaXplKihlLmRldGVjdFJldGluYSYmVmk/MjoxKSx0aGlzLndtc1BhcmFtcz1ufSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9jcnM9dGhpcy5vcHRpb25zLmNyc3x8dC5vcHRpb25zLmNycyx0aGlzLl93bXNWZXJzaW9uPXBhcnNlRmxvYXQodGhpcy53bXNQYXJhbXMudmVyc2lvbik7dmFyIGk9dGhpcy5fd21zVmVyc2lvbj49MS4zP1wiY3JzXCI6XCJzcnNcIjt0aGlzLndtc1BhcmFtc1tpXT10aGlzLl9jcnMuY29kZSxsbi5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLHQpfSxnZXRUaWxlVXJsOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX3RpbGVDb29yZHNUb0JvdW5kcyh0KSxlPXRoaXMuX2Nycy5wcm9qZWN0KGkuZ2V0Tm9ydGhXZXN0KCkpLG49dGhpcy5fY3JzLnByb2plY3QoaS5nZXRTb3V0aEVhc3QoKSksbz0odGhpcy5fd21zVmVyc2lvbj49MS4zJiZ0aGlzLl9jcnM9PT1OZT9bbi55LGUueCxlLnksbi54XTpbZS54LG4ueSxuLngsZS55XSkuam9pbihcIixcIikscz1sbi5wcm90b3R5cGUuZ2V0VGlsZVVybC5jYWxsKHRoaXMsdCk7cmV0dXJuIHMrYyh0aGlzLndtc1BhcmFtcyxzLHRoaXMub3B0aW9ucy51cHBlcmNhc2UpKyh0aGlzLm9wdGlvbnMudXBwZXJjYXNlP1wiJkJCT1g9XCI6XCImYmJveD1cIikrb30sc2V0UGFyYW1zOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodGhpcy53bXNQYXJhbXMsdCksZXx8dGhpcy5yZWRyYXcoKSx0aGlzfX0pO2xuLldNUz1jbixZdC53bXM9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IGNuKHQsaSl9O3ZhciBfbj1XZS5leHRlbmQoe29wdGlvbnM6e3BhZGRpbmc6LjF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7bCh0aGlzLHQpLG4odGhpcyksdGhpcy5fbGF5ZXJzPXRoaXMuX2xheWVyc3x8e319LG9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyfHwodGhpcy5faW5pdENvbnRhaW5lcigpLHRoaXMuX3pvb21BbmltYXRlZCYmcHQodGhpcy5fY29udGFpbmVyLFwibGVhZmxldC16b29tLWFuaW1hdGVkXCIpKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX3VwZGF0ZSgpLHRoaXMub24oXCJ1cGRhdGVcIix0aGlzLl91cGRhdGVQYXRocyx0aGlzKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLm9mZihcInVwZGF0ZVwiLHRoaXMuX3VwZGF0ZVBhdGhzLHRoaXMpLHRoaXMuX2Rlc3Ryb3lDb250YWluZXIoKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3ZpZXdyZXNldDp0aGlzLl9yZXNldCx6b29tOnRoaXMuX29uWm9vbSxtb3ZlZW5kOnRoaXMuX3VwZGF0ZSx6b29tZW5kOnRoaXMuX29uWm9vbUVuZH07cmV0dXJuIHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fb25BbmltWm9vbSksdH0sX29uQW5pbVpvb206ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlVHJhbnNmb3JtKHQuY2VudGVyLHQuem9vbSl9LF9vblpvb206ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVUcmFuc2Zvcm0odGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMuX21hcC5nZXRab29tKCkpfSxfdXBkYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5fbWFwLmdldFpvb21TY2FsZShpLHRoaXMuX3pvb20pLG49UHQodGhpcy5fY29udGFpbmVyKSxvPXRoaXMuX21hcC5nZXRTaXplKCkubXVsdGlwbHlCeSguNSt0aGlzLm9wdGlvbnMucGFkZGluZykscz10aGlzLl9tYXAucHJvamVjdCh0aGlzLl9jZW50ZXIsaSkscj10aGlzLl9tYXAucHJvamVjdCh0LGkpLnN1YnRyYWN0KHMpLGE9by5tdWx0aXBseUJ5KC1lKS5hZGQobikuYWRkKG8pLnN1YnRyYWN0KHIpO09pP3d0KHRoaXMuX2NvbnRhaW5lcixhLGUpOkx0KHRoaXMuX2NvbnRhaW5lcixhKX0sX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCksdGhpcy5fdXBkYXRlVHJhbnNmb3JtKHRoaXMuX2NlbnRlcix0aGlzLl96b29tKTtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5fcmVzZXQoKX0sX29uWm9vbUVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl9wcm9qZWN0KCl9LF91cGRhdGVQYXRoczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl91cGRhdGUoKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5wYWRkaW5nLGk9dGhpcy5fbWFwLmdldFNpemUoKSxlPXRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChpLm11bHRpcGx5QnkoLXQpKS5yb3VuZCgpO3RoaXMuX2JvdW5kcz1uZXcgUChlLGUuYWRkKGkubXVsdGlwbHlCeSgxKzIqdCkpLnJvdW5kKCkpLHRoaXMuX2NlbnRlcj10aGlzLl9tYXAuZ2V0Q2VudGVyKCksdGhpcy5fem9vbT10aGlzLl9tYXAuZ2V0Wm9vbSgpfX0pLGRuPV9uLmV4dGVuZCh7Z2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9X24ucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiB0LnZpZXdwcmVyZXNldD10aGlzLl9vblZpZXdQcmVSZXNldCx0fSxfb25WaWV3UHJlUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzPSEwfSxvbkFkZDpmdW5jdGlvbigpe19uLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMpLHRoaXMuX2RyYXcoKX0sX2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtWKHQsXCJtb3VzZW1vdmVcIixvKHRoaXMuX29uTW91c2VNb3ZlLDMyLHRoaXMpLHRoaXMpLFYodCxcImNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIGNvbnRleHRtZW51XCIsdGhpcy5fb25DbGljayx0aGlzKSxWKHQsXCJtb3VzZW91dFwiLHRoaXMuX2hhbmRsZU1vdXNlT3V0LHRoaXMpLHRoaXMuX2N0eD10LmdldENvbnRleHQoXCIyZFwiKX0sX2Rlc3Ryb3lDb250YWluZXI6ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fY3R4LHV0KHRoaXMuX2NvbnRhaW5lciksRyh0aGlzLl9jb250YWluZXIpLGRlbGV0ZSB0aGlzLl9jb250YWluZXJ9LF91cGRhdGVQYXRoczpmdW5jdGlvbigpe2lmKCF0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzKXt0aGlzLl9yZWRyYXdCb3VuZHM9bnVsbDtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5fdXBkYXRlKCk7dGhpcy5fcmVkcmF3KCl9fSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcC5fYW5pbWF0aW5nWm9vbXx8IXRoaXMuX2JvdW5kcyl7dGhpcy5fZHJhd25MYXllcnM9e30sX24ucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKTt2YXIgdD10aGlzLl9ib3VuZHMsaT10aGlzLl9jb250YWluZXIsZT10LmdldFNpemUoKSxuPVZpPzI6MTtMdChpLHQubWluKSxpLndpZHRoPW4qZS54LGkuaGVpZ2h0PW4qZS55LGkuc3R5bGUud2lkdGg9ZS54K1wicHhcIixpLnN0eWxlLmhlaWdodD1lLnkrXCJweFwiLFZpJiZ0aGlzLl9jdHguc2NhbGUoMiwyKSx0aGlzLl9jdHgudHJhbnNsYXRlKC10Lm1pbi54LC10Lm1pbi55KSx0aGlzLmZpcmUoXCJ1cGRhdGVcIil9fSxfcmVzZXQ6ZnVuY3Rpb24oKXtfbi5wcm90b3R5cGUuX3Jlc2V0LmNhbGwodGhpcyksdGhpcy5fcG9zdHBvbmVVcGRhdGVQYXRocyYmKHRoaXMuX3Bvc3Rwb25lVXBkYXRlUGF0aHM9ITEsdGhpcy5fdXBkYXRlUGF0aHMoKSl9LF9pbml0UGF0aDpmdW5jdGlvbih0KXt0aGlzLl91cGRhdGVEYXNoQXJyYXkodCksdGhpcy5fbGF5ZXJzW24odCldPXQ7dmFyIGk9dC5fb3JkZXI9e2xheWVyOnQscHJldjp0aGlzLl9kcmF3TGFzdCxuZXh0Om51bGx9O3RoaXMuX2RyYXdMYXN0JiYodGhpcy5fZHJhd0xhc3QubmV4dD1pKSx0aGlzLl9kcmF3TGFzdD1pLHRoaXMuX2RyYXdGaXJzdD10aGlzLl9kcmF3Rmlyc3R8fHRoaXMuX2RyYXdMYXN0fSxfYWRkUGF0aDpmdW5jdGlvbih0KXt0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpfSxfcmVtb3ZlUGF0aDpmdW5jdGlvbih0KXt2YXIgaT10Ll9vcmRlcixlPWkubmV4dCxuPWkucHJldjtlP2UucHJldj1uOnRoaXMuX2RyYXdMYXN0PW4sbj9uLm5leHQ9ZTp0aGlzLl9kcmF3Rmlyc3Q9ZSxkZWxldGUgdC5fb3JkZXIsZGVsZXRlIHRoaXMuX2xheWVyc1tMLnN0YW1wKHQpXSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbih0KXt0aGlzLl9leHRlbmRSZWRyYXdCb3VuZHModCksdC5fcHJvamVjdCgpLHQuX3VwZGF0ZSgpLHRoaXMuX3JlcXVlc3RSZWRyYXcodCl9LF91cGRhdGVTdHlsZTpmdW5jdGlvbih0KXt0aGlzLl91cGRhdGVEYXNoQXJyYXkodCksdGhpcy5fcmVxdWVzdFJlZHJhdyh0KX0sX3VwZGF0ZURhc2hBcnJheTpmdW5jdGlvbih0KXtpZih0Lm9wdGlvbnMuZGFzaEFycmF5KXt2YXIgaSxlPXQub3B0aW9ucy5kYXNoQXJyYXkuc3BsaXQoXCIsXCIpLG49W107Zm9yKGk9MDtpPGUubGVuZ3RoO2krKyluLnB1c2goTnVtYmVyKGVbaV0pKTt0Lm9wdGlvbnMuX2Rhc2hBcnJheT1ufX0sX3JlcXVlc3RSZWRyYXc6ZnVuY3Rpb24odCl7dGhpcy5fbWFwJiYodGhpcy5fZXh0ZW5kUmVkcmF3Qm91bmRzKHQpLHRoaXMuX3JlZHJhd1JlcXVlc3Q9dGhpcy5fcmVkcmF3UmVxdWVzdHx8Zih0aGlzLl9yZWRyYXcsdGhpcykpfSxfZXh0ZW5kUmVkcmF3Qm91bmRzOmZ1bmN0aW9uKHQpe2lmKHQuX3B4Qm91bmRzKXt2YXIgaT0odC5vcHRpb25zLndlaWdodHx8MCkrMTt0aGlzLl9yZWRyYXdCb3VuZHM9dGhpcy5fcmVkcmF3Qm91bmRzfHxuZXcgUCx0aGlzLl9yZWRyYXdCb3VuZHMuZXh0ZW5kKHQuX3B4Qm91bmRzLm1pbi5zdWJ0cmFjdChbaSxpXSkpLHRoaXMuX3JlZHJhd0JvdW5kcy5leHRlbmQodC5fcHhCb3VuZHMubWF4LmFkZChbaSxpXSkpfX0sX3JlZHJhdzpmdW5jdGlvbigpe3RoaXMuX3JlZHJhd1JlcXVlc3Q9bnVsbCx0aGlzLl9yZWRyYXdCb3VuZHMmJih0aGlzLl9yZWRyYXdCb3VuZHMubWluLl9mbG9vcigpLHRoaXMuX3JlZHJhd0JvdW5kcy5tYXguX2NlaWwoKSksdGhpcy5fY2xlYXIoKSx0aGlzLl9kcmF3KCksdGhpcy5fcmVkcmF3Qm91bmRzPW51bGx9LF9jbGVhcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlZHJhd0JvdW5kcztpZih0KXt2YXIgaT10LmdldFNpemUoKTt0aGlzLl9jdHguY2xlYXJSZWN0KHQubWluLngsdC5taW4ueSxpLngsaS55KX1lbHNlIHRoaXMuX2N0eC5jbGVhclJlY3QoMCwwLHRoaXMuX2NvbnRhaW5lci53aWR0aCx0aGlzLl9jb250YWluZXIuaGVpZ2h0KX0sX2RyYXc6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXMuX3JlZHJhd0JvdW5kcztpZih0aGlzLl9jdHguc2F2ZSgpLGkpe3ZhciBlPWkuZ2V0U2l6ZSgpO3RoaXMuX2N0eC5iZWdpblBhdGgoKSx0aGlzLl9jdHgucmVjdChpLm1pbi54LGkubWluLnksZS54LGUueSksdGhpcy5fY3R4LmNsaXAoKX10aGlzLl9kcmF3aW5nPSEwO2Zvcih2YXIgbj10aGlzLl9kcmF3Rmlyc3Q7bjtuPW4ubmV4dCl0PW4ubGF5ZXIsKCFpfHx0Ll9weEJvdW5kcyYmdC5fcHhCb3VuZHMuaW50ZXJzZWN0cyhpKSkmJnQuX3VwZGF0ZVBhdGgoKTt0aGlzLl9kcmF3aW5nPSExLHRoaXMuX2N0eC5yZXN0b3JlKCl9LF91cGRhdGVQb2x5OmZ1bmN0aW9uKHQsaSl7aWYodGhpcy5fZHJhd2luZyl7dmFyIGUsbixvLHMscj10Ll9wYXJ0cyxhPXIubGVuZ3RoLGg9dGhpcy5fY3R4O2lmKGEpe2Zvcih0aGlzLl9kcmF3bkxheWVyc1t0Ll9sZWFmbGV0X2lkXT10LGguYmVnaW5QYXRoKCksZT0wO2U8YTtlKyspe2ZvcihuPTAsbz1yW2VdLmxlbmd0aDtuPG87bisrKXM9cltlXVtuXSxoW24/XCJsaW5lVG9cIjpcIm1vdmVUb1wiXShzLngscy55KTtpJiZoLmNsb3NlUGF0aCgpfXRoaXMuX2ZpbGxTdHJva2UoaCx0KX19fSxfdXBkYXRlQ2lyY2xlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuX2RyYXdpbmcmJiF0Ll9lbXB0eSgpKXt2YXIgaT10Ll9wb2ludCxlPXRoaXMuX2N0eCxuPXQuX3JhZGl1cyxvPSh0Ll9yYWRpdXNZfHxuKS9uO3RoaXMuX2RyYXduTGF5ZXJzW3QuX2xlYWZsZXRfaWRdPXQsMSE9PW8mJihlLnNhdmUoKSxlLnNjYWxlKDEsbykpLGUuYmVnaW5QYXRoKCksZS5hcmMoaS54LGkueS9vLG4sMCwyKk1hdGguUEksITEpLDEhPT1vJiZlLnJlc3RvcmUoKSx0aGlzLl9maWxsU3Ryb2tlKGUsdCl9fSxfZmlsbFN0cm9rZTpmdW5jdGlvbih0LGkpe3ZhciBlPWkub3B0aW9ucztlLmZpbGwmJih0Lmdsb2JhbEFscGhhPWUuZmlsbE9wYWNpdHksdC5maWxsU3R5bGU9ZS5maWxsQ29sb3J8fGUuY29sb3IsdC5maWxsKGUuZmlsbFJ1bGV8fFwiZXZlbm9kZFwiKSksZS5zdHJva2UmJjAhPT1lLndlaWdodCYmKHQuc2V0TGluZURhc2gmJnQuc2V0TGluZURhc2goaS5vcHRpb25zJiZpLm9wdGlvbnMuX2Rhc2hBcnJheXx8W10pLHQuZ2xvYmFsQWxwaGE9ZS5vcGFjaXR5LHQubGluZVdpZHRoPWUud2VpZ2h0LHQuc3Ryb2tlU3R5bGU9ZS5jb2xvcix0LmxpbmVDYXA9ZS5saW5lQ2FwLHQubGluZUpvaW49ZS5saW5lSm9pbix0LnN0cm9rZSgpKX0sX29uQ2xpY2s6ZnVuY3Rpb24odCl7Zm9yKHZhciBpLGUsbj10aGlzLl9tYXAubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0KSxvPXRoaXMuX2RyYXdGaXJzdDtvO289by5uZXh0KShpPW8ubGF5ZXIpLm9wdGlvbnMuaW50ZXJhY3RpdmUmJmkuX2NvbnRhaW5zUG9pbnQobikmJiF0aGlzLl9tYXAuX2RyYWdnYWJsZU1vdmVkKGkpJiYoZT1pKTtlJiYoZXQodCksdGhpcy5fZmlyZUV2ZW50KFtlXSx0KSl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXtpZih0aGlzLl9tYXAmJiF0aGlzLl9tYXAuZHJhZ2dpbmcubW92aW5nKCkmJiF0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb20pe3ZhciBpPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpO3RoaXMuX2hhbmRsZU1vdXNlSG92ZXIodCxpKX19LF9oYW5kbGVNb3VzZU91dDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9ob3ZlcmVkTGF5ZXI7aSYmKG10KHRoaXMuX2NvbnRhaW5lcixcImxlYWZsZXQtaW50ZXJhY3RpdmVcIiksdGhpcy5fZmlyZUV2ZW50KFtpXSx0LFwibW91c2VvdXRcIiksdGhpcy5faG92ZXJlZExheWVyPW51bGwpfSxfaGFuZGxlTW91c2VIb3ZlcjpmdW5jdGlvbih0LGkpe2Zvcih2YXIgZSxuLG89dGhpcy5fZHJhd0ZpcnN0O287bz1vLm5leHQpKGU9by5sYXllcikub3B0aW9ucy5pbnRlcmFjdGl2ZSYmZS5fY29udGFpbnNQb2ludChpKSYmKG49ZSk7biE9PXRoaXMuX2hvdmVyZWRMYXllciYmKHRoaXMuX2hhbmRsZU1vdXNlT3V0KHQpLG4mJihwdCh0aGlzLl9jb250YWluZXIsXCJsZWFmbGV0LWludGVyYWN0aXZlXCIpLHRoaXMuX2ZpcmVFdmVudChbbl0sdCxcIm1vdXNlb3ZlclwiKSx0aGlzLl9ob3ZlcmVkTGF5ZXI9bikpLHRoaXMuX2hvdmVyZWRMYXllciYmdGhpcy5fZmlyZUV2ZW50KFt0aGlzLl9ob3ZlcmVkTGF5ZXJdLHQpfSxfZmlyZUV2ZW50OmZ1bmN0aW9uKHQsaSxlKXt0aGlzLl9tYXAuX2ZpcmVET01FdmVudChpLGV8fGkudHlwZSx0KX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbih0KXt2YXIgaT10Ll9vcmRlcixlPWkubmV4dCxuPWkucHJldjtlJiYoZS5wcmV2PW4sbj9uLm5leHQ9ZTplJiYodGhpcy5fZHJhd0ZpcnN0PWUpLGkucHJldj10aGlzLl9kcmF3TGFzdCx0aGlzLl9kcmF3TGFzdC5uZXh0PWksaS5uZXh0PW51bGwsdGhpcy5fZHJhd0xhc3Q9aSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpKX0sX2JyaW5nVG9CYWNrOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX29yZGVyLGU9aS5uZXh0LG49aS5wcmV2O24mJihuLm5leHQ9ZSxlP2UucHJldj1uOm4mJih0aGlzLl9kcmF3TGFzdD1uKSxpLnByZXY9bnVsbCxpLm5leHQ9dGhpcy5fZHJhd0ZpcnN0LHRoaXMuX2RyYXdGaXJzdC5wcmV2PWksdGhpcy5fZHJhd0ZpcnN0PWksdGhpcy5fcmVxdWVzdFJlZHJhdyh0KSl9fSkscG49ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGRvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKFwibHZtbFwiLFwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWxcIiksZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCI8bHZtbDpcIit0KycgY2xhc3M9XCJsdm1sXCI+Jyl9fWNhdGNoKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIjxcIit0KycgeG1sbnM9XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQuY29tOnZtbFwiIGNsYXNzPVwibHZtbFwiPicpfX19KCksbW49e19pbml0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyPWh0KFwiZGl2XCIsXCJsZWFmbGV0LXZtbC1jb250YWluZXJcIil9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb218fChfbi5wcm90b3R5cGUuX3VwZGF0ZS5jYWxsKHRoaXMpLHRoaXMuZmlyZShcInVwZGF0ZVwiKSl9LF9pbml0UGF0aDpmdW5jdGlvbih0KXt2YXIgaT10Ll9jb250YWluZXI9cG4oXCJzaGFwZVwiKTtwdChpLFwibGVhZmxldC12bWwtc2hhcGUgXCIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWV8fFwiXCIpKSxpLmNvb3Jkc2l6ZT1cIjEgMVwiLHQuX3BhdGg9cG4oXCJwYXRoXCIpLGkuYXBwZW5kQ2hpbGQodC5fcGF0aCksdGhpcy5fdXBkYXRlU3R5bGUodCksdGhpcy5fbGF5ZXJzW24odCldPXR9LF9hZGRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX2NvbnRhaW5lcjt0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoaSksdC5vcHRpb25zLmludGVyYWN0aXZlJiZ0LmFkZEludGVyYWN0aXZlVGFyZ2V0KGkpfSxfcmVtb3ZlUGF0aDpmdW5jdGlvbih0KXt2YXIgaT10Ll9jb250YWluZXI7dXQoaSksdC5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldChpKSxkZWxldGUgdGhpcy5fbGF5ZXJzW24odCldfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGk9dC5fc3Ryb2tlLGU9dC5fZmlsbCxuPXQub3B0aW9ucyxvPXQuX2NvbnRhaW5lcjtvLnN0cm9rZWQ9ISFuLnN0cm9rZSxvLmZpbGxlZD0hIW4uZmlsbCxuLnN0cm9rZT8oaXx8KGk9dC5fc3Ryb2tlPXBuKFwic3Ryb2tlXCIpKSxvLmFwcGVuZENoaWxkKGkpLGkud2VpZ2h0PW4ud2VpZ2h0K1wicHhcIixpLmNvbG9yPW4uY29sb3IsaS5vcGFjaXR5PW4ub3BhY2l0eSxuLmRhc2hBcnJheT9pLmRhc2hTdHlsZT1laShuLmRhc2hBcnJheSk/bi5kYXNoQXJyYXkuam9pbihcIiBcIik6bi5kYXNoQXJyYXkucmVwbGFjZSgvKCAqLCAqKS9nLFwiIFwiKTppLmRhc2hTdHlsZT1cIlwiLGkuZW5kY2FwPW4ubGluZUNhcC5yZXBsYWNlKFwiYnV0dFwiLFwiZmxhdFwiKSxpLmpvaW5zdHlsZT1uLmxpbmVKb2luKTppJiYoby5yZW1vdmVDaGlsZChpKSx0Ll9zdHJva2U9bnVsbCksbi5maWxsPyhlfHwoZT10Ll9maWxsPXBuKFwiZmlsbFwiKSksby5hcHBlbmRDaGlsZChlKSxlLmNvbG9yPW4uZmlsbENvbG9yfHxuLmNvbG9yLGUub3BhY2l0eT1uLmZpbGxPcGFjaXR5KTplJiYoby5yZW1vdmVDaGlsZChlKSx0Ll9maWxsPW51bGwpfSxfdXBkYXRlQ2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX3BvaW50LnJvdW5kKCksZT1NYXRoLnJvdW5kKHQuX3JhZGl1cyksbj1NYXRoLnJvdW5kKHQuX3JhZGl1c1l8fGUpO3RoaXMuX3NldFBhdGgodCx0Ll9lbXB0eSgpP1wiTTAgMFwiOlwiQUwgXCIraS54K1wiLFwiK2kueStcIiBcIitlK1wiLFwiK24rXCIgMCwyMzU5MjYwMFwiKX0sX3NldFBhdGg6ZnVuY3Rpb24odCxpKXt0Ll9wYXRoLnY9aX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbih0KXtjdCh0Ll9jb250YWluZXIpfSxfYnJpbmdUb0JhY2s6ZnVuY3Rpb24odCl7X3QodC5fY29udGFpbmVyKX19LGZuPUtpP3BuOlMsZ249X24uZXh0ZW5kKHtnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1fbi5wcm90b3R5cGUuZ2V0RXZlbnRzLmNhbGwodGhpcyk7cmV0dXJuIHQuem9vbXN0YXJ0PXRoaXMuX29uWm9vbVN0YXJ0LHR9LF9pbml0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyPWZuKFwic3ZnXCIpLHRoaXMuX2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJwb2ludGVyLWV2ZW50c1wiLFwibm9uZVwiKSx0aGlzLl9yb290R3JvdXA9Zm4oXCJnXCIpLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9yb290R3JvdXApfSxfZGVzdHJveUNvbnRhaW5lcjpmdW5jdGlvbigpe3V0KHRoaXMuX2NvbnRhaW5lciksRyh0aGlzLl9jb250YWluZXIpLGRlbGV0ZSB0aGlzLl9jb250YWluZXIsZGVsZXRlIHRoaXMuX3Jvb3RHcm91cH0sX29uWm9vbVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCl9LF91cGRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5fbWFwLl9hbmltYXRpbmdab29tfHwhdGhpcy5fYm91bmRzKXtfbi5wcm90b3R5cGUuX3VwZGF0ZS5jYWxsKHRoaXMpO3ZhciB0PXRoaXMuX2JvdW5kcyxpPXQuZ2V0U2l6ZSgpLGU9dGhpcy5fY29udGFpbmVyO3RoaXMuX3N2Z1NpemUmJnRoaXMuX3N2Z1NpemUuZXF1YWxzKGkpfHwodGhpcy5fc3ZnU2l6ZT1pLGUuc2V0QXR0cmlidXRlKFwid2lkdGhcIixpLngpLGUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsaS55KSksTHQoZSx0Lm1pbiksZS5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsW3QubWluLngsdC5taW4ueSxpLngsaS55XS5qb2luKFwiIFwiKSksdGhpcy5maXJlKFwidXBkYXRlXCIpfX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX3BhdGg9Zm4oXCJwYXRoXCIpO3Qub3B0aW9ucy5jbGFzc05hbWUmJnB0KGksdC5vcHRpb25zLmNsYXNzTmFtZSksdC5vcHRpb25zLmludGVyYWN0aXZlJiZwdChpLFwibGVhZmxldC1pbnRlcmFjdGl2ZVwiKSx0aGlzLl91cGRhdGVTdHlsZSh0KSx0aGlzLl9sYXllcnNbbih0KV09dH0sX2FkZFBhdGg6ZnVuY3Rpb24odCl7dGhpcy5fcm9vdEdyb3VwfHx0aGlzLl9pbml0Q29udGFpbmVyKCksdGhpcy5fcm9vdEdyb3VwLmFwcGVuZENoaWxkKHQuX3BhdGgpLHQuYWRkSW50ZXJhY3RpdmVUYXJnZXQodC5fcGF0aCl9LF9yZW1vdmVQYXRoOmZ1bmN0aW9uKHQpe3V0KHQuX3BhdGgpLHQucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQodC5fcGF0aCksZGVsZXRlIHRoaXMuX2xheWVyc1tuKHQpXX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24odCl7dC5fcHJvamVjdCgpLHQuX3VwZGF0ZSgpfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGk9dC5fcGF0aCxlPXQub3B0aW9ucztpJiYoZS5zdHJva2U/KGkuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsZS5jb2xvciksaS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLGUub3BhY2l0eSksaS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIixlLndlaWdodCksaS5zZXRBdHRyaWJ1dGUoXCJzdHJva2UtbGluZWNhcFwiLGUubGluZUNhcCksaS5zZXRBdHRyaWJ1dGUoXCJzdHJva2UtbGluZWpvaW5cIixlLmxpbmVKb2luKSxlLmRhc2hBcnJheT9pLnNldEF0dHJpYnV0ZShcInN0cm9rZS1kYXNoYXJyYXlcIixlLmRhc2hBcnJheSk6aS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHJva2UtZGFzaGFycmF5XCIpLGUuZGFzaE9mZnNldD9pLnNldEF0dHJpYnV0ZShcInN0cm9rZS1kYXNob2Zmc2V0XCIsZS5kYXNoT2Zmc2V0KTppLnJlbW92ZUF0dHJpYnV0ZShcInN0cm9rZS1kYXNob2Zmc2V0XCIpKTppLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLFwibm9uZVwiKSxlLmZpbGw/KGkuc2V0QXR0cmlidXRlKFwiZmlsbFwiLGUuZmlsbENvbG9yfHxlLmNvbG9yKSxpLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLGUuZmlsbE9wYWNpdHkpLGkuc2V0QXR0cmlidXRlKFwiZmlsbC1ydWxlXCIsZS5maWxsUnVsZXx8XCJldmVub2RkXCIpKTppLnNldEF0dHJpYnV0ZShcImZpbGxcIixcIm5vbmVcIikpfSxfdXBkYXRlUG9seTpmdW5jdGlvbih0LGkpe3RoaXMuX3NldFBhdGgodCxrKHQuX3BhcnRzLGkpKX0sX3VwZGF0ZUNpcmNsZTpmdW5jdGlvbih0KXt2YXIgaT10Ll9wb2ludCxlPXQuX3JhZGl1cyxuPVwiYVwiK2UrXCIsXCIrKHQuX3JhZGl1c1l8fGUpK1wiIDAgMSwwIFwiLG89dC5fZW1wdHkoKT9cIk0wIDBcIjpcIk1cIisoaS54LWUpK1wiLFwiK2kueStuKzIqZStcIiwwIFwiK24rMiotZStcIiwwIFwiO3RoaXMuX3NldFBhdGgodCxvKX0sX3NldFBhdGg6ZnVuY3Rpb24odCxpKXt0Ll9wYXRoLnNldEF0dHJpYnV0ZShcImRcIixpKX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbih0KXtjdCh0Ll9wYXRoKX0sX2JyaW5nVG9CYWNrOmZ1bmN0aW9uKHQpe190KHQuX3BhdGgpfX0pO0tpJiZnbi5pbmNsdWRlKG1uKSx5ZS5pbmNsdWRlKHtnZXRSZW5kZXJlcjpmdW5jdGlvbih0KXt2YXIgaT10Lm9wdGlvbnMucmVuZGVyZXJ8fHRoaXMuX2dldFBhbmVSZW5kZXJlcih0Lm9wdGlvbnMucGFuZSl8fHRoaXMub3B0aW9ucy5yZW5kZXJlcnx8dGhpcy5fcmVuZGVyZXI7cmV0dXJuIGl8fChpPXRoaXMuX3JlbmRlcmVyPXRoaXMub3B0aW9ucy5wcmVmZXJDYW52YXMmJlh0KCl8fEp0KCkpLHRoaXMuaGFzTGF5ZXIoaSl8fHRoaXMuYWRkTGF5ZXIoaSksaX0sX2dldFBhbmVSZW5kZXJlcjpmdW5jdGlvbih0KXtpZihcIm92ZXJsYXlQYW5lXCI9PT10fHx2b2lkIDA9PT10KXJldHVybiExO3ZhciBpPXRoaXMuX3BhbmVSZW5kZXJlcnNbdF07cmV0dXJuIHZvaWQgMD09PWkmJihpPWduJiZKdCh7cGFuZTp0fSl8fGRuJiZYdCh7cGFuZTp0fSksdGhpcy5fcGFuZVJlbmRlcmVyc1t0XT1pKSxpfX0pO3ZhciB2bj0kZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxpKXskZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsdGhpcy5fYm91bmRzVG9MYXRMbmdzKHQpLGkpfSxzZXRCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2V0TGF0TG5ncyh0aGlzLl9ib3VuZHNUb0xhdExuZ3ModCkpfSxfYm91bmRzVG9MYXRMbmdzOmZ1bmN0aW9uKHQpe3JldHVybiB0PXoodCksW3QuZ2V0U291dGhXZXN0KCksdC5nZXROb3J0aFdlc3QoKSx0LmdldE5vcnRoRWFzdCgpLHQuZ2V0U291dGhFYXN0KCldfX0pO2duLmNyZWF0ZT1mbixnbi5wb2ludHNUb1BhdGg9ayxRZS5nZW9tZXRyeVRvTGF5ZXI9V3QsUWUuY29vcmRzVG9MYXRMbmc9SHQsUWUuY29vcmRzVG9MYXRMbmdzPUZ0LFFlLmxhdExuZ1RvQ29vcmRzPVV0LFFlLmxhdExuZ3NUb0Nvb3Jkcz1WdCxRZS5nZXRGZWF0dXJlPUd0LFFlLmFzRmVhdHVyZT1xdCx5ZS5tZXJnZU9wdGlvbnMoe2JveFpvb206ITB9KTt2YXIgeW49TWUuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHRoaXMuX2NvbnRhaW5lcj10Ll9jb250YWluZXIsdGhpcy5fcGFuZT10Ll9wYW5lcy5vdmVybGF5UGFuZSx0aGlzLl9yZXNldFN0YXRlVGltZW91dD0wLHQub24oXCJ1bmxvYWRcIix0aGlzLl9kZXN0cm95LHRoaXMpfSxhZGRIb29rczpmdW5jdGlvbigpe1YodGhpcy5fY29udGFpbmVyLFwibW91c2Vkb3duXCIsdGhpcy5fb25Nb3VzZURvd24sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7Ryh0aGlzLl9jb250YWluZXIsXCJtb3VzZWRvd25cIix0aGlzLl9vbk1vdXNlRG93bix0aGlzKX0sbW92ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW92ZWR9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dXQodGhpcy5fcGFuZSksZGVsZXRlIHRoaXMuX3BhbmV9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQ9MCx0aGlzLl9tb3ZlZD0hMX0sX2NsZWFyRGVmZXJyZWRSZXNldFN0YXRlOmZ1bmN0aW9uKCl7MCE9PXRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0KSx0aGlzLl9yZXNldFN0YXRlVGltZW91dD0wKX0sX29uTW91c2VEb3duOmZ1bmN0aW9uKHQpe2lmKCF0LnNoaWZ0S2V5fHwxIT09dC53aGljaCYmMSE9PXQuYnV0dG9uKXJldHVybiExO3RoaXMuX2NsZWFyRGVmZXJyZWRSZXNldFN0YXRlKCksdGhpcy5fcmVzZXRTdGF0ZSgpLHBpKCksYnQoKSx0aGlzLl9zdGFydFBvaW50PXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSxWKGRvY3VtZW50LHtjb250ZXh0bWVudTpRLG1vdXNlbW92ZTp0aGlzLl9vbk1vdXNlTW92ZSxtb3VzZXVwOnRoaXMuX29uTW91c2VVcCxrZXlkb3duOnRoaXMuX29uS2V5RG93bn0sdGhpcyl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt0aGlzLl9tb3ZlZHx8KHRoaXMuX21vdmVkPSEwLHRoaXMuX2JveD1odChcImRpdlwiLFwibGVhZmxldC16b29tLWJveFwiLHRoaXMuX2NvbnRhaW5lcikscHQodGhpcy5fY29udGFpbmVyLFwibGVhZmxldC1jcm9zc2hhaXJcIiksdGhpcy5fbWFwLmZpcmUoXCJib3h6b29tc3RhcnRcIikpLHRoaXMuX3BvaW50PXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KTt2YXIgaT1uZXcgUCh0aGlzLl9wb2ludCx0aGlzLl9zdGFydFBvaW50KSxlPWkuZ2V0U2l6ZSgpO0x0KHRoaXMuX2JveCxpLm1pbiksdGhpcy5fYm94LnN0eWxlLndpZHRoPWUueCtcInB4XCIsdGhpcy5fYm94LnN0eWxlLmhlaWdodD1lLnkrXCJweFwifSxfZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZWQmJih1dCh0aGlzLl9ib3gpLG10KHRoaXMuX2NvbnRhaW5lcixcImxlYWZsZXQtY3Jvc3NoYWlyXCIpKSxtaSgpLFR0KCksRyhkb2N1bWVudCx7Y29udGV4dG1lbnU6USxtb3VzZW1vdmU6dGhpcy5fb25Nb3VzZU1vdmUsbW91c2V1cDp0aGlzLl9vbk1vdXNlVXAsa2V5ZG93bjp0aGlzLl9vbktleURvd259LHRoaXMpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKHQpe2lmKCgxPT09dC53aGljaHx8MT09PXQuYnV0dG9uKSYmKHRoaXMuX2ZpbmlzaCgpLHRoaXMuX21vdmVkKSl7dGhpcy5fY2xlYXJEZWZlcnJlZFJlc2V0U3RhdGUoKSx0aGlzLl9yZXNldFN0YXRlVGltZW91dD1zZXRUaW1lb3V0KGUodGhpcy5fcmVzZXRTdGF0ZSx0aGlzKSwwKTt2YXIgaT1uZXcgVCh0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh0aGlzLl9zdGFydFBvaW50KSx0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh0aGlzLl9wb2ludCkpO3RoaXMuX21hcC5maXRCb3VuZHMoaSkuZmlyZShcImJveHpvb21lbmRcIix7Ym94Wm9vbUJvdW5kczppfSl9fSxfb25LZXlEb3duOmZ1bmN0aW9uKHQpezI3PT09dC5rZXlDb2RlJiZ0aGlzLl9maW5pc2goKX19KTt5ZS5hZGRJbml0SG9vayhcImFkZEhhbmRsZXJcIixcImJveFpvb21cIix5bikseWUubWVyZ2VPcHRpb25zKHtkb3VibGVDbGlja1pvb206ITB9KTt2YXIgeG49TWUuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe3RoaXMuX21hcC5vbihcImRibGNsaWNrXCIsdGhpcy5fb25Eb3VibGVDbGljayx0aGlzKX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub2ZmKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRvdWJsZUNsaWNrLHRoaXMpfSxfb25Eb3VibGVDbGljazpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAsZT1pLmdldFpvb20oKSxuPWkub3B0aW9ucy56b29tRGVsdGEsbz10Lm9yaWdpbmFsRXZlbnQuc2hpZnRLZXk/ZS1uOmUrbjtcImNlbnRlclwiPT09aS5vcHRpb25zLmRvdWJsZUNsaWNrWm9vbT9pLnNldFpvb20obyk6aS5zZXRab29tQXJvdW5kKHQuY29udGFpbmVyUG9pbnQsbyl9fSk7eWUuYWRkSW5pdEhvb2soXCJhZGRIYW5kbGVyXCIsXCJkb3VibGVDbGlja1pvb21cIix4bikseWUubWVyZ2VPcHRpb25zKHtkcmFnZ2luZzohMCxpbmVydGlhOiFUaSxpbmVydGlhRGVjZWxlcmF0aW9uOjM0MDAsaW5lcnRpYU1heFNwZWVkOjEvMCxlYXNlTGluZWFyaXR5Oi4yLHdvcmxkQ29weUp1bXA6ITEsbWF4Qm91bmRzVmlzY29zaXR5OjB9KTt2YXIgd249TWUuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe2lmKCF0aGlzLl9kcmFnZ2FibGUpe3ZhciB0PXRoaXMuX21hcDt0aGlzLl9kcmFnZ2FibGU9bmV3IGtlKHQuX21hcFBhbmUsdC5fY29udGFpbmVyKSx0aGlzLl9kcmFnZ2FibGUub24oe2RyYWdzdGFydDp0aGlzLl9vbkRyYWdTdGFydCxkcmFnOnRoaXMuX29uRHJhZyxkcmFnZW5kOnRoaXMuX29uRHJhZ0VuZH0sdGhpcyksdGhpcy5fZHJhZ2dhYmxlLm9uKFwicHJlZHJhZ1wiLHRoaXMuX29uUHJlRHJhZ0xpbWl0LHRoaXMpLHQub3B0aW9ucy53b3JsZENvcHlKdW1wJiYodGhpcy5fZHJhZ2dhYmxlLm9uKFwicHJlZHJhZ1wiLHRoaXMuX29uUHJlRHJhZ1dyYXAsdGhpcyksdC5vbihcInpvb21lbmRcIix0aGlzLl9vblpvb21FbmQsdGhpcyksdC53aGVuUmVhZHkodGhpcy5fb25ab29tRW5kLHRoaXMpKX1wdCh0aGlzLl9tYXAuX2NvbnRhaW5lcixcImxlYWZsZXQtZ3JhYiBsZWFmbGV0LXRvdWNoLWRyYWdcIiksdGhpcy5fZHJhZ2dhYmxlLmVuYWJsZSgpLHRoaXMuX3Bvc2l0aW9ucz1bXSx0aGlzLl90aW1lcz1bXX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXttdCh0aGlzLl9tYXAuX2NvbnRhaW5lcixcImxlYWZsZXQtZ3JhYlwiKSxtdCh0aGlzLl9tYXAuX2NvbnRhaW5lcixcImxlYWZsZXQtdG91Y2gtZHJhZ1wiKSx0aGlzLl9kcmFnZ2FibGUuZGlzYWJsZSgpfSxtb3ZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnZ2FibGUmJnRoaXMuX2RyYWdnYWJsZS5fbW92ZWR9LG1vdmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnZ2FibGUmJnRoaXMuX2RyYWdnYWJsZS5fbW92aW5nfSxfb25EcmFnU3RhcnQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXA7aWYodC5fc3RvcCgpLHRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kcyYmdGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzVmlzY29zaXR5KXt2YXIgaT16KHRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kcyk7dGhpcy5fb2Zmc2V0TGltaXQ9Yih0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludChpLmdldE5vcnRoV2VzdCgpKS5tdWx0aXBseUJ5KC0xKSx0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludChpLmdldFNvdXRoRWFzdCgpKS5tdWx0aXBseUJ5KC0xKS5hZGQodGhpcy5fbWFwLmdldFNpemUoKSkpLHRoaXMuX3Zpc2Nvc2l0eT1NYXRoLm1pbigxLE1hdGgubWF4KDAsdGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzVmlzY29zaXR5KSl9ZWxzZSB0aGlzLl9vZmZzZXRMaW1pdD1udWxsO3QuZmlyZShcIm1vdmVzdGFydFwiKS5maXJlKFwiZHJhZ3N0YXJ0XCIpLHQub3B0aW9ucy5pbmVydGlhJiYodGhpcy5fcG9zaXRpb25zPVtdLHRoaXMuX3RpbWVzPVtdKX0sX29uRHJhZzpmdW5jdGlvbih0KXtpZih0aGlzLl9tYXAub3B0aW9ucy5pbmVydGlhKXt2YXIgaT10aGlzLl9sYXN0VGltZT0rbmV3IERhdGUsZT10aGlzLl9sYXN0UG9zPXRoaXMuX2RyYWdnYWJsZS5fYWJzUG9zfHx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvczt0aGlzLl9wb3NpdGlvbnMucHVzaChlKSx0aGlzLl90aW1lcy5wdXNoKGkpLGktdGhpcy5fdGltZXNbMF0+NTAmJih0aGlzLl9wb3NpdGlvbnMuc2hpZnQoKSx0aGlzLl90aW1lcy5zaGlmdCgpKX10aGlzLl9tYXAuZmlyZShcIm1vdmVcIix0KS5maXJlKFwiZHJhZ1wiLHQpfSxfb25ab29tRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLmdldFNpemUoKS5kaXZpZGVCeSgyKSxpPXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoWzAsMF0pO3RoaXMuX2luaXRpYWxXb3JsZE9mZnNldD1pLnN1YnRyYWN0KHQpLngsdGhpcy5fd29ybGRXaWR0aD10aGlzLl9tYXAuZ2V0UGl4ZWxXb3JsZEJvdW5kcygpLmdldFNpemUoKS54fSxfdmlzY291c0xpbWl0OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQtKHQtaSkqdGhpcy5fdmlzY29zaXR5fSxfb25QcmVEcmFnTGltaXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl92aXNjb3NpdHkmJnRoaXMuX29mZnNldExpbWl0KXt2YXIgdD10aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy5zdWJ0cmFjdCh0aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zKSxpPXRoaXMuX29mZnNldExpbWl0O3QueDxpLm1pbi54JiYodC54PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LngsaS5taW4ueCkpLHQueTxpLm1pbi55JiYodC55PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LnksaS5taW4ueSkpLHQueD5pLm1heC54JiYodC54PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LngsaS5tYXgueCkpLHQueT5pLm1heC55JiYodC55PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LnksaS5tYXgueSkpLHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zPXRoaXMuX2RyYWdnYWJsZS5fc3RhcnRQb3MuYWRkKHQpfX0sX29uUHJlRHJhZ1dyYXA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93b3JsZFdpZHRoLGk9TWF0aC5yb3VuZCh0LzIpLGU9dGhpcy5faW5pdGlhbFdvcmxkT2Zmc2V0LG49dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MueCxvPShuLWkrZSkldCtpLWUscz0obitpK2UpJXQtaS1lLHI9TWF0aC5hYnMobytlKTxNYXRoLmFicyhzK2UpP286czt0aGlzLl9kcmFnZ2FibGUuX2Fic1Bvcz10aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy5jbG9uZSgpLHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zLng9cn0sX29uRHJhZ0VuZDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAsZT1pLm9wdGlvbnMsbj0hZS5pbmVydGlhfHx0aGlzLl90aW1lcy5sZW5ndGg8MjtpZihpLmZpcmUoXCJkcmFnZW5kXCIsdCksbilpLmZpcmUoXCJtb3ZlZW5kXCIpO2Vsc2V7dmFyIG89dGhpcy5fbGFzdFBvcy5zdWJ0cmFjdCh0aGlzLl9wb3NpdGlvbnNbMF0pLHM9KHRoaXMuX2xhc3RUaW1lLXRoaXMuX3RpbWVzWzBdKS8xZTMscj1lLmVhc2VMaW5lYXJpdHksYT1vLm11bHRpcGx5Qnkoci9zKSxoPWEuZGlzdGFuY2VUbyhbMCwwXSksdT1NYXRoLm1pbihlLmluZXJ0aWFNYXhTcGVlZCxoKSxsPWEubXVsdGlwbHlCeSh1L2gpLGM9dS8oZS5pbmVydGlhRGVjZWxlcmF0aW9uKnIpLF89bC5tdWx0aXBseUJ5KC1jLzIpLnJvdW5kKCk7Xy54fHxfLnk/KF89aS5fbGltaXRPZmZzZXQoXyxpLm9wdGlvbnMubWF4Qm91bmRzKSxmKGZ1bmN0aW9uKCl7aS5wYW5CeShfLHtkdXJhdGlvbjpjLGVhc2VMaW5lYXJpdHk6cixub01vdmVTdGFydDohMCxhbmltYXRlOiEwfSl9KSk6aS5maXJlKFwibW92ZWVuZFwiKX19fSk7eWUuYWRkSW5pdEhvb2soXCJhZGRIYW5kbGVyXCIsXCJkcmFnZ2luZ1wiLHduKSx5ZS5tZXJnZU9wdGlvbnMoe2tleWJvYXJkOiEwLGtleWJvYXJkUGFuRGVsdGE6ODB9KTt2YXIgTG49TWUuZXh0ZW5kKHtrZXlDb2Rlczp7bGVmdDpbMzddLHJpZ2h0OlszOV0sZG93bjpbNDBdLHVwOlszOF0sem9vbUluOlsxODcsMTA3LDYxLDE3MV0sem9vbU91dDpbMTg5LDEwOSw1NCwxNzNdfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHRoaXMuX3NldFBhbkRlbHRhKHQub3B0aW9ucy5rZXlib2FyZFBhbkRlbHRhKSx0aGlzLl9zZXRab29tRGVsdGEodC5vcHRpb25zLnpvb21EZWx0YSl9LGFkZEhvb2tzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLl9jb250YWluZXI7dC50YWJJbmRleDw9MCYmKHQudGFiSW5kZXg9XCIwXCIpLFYodCx7Zm9jdXM6dGhpcy5fb25Gb2N1cyxibHVyOnRoaXMuX29uQmx1cixtb3VzZWRvd246dGhpcy5fb25Nb3VzZURvd259LHRoaXMpLHRoaXMuX21hcC5vbih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlSG9va3MoKSxHKHRoaXMuX21hcC5fY29udGFpbmVyLHtmb2N1czp0aGlzLl9vbkZvY3VzLGJsdXI6dGhpcy5fb25CbHVyLG1vdXNlZG93bjp0aGlzLl9vbk1vdXNlRG93bn0sdGhpcyksdGhpcy5fbWFwLm9mZih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LF9vbk1vdXNlRG93bjpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkKXt2YXIgdD1kb2N1bWVudC5ib2R5LGk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9dC5zY3JvbGxUb3B8fGkuc2Nyb2xsVG9wLG49dC5zY3JvbGxMZWZ0fHxpLnNjcm9sbExlZnQ7dGhpcy5fbWFwLl9jb250YWluZXIuZm9jdXMoKSx3aW5kb3cuc2Nyb2xsVG8obixlKX19LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZD0hMCx0aGlzLl9tYXAuZmlyZShcImZvY3VzXCIpfSxfb25CbHVyOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZD0hMSx0aGlzLl9tYXAuZmlyZShcImJsdXJcIil9LF9zZXRQYW5EZWx0YTpmdW5jdGlvbih0KXt2YXIgaSxlLG49dGhpcy5fcGFuS2V5cz17fSxvPXRoaXMua2V5Q29kZXM7Zm9yKGk9MCxlPW8ubGVmdC5sZW5ndGg7aTxlO2krKyluW28ubGVmdFtpXV09Wy0xKnQsMF07Zm9yKGk9MCxlPW8ucmlnaHQubGVuZ3RoO2k8ZTtpKyspbltvLnJpZ2h0W2ldXT1bdCwwXTtmb3IoaT0wLGU9by5kb3duLmxlbmd0aDtpPGU7aSsrKW5bby5kb3duW2ldXT1bMCx0XTtmb3IoaT0wLGU9by51cC5sZW5ndGg7aTxlO2krKyluW28udXBbaV1dPVswLC0xKnRdfSxfc2V0Wm9vbURlbHRhOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbj10aGlzLl96b29tS2V5cz17fSxvPXRoaXMua2V5Q29kZXM7Zm9yKGk9MCxlPW8uem9vbUluLmxlbmd0aDtpPGU7aSsrKW5bby56b29tSW5baV1dPXQ7Zm9yKGk9MCxlPW8uem9vbU91dC5sZW5ndGg7aTxlO2krKyluW28uem9vbU91dFtpXV09LXR9LF9hZGRIb29rczpmdW5jdGlvbigpe1YoZG9jdW1lbnQsXCJrZXlkb3duXCIsdGhpcy5fb25LZXlEb3duLHRoaXMpfSxfcmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXtHKGRvY3VtZW50LFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93bix0aGlzKX0sX29uS2V5RG93bjpmdW5jdGlvbih0KXtpZighKHQuYWx0S2V5fHx0LmN0cmxLZXl8fHQubWV0YUtleSkpe3ZhciBpLGU9dC5rZXlDb2RlLG49dGhpcy5fbWFwO2lmKGUgaW4gdGhpcy5fcGFuS2V5cyl7aWYobi5fcGFuQW5pbSYmbi5fcGFuQW5pbS5faW5Qcm9ncmVzcylyZXR1cm47aT10aGlzLl9wYW5LZXlzW2VdLHQuc2hpZnRLZXkmJihpPXcoaSkubXVsdGlwbHlCeSgzKSksbi5wYW5CeShpKSxuLm9wdGlvbnMubWF4Qm91bmRzJiZuLnBhbkluc2lkZUJvdW5kcyhuLm9wdGlvbnMubWF4Qm91bmRzKX1lbHNlIGlmKGUgaW4gdGhpcy5fem9vbUtleXMpbi5zZXRab29tKG4uZ2V0Wm9vbSgpKyh0LnNoaWZ0S2V5PzM6MSkqdGhpcy5fem9vbUtleXNbZV0pO2Vsc2V7aWYoMjchPT1lfHwhbi5fcG9wdXApcmV0dXJuO24uY2xvc2VQb3B1cCgpfVEodCl9fX0pO3llLmFkZEluaXRIb29rKFwiYWRkSGFuZGxlclwiLFwia2V5Ym9hcmRcIixMbikseWUubWVyZ2VPcHRpb25zKHtzY3JvbGxXaGVlbFpvb206ITAsd2hlZWxEZWJvdW5jZVRpbWU6NDAsd2hlZWxQeFBlclpvb21MZXZlbDo2MH0pO3ZhciBQbj1NZS5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7Vih0aGlzLl9tYXAuX2NvbnRhaW5lcixcIm1vdXNld2hlZWxcIix0aGlzLl9vbldoZWVsU2Nyb2xsLHRoaXMpLHRoaXMuX2RlbHRhPTB9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7Ryh0aGlzLl9tYXAuX2NvbnRhaW5lcixcIm1vdXNld2hlZWxcIix0aGlzLl9vbldoZWVsU2Nyb2xsLHRoaXMpfSxfb25XaGVlbFNjcm9sbDpmdW5jdGlvbih0KXt2YXIgaT1pdCh0KSxuPXRoaXMuX21hcC5vcHRpb25zLndoZWVsRGVib3VuY2VUaW1lO3RoaXMuX2RlbHRhKz1pLHRoaXMuX2xhc3RNb3VzZVBvcz10aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCksdGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPStuZXcgRGF0ZSk7dmFyIG89TWF0aC5tYXgobi0oK25ldyBEYXRlLXRoaXMuX3N0YXJ0VGltZSksMCk7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj1zZXRUaW1lb3V0KGUodGhpcy5fcGVyZm9ybVpvb20sdGhpcyksbyksUSh0KX0sX3BlcmZvcm1ab29tOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGk9dC5nZXRab29tKCksZT10aGlzLl9tYXAub3B0aW9ucy56b29tU25hcHx8MDt0Ll9zdG9wKCk7dmFyIG49dGhpcy5fZGVsdGEvKDQqdGhpcy5fbWFwLm9wdGlvbnMud2hlZWxQeFBlclpvb21MZXZlbCksbz00Kk1hdGgubG9nKDIvKDErTWF0aC5leHAoLU1hdGguYWJzKG4pKSkpL01hdGguTE4yLHM9ZT9NYXRoLmNlaWwoby9lKSplOm8scj10Ll9saW1pdFpvb20oaSsodGhpcy5fZGVsdGE+MD9zOi1zKSktaTt0aGlzLl9kZWx0YT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHImJihcImNlbnRlclwiPT09dC5vcHRpb25zLnNjcm9sbFdoZWVsWm9vbT90LnNldFpvb20oaStyKTp0LnNldFpvb21Bcm91bmQodGhpcy5fbGFzdE1vdXNlUG9zLGkrcikpfX0pO3llLmFkZEluaXRIb29rKFwiYWRkSGFuZGxlclwiLFwic2Nyb2xsV2hlZWxab29tXCIsUG4pLHllLm1lcmdlT3B0aW9ucyh7dGFwOiEwLHRhcFRvbGVyYW5jZToxNX0pO3ZhciBibj1NZS5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7Vih0aGlzLl9tYXAuX2NvbnRhaW5lcixcInRvdWNoc3RhcnRcIix0aGlzLl9vbkRvd24sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7Ryh0aGlzLl9tYXAuX2NvbnRhaW5lcixcInRvdWNoc3RhcnRcIix0aGlzLl9vbkRvd24sdGhpcyl9LF9vbkRvd246ZnVuY3Rpb24odCl7aWYodC50b3VjaGVzKXtpZigkKHQpLHRoaXMuX2ZpcmVDbGljaz0hMCx0LnRvdWNoZXMubGVuZ3RoPjEpcmV0dXJuIHRoaXMuX2ZpcmVDbGljaz0hMSx2b2lkIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7dmFyIGk9dC50b3VjaGVzWzBdLG49aS50YXJnZXQ7dGhpcy5fc3RhcnRQb3M9dGhpcy5fbmV3UG9zPW5ldyB4KGkuY2xpZW50WCxpLmNsaWVudFkpLG4udGFnTmFtZSYmXCJhXCI9PT1uLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmcHQobixcImxlYWZsZXQtYWN0aXZlXCIpLHRoaXMuX2hvbGRUaW1lb3V0PXNldFRpbWVvdXQoZShmdW5jdGlvbigpe3RoaXMuX2lzVGFwVmFsaWQoKSYmKHRoaXMuX2ZpcmVDbGljaz0hMSx0aGlzLl9vblVwKCksdGhpcy5fc2ltdWxhdGVFdmVudChcImNvbnRleHRtZW51XCIsaSkpfSx0aGlzKSwxZTMpLHRoaXMuX3NpbXVsYXRlRXZlbnQoXCJtb3VzZWRvd25cIixpKSxWKGRvY3VtZW50LHt0b3VjaG1vdmU6dGhpcy5fb25Nb3ZlLHRvdWNoZW5kOnRoaXMuX29uVXB9LHRoaXMpfX0sX29uVXA6ZnVuY3Rpb24odCl7aWYoY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KSxHKGRvY3VtZW50LHt0b3VjaG1vdmU6dGhpcy5fb25Nb3ZlLHRvdWNoZW5kOnRoaXMuX29uVXB9LHRoaXMpLHRoaXMuX2ZpcmVDbGljayYmdCYmdC5jaGFuZ2VkVG91Y2hlcyl7dmFyIGk9dC5jaGFuZ2VkVG91Y2hlc1swXSxlPWkudGFyZ2V0O2UmJmUudGFnTmFtZSYmXCJhXCI9PT1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmbXQoZSxcImxlYWZsZXQtYWN0aXZlXCIpLHRoaXMuX3NpbXVsYXRlRXZlbnQoXCJtb3VzZXVwXCIsaSksdGhpcy5faXNUYXBWYWxpZCgpJiZ0aGlzLl9zaW11bGF0ZUV2ZW50KFwiY2xpY2tcIixpKX19LF9pc1RhcFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25ld1Bvcy5kaXN0YW5jZVRvKHRoaXMuX3N0YXJ0UG9zKTw9dGhpcy5fbWFwLm9wdGlvbnMudGFwVG9sZXJhbmNlfSxfb25Nb3ZlOmZ1bmN0aW9uKHQpe3ZhciBpPXQudG91Y2hlc1swXTt0aGlzLl9uZXdQb3M9bmV3IHgoaS5jbGllbnRYLGkuY2xpZW50WSksdGhpcy5fc2ltdWxhdGVFdmVudChcIm1vdXNlbW92ZVwiLGkpfSxfc2ltdWxhdGVFdmVudDpmdW5jdGlvbih0LGkpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudHNcIik7ZS5fc2ltdWxhdGVkPSEwLGkudGFyZ2V0Ll9zaW11bGF0ZWRDbGljaz0hMCxlLmluaXRNb3VzZUV2ZW50KHQsITAsITAsd2luZG93LDEsaS5zY3JlZW5YLGkuc2NyZWVuWSxpLmNsaWVudFgsaS5jbGllbnRZLCExLCExLCExLCExLDAsbnVsbCksaS50YXJnZXQuZGlzcGF0Y2hFdmVudChlKX19KTtIaSYmIVdpJiZ5ZS5hZGRJbml0SG9vayhcImFkZEhhbmRsZXJcIixcInRhcFwiLGJuKSx5ZS5tZXJnZU9wdGlvbnMoe3RvdWNoWm9vbTpIaSYmIVRpLGJvdW5jZUF0Wm9vbUxpbWl0czohMH0pO3ZhciBUbj1NZS5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7cHQodGhpcy5fbWFwLl9jb250YWluZXIsXCJsZWFmbGV0LXRvdWNoLXpvb21cIiksVih0aGlzLl9tYXAuX2NvbnRhaW5lcixcInRvdWNoc3RhcnRcIix0aGlzLl9vblRvdWNoU3RhcnQsdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7bXQodGhpcy5fbWFwLl9jb250YWluZXIsXCJsZWFmbGV0LXRvdWNoLXpvb21cIiksRyh0aGlzLl9tYXAuX2NvbnRhaW5lcixcInRvdWNoc3RhcnRcIix0aGlzLl9vblRvdWNoU3RhcnQsdGhpcyl9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwO2lmKHQudG91Y2hlcyYmMj09PXQudG91Y2hlcy5sZW5ndGgmJiFpLl9hbmltYXRpbmdab29tJiYhdGhpcy5fem9vbWluZyl7dmFyIGU9aS5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0LnRvdWNoZXNbMF0pLG49aS5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0LnRvdWNoZXNbMV0pO3RoaXMuX2NlbnRlclBvaW50PWkuZ2V0U2l6ZSgpLl9kaXZpZGVCeSgyKSx0aGlzLl9zdGFydExhdExuZz1pLmNvbnRhaW5lclBvaW50VG9MYXRMbmcodGhpcy5fY2VudGVyUG9pbnQpLFwiY2VudGVyXCIhPT1pLm9wdGlvbnMudG91Y2hab29tJiYodGhpcy5fcGluY2hTdGFydExhdExuZz1pLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoZS5hZGQobikuX2RpdmlkZUJ5KDIpKSksdGhpcy5fc3RhcnREaXN0PWUuZGlzdGFuY2VUbyhuKSx0aGlzLl9zdGFydFpvb209aS5nZXRab29tKCksdGhpcy5fbW92ZWQ9ITEsdGhpcy5fem9vbWluZz0hMCxpLl9zdG9wKCksVihkb2N1bWVudCxcInRvdWNobW92ZVwiLHRoaXMuX29uVG91Y2hNb3ZlLHRoaXMpLFYoZG9jdW1lbnQsXCJ0b3VjaGVuZFwiLHRoaXMuX29uVG91Y2hFbmQsdGhpcyksJCh0KX19LF9vblRvdWNoTW92ZTpmdW5jdGlvbih0KXtpZih0LnRvdWNoZXMmJjI9PT10LnRvdWNoZXMubGVuZ3RoJiZ0aGlzLl96b29taW5nKXt2YXIgaT10aGlzLl9tYXAsbj1pLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1swXSksbz1pLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1sxXSkscz1uLmRpc3RhbmNlVG8obykvdGhpcy5fc3RhcnREaXN0O2lmKHRoaXMuX3pvb209aS5nZXRTY2FsZVpvb20ocyx0aGlzLl9zdGFydFpvb20pLCFpLm9wdGlvbnMuYm91bmNlQXRab29tTGltaXRzJiYodGhpcy5fem9vbTxpLmdldE1pblpvb20oKSYmczwxfHx0aGlzLl96b29tPmkuZ2V0TWF4Wm9vbSgpJiZzPjEpJiYodGhpcy5fem9vbT1pLl9saW1pdFpvb20odGhpcy5fem9vbSkpLFwiY2VudGVyXCI9PT1pLm9wdGlvbnMudG91Y2hab29tKXtpZih0aGlzLl9jZW50ZXI9dGhpcy5fc3RhcnRMYXRMbmcsMT09PXMpcmV0dXJufWVsc2V7dmFyIHI9bi5fYWRkKG8pLl9kaXZpZGVCeSgyKS5fc3VidHJhY3QodGhpcy5fY2VudGVyUG9pbnQpO2lmKDE9PT1zJiYwPT09ci54JiYwPT09ci55KXJldHVybjt0aGlzLl9jZW50ZXI9aS51bnByb2plY3QoaS5wcm9qZWN0KHRoaXMuX3BpbmNoU3RhcnRMYXRMbmcsdGhpcy5fem9vbSkuc3VidHJhY3QociksdGhpcy5fem9vbSl9dGhpcy5fbW92ZWR8fChpLl9tb3ZlU3RhcnQoITApLHRoaXMuX21vdmVkPSEwKSxnKHRoaXMuX2FuaW1SZXF1ZXN0KTt2YXIgYT1lKGkuX21vdmUsaSx0aGlzLl9jZW50ZXIsdGhpcy5fem9vbSx7cGluY2g6ITAscm91bmQ6ITF9KTt0aGlzLl9hbmltUmVxdWVzdD1mKGEsdGhpcywhMCksJCh0KX19LF9vblRvdWNoRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZWQmJnRoaXMuX3pvb21pbmc/KHRoaXMuX3pvb21pbmc9ITEsZyh0aGlzLl9hbmltUmVxdWVzdCksRyhkb2N1bWVudCxcInRvdWNobW92ZVwiLHRoaXMuX29uVG91Y2hNb3ZlKSxHKGRvY3VtZW50LFwidG91Y2hlbmRcIix0aGlzLl9vblRvdWNoRW5kKSx0aGlzLl9tYXAub3B0aW9ucy56b29tQW5pbWF0aW9uP3RoaXMuX21hcC5fYW5pbWF0ZVpvb20odGhpcy5fY2VudGVyLHRoaXMuX21hcC5fbGltaXRab29tKHRoaXMuX3pvb20pLCEwLHRoaXMuX21hcC5vcHRpb25zLnpvb21TbmFwKTp0aGlzLl9tYXAuX3Jlc2V0Vmlldyh0aGlzLl9jZW50ZXIsdGhpcy5fbWFwLl9saW1pdFpvb20odGhpcy5fem9vbSkpKTp0aGlzLl96b29taW5nPSExfX0pO3llLmFkZEluaXRIb29rKFwiYWRkSGFuZGxlclwiLFwidG91Y2hab29tXCIsVG4pLHllLkJveFpvb209eW4seWUuRG91YmxlQ2xpY2tab29tPXhuLHllLkRyYWc9d24seWUuS2V5Ym9hcmQ9TG4seWUuU2Nyb2xsV2hlZWxab29tPVBuLHllLlRhcD1ibix5ZS5Ub3VjaFpvb209VG47dmFyIHpuPXdpbmRvdy5MO3dpbmRvdy5MPXQsT2JqZWN0LmZyZWV6ZT0kdCx0LnZlcnNpb249XCIxLjIuMFwiLHQubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuTD16bix0aGlzfSx0LkNvbnRyb2w9eGUsdC5jb250cm9sPXdlLHQuQnJvd3Nlcj1ZaSx0LkV2ZW50ZWQ9dWksdC5NaXhpbj1DZSx0LlV0aWw9YWksdC5DbGFzcz12LHQuSGFuZGxlcj1NZSx0LmV4dGVuZD1pLHQuYmluZD1lLHQuc3RhbXA9bix0LnNldE9wdGlvbnM9bCx0LkRvbUV2ZW50PWxlLHQuRG9tVXRpbD1nZSx0LlBvc0FuaW1hdGlvbj12ZSx0LkRyYWdnYWJsZT1rZSx0LkxpbmVVdGlsPUJlLHQuUG9seVV0aWw9SWUsdC5Qb2ludD14LHQucG9pbnQ9dyx0LkJvdW5kcz1QLHQuYm91bmRzPWIsdC5UcmFuc2Zvcm1hdGlvbj1aLHQudHJhbnNmb3JtYXRpb249RSx0LlByb2plY3Rpb249UmUsdC5MYXRMbmc9TSx0LmxhdExuZz1DLHQuTGF0TG5nQm91bmRzPVQsdC5sYXRMbmdCb3VuZHM9eix0LkNSUz1saSx0Lkdlb0pTT049UWUsdC5nZW9KU09OPUt0LHQuZ2VvSnNvbj1lbix0LkxheWVyPVdlLHQuTGF5ZXJHcm91cD1IZSx0LmxheWVyR3JvdXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBIZSh0KX0sdC5GZWF0dXJlR3JvdXA9RmUsdC5mZWF0dXJlR3JvdXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGZSh0KX0sdC5JbWFnZU92ZXJsYXk9bm4sdC5pbWFnZU92ZXJsYXk9ZnVuY3Rpb24odCxpLGUpe3JldHVybiBuZXcgbm4odCxpLGUpfSx0LlZpZGVvT3ZlcmxheT1vbix0LnZpZGVvT3ZlcmxheT1mdW5jdGlvbih0LGksZSl7cmV0dXJuIG5ldyBvbih0LGksZSl9LHQuRGl2T3ZlcmxheT1zbix0LlBvcHVwPXJuLHQucG9wdXA9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IHJuKHQsaSl9LHQuVG9vbHRpcD1hbix0LnRvb2x0aXA9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IGFuKHQsaSl9LHQuSWNvbj1VZSx0Lmljb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVZSh0KX0sdC5EaXZJY29uPWhuLHQuZGl2SWNvbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGhuKHQpfSx0Lk1hcmtlcj1xZSx0Lm1hcmtlcj1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgcWUodCxpKX0sdC5UaWxlTGF5ZXI9bG4sdC50aWxlTGF5ZXI9WXQsdC5HcmlkTGF5ZXI9dW4sdC5ncmlkTGF5ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB1bih0KX0sdC5TVkc9Z24sdC5zdmc9SnQsdC5SZW5kZXJlcj1fbix0LkNhbnZhcz1kbix0LmNhbnZhcz1YdCx0LlBhdGg9S2UsdC5DaXJjbGVNYXJrZXI9WWUsdC5jaXJjbGVNYXJrZXI9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IFllKHQsaSl9LHQuQ2lyY2xlPVhlLHQuY2lyY2xlPWZ1bmN0aW9uKHQsaSxlKXtyZXR1cm4gbmV3IFhlKHQsaSxlKX0sdC5Qb2x5bGluZT1KZSx0LnBvbHlsaW5lPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyBKZSh0LGkpfSx0LlBvbHlnb249JGUsdC5wb2x5Z29uPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyAkZSh0LGkpfSx0LlJlY3RhbmdsZT12bix0LnJlY3RhbmdsZT1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgdm4odCxpKX0sdC5NYXA9eWUsdC5tYXA9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IHllKHQsaSl9fSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcHVibGljL2Fzc2V0cy92ZW5kb3IvbGVhZmxldC9kaXN0L2xlYWZsZXQuanMiLCIvKiFcbiAqIFNlbGVjdDIgNC4wLjNcbiAqIGh0dHBzOi8vc2VsZWN0Mi5naXRodWIuaW9cbiAqXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWxlY3QyL3NlbGVjdDIvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxuICovXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICBkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gTm9kZS9Db21tb25KU1xuICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpO1xuICB9IGVsc2Uge1xuICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xuICAgIGZhY3RvcnkoalF1ZXJ5KTtcbiAgfVxufShmdW5jdGlvbiAoalF1ZXJ5KSB7XG4gIC8vIFRoaXMgaXMgbmVlZGVkIHNvIHdlIGNhbiBjYXRjaCB0aGUgQU1EIGxvYWRlciBjb25maWd1cmF0aW9uIGFuZCB1c2UgaXRcbiAgLy8gVGhlIGlubmVyIGZpbGUgc2hvdWxkIGJlIHdyYXBwZWQgKGJ5IGBiYW5uZXIuc3RhcnQuanNgKSBpbiBhIGZ1bmN0aW9uIHRoYXRcbiAgLy8gcmV0dXJucyB0aGUgQU1EIGxvYWRlciByZWZlcmVuY2VzLlxuICB2YXIgUzIgPVxuKGZ1bmN0aW9uICgpIHtcbiAgLy8gUmVzdG9yZSB0aGUgU2VsZWN0MiBBTUQgbG9hZGVyIHNvIGl0IGNhbiBiZSB1c2VkXG4gIC8vIE5lZWRlZCBtb3N0bHkgaW4gdGhlIGxhbmd1YWdlIGZpbGVzLCB3aGVyZSB0aGUgbG9hZGVyIGlzIG5vdCBpbnNlcnRlZFxuICBpZiAoalF1ZXJ5ICYmIGpRdWVyeS5mbiAmJiBqUXVlcnkuZm4uc2VsZWN0MiAmJiBqUXVlcnkuZm4uc2VsZWN0Mi5hbWQpIHtcbiAgICB2YXIgUzIgPSBqUXVlcnkuZm4uc2VsZWN0Mi5hbWQ7XG4gIH1cbnZhciBTMjsoZnVuY3Rpb24gKCkgeyBpZiAoIVMyIHx8ICFTMi5yZXF1aXJlanMpIHtcbmlmICghUzIpIHsgUzIgPSB7fTsgfSBlbHNlIHsgcmVxdWlyZSA9IFMyOyB9XG4vKipcbiAqIEBsaWNlbnNlIGFsbW9uZCAwLjMuMSBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgVGhlIERvam8gRm91bmRhdGlvbiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogQXZhaWxhYmxlIHZpYSB0aGUgTUlUIG9yIG5ldyBCU0QgbGljZW5zZS5cbiAqIHNlZTogaHR0cDovL2dpdGh1Yi5jb20vanJidXJrZS9hbG1vbmQgZm9yIGRldGFpbHNcbiAqL1xuLy9Hb2luZyBzbG9wcHkgdG8gYXZvaWQgJ3VzZSBzdHJpY3QnIHN0cmluZyBjb3N0LCBidXQgc3RyaWN0IHByYWN0aWNlcyBzaG91bGRcbi8vYmUgZm9sbG93ZWQuXG4vKmpzbGludCBzbG9wcHk6IHRydWUgKi9cbi8qZ2xvYmFsIHNldFRpbWVvdXQ6IGZhbHNlICovXG5cbnZhciByZXF1aXJlanMsIHJlcXVpcmUsIGRlZmluZTtcbihmdW5jdGlvbiAodW5kZWYpIHtcbiAgICB2YXIgbWFpbiwgcmVxLCBtYWtlTWFwLCBoYW5kbGVycyxcbiAgICAgICAgZGVmaW5lZCA9IHt9LFxuICAgICAgICB3YWl0aW5nID0ge30sXG4gICAgICAgIGNvbmZpZyA9IHt9LFxuICAgICAgICBkZWZpbmluZyA9IHt9LFxuICAgICAgICBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuICAgICAgICBhcHMgPSBbXS5zbGljZSxcbiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXFwuanMkLztcblxuICAgIGZ1bmN0aW9uIGhhc1Byb3Aob2JqLCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBoYXNPd24uY2FsbChvYmosIHByb3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcmVsYXRpdmUgbW9kdWxlIG5hbWUsIGxpa2UgLi9zb21ldGhpbmcsIG5vcm1hbGl6ZSBpdCB0b1xuICAgICAqIGEgcmVhbCBuYW1lIHRoYXQgY2FuIGJlIG1hcHBlZCB0byBhIHBhdGguXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIHJlbGF0aXZlIG5hbWVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmFzZU5hbWUgYSByZWFsIG5hbWUgdGhhdCB0aGUgbmFtZSBhcmcgaXMgcmVsYXRpdmVcbiAgICAgKiB0by5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBub3JtYWxpemVkIG5hbWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub3JtYWxpemUobmFtZSwgYmFzZU5hbWUpIHtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cywgbmFtZVNlZ21lbnQsIG1hcFZhbHVlLCBmb3VuZE1hcCwgbGFzdEluZGV4LFxuICAgICAgICAgICAgZm91bmRJLCBmb3VuZFN0YXJNYXAsIHN0YXJJLCBpLCBqLCBwYXJ0LFxuICAgICAgICAgICAgYmFzZVBhcnRzID0gYmFzZU5hbWUgJiYgYmFzZU5hbWUuc3BsaXQoXCIvXCIpLFxuICAgICAgICAgICAgbWFwID0gY29uZmlnLm1hcCxcbiAgICAgICAgICAgIHN0YXJNYXAgPSAobWFwICYmIG1hcFsnKiddKSB8fCB7fTtcblxuICAgICAgICAvL0FkanVzdCBhbnkgcmVsYXRpdmUgcGF0aHMuXG4gICAgICAgIGlmIChuYW1lICYmIG5hbWUuY2hhckF0KDApID09PSBcIi5cIikge1xuICAgICAgICAgICAgLy9JZiBoYXZlIGEgYmFzZSBuYW1lLCB0cnkgdG8gbm9ybWFsaXplIGFnYWluc3QgaXQsXG4gICAgICAgICAgICAvL290aGVyd2lzZSwgYXNzdW1lIGl0IGlzIGEgdG9wLWxldmVsIHJlcXVpcmUgdGhhdCB3aWxsXG4gICAgICAgICAgICAvL2JlIHJlbGF0aXZlIHRvIGJhc2VVcmwgaW4gdGhlIGVuZC5cbiAgICAgICAgICAgIGlmIChiYXNlTmFtZSkge1xuICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbmFtZS5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICAgICAgLy8gTm9kZSAuanMgYWxsb3dhbmNlOlxuICAgICAgICAgICAgICAgIGlmIChjb25maWcubm9kZUlkQ29tcGF0ICYmIGpzU3VmZml4UmVnRXhwLnRlc3QobmFtZVtsYXN0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBuYW1lW2xhc3RJbmRleF0gPSBuYW1lW2xhc3RJbmRleF0ucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vTG9wIG9mZiB0aGUgbGFzdCBwYXJ0IG9mIGJhc2VQYXJ0cywgc28gdGhhdCAuIG1hdGNoZXMgdGhlXG4gICAgICAgICAgICAgICAgLy9cImRpcmVjdG9yeVwiIGFuZCBub3QgbmFtZSBvZiB0aGUgYmFzZU5hbWUncyBtb2R1bGUuIEZvciBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAvL2Jhc2VOYW1lIG9mIFwib25lL3R3by90aHJlZVwiLCBtYXBzIHRvIFwib25lL3R3by90aHJlZS5qc1wiLCBidXQgd2VcbiAgICAgICAgICAgICAgICAvL3dhbnQgdGhlIGRpcmVjdG9yeSwgXCJvbmUvdHdvXCIgZm9yIHRoaXMgbm9ybWFsaXphdGlvbi5cbiAgICAgICAgICAgICAgICBuYW1lID0gYmFzZVBhcnRzLnNsaWNlKDAsIGJhc2VQYXJ0cy5sZW5ndGggLSAxKS5jb25jYXQobmFtZSk7XG5cbiAgICAgICAgICAgICAgICAvL3N0YXJ0IHRyaW1Eb3RzXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydCA9IG5hbWVbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gXCIuLlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiAobmFtZVsyXSA9PT0gJy4uJyB8fCBuYW1lWzBdID09PSAnLi4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRW5kIG9mIHRoZSBsaW5lLiBLZWVwIGF0IGxlYXN0IG9uZSBub24tZG90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wYXRoIHNlZ21lbnQgYXQgdGhlIGZyb250IHNvIGl0IGNhbiBiZSBtYXBwZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvcnJlY3RseSB0byBkaXNrLiBPdGhlcndpc2UsIHRoZXJlIGlzIGxpa2VseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm8gcGF0aCBtYXBwaW5nIGZvciBhIHBhdGggc3RhcnRpbmcgd2l0aCAnLi4nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhpcyBjYW4gc3RpbGwgZmFpbCwgYnV0IGNhdGNoZXMgdGhlIG1vc3QgcmVhc29uYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNlcyBvZiAuLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuc3BsaWNlKGkgLSAxLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIC09IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9lbmQgdHJpbURvdHNcblxuICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLmpvaW4oXCIvXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmluZGV4T2YoJy4vJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBObyBiYXNlTmFtZSwgc28gdGhpcyBpcyBJRCBpcyByZXNvbHZlZCByZWxhdGl2ZVxuICAgICAgICAgICAgICAgIC8vIHRvIGJhc2VVcmwsIHB1bGwgb2ZmIHRoZSBsZWFkaW5nIGRvdC5cbiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL0FwcGx5IG1hcCBjb25maWcgaWYgYXZhaWxhYmxlLlxuICAgICAgICBpZiAoKGJhc2VQYXJ0cyB8fCBzdGFyTWFwKSAmJiBtYXApIHtcbiAgICAgICAgICAgIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTtcblxuICAgICAgICAgICAgZm9yIChpID0gbmFtZVBhcnRzLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkge1xuICAgICAgICAgICAgICAgIG5hbWVTZWdtZW50ID0gbmFtZVBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oXCIvXCIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0cykge1xuICAgICAgICAgICAgICAgICAgICAvL0ZpbmQgdGhlIGxvbmdlc3QgYmFzZU5hbWUgc2VnbWVudCBtYXRjaCBpbiB0aGUgY29uZmlnLlxuICAgICAgICAgICAgICAgICAgICAvL1NvLCBkbyBqb2lucyBvbiB0aGUgYmlnZ2VzdCB0byBzbWFsbGVzdCBsZW5ndGhzIG9mIGJhc2VQYXJ0cy5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYmFzZVBhcnRzLmxlbmd0aDsgaiA+IDA7IGogLT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBtYXBbYmFzZVBhcnRzLnNsaWNlKDAsIGopLmpvaW4oJy8nKV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vYmFzZU5hbWUgc2VnbWVudCBoYXMgIGNvbmZpZywgZmluZCBpZiBpdCBoYXMgb25lIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBWYWx1ZSA9IG1hcFZhbHVlW25hbWVTZWdtZW50XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXRjaCwgdXBkYXRlIG5hbWUgdG8gdGhlIG5ldyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXAgPSBtYXBWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGEgc3RhciBtYXAgbWF0Y2gsIGJ1dCBqdXN0IGhvbGQgb24gdG8gaXQsXG4gICAgICAgICAgICAgICAgLy9pZiB0aGVyZSBpcyBhIHNob3J0ZXIgc2VnbWVudCBtYXRjaCBsYXRlciBpbiBhIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgLy9jb25maWcsIHRoZW4gZmF2b3Igb3ZlciB0aGlzIHN0YXIgbWFwLlxuICAgICAgICAgICAgICAgIGlmICghZm91bmRTdGFyTWFwICYmIHN0YXJNYXAgJiYgc3Rhck1hcFtuYW1lU2VnbWVudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRTdGFyTWFwID0gc3Rhck1hcFtuYW1lU2VnbWVudF07XG4gICAgICAgICAgICAgICAgICAgIHN0YXJJID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZm91bmRNYXAgJiYgZm91bmRTdGFyTWFwKSB7XG4gICAgICAgICAgICAgICAgZm91bmRNYXAgPSBmb3VuZFN0YXJNYXA7XG4gICAgICAgICAgICAgICAgZm91bmRJID0gc3Rhckk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3VuZE1hcCkge1xuICAgICAgICAgICAgICAgIG5hbWVQYXJ0cy5zcGxpY2UoMCwgZm91bmRJLCBmb3VuZE1hcCk7XG4gICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0cy5qb2luKCcvJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlUmVxdWlyZShyZWxOYW1lLCBmb3JjZVN5bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vQSB2ZXJzaW9uIG9mIGEgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IHBhc3NlcyBhIG1vZHVsZU5hbWVcbiAgICAgICAgICAgIC8vdmFsdWUgZm9yIGl0ZW1zIHRoYXQgbWF5IG5lZWQgdG9cbiAgICAgICAgICAgIC8vbG9vayB1cCBwYXRocyByZWxhdGl2ZSB0byB0aGUgbW9kdWxlTmFtZVxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcHMuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgICAgICAvL0lmIGZpcnN0IGFyZyBpcyBub3QgcmVxdWlyZSgnc3RyaW5nJyksIGFuZCB0aGVyZSBpcyBvbmx5XG4gICAgICAgICAgICAvL29uZSBhcmcsIGl0IGlzIHRoZSBhcnJheSBmb3JtIHdpdGhvdXQgYSBjYWxsYmFjay4gSW5zZXJ0XG4gICAgICAgICAgICAvL2EgbnVsbCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uY2F0IGlzIGNvcnJlY3QuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnICYmIGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcS5hcHBseSh1bmRlZiwgYXJncy5jb25jYXQoW3JlbE5hbWUsIGZvcmNlU3luY10pKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlTm9ybWFsaXplKHJlbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKG5hbWUsIHJlbE5hbWUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VMb2FkKGRlcE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgZGVmaW5lZFtkZXBOYW1lXSA9IHZhbHVlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxEZXAobmFtZSkge1xuICAgICAgICBpZiAoaGFzUHJvcCh3YWl0aW5nLCBuYW1lKSkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSB3YWl0aW5nW25hbWVdO1xuICAgICAgICAgICAgZGVsZXRlIHdhaXRpbmdbbmFtZV07XG4gICAgICAgICAgICBkZWZpbmluZ1tuYW1lXSA9IHRydWU7XG4gICAgICAgICAgICBtYWluLmFwcGx5KHVuZGVmLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFzUHJvcChkZWZpbmVkLCBuYW1lKSAmJiAhaGFzUHJvcChkZWZpbmluZywgbmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gJyArIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVkW25hbWVdO1xuICAgIH1cblxuICAgIC8vVHVybnMgYSBwbHVnaW4hcmVzb3VyY2UgdG8gW3BsdWdpbiwgcmVzb3VyY2VdXG4gICAgLy93aXRoIHRoZSBwbHVnaW4gYmVpbmcgdW5kZWZpbmVkIGlmIHRoZSBuYW1lXG4gICAgLy9kaWQgbm90IGhhdmUgYSBwbHVnaW4gcHJlZml4LlxuICAgIGZ1bmN0aW9uIHNwbGl0UHJlZml4KG5hbWUpIHtcbiAgICAgICAgdmFyIHByZWZpeCxcbiAgICAgICAgICAgIGluZGV4ID0gbmFtZSA/IG5hbWUuaW5kZXhPZignIScpIDogLTE7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtwcmVmaXgsIG5hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgbmFtZSBtYXAsIG5vcm1hbGl6aW5nIHRoZSBuYW1lLCBhbmQgdXNpbmcgYSBwbHVnaW5cbiAgICAgKiBmb3Igbm9ybWFsaXphdGlvbiBpZiBuZWNlc3NhcnkuIEdyYWJzIGEgcmVmIHRvIHBsdWdpblxuICAgICAqIHRvbywgYXMgYW4gb3B0aW1pemF0aW9uLlxuICAgICAqL1xuICAgIG1ha2VNYXAgPSBmdW5jdGlvbiAobmFtZSwgcmVsTmFtZSkge1xuICAgICAgICB2YXIgcGx1Z2luLFxuICAgICAgICAgICAgcGFydHMgPSBzcGxpdFByZWZpeChuYW1lKSxcbiAgICAgICAgICAgIHByZWZpeCA9IHBhcnRzWzBdO1xuXG4gICAgICAgIG5hbWUgPSBwYXJ0c1sxXTtcblxuICAgICAgICBpZiAocHJlZml4KSB7XG4gICAgICAgICAgICBwcmVmaXggPSBub3JtYWxpemUocHJlZml4LCByZWxOYW1lKTtcbiAgICAgICAgICAgIHBsdWdpbiA9IGNhbGxEZXAocHJlZml4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vTm9ybWFsaXplIGFjY29yZGluZ1xuICAgICAgICBpZiAocHJlZml4KSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luICYmIHBsdWdpbi5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICBuYW1lID0gcGx1Z2luLm5vcm1hbGl6ZShuYW1lLCBtYWtlTm9ybWFsaXplKHJlbE5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IG5vcm1hbGl6ZShuYW1lLCByZWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hbWUgPSBub3JtYWxpemUobmFtZSwgcmVsTmFtZSk7XG4gICAgICAgICAgICBwYXJ0cyA9IHNwbGl0UHJlZml4KG5hbWUpO1xuICAgICAgICAgICAgcHJlZml4ID0gcGFydHNbMF07XG4gICAgICAgICAgICBuYW1lID0gcGFydHNbMV07XG4gICAgICAgICAgICBpZiAocHJlZml4KSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luID0gY2FsbERlcChwcmVmaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9Vc2luZyByaWRpY3Vsb3VzIHByb3BlcnR5IG5hbWVzIGZvciBzcGFjZSByZWFzb25zXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmOiBwcmVmaXggPyBwcmVmaXggKyAnIScgKyBuYW1lIDogbmFtZSwgLy9mdWxsTmFtZVxuICAgICAgICAgICAgbjogbmFtZSxcbiAgICAgICAgICAgIHByOiBwcmVmaXgsXG4gICAgICAgICAgICBwOiBwbHVnaW5cbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWFrZUNvbmZpZyhuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gKGNvbmZpZyAmJiBjb25maWcuY29uZmlnICYmIGNvbmZpZy5jb25maWdbbmFtZV0pIHx8IHt9O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhbmRsZXJzID0ge1xuICAgICAgICByZXF1aXJlOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VSZXF1aXJlKG5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBleHBvcnRzOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgdmFyIGUgPSBkZWZpbmVkW25hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGRlZmluZWRbbmFtZV0gPSB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vZHVsZTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IG5hbWUsXG4gICAgICAgICAgICAgICAgdXJpOiAnJyxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBkZWZpbmVkW25hbWVdLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogbWFrZUNvbmZpZyhuYW1lKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBtYWluID0gZnVuY3Rpb24gKG5hbWUsIGRlcHMsIGNhbGxiYWNrLCByZWxOYW1lKSB7XG4gICAgICAgIHZhciBjanNNb2R1bGUsIGRlcE5hbWUsIHJldCwgbWFwLCBpLFxuICAgICAgICAgICAgYXJncyA9IFtdLFxuICAgICAgICAgICAgY2FsbGJhY2tUeXBlID0gdHlwZW9mIGNhbGxiYWNrLFxuICAgICAgICAgICAgdXNpbmdFeHBvcnRzO1xuXG4gICAgICAgIC8vVXNlIG5hbWUgaWYgbm8gcmVsTmFtZVxuICAgICAgICByZWxOYW1lID0gcmVsTmFtZSB8fCBuYW1lO1xuXG4gICAgICAgIC8vQ2FsbCB0aGUgY2FsbGJhY2sgdG8gZGVmaW5lIHRoZSBtb2R1bGUsIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgaWYgKGNhbGxiYWNrVHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgY2FsbGJhY2tUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvL1B1bGwgb3V0IHRoZSBkZWZpbmVkIGRlcGVuZGVuY2llcyBhbmQgcGFzcyB0aGUgb3JkZXJlZFxuICAgICAgICAgICAgLy92YWx1ZXMgdG8gdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgLy9EZWZhdWx0IHRvIFtyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGVdIGlmIG5vIGRlcHNcbiAgICAgICAgICAgIGRlcHMgPSAhZGVwcy5sZW5ndGggJiYgY2FsbGJhY2subGVuZ3RoID8gWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ10gOiBkZXBzO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBtYXAgPSBtYWtlTWFwKGRlcHNbaV0sIHJlbE5hbWUpO1xuICAgICAgICAgICAgICAgIGRlcE5hbWUgPSBtYXAuZjtcblxuICAgICAgICAgICAgICAgIC8vRmFzdCBwYXRoIENvbW1vbkpTIHN0YW5kYXJkIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgICAgICBpZiAoZGVwTmFtZSA9PT0gXCJyZXF1aXJlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IGhhbmRsZXJzLnJlcXVpcmUobmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXBOYW1lID09PSBcImV4cG9ydHNcIikge1xuICAgICAgICAgICAgICAgICAgICAvL0NvbW1vbkpTIG1vZHVsZSBzcGVjIDEuMVxuICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gaGFuZGxlcnMuZXhwb3J0cyhuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdXNpbmdFeHBvcnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlcE5hbWUgPT09IFwibW9kdWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9Db21tb25KUyBtb2R1bGUgc3BlYyAxLjFcbiAgICAgICAgICAgICAgICAgICAgY2pzTW9kdWxlID0gYXJnc1tpXSA9IGhhbmRsZXJzLm1vZHVsZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhc1Byb3AoZGVmaW5lZCwgZGVwTmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Byb3Aod2FpdGluZywgZGVwTmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Byb3AoZGVmaW5pbmcsIGRlcE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBjYWxsRGVwKGRlcE5hbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwLnApIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnAubG9hZChtYXAubiwgbWFrZVJlcXVpcmUocmVsTmFtZSwgdHJ1ZSksIG1ha2VMb2FkKGRlcE5hbWUpLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBkZWZpbmVkW2RlcE5hbWVdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihuYW1lICsgJyBtaXNzaW5nICcgKyBkZXBOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldCA9IGNhbGxiYWNrID8gY2FsbGJhY2suYXBwbHkoZGVmaW5lZFtuYW1lXSwgYXJncykgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgLy9JZiBzZXR0aW5nIGV4cG9ydHMgdmlhIFwibW9kdWxlXCIgaXMgaW4gcGxheSxcbiAgICAgICAgICAgICAgICAvL2Zhdm9yIHRoYXQgb3ZlciByZXR1cm4gdmFsdWUgYW5kIGV4cG9ydHMuIEFmdGVyIHRoYXQsXG4gICAgICAgICAgICAgICAgLy9mYXZvciBhIG5vbi11bmRlZmluZWQgcmV0dXJuIHZhbHVlIG92ZXIgZXhwb3J0cyB1c2UuXG4gICAgICAgICAgICAgICAgaWYgKGNqc01vZHVsZSAmJiBjanNNb2R1bGUuZXhwb3J0cyAhPT0gdW5kZWYgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNqc01vZHVsZS5leHBvcnRzICE9PSBkZWZpbmVkW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZWRbbmFtZV0gPSBjanNNb2R1bGUuZXhwb3J0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPT0gdW5kZWYgfHwgIXVzaW5nRXhwb3J0cykge1xuICAgICAgICAgICAgICAgICAgICAvL1VzZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgICAgICBkZWZpbmVkW25hbWVdID0gcmV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAvL01heSBqdXN0IGJlIGFuIG9iamVjdCBkZWZpbml0aW9uIGZvciB0aGUgbW9kdWxlLiBPbmx5XG4gICAgICAgICAgICAvL3dvcnJ5IGFib3V0IGRlZmluaW5nIGlmIGhhdmUgYSBtb2R1bGUgbmFtZS5cbiAgICAgICAgICAgIGRlZmluZWRbbmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXF1aXJlanMgPSByZXF1aXJlID0gcmVxID0gZnVuY3Rpb24gKGRlcHMsIGNhbGxiYWNrLCByZWxOYW1lLCBmb3JjZVN5bmMsIGFsdCkge1xuICAgICAgICBpZiAodHlwZW9mIGRlcHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyc1tkZXBzXSkge1xuICAgICAgICAgICAgICAgIC8vY2FsbGJhY2sgaW4gdGhpcyBjYXNlIGlzIHJlYWxseSByZWxOYW1lXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJzW2RlcHNdKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vSnVzdCByZXR1cm4gdGhlIG1vZHVsZSB3YW50ZWQuIEluIHRoaXMgc2NlbmFyaW8sIHRoZVxuICAgICAgICAgICAgLy9kZXBzIGFyZyBpcyB0aGUgbW9kdWxlIG5hbWUsIGFuZCBzZWNvbmQgYXJnIChpZiBwYXNzZWQpXG4gICAgICAgICAgICAvL2lzIGp1c3QgdGhlIHJlbE5hbWUuXG4gICAgICAgICAgICAvL05vcm1hbGl6ZSBtb2R1bGUgbmFtZSwgaWYgaXQgY29udGFpbnMgLiBvciAuLlxuICAgICAgICAgICAgcmV0dXJuIGNhbGxEZXAobWFrZU1hcChkZXBzLCBjYWxsYmFjaykuZik7XG4gICAgICAgIH0gZWxzZSBpZiAoIWRlcHMuc3BsaWNlKSB7XG4gICAgICAgICAgICAvL2RlcHMgaXMgYSBjb25maWcgb2JqZWN0LCBub3QgYW4gYXJyYXkuXG4gICAgICAgICAgICBjb25maWcgPSBkZXBzO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5kZXBzKSB7XG4gICAgICAgICAgICAgICAgcmVxKGNvbmZpZy5kZXBzLCBjb25maWcuY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrLnNwbGljZSkge1xuICAgICAgICAgICAgICAgIC8vY2FsbGJhY2sgaXMgYW4gYXJyYXksIHdoaWNoIG1lYW5zIGl0IGlzIGEgZGVwZW5kZW5jeSBsaXN0LlxuICAgICAgICAgICAgICAgIC8vQWRqdXN0IGFyZ3MgaWYgdGhlcmUgYXJlIGRlcGVuZGVuY2llc1xuICAgICAgICAgICAgICAgIGRlcHMgPSBjYWxsYmFjaztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHJlbE5hbWU7XG4gICAgICAgICAgICAgICAgcmVsTmFtZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlcHMgPSB1bmRlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vU3VwcG9ydCByZXF1aXJlKFsnYSddKVxuICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICAgIC8vSWYgcmVsTmFtZSBpcyBhIGZ1bmN0aW9uLCBpdCBpcyBhbiBlcnJiYWNrIGhhbmRsZXIsXG4gICAgICAgIC8vc28gcmVtb3ZlIGl0LlxuICAgICAgICBpZiAodHlwZW9mIHJlbE5hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlbE5hbWUgPSBmb3JjZVN5bmM7XG4gICAgICAgICAgICBmb3JjZVN5bmMgPSBhbHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvL1NpbXVsYXRlIGFzeW5jIGNhbGxiYWNrO1xuICAgICAgICBpZiAoZm9yY2VTeW5jKSB7XG4gICAgICAgICAgICBtYWluKHVuZGVmLCBkZXBzLCBjYWxsYmFjaywgcmVsTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1VzaW5nIGEgbm9uLXplcm8gdmFsdWUgYmVjYXVzZSBvZiBjb25jZXJuIGZvciB3aGF0IG9sZCBicm93c2Vyc1xuICAgICAgICAgICAgLy9kbywgYW5kIGxhdGVzdCBicm93c2VycyBcInVwZ3JhZGVcIiB0byA0IGlmIGxvd2VyIHZhbHVlIGlzIHVzZWQ6XG4gICAgICAgICAgICAvL2h0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RpbWVycy5odG1sI2RvbS13aW5kb3d0aW1lcnMtc2V0dGltZW91dDpcbiAgICAgICAgICAgIC8vSWYgd2FudCBhIHZhbHVlIGltbWVkaWF0ZWx5LCB1c2UgcmVxdWlyZSgnaWQnKSBpbnN0ZWFkIC0tIHNvbWV0aGluZ1xuICAgICAgICAgICAgLy90aGF0IHdvcmtzIGluIGFsbW9uZCBvbiB0aGUgZ2xvYmFsIGxldmVsLCBidXQgbm90IGd1YXJhbnRlZWQgYW5kXG4gICAgICAgICAgICAvL3VubGlrZWx5IHRvIHdvcmsgaW4gb3RoZXIgQU1EIGltcGxlbWVudGF0aW9ucy5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG1haW4odW5kZWYsIGRlcHMsIGNhbGxiYWNrLCByZWxOYW1lKTtcbiAgICAgICAgICAgIH0sIDQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSnVzdCBkcm9wcyB0aGUgY29uZmlnIG9uIHRoZSBmbG9vciwgYnV0IHJldHVybnMgcmVxIGluIGNhc2VcbiAgICAgKiB0aGUgY29uZmlnIHJldHVybiB2YWx1ZSBpcyB1c2VkLlxuICAgICAqL1xuICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY2ZnKSB7XG4gICAgICAgIHJldHVybiByZXEoY2ZnKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXhwb3NlIG1vZHVsZSByZWdpc3RyeSBmb3IgZGVidWdnaW5nIGFuZCB0b29saW5nXG4gICAgICovXG4gICAgcmVxdWlyZWpzLl9kZWZpbmVkID0gZGVmaW5lZDtcblxuICAgIGRlZmluZSA9IGZ1bmN0aW9uIChuYW1lLCBkZXBzLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlZSBhbG1vbmQgUkVBRE1FOiBpbmNvcnJlY3QgbW9kdWxlIGJ1aWxkLCBubyBtb2R1bGUgbmFtZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9UaGlzIG1vZHVsZSBtYXkgbm90IGhhdmUgZGVwZW5kZW5jaWVzXG4gICAgICAgIGlmICghZGVwcy5zcGxpY2UpIHtcbiAgICAgICAgICAgIC8vZGVwcyBpcyBub3QgYW4gYXJyYXksIHNvIHByb2JhYmx5IG1lYW5zXG4gICAgICAgICAgICAvL2FuIG9iamVjdCBsaXRlcmFsIG9yIGZhY3RvcnkgZnVuY3Rpb24gZm9yXG4gICAgICAgICAgICAvL3RoZSB2YWx1ZS4gQWRqdXN0IGFyZ3MuXG4gICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7XG4gICAgICAgICAgICBkZXBzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgbmFtZSkgJiYgIWhhc1Byb3Aod2FpdGluZywgbmFtZSkpIHtcbiAgICAgICAgICAgIHdhaXRpbmdbbmFtZV0gPSBbbmFtZSwgZGVwcywgY2FsbGJhY2tdO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGRlZmluZS5hbWQgPSB7XG4gICAgICAgIGpRdWVyeTogdHJ1ZVxuICAgIH07XG59KCkpO1xuXG5TMi5yZXF1aXJlanMgPSByZXF1aXJlanM7UzIucmVxdWlyZSA9IHJlcXVpcmU7UzIuZGVmaW5lID0gZGVmaW5lO1xufVxufSgpKTtcblMyLmRlZmluZShcImFsbW9uZFwiLCBmdW5jdGlvbigpe30pO1xuXG4vKiBnbG9iYWwgalF1ZXJ5OmZhbHNlLCAkOmZhbHNlICovXG5TMi5kZWZpbmUoJ2pxdWVyeScsW10sZnVuY3Rpb24gKCkge1xuICB2YXIgXyQgPSBqUXVlcnkgfHwgJDtcblxuICBpZiAoXyQgPT0gbnVsbCAmJiBjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgJ1NlbGVjdDI6IEFuIGluc3RhbmNlIG9mIGpRdWVyeSBvciBhIGpRdWVyeS1jb21wYXRpYmxlIGxpYnJhcnkgd2FzIG5vdCAnICtcbiAgICAgICdmb3VuZC4gTWFrZSBzdXJlIHRoYXQgeW91IGFyZSBpbmNsdWRpbmcgalF1ZXJ5IGJlZm9yZSBTZWxlY3QyIG9uIHlvdXIgJyArXG4gICAgICAnd2ViIHBhZ2UuJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gXyQ7XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL3V0aWxzJyxbXG4gICdqcXVlcnknXG5dLCBmdW5jdGlvbiAoJCkge1xuICB2YXIgVXRpbHMgPSB7fTtcblxuICBVdGlscy5FeHRlbmQgPSBmdW5jdGlvbiAoQ2hpbGRDbGFzcywgU3VwZXJDbGFzcykge1xuICAgIHZhciBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICAgIGZ1bmN0aW9uIEJhc2VDb25zdHJ1Y3RvciAoKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gQ2hpbGRDbGFzcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gU3VwZXJDbGFzcykge1xuICAgICAgaWYgKF9faGFzUHJvcC5jYWxsKFN1cGVyQ2xhc3MsIGtleSkpIHtcbiAgICAgICAgQ2hpbGRDbGFzc1trZXldID0gU3VwZXJDbGFzc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIEJhc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBTdXBlckNsYXNzLnByb3RvdHlwZTtcbiAgICBDaGlsZENsYXNzLnByb3RvdHlwZSA9IG5ldyBCYXNlQ29uc3RydWN0b3IoKTtcbiAgICBDaGlsZENsYXNzLl9fc3VwZXJfXyA9IFN1cGVyQ2xhc3MucHJvdG90eXBlO1xuXG4gICAgcmV0dXJuIENoaWxkQ2xhc3M7XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0TWV0aG9kcyAodGhlQ2xhc3MpIHtcbiAgICB2YXIgcHJvdG8gPSB0aGVDbGFzcy5wcm90b3R5cGU7XG5cbiAgICB2YXIgbWV0aG9kcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgbWV0aG9kTmFtZSBpbiBwcm90bykge1xuICAgICAgdmFyIG0gPSBwcm90b1ttZXRob2ROYW1lXTtcblxuICAgICAgaWYgKHR5cGVvZiBtICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kTmFtZSA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbWV0aG9kcy5wdXNoKG1ldGhvZE5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRob2RzO1xuICB9XG5cbiAgVXRpbHMuRGVjb3JhdGUgPSBmdW5jdGlvbiAoU3VwZXJDbGFzcywgRGVjb3JhdG9yQ2xhc3MpIHtcbiAgICB2YXIgZGVjb3JhdGVkTWV0aG9kcyA9IGdldE1ldGhvZHMoRGVjb3JhdG9yQ2xhc3MpO1xuICAgIHZhciBzdXBlck1ldGhvZHMgPSBnZXRNZXRob2RzKFN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gRGVjb3JhdGVkQ2xhc3MgKCkge1xuICAgICAgdmFyIHVuc2hpZnQgPSBBcnJheS5wcm90b3R5cGUudW5zaGlmdDtcblxuICAgICAgdmFyIGFyZ0NvdW50ID0gRGVjb3JhdG9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yLmxlbmd0aDtcblxuICAgICAgdmFyIGNhbGxlZENvbnN0cnVjdG9yID0gU3VwZXJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbiAgICAgIGlmIChhcmdDb3VudCA+IDApIHtcbiAgICAgICAgdW5zaGlmdC5jYWxsKGFyZ3VtZW50cywgU3VwZXJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuXG4gICAgICAgIGNhbGxlZENvbnN0cnVjdG9yID0gRGVjb3JhdG9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuICAgICAgfVxuXG4gICAgICBjYWxsZWRDb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIERlY29yYXRvckNsYXNzLmRpc3BsYXlOYW1lID0gU3VwZXJDbGFzcy5kaXNwbGF5TmFtZTtcblxuICAgIGZ1bmN0aW9uIGN0ciAoKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gRGVjb3JhdGVkQ2xhc3M7XG4gICAgfVxuXG4gICAgRGVjb3JhdGVkQ2xhc3MucHJvdG90eXBlID0gbmV3IGN0cigpO1xuXG4gICAgZm9yICh2YXIgbSA9IDA7IG0gPCBzdXBlck1ldGhvZHMubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgdmFyIHN1cGVyTWV0aG9kID0gc3VwZXJNZXRob2RzW21dO1xuXG4gICAgICAgIERlY29yYXRlZENsYXNzLnByb3RvdHlwZVtzdXBlck1ldGhvZF0gPVxuICAgICAgICAgIFN1cGVyQ2xhc3MucHJvdG90eXBlW3N1cGVyTWV0aG9kXTtcbiAgICB9XG5cbiAgICB2YXIgY2FsbGVkTWV0aG9kID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUpIHtcbiAgICAgIC8vIFN0dWIgb3V0IHRoZSBvcmlnaW5hbCBtZXRob2QgaWYgaXQncyBub3QgZGVjb3JhdGluZyBhbiBhY3R1YWwgbWV0aG9kXG4gICAgICB2YXIgb3JpZ2luYWxNZXRob2QgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgaWYgKG1ldGhvZE5hbWUgaW4gRGVjb3JhdGVkQ2xhc3MucHJvdG90eXBlKSB7XG4gICAgICAgIG9yaWdpbmFsTWV0aG9kID0gRGVjb3JhdGVkQ2xhc3MucHJvdG90eXBlW21ldGhvZE5hbWVdO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVjb3JhdGVkTWV0aG9kID0gRGVjb3JhdG9yQ2xhc3MucHJvdG90eXBlW21ldGhvZE5hbWVdO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdW5zaGlmdCA9IEFycmF5LnByb3RvdHlwZS51bnNoaWZ0O1xuXG4gICAgICAgIHVuc2hpZnQuY2FsbChhcmd1bWVudHMsIG9yaWdpbmFsTWV0aG9kKTtcblxuICAgICAgICByZXR1cm4gZGVjb3JhdGVkTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBkID0gMDsgZCA8IGRlY29yYXRlZE1ldGhvZHMubGVuZ3RoOyBkKyspIHtcbiAgICAgIHZhciBkZWNvcmF0ZWRNZXRob2QgPSBkZWNvcmF0ZWRNZXRob2RzW2RdO1xuXG4gICAgICBEZWNvcmF0ZWRDbGFzcy5wcm90b3R5cGVbZGVjb3JhdGVkTWV0aG9kXSA9IGNhbGxlZE1ldGhvZChkZWNvcmF0ZWRNZXRob2QpO1xuICAgIH1cblxuICAgIHJldHVybiBEZWNvcmF0ZWRDbGFzcztcbiAgfTtcblxuICB2YXIgT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuICB9O1xuXG4gIE9ic2VydmFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2ZW50LCBjYWxsYmFjaykge1xuICAgIHRoaXMubGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMgfHwge307XG5cbiAgICBpZiAoZXZlbnQgaW4gdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRdID0gW2NhbGxiYWNrXTtcbiAgICB9XG4gIH07XG5cbiAgT2JzZXJ2YWJsZS5wcm90b3R5cGUudHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbiAgICB2YXIgcGFyYW1zID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycyB8fCB7fTtcblxuICAgIC8vIFBhcmFtcyBzaG91bGQgYWx3YXlzIGNvbWUgaW4gYXMgYW4gYXJyYXlcbiAgICBpZiAocGFyYW1zID09IG51bGwpIHtcbiAgICAgIHBhcmFtcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMgdG8gdGhlIGV2ZW50LCB1c2UgYSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHt9KTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGBfdHlwZWAgb2YgdGhlIGZpcnN0IG9iamVjdCB0byB0aGUgZXZlbnRcbiAgICBwYXJhbXNbMF0uX3R5cGUgPSBldmVudDtcblxuICAgIGlmIChldmVudCBpbiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgdGhpcy5pbnZva2UodGhpcy5saXN0ZW5lcnNbZXZlbnRdLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuICAgIH1cblxuICAgIGlmICgnKicgaW4gdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuaW52b2tlKHRoaXMubGlzdGVuZXJzWycqJ10sIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xuXG4gIE9ic2VydmFibGUucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uIChsaXN0ZW5lcnMsIHBhcmFtcykge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBwYXJhbXMpO1xuICAgIH1cbiAgfTtcblxuICBVdGlscy5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZTtcblxuICBVdGlscy5nZW5lcmF0ZUNoYXJzID0gZnVuY3Rpb24gKGxlbmd0aCkge1xuICAgIHZhciBjaGFycyA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJhbmRvbUNoYXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzNik7XG4gICAgICBjaGFycyArPSByYW5kb21DaGFyLnRvU3RyaW5nKDM2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhcnM7XG4gIH07XG5cbiAgVXRpbHMuYmluZCA9IGZ1bmN0aW9uIChmdW5jLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuXG4gIFV0aWxzLl9jb252ZXJ0RGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgZm9yICh2YXIgb3JpZ2luYWxLZXkgaW4gZGF0YSkge1xuICAgICAgdmFyIGtleXMgPSBvcmlnaW5hbEtleS5zcGxpdCgnLScpO1xuXG4gICAgICB2YXIgZGF0YUxldmVsID0gZGF0YTtcblxuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNba107XG5cbiAgICAgICAgLy8gTG93ZXJjYXNlIHRoZSBmaXJzdCBsZXR0ZXJcbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgZGFzaC1zZXBhcmF0ZWQgYmVjb21lcyBjYW1lbENhc2VcbiAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTtcblxuICAgICAgICBpZiAoIShrZXkgaW4gZGF0YUxldmVsKSkge1xuICAgICAgICAgIGRhdGFMZXZlbFtrZXldID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoayA9PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBkYXRhTGV2ZWxba2V5XSA9IGRhdGFbb3JpZ2luYWxLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YUxldmVsID0gZGF0YUxldmVsW2tleV07XG4gICAgICB9XG5cbiAgICAgIGRlbGV0ZSBkYXRhW29yaWdpbmFsS2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfTtcblxuICBVdGlscy5oYXNTY3JvbGwgPSBmdW5jdGlvbiAoaW5kZXgsIGVsKSB7XG4gICAgLy8gQWRhcHRlZCBmcm9tIHRoZSBmdW5jdGlvbiBjcmVhdGVkIGJ5IEBTaGFkb3dTY3JpcHRlclxuICAgIC8vIGFuZCBhZGFwdGVkIGJ5IEBCaWxsQmFycnkgb24gdGhlIFN0YWNrIEV4Y2hhbmdlIENvZGUgUmV2aWV3IHdlYnNpdGUuXG4gICAgLy8gVGhlIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGF0XG4gICAgLy8gaHR0cDovL2NvZGVyZXZpZXcuc3RhY2tleGNoYW5nZS5jb20vcS8xMzMzOFxuICAgIC8vIGFuZCB3YXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSBTaXp6bGUgc2VsZWN0b3IgZW5naW5lLlxuXG4gICAgdmFyICRlbCA9ICQoZWwpO1xuICAgIHZhciBvdmVyZmxvd1ggPSBlbC5zdHlsZS5vdmVyZmxvd1g7XG4gICAgdmFyIG92ZXJmbG93WSA9IGVsLnN0eWxlLm92ZXJmbG93WTtcblxuICAgIC8vQ2hlY2sgYm90aCB4IGFuZCB5IGRlY2xhcmF0aW9uc1xuICAgIGlmIChvdmVyZmxvd1ggPT09IG92ZXJmbG93WSAmJlxuICAgICAgICAob3ZlcmZsb3dZID09PSAnaGlkZGVuJyB8fCBvdmVyZmxvd1kgPT09ICd2aXNpYmxlJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAob3ZlcmZsb3dYID09PSAnc2Nyb2xsJyB8fCBvdmVyZmxvd1kgPT09ICdzY3JvbGwnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCRlbC5pbm5lckhlaWdodCgpIDwgZWwuc2Nyb2xsSGVpZ2h0IHx8XG4gICAgICAkZWwuaW5uZXJXaWR0aCgpIDwgZWwuc2Nyb2xsV2lkdGgpO1xuICB9O1xuXG4gIFV0aWxzLmVzY2FwZU1hcmt1cCA9IGZ1bmN0aW9uIChtYXJrdXApIHtcbiAgICB2YXIgcmVwbGFjZU1hcCA9IHtcbiAgICAgICdcXFxcJzogJyYjOTI7JyxcbiAgICAgICcmJzogJyZhbXA7JyxcbiAgICAgICc8JzogJyZsdDsnLFxuICAgICAgJz4nOiAnJmd0OycsXG4gICAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICAgICdcXCcnOiAnJiMzOTsnLFxuICAgICAgJy8nOiAnJiM0NzsnXG4gICAgfTtcblxuICAgIC8vIERvIG5vdCB0cnkgdG8gZXNjYXBlIHRoZSBtYXJrdXAgaWYgaXQncyBub3QgYSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIG1hcmt1cCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtYXJrdXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhtYXJrdXApLnJlcGxhY2UoL1smPD5cIidcXC9cXFxcXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiByZXBsYWNlTWFwW21hdGNoXTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBBcHBlbmQgYW4gYXJyYXkgb2YgalF1ZXJ5IG5vZGVzIHRvIGEgZ2l2ZW4gZWxlbWVudC5cbiAgVXRpbHMuYXBwZW5kTWFueSA9IGZ1bmN0aW9uICgkZWxlbWVudCwgJG5vZGVzKSB7XG4gICAgLy8galF1ZXJ5IDEuNy54IGRvZXMgbm90IHN1cHBvcnQgJC5mbi5hcHBlbmQoKSB3aXRoIGFuIGFycmF5XG4gICAgLy8gRmFsbCBiYWNrIHRvIGEgalF1ZXJ5IG9iamVjdCBjb2xsZWN0aW9uIHVzaW5nICQuZm4uYWRkKClcbiAgICBpZiAoJC5mbi5qcXVlcnkuc3Vic3RyKDAsIDMpID09PSAnMS43Jykge1xuICAgICAgdmFyICRqcU5vZGVzID0gJCgpO1xuXG4gICAgICAkLm1hcCgkbm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICRqcU5vZGVzID0gJGpxTm9kZXMuYWRkKG5vZGUpO1xuICAgICAgfSk7XG5cbiAgICAgICRub2RlcyA9ICRqcU5vZGVzO1xuICAgIH1cblxuICAgICRlbGVtZW50LmFwcGVuZCgkbm9kZXMpO1xuICB9O1xuXG4gIHJldHVybiBVdGlscztcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvcmVzdWx0cycsW1xuICAnanF1ZXJ5JyxcbiAgJy4vdXRpbHMnXG5dLCBmdW5jdGlvbiAoJCwgVXRpbHMpIHtcbiAgZnVuY3Rpb24gUmVzdWx0cyAoJGVsZW1lbnQsIG9wdGlvbnMsIGRhdGFBZGFwdGVyKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9ICRlbGVtZW50O1xuICAgIHRoaXMuZGF0YSA9IGRhdGFBZGFwdGVyO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBSZXN1bHRzLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO1xuICB9XG5cbiAgVXRpbHMuRXh0ZW5kKFJlc3VsdHMsIFV0aWxzLk9ic2VydmFibGUpO1xuXG4gIFJlc3VsdHMucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHJlc3VsdHMgPSAkKFxuICAgICAgJzx1bCBjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9uc1wiIHJvbGU9XCJ0cmVlXCI+PC91bD4nXG4gICAgKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ2V0KCdtdWx0aXBsZScpKSB7XG4gICAgICAkcmVzdWx0cy5hdHRyKCdhcmlhLW11bHRpc2VsZWN0YWJsZScsICd0cnVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy4kcmVzdWx0cyA9ICRyZXN1bHRzO1xuXG4gICAgcmV0dXJuICRyZXN1bHRzO1xuICB9O1xuXG4gIFJlc3VsdHMucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuJHJlc3VsdHMuZW1wdHkoKTtcbiAgfTtcblxuICBSZXN1bHRzLnByb3RvdHlwZS5kaXNwbGF5TWVzc2FnZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICB2YXIgZXNjYXBlTWFya3VwID0gdGhpcy5vcHRpb25zLmdldCgnZXNjYXBlTWFya3VwJyk7XG5cbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgdGhpcy5oaWRlTG9hZGluZygpO1xuXG4gICAgdmFyICRtZXNzYWdlID0gJChcbiAgICAgICc8bGkgcm9sZT1cInRyZWVpdGVtXCIgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCInICtcbiAgICAgICcgY2xhc3M9XCJzZWxlY3QyLXJlc3VsdHNfX29wdGlvblwiPjwvbGk+J1xuICAgICk7XG5cbiAgICB2YXIgbWVzc2FnZSA9IHRoaXMub3B0aW9ucy5nZXQoJ3RyYW5zbGF0aW9ucycpLmdldChwYXJhbXMubWVzc2FnZSk7XG5cbiAgICAkbWVzc2FnZS5hcHBlbmQoXG4gICAgICBlc2NhcGVNYXJrdXAoXG4gICAgICAgIG1lc3NhZ2UocGFyYW1zLmFyZ3MpXG4gICAgICApXG4gICAgKTtcblxuICAgICRtZXNzYWdlWzBdLmNsYXNzTmFtZSArPSAnIHNlbGVjdDItcmVzdWx0c19fbWVzc2FnZSc7XG5cbiAgICB0aGlzLiRyZXN1bHRzLmFwcGVuZCgkbWVzc2FnZSk7XG4gIH07XG5cbiAgUmVzdWx0cy5wcm90b3R5cGUuaGlkZU1lc3NhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuJHJlc3VsdHMuZmluZCgnLnNlbGVjdDItcmVzdWx0c19fbWVzc2FnZScpLnJlbW92ZSgpO1xuICB9O1xuXG4gIFJlc3VsdHMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdGhpcy5oaWRlTG9hZGluZygpO1xuXG4gICAgdmFyICRvcHRpb25zID0gW107XG5cbiAgICBpZiAoZGF0YS5yZXN1bHRzID09IG51bGwgfHwgZGF0YS5yZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuJHJlc3VsdHMuY2hpbGRyZW4oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdyZXN1bHRzOm1lc3NhZ2UnLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ25vUmVzdWx0cydcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkYXRhLnJlc3VsdHMgPSB0aGlzLnNvcnQoZGF0YS5yZXN1bHRzKTtcblxuICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGF0YS5yZXN1bHRzLmxlbmd0aDsgZCsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGRhdGEucmVzdWx0c1tkXTtcblxuICAgICAgdmFyICRvcHRpb24gPSB0aGlzLm9wdGlvbihpdGVtKTtcblxuICAgICAgJG9wdGlvbnMucHVzaCgkb3B0aW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLiRyZXN1bHRzLmFwcGVuZCgkb3B0aW9ucyk7XG4gIH07XG5cbiAgUmVzdWx0cy5wcm90b3R5cGUucG9zaXRpb24gPSBmdW5jdGlvbiAoJHJlc3VsdHMsICRkcm9wZG93bikge1xuICAgIHZhciAkcmVzdWx0c0NvbnRhaW5lciA9ICRkcm9wZG93bi5maW5kKCcuc2VsZWN0Mi1yZXN1bHRzJyk7XG4gICAgJHJlc3VsdHNDb250YWluZXIuYXBwZW5kKCRyZXN1bHRzKTtcbiAgfTtcblxuICBSZXN1bHRzLnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgc29ydGVyID0gdGhpcy5vcHRpb25zLmdldCgnc29ydGVyJyk7XG5cbiAgICByZXR1cm4gc29ydGVyKGRhdGEpO1xuICB9O1xuXG4gIFJlc3VsdHMucHJvdG90eXBlLmhpZ2hsaWdodEZpcnN0SXRlbSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJG9wdGlvbnMgPSB0aGlzLiRyZXN1bHRzXG4gICAgICAuZmluZCgnLnNlbGVjdDItcmVzdWx0c19fb3B0aW9uW2FyaWEtc2VsZWN0ZWRdJyk7XG5cbiAgICB2YXIgJHNlbGVjdGVkID0gJG9wdGlvbnMuZmlsdGVyKCdbYXJpYS1zZWxlY3RlZD10cnVlXScpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzZWxlY3RlZCBvcHRpb25zXG4gICAgaWYgKCRzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgc2VsZWN0ZWQgb3B0aW9ucywgaGlnaGxpZ2h0IHRoZSBmaXJzdFxuICAgICAgJHNlbGVjdGVkLmZpcnN0KCkudHJpZ2dlcignbW91c2VlbnRlcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gc2VsZWN0ZWQgb3B0aW9ucywgaGlnaGxpZ2h0IHRoZSBmaXJzdCBvcHRpb25cbiAgICAgIC8vIGluIHRoZSBkcm9wZG93blxuICAgICAgJG9wdGlvbnMuZmlyc3QoKS50cmlnZ2VyKCdtb3VzZWVudGVyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVIaWdobGlnaHRWaXNpYmxlKCk7XG4gIH07XG5cbiAgUmVzdWx0cy5wcm90b3R5cGUuc2V0Q2xhc3NlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLmRhdGEuY3VycmVudChmdW5jdGlvbiAoc2VsZWN0ZWQpIHtcbiAgICAgIHZhciBzZWxlY3RlZElkcyA9ICQubWFwKHNlbGVjdGVkLCBmdW5jdGlvbiAocykge1xuICAgICAgICByZXR1cm4gcy5pZC50b1N0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciAkb3B0aW9ucyA9IHNlbGYuJHJlc3VsdHNcbiAgICAgICAgLmZpbmQoJy5zZWxlY3QyLXJlc3VsdHNfX29wdGlvblthcmlhLXNlbGVjdGVkXScpO1xuXG4gICAgICAkb3B0aW9ucy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICRvcHRpb24gPSAkKHRoaXMpO1xuXG4gICAgICAgIHZhciBpdGVtID0gJC5kYXRhKHRoaXMsICdkYXRhJyk7XG5cbiAgICAgICAgLy8gaWQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgc3RyaW5nIHdoZW4gY29tcGFyaW5nXG4gICAgICAgIHZhciBpZCA9ICcnICsgaXRlbS5pZDtcblxuICAgICAgICBpZiAoKGl0ZW0uZWxlbWVudCAhPSBudWxsICYmIGl0ZW0uZWxlbWVudC5zZWxlY3RlZCkgfHxcbiAgICAgICAgICAgIChpdGVtLmVsZW1lbnQgPT0gbnVsbCAmJiAkLmluQXJyYXkoaWQsIHNlbGVjdGVkSWRzKSA+IC0xKSkge1xuICAgICAgICAgICRvcHRpb24uYXR0cignYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJG9wdGlvbi5hdHRyKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH07XG5cbiAgUmVzdWx0cy5wcm90b3R5cGUuc2hvd0xvYWRpbmcgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgdGhpcy5oaWRlTG9hZGluZygpO1xuXG4gICAgdmFyIGxvYWRpbmdNb3JlID0gdGhpcy5vcHRpb25zLmdldCgndHJhbnNsYXRpb25zJykuZ2V0KCdzZWFyY2hpbmcnKTtcblxuICAgIHZhciBsb2FkaW5nID0ge1xuICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgdGV4dDogbG9hZGluZ01vcmUocGFyYW1zKVxuICAgIH07XG4gICAgdmFyICRsb2FkaW5nID0gdGhpcy5vcHRpb24obG9hZGluZyk7XG4gICAgJGxvYWRpbmcuY2xhc3NOYW1lICs9ICcgbG9hZGluZy1yZXN1bHRzJztcblxuICAgIHRoaXMuJHJlc3VsdHMucHJlcGVuZCgkbG9hZGluZyk7XG4gIH07XG5cbiAgUmVzdWx0cy5wcm90b3R5cGUuaGlkZUxvYWRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy4kcmVzdWx0cy5maW5kKCcubG9hZGluZy1yZXN1bHRzJykucmVtb3ZlKCk7XG4gIH07XG5cbiAgUmVzdWx0cy5wcm90b3R5cGUub3B0aW9uID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBvcHRpb24uY2xhc3NOYW1lID0gJ3NlbGVjdDItcmVzdWx0c19fb3B0aW9uJztcblxuICAgIHZhciBhdHRycyA9IHtcbiAgICAgICdyb2xlJzogJ3RyZWVpdGVtJyxcbiAgICAgICdhcmlhLXNlbGVjdGVkJzogJ2ZhbHNlJ1xuICAgIH07XG5cbiAgICBpZiAoZGF0YS5kaXNhYmxlZCkge1xuICAgICAgZGVsZXRlIGF0dHJzWydhcmlhLXNlbGVjdGVkJ107XG4gICAgICBhdHRyc1snYXJpYS1kaXNhYmxlZCddID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmlkID09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSBhdHRyc1snYXJpYS1zZWxlY3RlZCddO1xuICAgIH1cblxuICAgIGlmIChkYXRhLl9yZXN1bHRJZCAhPSBudWxsKSB7XG4gICAgICBvcHRpb24uaWQgPSBkYXRhLl9yZXN1bHRJZDtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS50aXRsZSkge1xuICAgICAgb3B0aW9uLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jaGlsZHJlbikge1xuICAgICAgYXR0cnMucm9sZSA9ICdncm91cCc7XG4gICAgICBhdHRyc1snYXJpYS1sYWJlbCddID0gZGF0YS50ZXh0O1xuICAgICAgZGVsZXRlIGF0dHJzWydhcmlhLXNlbGVjdGVkJ107XG4gICAgfVxuXG4gICAgZm9yICh2YXIgYXR0ciBpbiBhdHRycykge1xuICAgICAgdmFyIHZhbCA9IGF0dHJzW2F0dHJdO1xuXG4gICAgICBvcHRpb24uc2V0QXR0cmlidXRlKGF0dHIsIHZhbCk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuY2hpbGRyZW4pIHtcbiAgICAgIHZhciAkb3B0aW9uID0gJChvcHRpb24pO1xuXG4gICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHJvbmcnKTtcbiAgICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdzZWxlY3QyLXJlc3VsdHNfX2dyb3VwJztcblxuICAgICAgdmFyICRsYWJlbCA9ICQobGFiZWwpO1xuICAgICAgdGhpcy50ZW1wbGF0ZShkYXRhLCBsYWJlbCk7XG5cbiAgICAgIHZhciAkY2hpbGRyZW4gPSBbXTtcblxuICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBkYXRhLmNoaWxkcmVuLmxlbmd0aDsgYysrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGRhdGEuY2hpbGRyZW5bY107XG5cbiAgICAgICAgdmFyICRjaGlsZCA9IHRoaXMub3B0aW9uKGNoaWxkKTtcblxuICAgICAgICAkY2hpbGRyZW4ucHVzaCgkY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgJGNoaWxkcmVuQ29udGFpbmVyID0gJCgnPHVsPjwvdWw+Jywge1xuICAgICAgICAnY2xhc3MnOiAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25zIHNlbGVjdDItcmVzdWx0c19fb3B0aW9ucy0tbmVzdGVkJ1xuICAgICAgfSk7XG5cbiAgICAgICRjaGlsZHJlbkNvbnRhaW5lci5hcHBlbmQoJGNoaWxkcmVuKTtcblxuICAgICAgJG9wdGlvbi5hcHBlbmQobGFiZWwpO1xuICAgICAgJG9wdGlvbi5hcHBlbmQoJGNoaWxkcmVuQ29udGFpbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wbGF0ZShkYXRhLCBvcHRpb24pO1xuICAgIH1cblxuICAgICQuZGF0YShvcHRpb24sICdkYXRhJywgZGF0YSk7XG5cbiAgICByZXR1cm4gb3B0aW9uO1xuICB9O1xuXG4gIFJlc3VsdHMucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGFpbmVyLCAkY29udGFpbmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIGlkID0gY29udGFpbmVyLmlkICsgJy1yZXN1bHRzJztcblxuICAgIHRoaXMuJHJlc3VsdHMuYXR0cignaWQnLCBpZCk7XG5cbiAgICBjb250YWluZXIub24oJ3Jlc3VsdHM6YWxsJywgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgc2VsZi5jbGVhcigpO1xuICAgICAgc2VsZi5hcHBlbmQocGFyYW1zLmRhdGEpO1xuXG4gICAgICBpZiAoY29udGFpbmVyLmlzT3BlbigpKSB7XG4gICAgICAgIHNlbGYuc2V0Q2xhc3NlcygpO1xuICAgICAgICBzZWxmLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdyZXN1bHRzOmFwcGVuZCcsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHNlbGYuYXBwZW5kKHBhcmFtcy5kYXRhKTtcblxuICAgICAgaWYgKGNvbnRhaW5lci5pc09wZW4oKSkge1xuICAgICAgICBzZWxmLnNldENsYXNzZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbigncXVlcnknLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICBzZWxmLmhpZGVNZXNzYWdlcygpO1xuICAgICAgc2VsZi5zaG93TG9hZGluZyhwYXJhbXMpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdzZWxlY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWNvbnRhaW5lci5pc09wZW4oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuc2V0Q2xhc3NlcygpO1xuICAgICAgc2VsZi5oaWdobGlnaHRGaXJzdEl0ZW0oKTtcbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbigndW5zZWxlY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWNvbnRhaW5lci5pc09wZW4oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuc2V0Q2xhc3NlcygpO1xuICAgICAgc2VsZi5oaWdobGlnaHRGaXJzdEl0ZW0oKTtcbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbignb3BlbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFdoZW4gdGhlIGRyb3Bkb3duIGlzIG9wZW4sIGFyaWEtZXhwZW5kZWQ9XCJ0cnVlXCJcbiAgICAgIHNlbGYuJHJlc3VsdHMuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICBzZWxmLiRyZXN1bHRzLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG5cbiAgICAgIHNlbGYuc2V0Q2xhc3NlcygpO1xuICAgICAgc2VsZi5lbnN1cmVIaWdobGlnaHRWaXNpYmxlKCk7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gV2hlbiB0aGUgZHJvcGRvd24gaXMgY2xvc2VkLCBhcmlhLWV4cGVuZGVkPVwiZmFsc2VcIlxuICAgICAgc2VsZi4kcmVzdWx0cy5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICBzZWxmLiRyZXN1bHRzLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgIHNlbGYuJHJlc3VsdHMucmVtb3ZlQXR0cignYXJpYS1hY3RpdmVkZXNjZW5kYW50Jyk7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ3Jlc3VsdHM6dG9nZ2xlJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRoaWdobGlnaHRlZCA9IHNlbGYuZ2V0SGlnaGxpZ2h0ZWRSZXN1bHRzKCk7XG5cbiAgICAgIGlmICgkaGlnaGxpZ2h0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJGhpZ2hsaWdodGVkLnRyaWdnZXIoJ21vdXNldXAnKTtcbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbigncmVzdWx0czpzZWxlY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJGhpZ2hsaWdodGVkID0gc2VsZi5nZXRIaWdobGlnaHRlZFJlc3VsdHMoKTtcblxuICAgICAgaWYgKCRoaWdobGlnaHRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGF0YSA9ICRoaWdobGlnaHRlZC5kYXRhKCdkYXRhJyk7XG5cbiAgICAgIGlmICgkaGlnaGxpZ2h0ZWQuYXR0cignYXJpYS1zZWxlY3RlZCcpID09ICd0cnVlJykge1xuICAgICAgICBzZWxmLnRyaWdnZXIoJ2Nsb3NlJywge30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi50cmlnZ2VyKCdzZWxlY3QnLCB7XG4gICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbigncmVzdWx0czpwcmV2aW91cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkaGlnaGxpZ2h0ZWQgPSBzZWxmLmdldEhpZ2hsaWdodGVkUmVzdWx0cygpO1xuXG4gICAgICB2YXIgJG9wdGlvbnMgPSBzZWxmLiRyZXN1bHRzLmZpbmQoJ1thcmlhLXNlbGVjdGVkXScpO1xuXG4gICAgICB2YXIgY3VycmVudEluZGV4ID0gJG9wdGlvbnMuaW5kZXgoJGhpZ2hsaWdodGVkKTtcblxuICAgICAgLy8gSWYgd2UgYXJlIGFscmVhZHkgYXQgdGUgdG9wLCBkb24ndCBtb3ZlIGZ1cnRoZXJcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV4dEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcblxuICAgICAgLy8gSWYgbm9uZSBhcmUgaGlnaGxpZ2h0ZWQsIGhpZ2hsaWdodCB0aGUgZmlyc3RcbiAgICAgIGlmICgkaGlnaGxpZ2h0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG5leHRJbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHZhciAkbmV4dCA9ICRvcHRpb25zLmVxKG5leHRJbmRleCk7XG5cbiAgICAgICRuZXh0LnRyaWdnZXIoJ21vdXNlZW50ZXInKTtcblxuICAgICAgdmFyIGN1cnJlbnRPZmZzZXQgPSBzZWxmLiRyZXN1bHRzLm9mZnNldCgpLnRvcDtcbiAgICAgIHZhciBuZXh0VG9wID0gJG5leHQub2Zmc2V0KCkudG9wO1xuICAgICAgdmFyIG5leHRPZmZzZXQgPSBzZWxmLiRyZXN1bHRzLnNjcm9sbFRvcCgpICsgKG5leHRUb3AgLSBjdXJyZW50T2Zmc2V0KTtcblxuICAgICAgaWYgKG5leHRJbmRleCA9PT0gMCkge1xuICAgICAgICBzZWxmLiRyZXN1bHRzLnNjcm9sbFRvcCgwKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dFRvcCAtIGN1cnJlbnRPZmZzZXQgPCAwKSB7XG4gICAgICAgIHNlbGYuJHJlc3VsdHMuc2Nyb2xsVG9wKG5leHRPZmZzZXQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdyZXN1bHRzOm5leHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJGhpZ2hsaWdodGVkID0gc2VsZi5nZXRIaWdobGlnaHRlZFJlc3VsdHMoKTtcblxuICAgICAgdmFyICRvcHRpb25zID0gc2VsZi4kcmVzdWx0cy5maW5kKCdbYXJpYS1zZWxlY3RlZF0nKTtcblxuICAgICAgdmFyIGN1cnJlbnRJbmRleCA9ICRvcHRpb25zLmluZGV4KCRoaWdobGlnaHRlZCk7XG5cbiAgICAgIHZhciBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuXG4gICAgICAvLyBJZiB3ZSBhcmUgYXQgdGhlIGxhc3Qgb3B0aW9uLCBzdGF5IHRoZXJlXG4gICAgICBpZiAobmV4dEluZGV4ID49ICRvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciAkbmV4dCA9ICRvcHRpb25zLmVxKG5leHRJbmRleCk7XG5cbiAgICAgICRuZXh0LnRyaWdnZXIoJ21vdXNlZW50ZXInKTtcblxuICAgICAgdmFyIGN1cnJlbnRPZmZzZXQgPSBzZWxmLiRyZXN1bHRzLm9mZnNldCgpLnRvcCArXG4gICAgICAgIHNlbGYuJHJlc3VsdHMub3V0ZXJIZWlnaHQoZmFsc2UpO1xuICAgICAgdmFyIG5leHRCb3R0b20gPSAkbmV4dC5vZmZzZXQoKS50b3AgKyAkbmV4dC5vdXRlckhlaWdodChmYWxzZSk7XG4gICAgICB2YXIgbmV4dE9mZnNldCA9IHNlbGYuJHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyBuZXh0Qm90dG9tIC0gY3VycmVudE9mZnNldDtcblxuICAgICAgaWYgKG5leHRJbmRleCA9PT0gMCkge1xuICAgICAgICBzZWxmLiRyZXN1bHRzLnNjcm9sbFRvcCgwKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dEJvdHRvbSA+IGN1cnJlbnRPZmZzZXQpIHtcbiAgICAgICAgc2VsZi4kcmVzdWx0cy5zY3JvbGxUb3AobmV4dE9mZnNldCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ3Jlc3VsdHM6Zm9jdXMnLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICBwYXJhbXMuZWxlbWVudC5hZGRDbGFzcygnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24tLWhpZ2hsaWdodGVkJyk7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ3Jlc3VsdHM6bWVzc2FnZScsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHNlbGYuZGlzcGxheU1lc3NhZ2UocGFyYW1zKTtcbiAgICB9KTtcblxuICAgIGlmICgkLmZuLm1vdXNld2hlZWwpIHtcbiAgICAgIHRoaXMuJHJlc3VsdHMub24oJ21vdXNld2hlZWwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgdG9wID0gc2VsZi4kcmVzdWx0cy5zY3JvbGxUb3AoKTtcblxuICAgICAgICB2YXIgYm90dG9tID0gc2VsZi4kcmVzdWx0cy5nZXQoMCkuc2Nyb2xsSGVpZ2h0IC0gdG9wICsgZS5kZWx0YVk7XG5cbiAgICAgICAgdmFyIGlzQXRUb3AgPSBlLmRlbHRhWSA+IDAgJiYgdG9wIC0gZS5kZWx0YVkgPD0gMDtcbiAgICAgICAgdmFyIGlzQXRCb3R0b20gPSBlLmRlbHRhWSA8IDAgJiYgYm90dG9tIDw9IHNlbGYuJHJlc3VsdHMuaGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKGlzQXRUb3ApIHtcbiAgICAgICAgICBzZWxmLiRyZXN1bHRzLnNjcm9sbFRvcCgwKTtcblxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXRCb3R0b20pIHtcbiAgICAgICAgICBzZWxmLiRyZXN1bHRzLnNjcm9sbFRvcChcbiAgICAgICAgICAgIHNlbGYuJHJlc3VsdHMuZ2V0KDApLnNjcm9sbEhlaWdodCAtIHNlbGYuJHJlc3VsdHMuaGVpZ2h0KClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuJHJlc3VsdHMub24oJ21vdXNldXAnLCAnLnNlbGVjdDItcmVzdWx0c19fb3B0aW9uW2FyaWEtc2VsZWN0ZWRdJyxcbiAgICAgIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG5cbiAgICAgIHZhciBkYXRhID0gJHRoaXMuZGF0YSgnZGF0YScpO1xuXG4gICAgICBpZiAoJHRoaXMuYXR0cignYXJpYS1zZWxlY3RlZCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5nZXQoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3Vuc2VsZWN0Jywge1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0LFxuICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYudHJpZ2dlcignY2xvc2UnLCB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYudHJpZ2dlcignc2VsZWN0Jywge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnQsXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kcmVzdWx0cy5vbignbW91c2VlbnRlcicsICcuc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25bYXJpYS1zZWxlY3RlZF0nLFxuICAgICAgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoJ2RhdGEnKTtcblxuICAgICAgc2VsZi5nZXRIaWdobGlnaHRlZFJlc3VsdHMoKVxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24tLWhpZ2hsaWdodGVkJyk7XG5cbiAgICAgIHNlbGYudHJpZ2dlcigncmVzdWx0czpmb2N1cycsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgZWxlbWVudDogJCh0aGlzKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgUmVzdWx0cy5wcm90b3R5cGUuZ2V0SGlnaGxpZ2h0ZWRSZXN1bHRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciAkaGlnaGxpZ2h0ZWQgPSB0aGlzLiRyZXN1bHRzXG4gICAgLmZpbmQoJy5zZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlnaGxpZ2h0ZWQnKTtcblxuICAgIHJldHVybiAkaGlnaGxpZ2h0ZWQ7XG4gIH07XG5cbiAgUmVzdWx0cy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLiRyZXN1bHRzLnJlbW92ZSgpO1xuICB9O1xuXG4gIFJlc3VsdHMucHJvdG90eXBlLmVuc3VyZUhpZ2hsaWdodFZpc2libGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRoaWdobGlnaHRlZCA9IHRoaXMuZ2V0SGlnaGxpZ2h0ZWRSZXN1bHRzKCk7XG5cbiAgICBpZiAoJGhpZ2hsaWdodGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciAkb3B0aW9ucyA9IHRoaXMuJHJlc3VsdHMuZmluZCgnW2FyaWEtc2VsZWN0ZWRdJyk7XG5cbiAgICB2YXIgY3VycmVudEluZGV4ID0gJG9wdGlvbnMuaW5kZXgoJGhpZ2hsaWdodGVkKTtcblxuICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gdGhpcy4kcmVzdWx0cy5vZmZzZXQoKS50b3A7XG4gICAgdmFyIG5leHRUb3AgPSAkaGlnaGxpZ2h0ZWQub2Zmc2V0KCkudG9wO1xuICAgIHZhciBuZXh0T2Zmc2V0ID0gdGhpcy4kcmVzdWx0cy5zY3JvbGxUb3AoKSArIChuZXh0VG9wIC0gY3VycmVudE9mZnNldCk7XG5cbiAgICB2YXIgb2Zmc2V0RGVsdGEgPSBuZXh0VG9wIC0gY3VycmVudE9mZnNldDtcbiAgICBuZXh0T2Zmc2V0IC09ICRoaWdobGlnaHRlZC5vdXRlckhlaWdodChmYWxzZSkgKiAyO1xuXG4gICAgaWYgKGN1cnJlbnRJbmRleCA8PSAyKSB7XG4gICAgICB0aGlzLiRyZXN1bHRzLnNjcm9sbFRvcCgwKTtcbiAgICB9IGVsc2UgaWYgKG9mZnNldERlbHRhID4gdGhpcy4kcmVzdWx0cy5vdXRlckhlaWdodCgpIHx8IG9mZnNldERlbHRhIDwgMCkge1xuICAgICAgdGhpcy4kcmVzdWx0cy5zY3JvbGxUb3AobmV4dE9mZnNldCk7XG4gICAgfVxuICB9O1xuXG4gIFJlc3VsdHMucHJvdG90eXBlLnRlbXBsYXRlID0gZnVuY3Rpb24gKHJlc3VsdCwgY29udGFpbmVyKSB7XG4gICAgdmFyIHRlbXBsYXRlID0gdGhpcy5vcHRpb25zLmdldCgndGVtcGxhdGVSZXN1bHQnKTtcbiAgICB2YXIgZXNjYXBlTWFya3VwID0gdGhpcy5vcHRpb25zLmdldCgnZXNjYXBlTWFya3VwJyk7XG5cbiAgICB2YXIgY29udGVudCA9IHRlbXBsYXRlKHJlc3VsdCwgY29udGFpbmVyKTtcblxuICAgIGlmIChjb250ZW50ID09IG51bGwpIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gZXNjYXBlTWFya3VwKGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkKGNvbnRhaW5lcikuYXBwZW5kKGNvbnRlbnQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUmVzdWx0cztcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIva2V5cycsW1xuXG5dLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBLRVlTID0ge1xuICAgIEJBQ0tTUEFDRTogOCxcbiAgICBUQUI6IDksXG4gICAgRU5URVI6IDEzLFxuICAgIFNISUZUOiAxNixcbiAgICBDVFJMOiAxNyxcbiAgICBBTFQ6IDE4LFxuICAgIEVTQzogMjcsXG4gICAgU1BBQ0U6IDMyLFxuICAgIFBBR0VfVVA6IDMzLFxuICAgIFBBR0VfRE9XTjogMzQsXG4gICAgRU5EOiAzNSxcbiAgICBIT01FOiAzNixcbiAgICBMRUZUOiAzNyxcbiAgICBVUDogMzgsXG4gICAgUklHSFQ6IDM5LFxuICAgIERPV046IDQwLFxuICAgIERFTEVURTogNDZcbiAgfTtcblxuICByZXR1cm4gS0VZUztcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvc2VsZWN0aW9uL2Jhc2UnLFtcbiAgJ2pxdWVyeScsXG4gICcuLi91dGlscycsXG4gICcuLi9rZXlzJ1xuXSwgZnVuY3Rpb24gKCQsIFV0aWxzLCBLRVlTKSB7XG4gIGZ1bmN0aW9uIEJhc2VTZWxlY3Rpb24gKCRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9ICRlbGVtZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBCYXNlU2VsZWN0aW9uLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO1xuICB9XG5cbiAgVXRpbHMuRXh0ZW5kKEJhc2VTZWxlY3Rpb24sIFV0aWxzLk9ic2VydmFibGUpO1xuXG4gIEJhc2VTZWxlY3Rpb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHNlbGVjdGlvbiA9ICQoXG4gICAgICAnPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvblwiIHJvbGU9XCJjb21ib2JveFwiICcgK1xuICAgICAgJyBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPicgK1xuICAgICAgJzwvc3Bhbj4nXG4gICAgKTtcblxuICAgIHRoaXMuX3RhYmluZGV4ID0gMDtcblxuICAgIGlmICh0aGlzLiRlbGVtZW50LmRhdGEoJ29sZC10YWJpbmRleCcpICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX3RhYmluZGV4ID0gdGhpcy4kZWxlbWVudC5kYXRhKCdvbGQtdGFiaW5kZXgnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJGVsZW1lbnQuYXR0cigndGFiaW5kZXgnKSAhPSBudWxsKSB7XG4gICAgICB0aGlzLl90YWJpbmRleCA9IHRoaXMuJGVsZW1lbnQuYXR0cigndGFiaW5kZXgnKTtcbiAgICB9XG5cbiAgICAkc2VsZWN0aW9uLmF0dHIoJ3RpdGxlJywgdGhpcy4kZWxlbWVudC5hdHRyKCd0aXRsZScpKTtcbiAgICAkc2VsZWN0aW9uLmF0dHIoJ3RhYmluZGV4JywgdGhpcy5fdGFiaW5kZXgpO1xuXG4gICAgdGhpcy4kc2VsZWN0aW9uID0gJHNlbGVjdGlvbjtcblxuICAgIHJldHVybiAkc2VsZWN0aW9uO1xuICB9O1xuXG4gIEJhc2VTZWxlY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGFpbmVyLCAkY29udGFpbmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIGlkID0gY29udGFpbmVyLmlkICsgJy1jb250YWluZXInO1xuICAgIHZhciByZXN1bHRzSWQgPSBjb250YWluZXIuaWQgKyAnLXJlc3VsdHMnO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG5cbiAgICB0aGlzLiRzZWxlY3Rpb24ub24oJ2ZvY3VzJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgc2VsZi50cmlnZ2VyKCdmb2N1cycsIGV2dCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRzZWxlY3Rpb24ub24oJ2JsdXInLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICBzZWxmLl9oYW5kbGVCbHVyKGV2dCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRzZWxlY3Rpb24ub24oJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICBzZWxmLnRyaWdnZXIoJ2tleXByZXNzJywgZXZ0KTtcblxuICAgICAgaWYgKGV2dC53aGljaCA9PT0gS0VZUy5TUEFDRSkge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbigncmVzdWx0czpmb2N1cycsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHNlbGYuJHNlbGVjdGlvbi5hdHRyKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLCBwYXJhbXMuZGF0YS5fcmVzdWx0SWQpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdzZWxlY3Rpb246dXBkYXRlJywgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgc2VsZi51cGRhdGUocGFyYW1zLmRhdGEpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdvcGVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gV2hlbiB0aGUgZHJvcGRvd24gaXMgb3BlbiwgYXJpYS1leHBhbmRlZD1cInRydWVcIlxuICAgICAgc2VsZi4kc2VsZWN0aW9uLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xuICAgICAgc2VsZi4kc2VsZWN0aW9uLmF0dHIoJ2FyaWEtb3ducycsIHJlc3VsdHNJZCk7XG5cbiAgICAgIHNlbGYuX2F0dGFjaENsb3NlSGFuZGxlcihjb250YWluZXIpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFdoZW4gdGhlIGRyb3Bkb3duIGlzIGNsb3NlZCwgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgIHNlbGYuJHNlbGVjdGlvbi5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICBzZWxmLiRzZWxlY3Rpb24ucmVtb3ZlQXR0cignYXJpYS1hY3RpdmVkZXNjZW5kYW50Jyk7XG4gICAgICBzZWxmLiRzZWxlY3Rpb24ucmVtb3ZlQXR0cignYXJpYS1vd25zJyk7XG5cbiAgICAgIHNlbGYuJHNlbGVjdGlvbi5mb2N1cygpO1xuXG4gICAgICBzZWxmLl9kZXRhY2hDbG9zZUhhbmRsZXIoY29udGFpbmVyKTtcbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbignZW5hYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi4kc2VsZWN0aW9uLmF0dHIoJ3RhYmluZGV4Jywgc2VsZi5fdGFiaW5kZXgpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdkaXNhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi4kc2VsZWN0aW9uLmF0dHIoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgfSk7XG4gIH07XG5cbiAgQmFzZVNlbGVjdGlvbi5wcm90b3R5cGUuX2hhbmRsZUJsdXIgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gVGhpcyBuZWVkcyB0byBiZSBkZWxheWVkIGFzIHRoZSBhY3RpdmUgZWxlbWVudCBpcyB0aGUgYm9keSB3aGVuIHRoZSB0YWJcbiAgICAvLyBrZXkgaXMgcHJlc3NlZCwgcG9zc2libHkgYWxvbmcgd2l0aCBvdGhlcnMuXG4gICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBgYmx1cmAgaWYgdGhlIGZvY3VzIGlzIHN0aWxsIGluIHRoZSBzZWxlY3Rpb25cbiAgICAgIGlmIChcbiAgICAgICAgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT0gc2VsZi4kc2VsZWN0aW9uWzBdKSB8fFxuICAgICAgICAoJC5jb250YWlucyhzZWxmLiRzZWxlY3Rpb25bMF0sIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi50cmlnZ2VyKCdibHVyJywgZXZ0KTtcbiAgICB9LCAxKTtcbiAgfTtcblxuICBCYXNlU2VsZWN0aW9uLnByb3RvdHlwZS5fYXR0YWNoQ2xvc2VIYW5kbGVyID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICQoZG9jdW1lbnQuYm9keSkub24oJ21vdXNlZG93bi5zZWxlY3QyLicgKyBjb250YWluZXIuaWQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgJHRhcmdldCA9ICQoZS50YXJnZXQpO1xuXG4gICAgICB2YXIgJHNlbGVjdCA9ICR0YXJnZXQuY2xvc2VzdCgnLnNlbGVjdDInKTtcblxuICAgICAgdmFyICRhbGwgPSAkKCcuc2VsZWN0Mi5zZWxlY3QyLWNvbnRhaW5lci0tb3BlbicpO1xuXG4gICAgICAkYWxsLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzID09ICRzZWxlY3RbMF0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgJGVsZW1lbnQgPSAkdGhpcy5kYXRhKCdlbGVtZW50Jyk7XG5cbiAgICAgICAgJGVsZW1lbnQuc2VsZWN0MignY2xvc2UnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIEJhc2VTZWxlY3Rpb24ucHJvdG90eXBlLl9kZXRhY2hDbG9zZUhhbmRsZXIgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgJChkb2N1bWVudC5ib2R5KS5vZmYoJ21vdXNlZG93bi5zZWxlY3QyLicgKyBjb250YWluZXIuaWQpO1xuICB9O1xuXG4gIEJhc2VTZWxlY3Rpb24ucHJvdG90eXBlLnBvc2l0aW9uID0gZnVuY3Rpb24gKCRzZWxlY3Rpb24sICRjb250YWluZXIpIHtcbiAgICB2YXIgJHNlbGVjdGlvbkNvbnRhaW5lciA9ICRjb250YWluZXIuZmluZCgnLnNlbGVjdGlvbicpO1xuICAgICRzZWxlY3Rpb25Db250YWluZXIuYXBwZW5kKCRzZWxlY3Rpb24pO1xuICB9O1xuXG4gIEJhc2VTZWxlY3Rpb24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fZGV0YWNoQ2xvc2VIYW5kbGVyKHRoaXMuY29udGFpbmVyKTtcbiAgfTtcblxuICBCYXNlU2VsZWN0aW9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGB1cGRhdGVgIG1ldGhvZCBtdXN0IGJlIGRlZmluZWQgaW4gY2hpbGQgY2xhc3Nlcy4nKTtcbiAgfTtcblxuICByZXR1cm4gQmFzZVNlbGVjdGlvbjtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvc2VsZWN0aW9uL3NpbmdsZScsW1xuICAnanF1ZXJ5JyxcbiAgJy4vYmFzZScsXG4gICcuLi91dGlscycsXG4gICcuLi9rZXlzJ1xuXSwgZnVuY3Rpb24gKCQsIEJhc2VTZWxlY3Rpb24sIFV0aWxzLCBLRVlTKSB7XG4gIGZ1bmN0aW9uIFNpbmdsZVNlbGVjdGlvbiAoKSB7XG4gICAgU2luZ2xlU2VsZWN0aW9uLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgVXRpbHMuRXh0ZW5kKFNpbmdsZVNlbGVjdGlvbiwgQmFzZVNlbGVjdGlvbik7XG5cbiAgU2luZ2xlU2VsZWN0aW9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRzZWxlY3Rpb24gPSBTaW5nbGVTZWxlY3Rpb24uX19zdXBlcl9fLnJlbmRlci5jYWxsKHRoaXMpO1xuXG4gICAgJHNlbGVjdGlvbi5hZGRDbGFzcygnc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZScpO1xuXG4gICAgJHNlbGVjdGlvbi5odG1sKFxuICAgICAgJzxzcGFuIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkXCI+PC9zcGFuPicgK1xuICAgICAgJzxzcGFuIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX2Fycm93XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPicgK1xuICAgICAgICAnPGIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvYj4nICtcbiAgICAgICc8L3NwYW4+J1xuICAgICk7XG5cbiAgICByZXR1cm4gJHNlbGVjdGlvbjtcbiAgfTtcblxuICBTaW5nbGVTZWxlY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGFpbmVyLCAkY29udGFpbmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgU2luZ2xlU2VsZWN0aW9uLl9fc3VwZXJfXy5iaW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgaWQgPSBjb250YWluZXIuaWQgKyAnLWNvbnRhaW5lcic7XG5cbiAgICB0aGlzLiRzZWxlY3Rpb24uZmluZCgnLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZCcpLmF0dHIoJ2lkJywgaWQpO1xuICAgIHRoaXMuJHNlbGVjdGlvbi5hdHRyKCdhcmlhLWxhYmVsbGVkYnknLCBpZCk7XG5cbiAgICB0aGlzLiRzZWxlY3Rpb24ub24oJ21vdXNlZG93bicsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIC8vIE9ubHkgcmVzcG9uZCB0byBsZWZ0IGNsaWNrc1xuICAgICAgaWYgKGV2dC53aGljaCAhPT0gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYudHJpZ2dlcigndG9nZ2xlJywge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kc2VsZWN0aW9uLm9uKCdmb2N1cycsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIC8vIFVzZXIgZm9jdXNlcyBvbiB0aGUgY29udGFpbmVyXG4gICAgfSk7XG5cbiAgICB0aGlzLiRzZWxlY3Rpb24ub24oJ2JsdXInLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAvLyBVc2VyIGV4aXRzIHRoZSBjb250YWluZXJcbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbignZm9jdXMnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICBpZiAoIWNvbnRhaW5lci5pc09wZW4oKSkge1xuICAgICAgICBzZWxmLiRzZWxlY3Rpb24uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbignc2VsZWN0aW9uOnVwZGF0ZScsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHNlbGYudXBkYXRlKHBhcmFtcy5kYXRhKTtcbiAgICB9KTtcbiAgfTtcblxuICBTaW5nbGVTZWxlY3Rpb24ucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuJHNlbGVjdGlvbi5maW5kKCcuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkJykuZW1wdHkoKTtcbiAgfTtcblxuICBTaW5nbGVTZWxlY3Rpb24ucHJvdG90eXBlLmRpc3BsYXkgPSBmdW5jdGlvbiAoZGF0YSwgY29udGFpbmVyKSB7XG4gICAgdmFyIHRlbXBsYXRlID0gdGhpcy5vcHRpb25zLmdldCgndGVtcGxhdGVTZWxlY3Rpb24nKTtcbiAgICB2YXIgZXNjYXBlTWFya3VwID0gdGhpcy5vcHRpb25zLmdldCgnZXNjYXBlTWFya3VwJyk7XG5cbiAgICByZXR1cm4gZXNjYXBlTWFya3VwKHRlbXBsYXRlKGRhdGEsIGNvbnRhaW5lcikpO1xuICB9O1xuXG4gIFNpbmdsZVNlbGVjdGlvbi5wcm90b3R5cGUuc2VsZWN0aW9uQ29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAkKCc8c3Bhbj48L3NwYW4+Jyk7XG4gIH07XG5cbiAgU2luZ2xlU2VsZWN0aW9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzZWxlY3Rpb24gPSBkYXRhWzBdO1xuXG4gICAgdmFyICRyZW5kZXJlZCA9IHRoaXMuJHNlbGVjdGlvbi5maW5kKCcuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkJyk7XG4gICAgdmFyIGZvcm1hdHRlZCA9IHRoaXMuZGlzcGxheShzZWxlY3Rpb24sICRyZW5kZXJlZCk7XG5cbiAgICAkcmVuZGVyZWQuZW1wdHkoKS5hcHBlbmQoZm9ybWF0dGVkKTtcbiAgICAkcmVuZGVyZWQucHJvcCgndGl0bGUnLCBzZWxlY3Rpb24udGl0bGUgfHwgc2VsZWN0aW9uLnRleHQpO1xuICB9O1xuXG4gIHJldHVybiBTaW5nbGVTZWxlY3Rpb247XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL3NlbGVjdGlvbi9tdWx0aXBsZScsW1xuICAnanF1ZXJ5JyxcbiAgJy4vYmFzZScsXG4gICcuLi91dGlscydcbl0sIGZ1bmN0aW9uICgkLCBCYXNlU2VsZWN0aW9uLCBVdGlscykge1xuICBmdW5jdGlvbiBNdWx0aXBsZVNlbGVjdGlvbiAoJGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBNdWx0aXBsZVNlbGVjdGlvbi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIFV0aWxzLkV4dGVuZChNdWx0aXBsZVNlbGVjdGlvbiwgQmFzZVNlbGVjdGlvbik7XG5cbiAgTXVsdGlwbGVTZWxlY3Rpb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHNlbGVjdGlvbiA9IE11bHRpcGxlU2VsZWN0aW9uLl9fc3VwZXJfXy5yZW5kZXIuY2FsbCh0aGlzKTtcblxuICAgICRzZWxlY3Rpb24uYWRkQ2xhc3MoJ3NlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZScpO1xuXG4gICAgJHNlbGVjdGlvbi5odG1sKFxuICAgICAgJzx1bCBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiPjwvdWw+J1xuICAgICk7XG5cbiAgICByZXR1cm4gJHNlbGVjdGlvbjtcbiAgfTtcblxuICBNdWx0aXBsZVNlbGVjdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChjb250YWluZXIsICRjb250YWluZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBNdWx0aXBsZVNlbGVjdGlvbi5fX3N1cGVyX18uYmluZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy4kc2VsZWN0aW9uLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHNlbGYudHJpZ2dlcigndG9nZ2xlJywge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kc2VsZWN0aW9uLm9uKFxuICAgICAgJ2NsaWNrJyxcbiAgICAgICcuc2VsZWN0Mi1zZWxlY3Rpb25fX2Nob2ljZV9fcmVtb3ZlJyxcbiAgICAgIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBldmVudCBpZiBpdCBpcyBkaXNhYmxlZFxuICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmdldCgnZGlzYWJsZWQnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciAkcmVtb3ZlID0gJCh0aGlzKTtcbiAgICAgICAgdmFyICRzZWxlY3Rpb24gPSAkcmVtb3ZlLnBhcmVudCgpO1xuXG4gICAgICAgIHZhciBkYXRhID0gJHNlbGVjdGlvbi5kYXRhKCdkYXRhJyk7XG5cbiAgICAgICAgc2VsZi50cmlnZ2VyKCd1bnNlbGVjdCcsIHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnQsXG4gICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIE11bHRpcGxlU2VsZWN0aW9uLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLiRzZWxlY3Rpb24uZmluZCgnLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZCcpLmVtcHR5KCk7XG4gIH07XG5cbiAgTXVsdGlwbGVTZWxlY3Rpb24ucHJvdG90eXBlLmRpc3BsYXkgPSBmdW5jdGlvbiAoZGF0YSwgY29udGFpbmVyKSB7XG4gICAgdmFyIHRlbXBsYXRlID0gdGhpcy5vcHRpb25zLmdldCgndGVtcGxhdGVTZWxlY3Rpb24nKTtcbiAgICB2YXIgZXNjYXBlTWFya3VwID0gdGhpcy5vcHRpb25zLmdldCgnZXNjYXBlTWFya3VwJyk7XG5cbiAgICByZXR1cm4gZXNjYXBlTWFya3VwKHRlbXBsYXRlKGRhdGEsIGNvbnRhaW5lcikpO1xuICB9O1xuXG4gIE11bHRpcGxlU2VsZWN0aW9uLnByb3RvdHlwZS5zZWxlY3Rpb25Db250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRjb250YWluZXIgPSAkKFxuICAgICAgJzxsaSBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19jaG9pY2VcIj4nICtcbiAgICAgICAgJzxzcGFuIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX2Nob2ljZV9fcmVtb3ZlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPicgK1xuICAgICAgICAgICcmdGltZXM7JyArXG4gICAgICAgICc8L3NwYW4+JyArXG4gICAgICAnPC9saT4nXG4gICAgKTtcblxuICAgIHJldHVybiAkY29udGFpbmVyO1xuICB9O1xuXG4gIE11bHRpcGxlU2VsZWN0aW9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMuY2xlYXIoKTtcblxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciAkc2VsZWN0aW9ucyA9IFtdO1xuXG4gICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkYXRhLmxlbmd0aDsgZCsrKSB7XG4gICAgICB2YXIgc2VsZWN0aW9uID0gZGF0YVtkXTtcblxuICAgICAgdmFyICRzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbkNvbnRhaW5lcigpO1xuICAgICAgdmFyIGZvcm1hdHRlZCA9IHRoaXMuZGlzcGxheShzZWxlY3Rpb24sICRzZWxlY3Rpb24pO1xuXG4gICAgICAkc2VsZWN0aW9uLmFwcGVuZChmb3JtYXR0ZWQpO1xuICAgICAgJHNlbGVjdGlvbi5wcm9wKCd0aXRsZScsIHNlbGVjdGlvbi50aXRsZSB8fCBzZWxlY3Rpb24udGV4dCk7XG5cbiAgICAgICRzZWxlY3Rpb24uZGF0YSgnZGF0YScsIHNlbGVjdGlvbik7XG5cbiAgICAgICRzZWxlY3Rpb25zLnB1c2goJHNlbGVjdGlvbik7XG4gICAgfVxuXG4gICAgdmFyICRyZW5kZXJlZCA9IHRoaXMuJHNlbGVjdGlvbi5maW5kKCcuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkJyk7XG5cbiAgICBVdGlscy5hcHBlbmRNYW55KCRyZW5kZXJlZCwgJHNlbGVjdGlvbnMpO1xuICB9O1xuXG4gIHJldHVybiBNdWx0aXBsZVNlbGVjdGlvbjtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvc2VsZWN0aW9uL3BsYWNlaG9sZGVyJyxbXG4gICcuLi91dGlscydcbl0sIGZ1bmN0aW9uIChVdGlscykge1xuICBmdW5jdGlvbiBQbGFjZWhvbGRlciAoZGVjb3JhdGVkLCAkZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLm5vcm1hbGl6ZVBsYWNlaG9sZGVyKG9wdGlvbnMuZ2V0KCdwbGFjZWhvbGRlcicpKTtcblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsICRlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIFBsYWNlaG9sZGVyLnByb3RvdHlwZS5ub3JtYWxpemVQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChfLCBwbGFjZWhvbGRlcikge1xuICAgIGlmICh0eXBlb2YgcGxhY2Vob2xkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwbGFjZWhvbGRlciA9IHtcbiAgICAgICAgaWQ6ICcnLFxuICAgICAgICB0ZXh0OiBwbGFjZWhvbGRlclxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gIH07XG5cbiAgUGxhY2Vob2xkZXIucHJvdG90eXBlLmNyZWF0ZVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKGRlY29yYXRlZCwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgJHBsYWNlaG9sZGVyID0gdGhpcy5zZWxlY3Rpb25Db250YWluZXIoKTtcblxuICAgICRwbGFjZWhvbGRlci5odG1sKHRoaXMuZGlzcGxheShwbGFjZWhvbGRlcikpO1xuICAgICRwbGFjZWhvbGRlci5hZGRDbGFzcygnc2VsZWN0Mi1zZWxlY3Rpb25fX3BsYWNlaG9sZGVyJylcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3NlbGVjdDItc2VsZWN0aW9uX19jaG9pY2UnKTtcblxuICAgIHJldHVybiAkcGxhY2Vob2xkZXI7XG4gIH07XG5cbiAgUGxhY2Vob2xkZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGRhdGEpIHtcbiAgICB2YXIgc2luZ2xlUGxhY2Vob2xkZXIgPSAoXG4gICAgICBkYXRhLmxlbmd0aCA9PSAxICYmIGRhdGFbMF0uaWQgIT0gdGhpcy5wbGFjZWhvbGRlci5pZFxuICAgICk7XG4gICAgdmFyIG11bHRpcGxlU2VsZWN0aW9ucyA9IGRhdGEubGVuZ3RoID4gMTtcblxuICAgIGlmIChtdWx0aXBsZVNlbGVjdGlvbnMgfHwgc2luZ2xlUGxhY2Vob2xkZXIpIHtcbiAgICAgIHJldHVybiBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyKCk7XG5cbiAgICB2YXIgJHBsYWNlaG9sZGVyID0gdGhpcy5jcmVhdGVQbGFjZWhvbGRlcih0aGlzLnBsYWNlaG9sZGVyKTtcblxuICAgIHRoaXMuJHNlbGVjdGlvbi5maW5kKCcuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkJykuYXBwZW5kKCRwbGFjZWhvbGRlcik7XG4gIH07XG5cbiAgcmV0dXJuIFBsYWNlaG9sZGVyO1xufSk7XG5cblMyLmRlZmluZSgnc2VsZWN0Mi9zZWxlY3Rpb24vYWxsb3dDbGVhcicsW1xuICAnanF1ZXJ5JyxcbiAgJy4uL2tleXMnXG5dLCBmdW5jdGlvbiAoJCwgS0VZUykge1xuICBmdW5jdGlvbiBBbGxvd0NsZWFyICgpIHsgfVxuXG4gIEFsbG93Q2xlYXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoZGVjb3JhdGVkLCBjb250YWluZXIsICRjb250YWluZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBjb250YWluZXIsICRjb250YWluZXIpO1xuXG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIgPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5nZXQoJ2RlYnVnJykgJiYgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICdTZWxlY3QyOiBUaGUgYGFsbG93Q2xlYXJgIG9wdGlvbiBzaG91bGQgYmUgdXNlZCBpbiBjb21iaW5hdGlvbiAnICtcbiAgICAgICAgICAnd2l0aCB0aGUgYHBsYWNlaG9sZGVyYCBvcHRpb24uJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuJHNlbGVjdGlvbi5vbignbW91c2Vkb3duJywgJy5zZWxlY3QyLXNlbGVjdGlvbl9fY2xlYXInLFxuICAgICAgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICBzZWxmLl9oYW5kbGVDbGVhcihldnQpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdrZXlwcmVzcycsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHNlbGYuX2hhbmRsZUtleWJvYXJkQ2xlYXIoZXZ0LCBjb250YWluZXIpO1xuICAgIH0pO1xuICB9O1xuXG4gIEFsbG93Q2xlYXIucHJvdG90eXBlLl9oYW5kbGVDbGVhciA9IGZ1bmN0aW9uIChfLCBldnQpIHtcbiAgICAvLyBJZ25vcmUgdGhlIGV2ZW50IGlmIGl0IGlzIGRpc2FibGVkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5nZXQoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgJGNsZWFyID0gdGhpcy4kc2VsZWN0aW9uLmZpbmQoJy5zZWxlY3QyLXNlbGVjdGlvbl9fY2xlYXInKTtcblxuICAgIC8vIElnbm9yZSB0aGUgZXZlbnQgaWYgbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZFxuICAgIGlmICgkY2xlYXIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdmFyIGRhdGEgPSAkY2xlYXIuZGF0YSgnZGF0YScpO1xuXG4gICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkYXRhLmxlbmd0aDsgZCsrKSB7XG4gICAgICB2YXIgdW5zZWxlY3REYXRhID0ge1xuICAgICAgICBkYXRhOiBkYXRhW2RdXG4gICAgICB9O1xuXG4gICAgICAvLyBUcmlnZ2VyIHRoZSBgdW5zZWxlY3RgIGV2ZW50LCBzbyBwZW9wbGUgY2FuIHByZXZlbnQgaXQgZnJvbSBiZWluZ1xuICAgICAgLy8gY2xlYXJlZC5cbiAgICAgIHRoaXMudHJpZ2dlcigndW5zZWxlY3QnLCB1bnNlbGVjdERhdGEpO1xuXG4gICAgICAvLyBJZiB0aGUgZXZlbnQgd2FzIHByZXZlbnRlZCwgZG9uJ3QgY2xlYXIgaXQgb3V0LlxuICAgICAgaWYgKHVuc2VsZWN0RGF0YS5wcmV2ZW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQudmFsKHRoaXMucGxhY2Vob2xkZXIuaWQpLnRyaWdnZXIoJ2NoYW5nZScpO1xuXG4gICAgdGhpcy50cmlnZ2VyKCd0b2dnbGUnLCB7fSk7XG4gIH07XG5cbiAgQWxsb3dDbGVhci5wcm90b3R5cGUuX2hhbmRsZUtleWJvYXJkQ2xlYXIgPSBmdW5jdGlvbiAoXywgZXZ0LCBjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyLmlzT3BlbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2dC53aGljaCA9PSBLRVlTLkRFTEVURSB8fCBldnQud2hpY2ggPT0gS0VZUy5CQUNLU1BBQ0UpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsZWFyKGV2dCk7XG4gICAgfVxuICB9O1xuXG4gIEFsbG93Q2xlYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGRhdGEpIHtcbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBkYXRhKTtcblxuICAgIGlmICh0aGlzLiRzZWxlY3Rpb24uZmluZCgnLnNlbGVjdDItc2VsZWN0aW9uX19wbGFjZWhvbGRlcicpLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgJHJlbW92ZSA9ICQoXG4gICAgICAnPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fY2xlYXJcIj4nICtcbiAgICAgICAgJyZ0aW1lczsnICtcbiAgICAgICc8L3NwYW4+J1xuICAgICk7XG4gICAgJHJlbW92ZS5kYXRhKCdkYXRhJywgZGF0YSk7XG5cbiAgICB0aGlzLiRzZWxlY3Rpb24uZmluZCgnLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZCcpLnByZXBlbmQoJHJlbW92ZSk7XG4gIH07XG5cbiAgcmV0dXJuIEFsbG93Q2xlYXI7XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL3NlbGVjdGlvbi9zZWFyY2gnLFtcbiAgJ2pxdWVyeScsXG4gICcuLi91dGlscycsXG4gICcuLi9rZXlzJ1xuXSwgZnVuY3Rpb24gKCQsIFV0aWxzLCBLRVlTKSB7XG4gIGZ1bmN0aW9uIFNlYXJjaCAoZGVjb3JhdGVkLCAkZWxlbWVudCwgb3B0aW9ucykge1xuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsICRlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIFNlYXJjaC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGRlY29yYXRlZCkge1xuICAgIHZhciAkc2VhcmNoID0gJChcbiAgICAgICc8bGkgY2xhc3M9XCJzZWxlY3QyLXNlYXJjaCBzZWxlY3QyLXNlYXJjaC0taW5saW5lXCI+JyArXG4gICAgICAgICc8aW5wdXQgY2xhc3M9XCJzZWxlY3QyLXNlYXJjaF9fZmllbGRcIiB0eXBlPVwic2VhcmNoXCIgdGFiaW5kZXg9XCItMVwiJyArXG4gICAgICAgICcgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiJyArXG4gICAgICAgICcgc3BlbGxjaGVjaz1cImZhbHNlXCIgcm9sZT1cInRleHRib3hcIiBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIiAvPicgK1xuICAgICAgJzwvbGk+J1xuICAgICk7XG5cbiAgICB0aGlzLiRzZWFyY2hDb250YWluZXIgPSAkc2VhcmNoO1xuICAgIHRoaXMuJHNlYXJjaCA9ICRzZWFyY2guZmluZCgnaW5wdXQnKTtcblxuICAgIHZhciAkcmVuZGVyZWQgPSBkZWNvcmF0ZWQuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMuX3RyYW5zZmVyVGFiSW5kZXgoKTtcblxuICAgIHJldHVybiAkcmVuZGVyZWQ7XG4gIH07XG5cbiAgU2VhcmNoLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKGRlY29yYXRlZCwgY29udGFpbmVyLCAkY29udGFpbmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgZGVjb3JhdGVkLmNhbGwodGhpcywgY29udGFpbmVyLCAkY29udGFpbmVyKTtcblxuICAgIGNvbnRhaW5lci5vbignb3BlbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuJHNlYXJjaC50cmlnZ2VyKCdmb2N1cycpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuJHNlYXJjaC52YWwoJycpO1xuICAgICAgc2VsZi4kc2VhcmNoLnJlbW92ZUF0dHIoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpO1xuICAgICAgc2VsZi4kc2VhcmNoLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ2VuYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuJHNlYXJjaC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcblxuICAgICAgc2VsZi5fdHJhbnNmZXJUYWJJbmRleCgpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdkaXNhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi4kc2VhcmNoLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ2ZvY3VzJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgc2VsZi4kc2VhcmNoLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ3Jlc3VsdHM6Zm9jdXMnLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICBzZWxmLiRzZWFyY2guYXR0cignYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgcGFyYW1zLmlkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuJHNlbGVjdGlvbi5vbignZm9jdXNpbicsICcuc2VsZWN0Mi1zZWFyY2gtLWlubGluZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHNlbGYudHJpZ2dlcignZm9jdXMnLCBldnQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kc2VsZWN0aW9uLm9uKCdmb2N1c291dCcsICcuc2VsZWN0Mi1zZWFyY2gtLWlubGluZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHNlbGYuX2hhbmRsZUJsdXIoZXZ0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuJHNlbGVjdGlvbi5vbigna2V5ZG93bicsICcuc2VsZWN0Mi1zZWFyY2gtLWlubGluZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgc2VsZi50cmlnZ2VyKCdrZXlwcmVzcycsIGV2dCk7XG5cbiAgICAgIHNlbGYuX2tleVVwUHJldmVudGVkID0gZXZ0LmlzRGVmYXVsdFByZXZlbnRlZCgpO1xuXG4gICAgICB2YXIga2V5ID0gZXZ0LndoaWNoO1xuXG4gICAgICBpZiAoa2V5ID09PSBLRVlTLkJBQ0tTUEFDRSAmJiBzZWxmLiRzZWFyY2gudmFsKCkgPT09ICcnKSB7XG4gICAgICAgIHZhciAkcHJldmlvdXNDaG9pY2UgPSBzZWxmLiRzZWFyY2hDb250YWluZXJcbiAgICAgICAgICAucHJldignLnNlbGVjdDItc2VsZWN0aW9uX19jaG9pY2UnKTtcblxuICAgICAgICBpZiAoJHByZXZpb3VzQ2hvaWNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgaXRlbSA9ICRwcmV2aW91c0Nob2ljZS5kYXRhKCdkYXRhJyk7XG5cbiAgICAgICAgICBzZWxmLnNlYXJjaFJlbW92ZUNob2ljZShpdGVtKTtcblxuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUcnkgdG8gZGV0ZWN0IHRoZSBJRSB2ZXJzaW9uIHNob3VsZCB0aGUgYGRvY3VtZW50TW9kZWAgcHJvcGVydHkgdGhhdFxuICAgIC8vIGlzIHN0b3JlZCBvbiB0aGUgZG9jdW1lbnQuIFRoaXMgaXMgb25seSBpbXBsZW1lbnRlZCBpbiBJRSBhbmQgaXNcbiAgICAvLyBzbGlnaHRseSBjbGVhbmVyIHRoYW4gZG9pbmcgYSB1c2VyIGFnZW50IGNoZWNrLlxuICAgIC8vIFRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBpbiBFZGdlLCBidXQgRWRnZSBhbHNvIGRvZXNuJ3QgaGF2ZVxuICAgIC8vIHRoaXMgYnVnLlxuICAgIHZhciBtc2llID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuICAgIHZhciBkaXNhYmxlSW5wdXRFdmVudHMgPSBtc2llICYmIG1zaWUgPD0gMTE7XG5cbiAgICAvLyBXb3JrYXJvdW5kIGZvciBicm93c2VycyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGUgYGlucHV0YCBldmVudFxuICAgIC8vIFRoaXMgd2lsbCBwcmV2ZW50IGRvdWJsZS10cmlnZ2VyaW5nIG9mIGV2ZW50cyBmb3IgYnJvd3NlcnMgd2hpY2ggc3VwcG9ydFxuICAgIC8vIGJvdGggdGhlIGBrZXl1cGAgYW5kIGBpbnB1dGAgZXZlbnRzLlxuICAgIHRoaXMuJHNlbGVjdGlvbi5vbihcbiAgICAgICdpbnB1dC5zZWFyY2hjaGVjaycsXG4gICAgICAnLnNlbGVjdDItc2VhcmNoLS1pbmxpbmUnLFxuICAgICAgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAvLyBJRSB3aWxsIHRyaWdnZXIgdGhlIGBpbnB1dGAgZXZlbnQgd2hlbiBhIHBsYWNlaG9sZGVyIGlzIHVzZWQgb24gYVxuICAgICAgICAvLyBzZWFyY2ggYm94LiBUbyBnZXQgYXJvdW5kIHRoaXMgaXNzdWUsIHdlIGFyZSBmb3JjZWQgdG8gaWdub3JlIGFsbFxuICAgICAgICAvLyBgaW5wdXRgIGV2ZW50cyBpbiBJRSBhbmQga2VlcCB1c2luZyBga2V5dXBgLlxuICAgICAgICBpZiAoZGlzYWJsZUlucHV0RXZlbnRzKSB7XG4gICAgICAgICAgc2VsZi4kc2VsZWN0aW9uLm9mZignaW5wdXQuc2VhcmNoIGlucHV0LnNlYXJjaGNoZWNrJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVW5iaW5kIHRoZSBkdXBsaWNhdGVkIGBrZXl1cGAgZXZlbnRcbiAgICAgICAgc2VsZi4kc2VsZWN0aW9uLm9mZigna2V5dXAuc2VhcmNoJyk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuJHNlbGVjdGlvbi5vbihcbiAgICAgICdrZXl1cC5zZWFyY2ggaW5wdXQuc2VhcmNoJyxcbiAgICAgICcuc2VsZWN0Mi1zZWFyY2gtLWlubGluZScsXG4gICAgICBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIC8vIElFIHdpbGwgdHJpZ2dlciB0aGUgYGlucHV0YCBldmVudCB3aGVuIGEgcGxhY2Vob2xkZXIgaXMgdXNlZCBvbiBhXG4gICAgICAgIC8vIHNlYXJjaCBib3guIFRvIGdldCBhcm91bmQgdGhpcyBpc3N1ZSwgd2UgYXJlIGZvcmNlZCB0byBpZ25vcmUgYWxsXG4gICAgICAgIC8vIGBpbnB1dGAgZXZlbnRzIGluIElFIGFuZCBrZWVwIHVzaW5nIGBrZXl1cGAuXG4gICAgICAgIGlmIChkaXNhYmxlSW5wdXRFdmVudHMgJiYgZXZ0LnR5cGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICBzZWxmLiRzZWxlY3Rpb24ub2ZmKCdpbnB1dC5zZWFyY2ggaW5wdXQuc2VhcmNoY2hlY2snKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIga2V5ID0gZXZ0LndoaWNoO1xuXG4gICAgICAgIC8vIFdlIGNhbiBmcmVlbHkgaWdub3JlIGV2ZW50cyBmcm9tIG1vZGlmaWVyIGtleXNcbiAgICAgICAgaWYgKGtleSA9PSBLRVlTLlNISUZUIHx8IGtleSA9PSBLRVlTLkNUUkwgfHwga2V5ID09IEtFWVMuQUxUKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGFiYmluZyB3aWxsIGJlIGhhbmRsZWQgZHVyaW5nIHRoZSBga2V5ZG93bmAgcGhhc2VcbiAgICAgICAgaWYgKGtleSA9PSBLRVlTLlRBQikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuaGFuZGxlU2VhcmNoKGV2dCk7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCB0cmFuc2ZlciB0aGUgdGFiaW5kZXggYXR0cmlidXRlIGZyb20gdGhlIHJlbmRlcmVkXG4gICAqIHNlbGVjdGlvbiB0byB0aGUgc2VhcmNoIGJveC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBzZWFyY2ggYm94IHRvIGJlIHVzZWQgYXNcbiAgICogdGhlIHByaW1hcnkgZm9jdXMgaW5zdGVhZCBvZiB0aGUgc2VsZWN0aW9uIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIFNlYXJjaC5wcm90b3R5cGUuX3RyYW5zZmVyVGFiSW5kZXggPSBmdW5jdGlvbiAoZGVjb3JhdGVkKSB7XG4gICAgdGhpcy4kc2VhcmNoLmF0dHIoJ3RhYmluZGV4JywgdGhpcy4kc2VsZWN0aW9uLmF0dHIoJ3RhYmluZGV4JykpO1xuICAgIHRoaXMuJHNlbGVjdGlvbi5hdHRyKCd0YWJpbmRleCcsICctMScpO1xuICB9O1xuXG4gIFNlYXJjaC5wcm90b3R5cGUuY3JlYXRlUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAoZGVjb3JhdGVkLCBwbGFjZWhvbGRlcikge1xuICAgIHRoaXMuJHNlYXJjaC5hdHRyKCdwbGFjZWhvbGRlcicsIHBsYWNlaG9sZGVyLnRleHQpO1xuICB9O1xuXG4gIFNlYXJjaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGRlY29yYXRlZCwgZGF0YSkge1xuICAgIHZhciBzZWFyY2hIYWRGb2N1cyA9IHRoaXMuJHNlYXJjaFswXSA9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgdGhpcy4kc2VhcmNoLmF0dHIoJ3BsYWNlaG9sZGVyJywgJycpO1xuXG4gICAgZGVjb3JhdGVkLmNhbGwodGhpcywgZGF0YSk7XG5cbiAgICB0aGlzLiRzZWxlY3Rpb24uZmluZCgnLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZCcpXG4gICAgICAgICAgICAgICAgICAgLmFwcGVuZCh0aGlzLiRzZWFyY2hDb250YWluZXIpO1xuXG4gICAgdGhpcy5yZXNpemVTZWFyY2goKTtcbiAgICBpZiAoc2VhcmNoSGFkRm9jdXMpIHtcbiAgICAgIHRoaXMuJHNlYXJjaC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBTZWFyY2gucHJvdG90eXBlLmhhbmRsZVNlYXJjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnJlc2l6ZVNlYXJjaCgpO1xuXG4gICAgaWYgKCF0aGlzLl9rZXlVcFByZXZlbnRlZCkge1xuICAgICAgdmFyIGlucHV0ID0gdGhpcy4kc2VhcmNoLnZhbCgpO1xuXG4gICAgICB0aGlzLnRyaWdnZXIoJ3F1ZXJ5Jywge1xuICAgICAgICB0ZXJtOiBpbnB1dFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fa2V5VXBQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBTZWFyY2gucHJvdG90eXBlLnNlYXJjaFJlbW92ZUNob2ljZSA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGl0ZW0pIHtcbiAgICB0aGlzLnRyaWdnZXIoJ3Vuc2VsZWN0Jywge1xuICAgICAgZGF0YTogaXRlbVxuICAgIH0pO1xuXG4gICAgdGhpcy4kc2VhcmNoLnZhbChpdGVtLnRleHQpO1xuICAgIHRoaXMuaGFuZGxlU2VhcmNoKCk7XG4gIH07XG5cbiAgU2VhcmNoLnByb3RvdHlwZS5yZXNpemVTZWFyY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy4kc2VhcmNoLmNzcygnd2lkdGgnLCAnMjVweCcpO1xuXG4gICAgdmFyIHdpZHRoID0gJyc7XG5cbiAgICBpZiAodGhpcy4kc2VhcmNoLmF0dHIoJ3BsYWNlaG9sZGVyJykgIT09ICcnKSB7XG4gICAgICB3aWR0aCA9IHRoaXMuJHNlbGVjdGlvbi5maW5kKCcuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkJykuaW5uZXJXaWR0aCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWluaW11bVdpZHRoID0gdGhpcy4kc2VhcmNoLnZhbCgpLmxlbmd0aCArIDE7XG5cbiAgICAgIHdpZHRoID0gKG1pbmltdW1XaWR0aCAqIDAuNzUpICsgJ2VtJztcbiAgICB9XG5cbiAgICB0aGlzLiRzZWFyY2guY3NzKCd3aWR0aCcsIHdpZHRoKTtcbiAgfTtcblxuICByZXR1cm4gU2VhcmNoO1xufSk7XG5cblMyLmRlZmluZSgnc2VsZWN0Mi9zZWxlY3Rpb24vZXZlbnRSZWxheScsW1xuICAnanF1ZXJ5J1xuXSwgZnVuY3Rpb24gKCQpIHtcbiAgZnVuY3Rpb24gRXZlbnRSZWxheSAoKSB7IH1cblxuICBFdmVudFJlbGF5LnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKGRlY29yYXRlZCwgY29udGFpbmVyLCAkY29udGFpbmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByZWxheUV2ZW50cyA9IFtcbiAgICAgICdvcGVuJywgJ29wZW5pbmcnLFxuICAgICAgJ2Nsb3NlJywgJ2Nsb3NpbmcnLFxuICAgICAgJ3NlbGVjdCcsICdzZWxlY3RpbmcnLFxuICAgICAgJ3Vuc2VsZWN0JywgJ3Vuc2VsZWN0aW5nJ1xuICAgIF07XG5cbiAgICB2YXIgcHJldmVudGFibGVFdmVudHMgPSBbJ29wZW5pbmcnLCAnY2xvc2luZycsICdzZWxlY3RpbmcnLCAndW5zZWxlY3RpbmcnXTtcblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsIGNvbnRhaW5lciwgJGNvbnRhaW5lcik7XG5cbiAgICBjb250YWluZXIub24oJyonLCBmdW5jdGlvbiAobmFtZSwgcGFyYW1zKSB7XG4gICAgICAvLyBJZ25vcmUgZXZlbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSByZWxheWVkXG4gICAgICBpZiAoJC5pbkFycmF5KG5hbWUsIHJlbGF5RXZlbnRzKSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcGFyYW1ldGVycyBzaG91bGQgYWx3YXlzIGJlIGFuIG9iamVjdFxuICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG4gICAgICAvLyBHZW5lcmF0ZSB0aGUgalF1ZXJ5IGV2ZW50IGZvciB0aGUgU2VsZWN0MiBldmVudFxuICAgICAgdmFyIGV2dCA9ICQuRXZlbnQoJ3NlbGVjdDI6JyArIG5hbWUsIHtcbiAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgIH0pO1xuXG4gICAgICBzZWxmLiRlbGVtZW50LnRyaWdnZXIoZXZ0KTtcblxuICAgICAgLy8gT25seSBoYW5kbGUgcHJldmVudGFibGUgZXZlbnRzIGlmIGl0IHdhcyBvbmVcbiAgICAgIGlmICgkLmluQXJyYXkobmFtZSwgcHJldmVudGFibGVFdmVudHMpID09PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmFtcy5wcmV2ZW50ZWQgPSBldnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEV2ZW50UmVsYXk7XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL3RyYW5zbGF0aW9uJyxbXG4gICdqcXVlcnknLFxuICAncmVxdWlyZSdcbl0sIGZ1bmN0aW9uICgkLCByZXF1aXJlKSB7XG4gIGZ1bmN0aW9uIFRyYW5zbGF0aW9uIChkaWN0KSB7XG4gICAgdGhpcy5kaWN0ID0gZGljdCB8fCB7fTtcbiAgfVxuXG4gIFRyYW5zbGF0aW9uLnByb3RvdHlwZS5hbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGljdDtcbiAgfTtcblxuICBUcmFuc2xhdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiB0aGlzLmRpY3Rba2V5XTtcbiAgfTtcblxuICBUcmFuc2xhdGlvbi5wcm90b3R5cGUuZXh0ZW5kID0gZnVuY3Rpb24gKHRyYW5zbGF0aW9uKSB7XG4gICAgdGhpcy5kaWN0ID0gJC5leHRlbmQoe30sIHRyYW5zbGF0aW9uLmFsbCgpLCB0aGlzLmRpY3QpO1xuICB9O1xuXG4gIC8vIFN0YXRpYyBmdW5jdGlvbnNcblxuICBUcmFuc2xhdGlvbi5fY2FjaGUgPSB7fTtcblxuICBUcmFuc2xhdGlvbi5sb2FkUGF0aCA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgaWYgKCEocGF0aCBpbiBUcmFuc2xhdGlvbi5fY2FjaGUpKSB7XG4gICAgICB2YXIgdHJhbnNsYXRpb25zID0gcmVxdWlyZShwYXRoKTtcblxuICAgICAgVHJhbnNsYXRpb24uX2NhY2hlW3BhdGhdID0gdHJhbnNsYXRpb25zO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVHJhbnNsYXRpb24oVHJhbnNsYXRpb24uX2NhY2hlW3BhdGhdKTtcbiAgfTtcblxuICByZXR1cm4gVHJhbnNsYXRpb247XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL2RpYWNyaXRpY3MnLFtcblxuXSwgZnVuY3Rpb24gKCkge1xuICB2YXIgZGlhY3JpdGljcyA9IHtcbiAgICAnXFx1MjRCNic6ICdBJyxcbiAgICAnXFx1RkYyMSc6ICdBJyxcbiAgICAnXFx1MDBDMCc6ICdBJyxcbiAgICAnXFx1MDBDMSc6ICdBJyxcbiAgICAnXFx1MDBDMic6ICdBJyxcbiAgICAnXFx1MUVBNic6ICdBJyxcbiAgICAnXFx1MUVBNCc6ICdBJyxcbiAgICAnXFx1MUVBQSc6ICdBJyxcbiAgICAnXFx1MUVBOCc6ICdBJyxcbiAgICAnXFx1MDBDMyc6ICdBJyxcbiAgICAnXFx1MDEwMCc6ICdBJyxcbiAgICAnXFx1MDEwMic6ICdBJyxcbiAgICAnXFx1MUVCMCc6ICdBJyxcbiAgICAnXFx1MUVBRSc6ICdBJyxcbiAgICAnXFx1MUVCNCc6ICdBJyxcbiAgICAnXFx1MUVCMic6ICdBJyxcbiAgICAnXFx1MDIyNic6ICdBJyxcbiAgICAnXFx1MDFFMCc6ICdBJyxcbiAgICAnXFx1MDBDNCc6ICdBJyxcbiAgICAnXFx1MDFERSc6ICdBJyxcbiAgICAnXFx1MUVBMic6ICdBJyxcbiAgICAnXFx1MDBDNSc6ICdBJyxcbiAgICAnXFx1MDFGQSc6ICdBJyxcbiAgICAnXFx1MDFDRCc6ICdBJyxcbiAgICAnXFx1MDIwMCc6ICdBJyxcbiAgICAnXFx1MDIwMic6ICdBJyxcbiAgICAnXFx1MUVBMCc6ICdBJyxcbiAgICAnXFx1MUVBQyc6ICdBJyxcbiAgICAnXFx1MUVCNic6ICdBJyxcbiAgICAnXFx1MUUwMCc6ICdBJyxcbiAgICAnXFx1MDEwNCc6ICdBJyxcbiAgICAnXFx1MDIzQSc6ICdBJyxcbiAgICAnXFx1MkM2Ric6ICdBJyxcbiAgICAnXFx1QTczMic6ICdBQScsXG4gICAgJ1xcdTAwQzYnOiAnQUUnLFxuICAgICdcXHUwMUZDJzogJ0FFJyxcbiAgICAnXFx1MDFFMic6ICdBRScsXG4gICAgJ1xcdUE3MzQnOiAnQU8nLFxuICAgICdcXHVBNzM2JzogJ0FVJyxcbiAgICAnXFx1QTczOCc6ICdBVicsXG4gICAgJ1xcdUE3M0EnOiAnQVYnLFxuICAgICdcXHVBNzNDJzogJ0FZJyxcbiAgICAnXFx1MjRCNyc6ICdCJyxcbiAgICAnXFx1RkYyMic6ICdCJyxcbiAgICAnXFx1MUUwMic6ICdCJyxcbiAgICAnXFx1MUUwNCc6ICdCJyxcbiAgICAnXFx1MUUwNic6ICdCJyxcbiAgICAnXFx1MDI0Myc6ICdCJyxcbiAgICAnXFx1MDE4Mic6ICdCJyxcbiAgICAnXFx1MDE4MSc6ICdCJyxcbiAgICAnXFx1MjRCOCc6ICdDJyxcbiAgICAnXFx1RkYyMyc6ICdDJyxcbiAgICAnXFx1MDEwNic6ICdDJyxcbiAgICAnXFx1MDEwOCc6ICdDJyxcbiAgICAnXFx1MDEwQSc6ICdDJyxcbiAgICAnXFx1MDEwQyc6ICdDJyxcbiAgICAnXFx1MDBDNyc6ICdDJyxcbiAgICAnXFx1MUUwOCc6ICdDJyxcbiAgICAnXFx1MDE4Nyc6ICdDJyxcbiAgICAnXFx1MDIzQic6ICdDJyxcbiAgICAnXFx1QTczRSc6ICdDJyxcbiAgICAnXFx1MjRCOSc6ICdEJyxcbiAgICAnXFx1RkYyNCc6ICdEJyxcbiAgICAnXFx1MUUwQSc6ICdEJyxcbiAgICAnXFx1MDEwRSc6ICdEJyxcbiAgICAnXFx1MUUwQyc6ICdEJyxcbiAgICAnXFx1MUUxMCc6ICdEJyxcbiAgICAnXFx1MUUxMic6ICdEJyxcbiAgICAnXFx1MUUwRSc6ICdEJyxcbiAgICAnXFx1MDExMCc6ICdEJyxcbiAgICAnXFx1MDE4Qic6ICdEJyxcbiAgICAnXFx1MDE4QSc6ICdEJyxcbiAgICAnXFx1MDE4OSc6ICdEJyxcbiAgICAnXFx1QTc3OSc6ICdEJyxcbiAgICAnXFx1MDFGMSc6ICdEWicsXG4gICAgJ1xcdTAxQzQnOiAnRFonLFxuICAgICdcXHUwMUYyJzogJ0R6JyxcbiAgICAnXFx1MDFDNSc6ICdEeicsXG4gICAgJ1xcdTI0QkEnOiAnRScsXG4gICAgJ1xcdUZGMjUnOiAnRScsXG4gICAgJ1xcdTAwQzgnOiAnRScsXG4gICAgJ1xcdTAwQzknOiAnRScsXG4gICAgJ1xcdTAwQ0EnOiAnRScsXG4gICAgJ1xcdTFFQzAnOiAnRScsXG4gICAgJ1xcdTFFQkUnOiAnRScsXG4gICAgJ1xcdTFFQzQnOiAnRScsXG4gICAgJ1xcdTFFQzInOiAnRScsXG4gICAgJ1xcdTFFQkMnOiAnRScsXG4gICAgJ1xcdTAxMTInOiAnRScsXG4gICAgJ1xcdTFFMTQnOiAnRScsXG4gICAgJ1xcdTFFMTYnOiAnRScsXG4gICAgJ1xcdTAxMTQnOiAnRScsXG4gICAgJ1xcdTAxMTYnOiAnRScsXG4gICAgJ1xcdTAwQ0InOiAnRScsXG4gICAgJ1xcdTFFQkEnOiAnRScsXG4gICAgJ1xcdTAxMUEnOiAnRScsXG4gICAgJ1xcdTAyMDQnOiAnRScsXG4gICAgJ1xcdTAyMDYnOiAnRScsXG4gICAgJ1xcdTFFQjgnOiAnRScsXG4gICAgJ1xcdTFFQzYnOiAnRScsXG4gICAgJ1xcdTAyMjgnOiAnRScsXG4gICAgJ1xcdTFFMUMnOiAnRScsXG4gICAgJ1xcdTAxMTgnOiAnRScsXG4gICAgJ1xcdTFFMTgnOiAnRScsXG4gICAgJ1xcdTFFMUEnOiAnRScsXG4gICAgJ1xcdTAxOTAnOiAnRScsXG4gICAgJ1xcdTAxOEUnOiAnRScsXG4gICAgJ1xcdTI0QkInOiAnRicsXG4gICAgJ1xcdUZGMjYnOiAnRicsXG4gICAgJ1xcdTFFMUUnOiAnRicsXG4gICAgJ1xcdTAxOTEnOiAnRicsXG4gICAgJ1xcdUE3N0InOiAnRicsXG4gICAgJ1xcdTI0QkMnOiAnRycsXG4gICAgJ1xcdUZGMjcnOiAnRycsXG4gICAgJ1xcdTAxRjQnOiAnRycsXG4gICAgJ1xcdTAxMUMnOiAnRycsXG4gICAgJ1xcdTFFMjAnOiAnRycsXG4gICAgJ1xcdTAxMUUnOiAnRycsXG4gICAgJ1xcdTAxMjAnOiAnRycsXG4gICAgJ1xcdTAxRTYnOiAnRycsXG4gICAgJ1xcdTAxMjInOiAnRycsXG4gICAgJ1xcdTAxRTQnOiAnRycsXG4gICAgJ1xcdTAxOTMnOiAnRycsXG4gICAgJ1xcdUE3QTAnOiAnRycsXG4gICAgJ1xcdUE3N0QnOiAnRycsXG4gICAgJ1xcdUE3N0UnOiAnRycsXG4gICAgJ1xcdTI0QkQnOiAnSCcsXG4gICAgJ1xcdUZGMjgnOiAnSCcsXG4gICAgJ1xcdTAxMjQnOiAnSCcsXG4gICAgJ1xcdTFFMjInOiAnSCcsXG4gICAgJ1xcdTFFMjYnOiAnSCcsXG4gICAgJ1xcdTAyMUUnOiAnSCcsXG4gICAgJ1xcdTFFMjQnOiAnSCcsXG4gICAgJ1xcdTFFMjgnOiAnSCcsXG4gICAgJ1xcdTFFMkEnOiAnSCcsXG4gICAgJ1xcdTAxMjYnOiAnSCcsXG4gICAgJ1xcdTJDNjcnOiAnSCcsXG4gICAgJ1xcdTJDNzUnOiAnSCcsXG4gICAgJ1xcdUE3OEQnOiAnSCcsXG4gICAgJ1xcdTI0QkUnOiAnSScsXG4gICAgJ1xcdUZGMjknOiAnSScsXG4gICAgJ1xcdTAwQ0MnOiAnSScsXG4gICAgJ1xcdTAwQ0QnOiAnSScsXG4gICAgJ1xcdTAwQ0UnOiAnSScsXG4gICAgJ1xcdTAxMjgnOiAnSScsXG4gICAgJ1xcdTAxMkEnOiAnSScsXG4gICAgJ1xcdTAxMkMnOiAnSScsXG4gICAgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAwQ0YnOiAnSScsXG4gICAgJ1xcdTFFMkUnOiAnSScsXG4gICAgJ1xcdTFFQzgnOiAnSScsXG4gICAgJ1xcdTAxQ0YnOiAnSScsXG4gICAgJ1xcdTAyMDgnOiAnSScsXG4gICAgJ1xcdTAyMEEnOiAnSScsXG4gICAgJ1xcdTFFQ0EnOiAnSScsXG4gICAgJ1xcdTAxMkUnOiAnSScsXG4gICAgJ1xcdTFFMkMnOiAnSScsXG4gICAgJ1xcdTAxOTcnOiAnSScsXG4gICAgJ1xcdTI0QkYnOiAnSicsXG4gICAgJ1xcdUZGMkEnOiAnSicsXG4gICAgJ1xcdTAxMzQnOiAnSicsXG4gICAgJ1xcdTAyNDgnOiAnSicsXG4gICAgJ1xcdTI0QzAnOiAnSycsXG4gICAgJ1xcdUZGMkInOiAnSycsXG4gICAgJ1xcdTFFMzAnOiAnSycsXG4gICAgJ1xcdTAxRTgnOiAnSycsXG4gICAgJ1xcdTFFMzInOiAnSycsXG4gICAgJ1xcdTAxMzYnOiAnSycsXG4gICAgJ1xcdTFFMzQnOiAnSycsXG4gICAgJ1xcdTAxOTgnOiAnSycsXG4gICAgJ1xcdTJDNjknOiAnSycsXG4gICAgJ1xcdUE3NDAnOiAnSycsXG4gICAgJ1xcdUE3NDInOiAnSycsXG4gICAgJ1xcdUE3NDQnOiAnSycsXG4gICAgJ1xcdUE3QTInOiAnSycsXG4gICAgJ1xcdTI0QzEnOiAnTCcsXG4gICAgJ1xcdUZGMkMnOiAnTCcsXG4gICAgJ1xcdTAxM0YnOiAnTCcsXG4gICAgJ1xcdTAxMzknOiAnTCcsXG4gICAgJ1xcdTAxM0QnOiAnTCcsXG4gICAgJ1xcdTFFMzYnOiAnTCcsXG4gICAgJ1xcdTFFMzgnOiAnTCcsXG4gICAgJ1xcdTAxM0InOiAnTCcsXG4gICAgJ1xcdTFFM0MnOiAnTCcsXG4gICAgJ1xcdTFFM0EnOiAnTCcsXG4gICAgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAyM0QnOiAnTCcsXG4gICAgJ1xcdTJDNjInOiAnTCcsXG4gICAgJ1xcdTJDNjAnOiAnTCcsXG4gICAgJ1xcdUE3NDgnOiAnTCcsXG4gICAgJ1xcdUE3NDYnOiAnTCcsXG4gICAgJ1xcdUE3ODAnOiAnTCcsXG4gICAgJ1xcdTAxQzcnOiAnTEonLFxuICAgICdcXHUwMUM4JzogJ0xqJyxcbiAgICAnXFx1MjRDMic6ICdNJyxcbiAgICAnXFx1RkYyRCc6ICdNJyxcbiAgICAnXFx1MUUzRSc6ICdNJyxcbiAgICAnXFx1MUU0MCc6ICdNJyxcbiAgICAnXFx1MUU0Mic6ICdNJyxcbiAgICAnXFx1MkM2RSc6ICdNJyxcbiAgICAnXFx1MDE5Qyc6ICdNJyxcbiAgICAnXFx1MjRDMyc6ICdOJyxcbiAgICAnXFx1RkYyRSc6ICdOJyxcbiAgICAnXFx1MDFGOCc6ICdOJyxcbiAgICAnXFx1MDE0Myc6ICdOJyxcbiAgICAnXFx1MDBEMSc6ICdOJyxcbiAgICAnXFx1MUU0NCc6ICdOJyxcbiAgICAnXFx1MDE0Nyc6ICdOJyxcbiAgICAnXFx1MUU0Nic6ICdOJyxcbiAgICAnXFx1MDE0NSc6ICdOJyxcbiAgICAnXFx1MUU0QSc6ICdOJyxcbiAgICAnXFx1MUU0OCc6ICdOJyxcbiAgICAnXFx1MDIyMCc6ICdOJyxcbiAgICAnXFx1MDE5RCc6ICdOJyxcbiAgICAnXFx1QTc5MCc6ICdOJyxcbiAgICAnXFx1QTdBNCc6ICdOJyxcbiAgICAnXFx1MDFDQSc6ICdOSicsXG4gICAgJ1xcdTAxQ0InOiAnTmonLFxuICAgICdcXHUyNEM0JzogJ08nLFxuICAgICdcXHVGRjJGJzogJ08nLFxuICAgICdcXHUwMEQyJzogJ08nLFxuICAgICdcXHUwMEQzJzogJ08nLFxuICAgICdcXHUwMEQ0JzogJ08nLFxuICAgICdcXHUxRUQyJzogJ08nLFxuICAgICdcXHUxRUQwJzogJ08nLFxuICAgICdcXHUxRUQ2JzogJ08nLFxuICAgICdcXHUxRUQ0JzogJ08nLFxuICAgICdcXHUwMEQ1JzogJ08nLFxuICAgICdcXHUxRTRDJzogJ08nLFxuICAgICdcXHUwMjJDJzogJ08nLFxuICAgICdcXHUxRTRFJzogJ08nLFxuICAgICdcXHUwMTRDJzogJ08nLFxuICAgICdcXHUxRTUwJzogJ08nLFxuICAgICdcXHUxRTUyJzogJ08nLFxuICAgICdcXHUwMTRFJzogJ08nLFxuICAgICdcXHUwMjJFJzogJ08nLFxuICAgICdcXHUwMjMwJzogJ08nLFxuICAgICdcXHUwMEQ2JzogJ08nLFxuICAgICdcXHUwMjJBJzogJ08nLFxuICAgICdcXHUxRUNFJzogJ08nLFxuICAgICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMUQxJzogJ08nLFxuICAgICdcXHUwMjBDJzogJ08nLFxuICAgICdcXHUwMjBFJzogJ08nLFxuICAgICdcXHUwMUEwJzogJ08nLFxuICAgICdcXHUxRURDJzogJ08nLFxuICAgICdcXHUxRURBJzogJ08nLFxuICAgICdcXHUxRUUwJzogJ08nLFxuICAgICdcXHUxRURFJzogJ08nLFxuICAgICdcXHUxRUUyJzogJ08nLFxuICAgICdcXHUxRUNDJzogJ08nLFxuICAgICdcXHUxRUQ4JzogJ08nLFxuICAgICdcXHUwMUVBJzogJ08nLFxuICAgICdcXHUwMUVDJzogJ08nLFxuICAgICdcXHUwMEQ4JzogJ08nLFxuICAgICdcXHUwMUZFJzogJ08nLFxuICAgICdcXHUwMTg2JzogJ08nLFxuICAgICdcXHUwMTlGJzogJ08nLFxuICAgICdcXHVBNzRBJzogJ08nLFxuICAgICdcXHVBNzRDJzogJ08nLFxuICAgICdcXHUwMUEyJzogJ09JJyxcbiAgICAnXFx1QTc0RSc6ICdPTycsXG4gICAgJ1xcdTAyMjInOiAnT1UnLFxuICAgICdcXHUyNEM1JzogJ1AnLFxuICAgICdcXHVGRjMwJzogJ1AnLFxuICAgICdcXHUxRTU0JzogJ1AnLFxuICAgICdcXHUxRTU2JzogJ1AnLFxuICAgICdcXHUwMUE0JzogJ1AnLFxuICAgICdcXHUyQzYzJzogJ1AnLFxuICAgICdcXHVBNzUwJzogJ1AnLFxuICAgICdcXHVBNzUyJzogJ1AnLFxuICAgICdcXHVBNzU0JzogJ1AnLFxuICAgICdcXHUyNEM2JzogJ1EnLFxuICAgICdcXHVGRjMxJzogJ1EnLFxuICAgICdcXHVBNzU2JzogJ1EnLFxuICAgICdcXHVBNzU4JzogJ1EnLFxuICAgICdcXHUwMjRBJzogJ1EnLFxuICAgICdcXHUyNEM3JzogJ1InLFxuICAgICdcXHVGRjMyJzogJ1InLFxuICAgICdcXHUwMTU0JzogJ1InLFxuICAgICdcXHUxRTU4JzogJ1InLFxuICAgICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMjEwJzogJ1InLFxuICAgICdcXHUwMjEyJzogJ1InLFxuICAgICdcXHUxRTVBJzogJ1InLFxuICAgICdcXHUxRTVDJzogJ1InLFxuICAgICdcXHUwMTU2JzogJ1InLFxuICAgICdcXHUxRTVFJzogJ1InLFxuICAgICdcXHUwMjRDJzogJ1InLFxuICAgICdcXHUyQzY0JzogJ1InLFxuICAgICdcXHVBNzVBJzogJ1InLFxuICAgICdcXHVBN0E2JzogJ1InLFxuICAgICdcXHVBNzgyJzogJ1InLFxuICAgICdcXHUyNEM4JzogJ1MnLFxuICAgICdcXHVGRjMzJzogJ1MnLFxuICAgICdcXHUxRTlFJzogJ1MnLFxuICAgICdcXHUwMTVBJzogJ1MnLFxuICAgICdcXHUxRTY0JzogJ1MnLFxuICAgICdcXHUwMTVDJzogJ1MnLFxuICAgICdcXHUxRTYwJzogJ1MnLFxuICAgICdcXHUwMTYwJzogJ1MnLFxuICAgICdcXHUxRTY2JzogJ1MnLFxuICAgICdcXHUxRTYyJzogJ1MnLFxuICAgICdcXHUxRTY4JzogJ1MnLFxuICAgICdcXHUwMjE4JzogJ1MnLFxuICAgICdcXHUwMTVFJzogJ1MnLFxuICAgICdcXHUyQzdFJzogJ1MnLFxuICAgICdcXHVBN0E4JzogJ1MnLFxuICAgICdcXHVBNzg0JzogJ1MnLFxuICAgICdcXHUyNEM5JzogJ1QnLFxuICAgICdcXHVGRjM0JzogJ1QnLFxuICAgICdcXHUxRTZBJzogJ1QnLFxuICAgICdcXHUwMTY0JzogJ1QnLFxuICAgICdcXHUxRTZDJzogJ1QnLFxuICAgICdcXHUwMjFBJzogJ1QnLFxuICAgICdcXHUwMTYyJzogJ1QnLFxuICAgICdcXHUxRTcwJzogJ1QnLFxuICAgICdcXHUxRTZFJzogJ1QnLFxuICAgICdcXHUwMTY2JzogJ1QnLFxuICAgICdcXHUwMUFDJzogJ1QnLFxuICAgICdcXHUwMUFFJzogJ1QnLFxuICAgICdcXHUwMjNFJzogJ1QnLFxuICAgICdcXHVBNzg2JzogJ1QnLFxuICAgICdcXHVBNzI4JzogJ1RaJyxcbiAgICAnXFx1MjRDQSc6ICdVJyxcbiAgICAnXFx1RkYzNSc6ICdVJyxcbiAgICAnXFx1MDBEOSc6ICdVJyxcbiAgICAnXFx1MDBEQSc6ICdVJyxcbiAgICAnXFx1MDBEQic6ICdVJyxcbiAgICAnXFx1MDE2OCc6ICdVJyxcbiAgICAnXFx1MUU3OCc6ICdVJyxcbiAgICAnXFx1MDE2QSc6ICdVJyxcbiAgICAnXFx1MUU3QSc6ICdVJyxcbiAgICAnXFx1MDE2Qyc6ICdVJyxcbiAgICAnXFx1MDBEQyc6ICdVJyxcbiAgICAnXFx1MDFEQic6ICdVJyxcbiAgICAnXFx1MDFENyc6ICdVJyxcbiAgICAnXFx1MDFENSc6ICdVJyxcbiAgICAnXFx1MDFEOSc6ICdVJyxcbiAgICAnXFx1MUVFNic6ICdVJyxcbiAgICAnXFx1MDE2RSc6ICdVJyxcbiAgICAnXFx1MDE3MCc6ICdVJyxcbiAgICAnXFx1MDFEMyc6ICdVJyxcbiAgICAnXFx1MDIxNCc6ICdVJyxcbiAgICAnXFx1MDIxNic6ICdVJyxcbiAgICAnXFx1MDFBRic6ICdVJyxcbiAgICAnXFx1MUVFQSc6ICdVJyxcbiAgICAnXFx1MUVFOCc6ICdVJyxcbiAgICAnXFx1MUVFRSc6ICdVJyxcbiAgICAnXFx1MUVFQyc6ICdVJyxcbiAgICAnXFx1MUVGMCc6ICdVJyxcbiAgICAnXFx1MUVFNCc6ICdVJyxcbiAgICAnXFx1MUU3Mic6ICdVJyxcbiAgICAnXFx1MDE3Mic6ICdVJyxcbiAgICAnXFx1MUU3Nic6ICdVJyxcbiAgICAnXFx1MUU3NCc6ICdVJyxcbiAgICAnXFx1MDI0NCc6ICdVJyxcbiAgICAnXFx1MjRDQic6ICdWJyxcbiAgICAnXFx1RkYzNic6ICdWJyxcbiAgICAnXFx1MUU3Qyc6ICdWJyxcbiAgICAnXFx1MUU3RSc6ICdWJyxcbiAgICAnXFx1MDFCMic6ICdWJyxcbiAgICAnXFx1QTc1RSc6ICdWJyxcbiAgICAnXFx1MDI0NSc6ICdWJyxcbiAgICAnXFx1QTc2MCc6ICdWWScsXG4gICAgJ1xcdTI0Q0MnOiAnVycsXG4gICAgJ1xcdUZGMzcnOiAnVycsXG4gICAgJ1xcdTFFODAnOiAnVycsXG4gICAgJ1xcdTFFODInOiAnVycsXG4gICAgJ1xcdTAxNzQnOiAnVycsXG4gICAgJ1xcdTFFODYnOiAnVycsXG4gICAgJ1xcdTFFODQnOiAnVycsXG4gICAgJ1xcdTFFODgnOiAnVycsXG4gICAgJ1xcdTJDNzInOiAnVycsXG4gICAgJ1xcdTI0Q0QnOiAnWCcsXG4gICAgJ1xcdUZGMzgnOiAnWCcsXG4gICAgJ1xcdTFFOEEnOiAnWCcsXG4gICAgJ1xcdTFFOEMnOiAnWCcsXG4gICAgJ1xcdTI0Q0UnOiAnWScsXG4gICAgJ1xcdUZGMzknOiAnWScsXG4gICAgJ1xcdTFFRjInOiAnWScsXG4gICAgJ1xcdTAwREQnOiAnWScsXG4gICAgJ1xcdTAxNzYnOiAnWScsXG4gICAgJ1xcdTFFRjgnOiAnWScsXG4gICAgJ1xcdTAyMzInOiAnWScsXG4gICAgJ1xcdTFFOEUnOiAnWScsXG4gICAgJ1xcdTAxNzgnOiAnWScsXG4gICAgJ1xcdTFFRjYnOiAnWScsXG4gICAgJ1xcdTFFRjQnOiAnWScsXG4gICAgJ1xcdTAxQjMnOiAnWScsXG4gICAgJ1xcdTAyNEUnOiAnWScsXG4gICAgJ1xcdTFFRkUnOiAnWScsXG4gICAgJ1xcdTI0Q0YnOiAnWicsXG4gICAgJ1xcdUZGM0EnOiAnWicsXG4gICAgJ1xcdTAxNzknOiAnWicsXG4gICAgJ1xcdTFFOTAnOiAnWicsXG4gICAgJ1xcdTAxN0InOiAnWicsXG4gICAgJ1xcdTAxN0QnOiAnWicsXG4gICAgJ1xcdTFFOTInOiAnWicsXG4gICAgJ1xcdTFFOTQnOiAnWicsXG4gICAgJ1xcdTAxQjUnOiAnWicsXG4gICAgJ1xcdTAyMjQnOiAnWicsXG4gICAgJ1xcdTJDN0YnOiAnWicsXG4gICAgJ1xcdTJDNkInOiAnWicsXG4gICAgJ1xcdUE3NjInOiAnWicsXG4gICAgJ1xcdTI0RDAnOiAnYScsXG4gICAgJ1xcdUZGNDEnOiAnYScsXG4gICAgJ1xcdTFFOUEnOiAnYScsXG4gICAgJ1xcdTAwRTAnOiAnYScsXG4gICAgJ1xcdTAwRTEnOiAnYScsXG4gICAgJ1xcdTAwRTInOiAnYScsXG4gICAgJ1xcdTFFQTcnOiAnYScsXG4gICAgJ1xcdTFFQTUnOiAnYScsXG4gICAgJ1xcdTFFQUInOiAnYScsXG4gICAgJ1xcdTFFQTknOiAnYScsXG4gICAgJ1xcdTAwRTMnOiAnYScsXG4gICAgJ1xcdTAxMDEnOiAnYScsXG4gICAgJ1xcdTAxMDMnOiAnYScsXG4gICAgJ1xcdTFFQjEnOiAnYScsXG4gICAgJ1xcdTFFQUYnOiAnYScsXG4gICAgJ1xcdTFFQjUnOiAnYScsXG4gICAgJ1xcdTFFQjMnOiAnYScsXG4gICAgJ1xcdTAyMjcnOiAnYScsXG4gICAgJ1xcdTAxRTEnOiAnYScsXG4gICAgJ1xcdTAwRTQnOiAnYScsXG4gICAgJ1xcdTAxREYnOiAnYScsXG4gICAgJ1xcdTFFQTMnOiAnYScsXG4gICAgJ1xcdTAwRTUnOiAnYScsXG4gICAgJ1xcdTAxRkInOiAnYScsXG4gICAgJ1xcdTAxQ0UnOiAnYScsXG4gICAgJ1xcdTAyMDEnOiAnYScsXG4gICAgJ1xcdTAyMDMnOiAnYScsXG4gICAgJ1xcdTFFQTEnOiAnYScsXG4gICAgJ1xcdTFFQUQnOiAnYScsXG4gICAgJ1xcdTFFQjcnOiAnYScsXG4gICAgJ1xcdTFFMDEnOiAnYScsXG4gICAgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTJDNjUnOiAnYScsXG4gICAgJ1xcdTAyNTAnOiAnYScsXG4gICAgJ1xcdUE3MzMnOiAnYWEnLFxuICAgICdcXHUwMEU2JzogJ2FlJyxcbiAgICAnXFx1MDFGRCc6ICdhZScsXG4gICAgJ1xcdTAxRTMnOiAnYWUnLFxuICAgICdcXHVBNzM1JzogJ2FvJyxcbiAgICAnXFx1QTczNyc6ICdhdScsXG4gICAgJ1xcdUE3MzknOiAnYXYnLFxuICAgICdcXHVBNzNCJzogJ2F2JyxcbiAgICAnXFx1QTczRCc6ICdheScsXG4gICAgJ1xcdTI0RDEnOiAnYicsXG4gICAgJ1xcdUZGNDInOiAnYicsXG4gICAgJ1xcdTFFMDMnOiAnYicsXG4gICAgJ1xcdTFFMDUnOiAnYicsXG4gICAgJ1xcdTFFMDcnOiAnYicsXG4gICAgJ1xcdTAxODAnOiAnYicsXG4gICAgJ1xcdTAxODMnOiAnYicsXG4gICAgJ1xcdTAyNTMnOiAnYicsXG4gICAgJ1xcdTI0RDInOiAnYycsXG4gICAgJ1xcdUZGNDMnOiAnYycsXG4gICAgJ1xcdTAxMDcnOiAnYycsXG4gICAgJ1xcdTAxMDknOiAnYycsXG4gICAgJ1xcdTAxMEInOiAnYycsXG4gICAgJ1xcdTAxMEQnOiAnYycsXG4gICAgJ1xcdTAwRTcnOiAnYycsXG4gICAgJ1xcdTFFMDknOiAnYycsXG4gICAgJ1xcdTAxODgnOiAnYycsXG4gICAgJ1xcdTAyM0MnOiAnYycsXG4gICAgJ1xcdUE3M0YnOiAnYycsXG4gICAgJ1xcdTIxODQnOiAnYycsXG4gICAgJ1xcdTI0RDMnOiAnZCcsXG4gICAgJ1xcdUZGNDQnOiAnZCcsXG4gICAgJ1xcdTFFMEInOiAnZCcsXG4gICAgJ1xcdTAxMEYnOiAnZCcsXG4gICAgJ1xcdTFFMEQnOiAnZCcsXG4gICAgJ1xcdTFFMTEnOiAnZCcsXG4gICAgJ1xcdTFFMTMnOiAnZCcsXG4gICAgJ1xcdTFFMEYnOiAnZCcsXG4gICAgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxOEMnOiAnZCcsXG4gICAgJ1xcdTAyNTYnOiAnZCcsXG4gICAgJ1xcdTAyNTcnOiAnZCcsXG4gICAgJ1xcdUE3N0EnOiAnZCcsXG4gICAgJ1xcdTAxRjMnOiAnZHonLFxuICAgICdcXHUwMUM2JzogJ2R6JyxcbiAgICAnXFx1MjRENCc6ICdlJyxcbiAgICAnXFx1RkY0NSc6ICdlJyxcbiAgICAnXFx1MDBFOCc6ICdlJyxcbiAgICAnXFx1MDBFOSc6ICdlJyxcbiAgICAnXFx1MDBFQSc6ICdlJyxcbiAgICAnXFx1MUVDMSc6ICdlJyxcbiAgICAnXFx1MUVCRic6ICdlJyxcbiAgICAnXFx1MUVDNSc6ICdlJyxcbiAgICAnXFx1MUVDMyc6ICdlJyxcbiAgICAnXFx1MUVCRCc6ICdlJyxcbiAgICAnXFx1MDExMyc6ICdlJyxcbiAgICAnXFx1MUUxNSc6ICdlJyxcbiAgICAnXFx1MUUxNyc6ICdlJyxcbiAgICAnXFx1MDExNSc6ICdlJyxcbiAgICAnXFx1MDExNyc6ICdlJyxcbiAgICAnXFx1MDBFQic6ICdlJyxcbiAgICAnXFx1MUVCQic6ICdlJyxcbiAgICAnXFx1MDExQic6ICdlJyxcbiAgICAnXFx1MDIwNSc6ICdlJyxcbiAgICAnXFx1MDIwNyc6ICdlJyxcbiAgICAnXFx1MUVCOSc6ICdlJyxcbiAgICAnXFx1MUVDNyc6ICdlJyxcbiAgICAnXFx1MDIyOSc6ICdlJyxcbiAgICAnXFx1MUUxRCc6ICdlJyxcbiAgICAnXFx1MDExOSc6ICdlJyxcbiAgICAnXFx1MUUxOSc6ICdlJyxcbiAgICAnXFx1MUUxQic6ICdlJyxcbiAgICAnXFx1MDI0Nyc6ICdlJyxcbiAgICAnXFx1MDI1Qic6ICdlJyxcbiAgICAnXFx1MDFERCc6ICdlJyxcbiAgICAnXFx1MjRENSc6ICdmJyxcbiAgICAnXFx1RkY0Nic6ICdmJyxcbiAgICAnXFx1MUUxRic6ICdmJyxcbiAgICAnXFx1MDE5Mic6ICdmJyxcbiAgICAnXFx1QTc3Qyc6ICdmJyxcbiAgICAnXFx1MjRENic6ICdnJyxcbiAgICAnXFx1RkY0Nyc6ICdnJyxcbiAgICAnXFx1MDFGNSc6ICdnJyxcbiAgICAnXFx1MDExRCc6ICdnJyxcbiAgICAnXFx1MUUyMSc6ICdnJyxcbiAgICAnXFx1MDExRic6ICdnJyxcbiAgICAnXFx1MDEyMSc6ICdnJyxcbiAgICAnXFx1MDFFNyc6ICdnJyxcbiAgICAnXFx1MDEyMyc6ICdnJyxcbiAgICAnXFx1MDFFNSc6ICdnJyxcbiAgICAnXFx1MDI2MCc6ICdnJyxcbiAgICAnXFx1QTdBMSc6ICdnJyxcbiAgICAnXFx1MUQ3OSc6ICdnJyxcbiAgICAnXFx1QTc3Ric6ICdnJyxcbiAgICAnXFx1MjRENyc6ICdoJyxcbiAgICAnXFx1RkY0OCc6ICdoJyxcbiAgICAnXFx1MDEyNSc6ICdoJyxcbiAgICAnXFx1MUUyMyc6ICdoJyxcbiAgICAnXFx1MUUyNyc6ICdoJyxcbiAgICAnXFx1MDIxRic6ICdoJyxcbiAgICAnXFx1MUUyNSc6ICdoJyxcbiAgICAnXFx1MUUyOSc6ICdoJyxcbiAgICAnXFx1MUUyQic6ICdoJyxcbiAgICAnXFx1MUU5Nic6ICdoJyxcbiAgICAnXFx1MDEyNyc6ICdoJyxcbiAgICAnXFx1MkM2OCc6ICdoJyxcbiAgICAnXFx1MkM3Nic6ICdoJyxcbiAgICAnXFx1MDI2NSc6ICdoJyxcbiAgICAnXFx1MDE5NSc6ICdodicsXG4gICAgJ1xcdTI0RDgnOiAnaScsXG4gICAgJ1xcdUZGNDknOiAnaScsXG4gICAgJ1xcdTAwRUMnOiAnaScsXG4gICAgJ1xcdTAwRUQnOiAnaScsXG4gICAgJ1xcdTAwRUUnOiAnaScsXG4gICAgJ1xcdTAxMjknOiAnaScsXG4gICAgJ1xcdTAxMkInOiAnaScsXG4gICAgJ1xcdTAxMkQnOiAnaScsXG4gICAgJ1xcdTAwRUYnOiAnaScsXG4gICAgJ1xcdTFFMkYnOiAnaScsXG4gICAgJ1xcdTFFQzknOiAnaScsXG4gICAgJ1xcdTAxRDAnOiAnaScsXG4gICAgJ1xcdTAyMDknOiAnaScsXG4gICAgJ1xcdTAyMEInOiAnaScsXG4gICAgJ1xcdTFFQ0InOiAnaScsXG4gICAgJ1xcdTAxMkYnOiAnaScsXG4gICAgJ1xcdTFFMkQnOiAnaScsXG4gICAgJ1xcdTAyNjgnOiAnaScsXG4gICAgJ1xcdTAxMzEnOiAnaScsXG4gICAgJ1xcdTI0RDknOiAnaicsXG4gICAgJ1xcdUZGNEEnOiAnaicsXG4gICAgJ1xcdTAxMzUnOiAnaicsXG4gICAgJ1xcdTAxRjAnOiAnaicsXG4gICAgJ1xcdTAyNDknOiAnaicsXG4gICAgJ1xcdTI0REEnOiAnaycsXG4gICAgJ1xcdUZGNEInOiAnaycsXG4gICAgJ1xcdTFFMzEnOiAnaycsXG4gICAgJ1xcdTAxRTknOiAnaycsXG4gICAgJ1xcdTFFMzMnOiAnaycsXG4gICAgJ1xcdTAxMzcnOiAnaycsXG4gICAgJ1xcdTFFMzUnOiAnaycsXG4gICAgJ1xcdTAxOTknOiAnaycsXG4gICAgJ1xcdTJDNkEnOiAnaycsXG4gICAgJ1xcdUE3NDEnOiAnaycsXG4gICAgJ1xcdUE3NDMnOiAnaycsXG4gICAgJ1xcdUE3NDUnOiAnaycsXG4gICAgJ1xcdUE3QTMnOiAnaycsXG4gICAgJ1xcdTI0REInOiAnbCcsXG4gICAgJ1xcdUZGNEMnOiAnbCcsXG4gICAgJ1xcdTAxNDAnOiAnbCcsXG4gICAgJ1xcdTAxM0EnOiAnbCcsXG4gICAgJ1xcdTAxM0UnOiAnbCcsXG4gICAgJ1xcdTFFMzcnOiAnbCcsXG4gICAgJ1xcdTFFMzknOiAnbCcsXG4gICAgJ1xcdTAxM0MnOiAnbCcsXG4gICAgJ1xcdTFFM0QnOiAnbCcsXG4gICAgJ1xcdTFFM0InOiAnbCcsXG4gICAgJ1xcdTAxN0YnOiAnbCcsXG4gICAgJ1xcdTAxNDInOiAnbCcsXG4gICAgJ1xcdTAxOUEnOiAnbCcsXG4gICAgJ1xcdTAyNkInOiAnbCcsXG4gICAgJ1xcdTJDNjEnOiAnbCcsXG4gICAgJ1xcdUE3NDknOiAnbCcsXG4gICAgJ1xcdUE3ODEnOiAnbCcsXG4gICAgJ1xcdUE3NDcnOiAnbCcsXG4gICAgJ1xcdTAxQzknOiAnbGonLFxuICAgICdcXHUyNERDJzogJ20nLFxuICAgICdcXHVGRjREJzogJ20nLFxuICAgICdcXHUxRTNGJzogJ20nLFxuICAgICdcXHUxRTQxJzogJ20nLFxuICAgICdcXHUxRTQzJzogJ20nLFxuICAgICdcXHUwMjcxJzogJ20nLFxuICAgICdcXHUwMjZGJzogJ20nLFxuICAgICdcXHUyNEREJzogJ24nLFxuICAgICdcXHVGRjRFJzogJ24nLFxuICAgICdcXHUwMUY5JzogJ24nLFxuICAgICdcXHUwMTQ0JzogJ24nLFxuICAgICdcXHUwMEYxJzogJ24nLFxuICAgICdcXHUxRTQ1JzogJ24nLFxuICAgICdcXHUwMTQ4JzogJ24nLFxuICAgICdcXHUxRTQ3JzogJ24nLFxuICAgICdcXHUwMTQ2JzogJ24nLFxuICAgICdcXHUxRTRCJzogJ24nLFxuICAgICdcXHUxRTQ5JzogJ24nLFxuICAgICdcXHUwMTlFJzogJ24nLFxuICAgICdcXHUwMjcyJzogJ24nLFxuICAgICdcXHUwMTQ5JzogJ24nLFxuICAgICdcXHVBNzkxJzogJ24nLFxuICAgICdcXHVBN0E1JzogJ24nLFxuICAgICdcXHUwMUNDJzogJ25qJyxcbiAgICAnXFx1MjRERSc6ICdvJyxcbiAgICAnXFx1RkY0Ric6ICdvJyxcbiAgICAnXFx1MDBGMic6ICdvJyxcbiAgICAnXFx1MDBGMyc6ICdvJyxcbiAgICAnXFx1MDBGNCc6ICdvJyxcbiAgICAnXFx1MUVEMyc6ICdvJyxcbiAgICAnXFx1MUVEMSc6ICdvJyxcbiAgICAnXFx1MUVENyc6ICdvJyxcbiAgICAnXFx1MUVENSc6ICdvJyxcbiAgICAnXFx1MDBGNSc6ICdvJyxcbiAgICAnXFx1MUU0RCc6ICdvJyxcbiAgICAnXFx1MDIyRCc6ICdvJyxcbiAgICAnXFx1MUU0Ric6ICdvJyxcbiAgICAnXFx1MDE0RCc6ICdvJyxcbiAgICAnXFx1MUU1MSc6ICdvJyxcbiAgICAnXFx1MUU1Myc6ICdvJyxcbiAgICAnXFx1MDE0Ric6ICdvJyxcbiAgICAnXFx1MDIyRic6ICdvJyxcbiAgICAnXFx1MDIzMSc6ICdvJyxcbiAgICAnXFx1MDBGNic6ICdvJyxcbiAgICAnXFx1MDIyQic6ICdvJyxcbiAgICAnXFx1MUVDRic6ICdvJyxcbiAgICAnXFx1MDE1MSc6ICdvJyxcbiAgICAnXFx1MDFEMic6ICdvJyxcbiAgICAnXFx1MDIwRCc6ICdvJyxcbiAgICAnXFx1MDIwRic6ICdvJyxcbiAgICAnXFx1MDFBMSc6ICdvJyxcbiAgICAnXFx1MUVERCc6ICdvJyxcbiAgICAnXFx1MUVEQic6ICdvJyxcbiAgICAnXFx1MUVFMSc6ICdvJyxcbiAgICAnXFx1MUVERic6ICdvJyxcbiAgICAnXFx1MUVFMyc6ICdvJyxcbiAgICAnXFx1MUVDRCc6ICdvJyxcbiAgICAnXFx1MUVEOSc6ICdvJyxcbiAgICAnXFx1MDFFQic6ICdvJyxcbiAgICAnXFx1MDFFRCc6ICdvJyxcbiAgICAnXFx1MDBGOCc6ICdvJyxcbiAgICAnXFx1MDFGRic6ICdvJyxcbiAgICAnXFx1MDI1NCc6ICdvJyxcbiAgICAnXFx1QTc0Qic6ICdvJyxcbiAgICAnXFx1QTc0RCc6ICdvJyxcbiAgICAnXFx1MDI3NSc6ICdvJyxcbiAgICAnXFx1MDFBMyc6ICdvaScsXG4gICAgJ1xcdTAyMjMnOiAnb3UnLFxuICAgICdcXHVBNzRGJzogJ29vJyxcbiAgICAnXFx1MjRERic6ICdwJyxcbiAgICAnXFx1RkY1MCc6ICdwJyxcbiAgICAnXFx1MUU1NSc6ICdwJyxcbiAgICAnXFx1MUU1Nyc6ICdwJyxcbiAgICAnXFx1MDFBNSc6ICdwJyxcbiAgICAnXFx1MUQ3RCc6ICdwJyxcbiAgICAnXFx1QTc1MSc6ICdwJyxcbiAgICAnXFx1QTc1Myc6ICdwJyxcbiAgICAnXFx1QTc1NSc6ICdwJyxcbiAgICAnXFx1MjRFMCc6ICdxJyxcbiAgICAnXFx1RkY1MSc6ICdxJyxcbiAgICAnXFx1MDI0Qic6ICdxJyxcbiAgICAnXFx1QTc1Nyc6ICdxJyxcbiAgICAnXFx1QTc1OSc6ICdxJyxcbiAgICAnXFx1MjRFMSc6ICdyJyxcbiAgICAnXFx1RkY1Mic6ICdyJyxcbiAgICAnXFx1MDE1NSc6ICdyJyxcbiAgICAnXFx1MUU1OSc6ICdyJyxcbiAgICAnXFx1MDE1OSc6ICdyJyxcbiAgICAnXFx1MDIxMSc6ICdyJyxcbiAgICAnXFx1MDIxMyc6ICdyJyxcbiAgICAnXFx1MUU1Qic6ICdyJyxcbiAgICAnXFx1MUU1RCc6ICdyJyxcbiAgICAnXFx1MDE1Nyc6ICdyJyxcbiAgICAnXFx1MUU1Ric6ICdyJyxcbiAgICAnXFx1MDI0RCc6ICdyJyxcbiAgICAnXFx1MDI3RCc6ICdyJyxcbiAgICAnXFx1QTc1Qic6ICdyJyxcbiAgICAnXFx1QTdBNyc6ICdyJyxcbiAgICAnXFx1QTc4Myc6ICdyJyxcbiAgICAnXFx1MjRFMic6ICdzJyxcbiAgICAnXFx1RkY1Myc6ICdzJyxcbiAgICAnXFx1MDBERic6ICdzJyxcbiAgICAnXFx1MDE1Qic6ICdzJyxcbiAgICAnXFx1MUU2NSc6ICdzJyxcbiAgICAnXFx1MDE1RCc6ICdzJyxcbiAgICAnXFx1MUU2MSc6ICdzJyxcbiAgICAnXFx1MDE2MSc6ICdzJyxcbiAgICAnXFx1MUU2Nyc6ICdzJyxcbiAgICAnXFx1MUU2Myc6ICdzJyxcbiAgICAnXFx1MUU2OSc6ICdzJyxcbiAgICAnXFx1MDIxOSc6ICdzJyxcbiAgICAnXFx1MDE1Ric6ICdzJyxcbiAgICAnXFx1MDIzRic6ICdzJyxcbiAgICAnXFx1QTdBOSc6ICdzJyxcbiAgICAnXFx1QTc4NSc6ICdzJyxcbiAgICAnXFx1MUU5Qic6ICdzJyxcbiAgICAnXFx1MjRFMyc6ICd0JyxcbiAgICAnXFx1RkY1NCc6ICd0JyxcbiAgICAnXFx1MUU2Qic6ICd0JyxcbiAgICAnXFx1MUU5Nyc6ICd0JyxcbiAgICAnXFx1MDE2NSc6ICd0JyxcbiAgICAnXFx1MUU2RCc6ICd0JyxcbiAgICAnXFx1MDIxQic6ICd0JyxcbiAgICAnXFx1MDE2Myc6ICd0JyxcbiAgICAnXFx1MUU3MSc6ICd0JyxcbiAgICAnXFx1MUU2Ric6ICd0JyxcbiAgICAnXFx1MDE2Nyc6ICd0JyxcbiAgICAnXFx1MDFBRCc6ICd0JyxcbiAgICAnXFx1MDI4OCc6ICd0JyxcbiAgICAnXFx1MkM2Nic6ICd0JyxcbiAgICAnXFx1QTc4Nyc6ICd0JyxcbiAgICAnXFx1QTcyOSc6ICd0eicsXG4gICAgJ1xcdTI0RTQnOiAndScsXG4gICAgJ1xcdUZGNTUnOiAndScsXG4gICAgJ1xcdTAwRjknOiAndScsXG4gICAgJ1xcdTAwRkEnOiAndScsXG4gICAgJ1xcdTAwRkInOiAndScsXG4gICAgJ1xcdTAxNjknOiAndScsXG4gICAgJ1xcdTFFNzknOiAndScsXG4gICAgJ1xcdTAxNkInOiAndScsXG4gICAgJ1xcdTFFN0InOiAndScsXG4gICAgJ1xcdTAxNkQnOiAndScsXG4gICAgJ1xcdTAwRkMnOiAndScsXG4gICAgJ1xcdTAxREMnOiAndScsXG4gICAgJ1xcdTAxRDgnOiAndScsXG4gICAgJ1xcdTAxRDYnOiAndScsXG4gICAgJ1xcdTAxREEnOiAndScsXG4gICAgJ1xcdTFFRTcnOiAndScsXG4gICAgJ1xcdTAxNkYnOiAndScsXG4gICAgJ1xcdTAxNzEnOiAndScsXG4gICAgJ1xcdTAxRDQnOiAndScsXG4gICAgJ1xcdTAyMTUnOiAndScsXG4gICAgJ1xcdTAyMTcnOiAndScsXG4gICAgJ1xcdTAxQjAnOiAndScsXG4gICAgJ1xcdTFFRUInOiAndScsXG4gICAgJ1xcdTFFRTknOiAndScsXG4gICAgJ1xcdTFFRUYnOiAndScsXG4gICAgJ1xcdTFFRUQnOiAndScsXG4gICAgJ1xcdTFFRjEnOiAndScsXG4gICAgJ1xcdTFFRTUnOiAndScsXG4gICAgJ1xcdTFFNzMnOiAndScsXG4gICAgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTFFNzcnOiAndScsXG4gICAgJ1xcdTFFNzUnOiAndScsXG4gICAgJ1xcdTAyODknOiAndScsXG4gICAgJ1xcdTI0RTUnOiAndicsXG4gICAgJ1xcdUZGNTYnOiAndicsXG4gICAgJ1xcdTFFN0QnOiAndicsXG4gICAgJ1xcdTFFN0YnOiAndicsXG4gICAgJ1xcdTAyOEInOiAndicsXG4gICAgJ1xcdUE3NUYnOiAndicsXG4gICAgJ1xcdTAyOEMnOiAndicsXG4gICAgJ1xcdUE3NjEnOiAndnknLFxuICAgICdcXHUyNEU2JzogJ3cnLFxuICAgICdcXHVGRjU3JzogJ3cnLFxuICAgICdcXHUxRTgxJzogJ3cnLFxuICAgICdcXHUxRTgzJzogJ3cnLFxuICAgICdcXHUwMTc1JzogJ3cnLFxuICAgICdcXHUxRTg3JzogJ3cnLFxuICAgICdcXHUxRTg1JzogJ3cnLFxuICAgICdcXHUxRTk4JzogJ3cnLFxuICAgICdcXHUxRTg5JzogJ3cnLFxuICAgICdcXHUyQzczJzogJ3cnLFxuICAgICdcXHUyNEU3JzogJ3gnLFxuICAgICdcXHVGRjU4JzogJ3gnLFxuICAgICdcXHUxRThCJzogJ3gnLFxuICAgICdcXHUxRThEJzogJ3gnLFxuICAgICdcXHUyNEU4JzogJ3knLFxuICAgICdcXHVGRjU5JzogJ3knLFxuICAgICdcXHUxRUYzJzogJ3knLFxuICAgICdcXHUwMEZEJzogJ3knLFxuICAgICdcXHUwMTc3JzogJ3knLFxuICAgICdcXHUxRUY5JzogJ3knLFxuICAgICdcXHUwMjMzJzogJ3knLFxuICAgICdcXHUxRThGJzogJ3knLFxuICAgICdcXHUwMEZGJzogJ3knLFxuICAgICdcXHUxRUY3JzogJ3knLFxuICAgICdcXHUxRTk5JzogJ3knLFxuICAgICdcXHUxRUY1JzogJ3knLFxuICAgICdcXHUwMUI0JzogJ3knLFxuICAgICdcXHUwMjRGJzogJ3knLFxuICAgICdcXHUxRUZGJzogJ3knLFxuICAgICdcXHUyNEU5JzogJ3onLFxuICAgICdcXHVGRjVBJzogJ3onLFxuICAgICdcXHUwMTdBJzogJ3onLFxuICAgICdcXHUxRTkxJzogJ3onLFxuICAgICdcXHUwMTdDJzogJ3onLFxuICAgICdcXHUwMTdFJzogJ3onLFxuICAgICdcXHUxRTkzJzogJ3onLFxuICAgICdcXHUxRTk1JzogJ3onLFxuICAgICdcXHUwMUI2JzogJ3onLFxuICAgICdcXHUwMjI1JzogJ3onLFxuICAgICdcXHUwMjQwJzogJ3onLFxuICAgICdcXHUyQzZDJzogJ3onLFxuICAgICdcXHVBNzYzJzogJ3onLFxuICAgICdcXHUwMzg2JzogJ1xcdTAzOTEnLFxuICAgICdcXHUwMzg4JzogJ1xcdTAzOTUnLFxuICAgICdcXHUwMzg5JzogJ1xcdTAzOTcnLFxuICAgICdcXHUwMzhBJzogJ1xcdTAzOTknLFxuICAgICdcXHUwM0FBJzogJ1xcdTAzOTknLFxuICAgICdcXHUwMzhDJzogJ1xcdTAzOUYnLFxuICAgICdcXHUwMzhFJzogJ1xcdTAzQTUnLFxuICAgICdcXHUwM0FCJzogJ1xcdTAzQTUnLFxuICAgICdcXHUwMzhGJzogJ1xcdTAzQTknLFxuICAgICdcXHUwM0FDJzogJ1xcdTAzQjEnLFxuICAgICdcXHUwM0FEJzogJ1xcdTAzQjUnLFxuICAgICdcXHUwM0FFJzogJ1xcdTAzQjcnLFxuICAgICdcXHUwM0FGJzogJ1xcdTAzQjknLFxuICAgICdcXHUwM0NBJzogJ1xcdTAzQjknLFxuICAgICdcXHUwMzkwJzogJ1xcdTAzQjknLFxuICAgICdcXHUwM0NDJzogJ1xcdTAzQkYnLFxuICAgICdcXHUwM0NEJzogJ1xcdTAzQzUnLFxuICAgICdcXHUwM0NCJzogJ1xcdTAzQzUnLFxuICAgICdcXHUwM0IwJzogJ1xcdTAzQzUnLFxuICAgICdcXHUwM0M5JzogJ1xcdTAzQzknLFxuICAgICdcXHUwM0MyJzogJ1xcdTAzQzMnXG4gIH07XG5cbiAgcmV0dXJuIGRpYWNyaXRpY3M7XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL2RhdGEvYmFzZScsW1xuICAnLi4vdXRpbHMnXG5dLCBmdW5jdGlvbiAoVXRpbHMpIHtcbiAgZnVuY3Rpb24gQmFzZUFkYXB0ZXIgKCRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgQmFzZUFkYXB0ZXIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7XG4gIH1cblxuICBVdGlscy5FeHRlbmQoQmFzZUFkYXB0ZXIsIFV0aWxzLk9ic2VydmFibGUpO1xuXG4gIEJhc2VBZGFwdGVyLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYGN1cnJlbnRgIG1ldGhvZCBtdXN0IGJlIGRlZmluZWQgaW4gY2hpbGQgY2xhc3Nlcy4nKTtcbiAgfTtcblxuICBCYXNlQWRhcHRlci5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBxdWVyeWAgbWV0aG9kIG11c3QgYmUgZGVmaW5lZCBpbiBjaGlsZCBjbGFzc2VzLicpO1xuICB9O1xuXG4gIEJhc2VBZGFwdGVyLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgJGNvbnRhaW5lcikge1xuICAgIC8vIENhbiBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gIH07XG5cbiAgQmFzZUFkYXB0ZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ2FuIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgfTtcblxuICBCYXNlQWRhcHRlci5wcm90b3R5cGUuZ2VuZXJhdGVSZXN1bHRJZCA9IGZ1bmN0aW9uIChjb250YWluZXIsIGRhdGEpIHtcbiAgICB2YXIgaWQgPSBjb250YWluZXIuaWQgKyAnLXJlc3VsdC0nO1xuXG4gICAgaWQgKz0gVXRpbHMuZ2VuZXJhdGVDaGFycyg0KTtcblxuICAgIGlmIChkYXRhLmlkICE9IG51bGwpIHtcbiAgICAgIGlkICs9ICctJyArIGRhdGEuaWQudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWQgKz0gJy0nICsgVXRpbHMuZ2VuZXJhdGVDaGFycyg0KTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9O1xuXG4gIHJldHVybiBCYXNlQWRhcHRlcjtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZGF0YS9zZWxlY3QnLFtcbiAgJy4vYmFzZScsXG4gICcuLi91dGlscycsXG4gICdqcXVlcnknXG5dLCBmdW5jdGlvbiAoQmFzZUFkYXB0ZXIsIFV0aWxzLCAkKSB7XG4gIGZ1bmN0aW9uIFNlbGVjdEFkYXB0ZXIgKCRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9ICRlbGVtZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBTZWxlY3RBZGFwdGVyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO1xuICB9XG5cbiAgVXRpbHMuRXh0ZW5kKFNlbGVjdEFkYXB0ZXIsIEJhc2VBZGFwdGVyKTtcblxuICBTZWxlY3RBZGFwdGVyLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdmFyIGRhdGEgPSBbXTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLiRlbGVtZW50LmZpbmQoJzpzZWxlY3RlZCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRvcHRpb24gPSAkKHRoaXMpO1xuXG4gICAgICB2YXIgb3B0aW9uID0gc2VsZi5pdGVtKCRvcHRpb24pO1xuXG4gICAgICBkYXRhLnB1c2gob3B0aW9uKTtcbiAgICB9KTtcblxuICAgIGNhbGxiYWNrKGRhdGEpO1xuICB9O1xuXG4gIFNlbGVjdEFkYXB0ZXIucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgZGF0YS5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICAvLyBJZiBkYXRhLmVsZW1lbnQgaXMgYSBET00gbm9kZSwgdXNlIGl0IGluc3RlYWRcbiAgICBpZiAoJChkYXRhLmVsZW1lbnQpLmlzKCdvcHRpb24nKSkge1xuICAgICAgZGF0YS5lbGVtZW50LnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLiRlbGVtZW50LnByb3AoJ211bHRpcGxlJykpIHtcbiAgICAgIHRoaXMuY3VycmVudChmdW5jdGlvbiAoY3VycmVudERhdGEpIHtcbiAgICAgICAgdmFyIHZhbCA9IFtdO1xuXG4gICAgICAgIGRhdGEgPSBbZGF0YV07XG4gICAgICAgIGRhdGEucHVzaC5hcHBseShkYXRhLCBjdXJyZW50RGF0YSk7XG5cbiAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkYXRhLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgICAgdmFyIGlkID0gZGF0YVtkXS5pZDtcblxuICAgICAgICAgIGlmICgkLmluQXJyYXkoaWQsIHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICB2YWwucHVzaChpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi4kZWxlbWVudC52YWwodmFsKTtcbiAgICAgICAgc2VsZi4kZWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdmFsID0gZGF0YS5pZDtcblxuICAgICAgdGhpcy4kZWxlbWVudC52YWwodmFsKTtcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgfVxuICB9O1xuXG4gIFNlbGVjdEFkYXB0ZXIucHJvdG90eXBlLnVuc2VsZWN0ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoIXRoaXMuJGVsZW1lbnQucHJvcCgnbXVsdGlwbGUnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRhdGEuc2VsZWN0ZWQgPSBmYWxzZTtcblxuICAgIGlmICgkKGRhdGEuZWxlbWVudCkuaXMoJ29wdGlvbicpKSB7XG4gICAgICBkYXRhLmVsZW1lbnQuc2VsZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdjaGFuZ2UnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudChmdW5jdGlvbiAoY3VycmVudERhdGEpIHtcbiAgICAgIHZhciB2YWwgPSBbXTtcblxuICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBjdXJyZW50RGF0YS5sZW5ndGg7IGQrKykge1xuICAgICAgICB2YXIgaWQgPSBjdXJyZW50RGF0YVtkXS5pZDtcblxuICAgICAgICBpZiAoaWQgIT09IGRhdGEuaWQgJiYgJC5pbkFycmF5KGlkLCB2YWwpID09PSAtMSkge1xuICAgICAgICAgIHZhbC5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZWxmLiRlbGVtZW50LnZhbCh2YWwpO1xuXG4gICAgICBzZWxmLiRlbGVtZW50LnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgIH0pO1xuICB9O1xuXG4gIFNlbGVjdEFkYXB0ZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGFpbmVyLCAkY29udGFpbmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG5cbiAgICBjb250YWluZXIub24oJ3NlbGVjdCcsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHNlbGYuc2VsZWN0KHBhcmFtcy5kYXRhKTtcbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbigndW5zZWxlY3QnLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICBzZWxmLnVuc2VsZWN0KHBhcmFtcy5kYXRhKTtcbiAgICB9KTtcbiAgfTtcblxuICBTZWxlY3RBZGFwdGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFJlbW92ZSBhbnl0aGluZyBhZGRlZCB0byBjaGlsZCBlbGVtZW50c1xuICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnKicpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUmVtb3ZlIGFueSBjdXN0b20gZGF0YSBzZXQgYnkgU2VsZWN0MlxuICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICdkYXRhJyk7XG4gICAgfSk7XG4gIH07XG5cbiAgU2VsZWN0QWRhcHRlci5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICAgIHZhciBkYXRhID0gW107XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyICRvcHRpb25zID0gdGhpcy4kZWxlbWVudC5jaGlsZHJlbigpO1xuXG4gICAgJG9wdGlvbnMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJG9wdGlvbiA9ICQodGhpcyk7XG5cbiAgICAgIGlmICghJG9wdGlvbi5pcygnb3B0aW9uJykgJiYgISRvcHRpb24uaXMoJ29wdGdyb3VwJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3B0aW9uID0gc2VsZi5pdGVtKCRvcHRpb24pO1xuXG4gICAgICB2YXIgbWF0Y2hlcyA9IHNlbGYubWF0Y2hlcyhwYXJhbXMsIG9wdGlvbik7XG5cbiAgICAgIGlmIChtYXRjaGVzICE9PSBudWxsKSB7XG4gICAgICAgIGRhdGEucHVzaChtYXRjaGVzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNhbGxiYWNrKHtcbiAgICAgIHJlc3VsdHM6IGRhdGFcbiAgICB9KTtcbiAgfTtcblxuICBTZWxlY3RBZGFwdGVyLnByb3RvdHlwZS5hZGRPcHRpb25zID0gZnVuY3Rpb24gKCRvcHRpb25zKSB7XG4gICAgVXRpbHMuYXBwZW5kTWFueSh0aGlzLiRlbGVtZW50LCAkb3B0aW9ucyk7XG4gIH07XG5cbiAgU2VsZWN0QWRhcHRlci5wcm90b3R5cGUub3B0aW9uID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgb3B0aW9uO1xuXG4gICAgaWYgKGRhdGEuY2hpbGRyZW4pIHtcbiAgICAgIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGdyb3VwJyk7XG4gICAgICBvcHRpb24ubGFiZWwgPSBkYXRhLnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuXG4gICAgICBpZiAob3B0aW9uLnRleHRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9uLnRleHRDb250ZW50ID0gZGF0YS50ZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uLmlubmVyVGV4dCA9IGRhdGEudGV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGF0YS5pZCkge1xuICAgICAgb3B0aW9uLnZhbHVlID0gZGF0YS5pZDtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5kaXNhYmxlZCkge1xuICAgICAgb3B0aW9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5zZWxlY3RlZCkge1xuICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS50aXRsZSkge1xuICAgICAgb3B0aW9uLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB9XG5cbiAgICB2YXIgJG9wdGlvbiA9ICQob3B0aW9uKTtcblxuICAgIHZhciBub3JtYWxpemVkRGF0YSA9IHRoaXMuX25vcm1hbGl6ZUl0ZW0oZGF0YSk7XG4gICAgbm9ybWFsaXplZERhdGEuZWxlbWVudCA9IG9wdGlvbjtcblxuICAgIC8vIE92ZXJyaWRlIHRoZSBvcHRpb24ncyBkYXRhIHdpdGggdGhlIGNvbWJpbmVkIGRhdGFcbiAgICAkLmRhdGEob3B0aW9uLCAnZGF0YScsIG5vcm1hbGl6ZWREYXRhKTtcblxuICAgIHJldHVybiAkb3B0aW9uO1xuICB9O1xuXG4gIFNlbGVjdEFkYXB0ZXIucHJvdG90eXBlLml0ZW0gPSBmdW5jdGlvbiAoJG9wdGlvbikge1xuICAgIHZhciBkYXRhID0ge307XG5cbiAgICBkYXRhID0gJC5kYXRhKCRvcHRpb25bMF0sICdkYXRhJyk7XG5cbiAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoJG9wdGlvbi5pcygnb3B0aW9uJykpIHtcbiAgICAgIGRhdGEgPSB7XG4gICAgICAgIGlkOiAkb3B0aW9uLnZhbCgpLFxuICAgICAgICB0ZXh0OiAkb3B0aW9uLnRleHQoKSxcbiAgICAgICAgZGlzYWJsZWQ6ICRvcHRpb24ucHJvcCgnZGlzYWJsZWQnKSxcbiAgICAgICAgc2VsZWN0ZWQ6ICRvcHRpb24ucHJvcCgnc2VsZWN0ZWQnKSxcbiAgICAgICAgdGl0bGU6ICRvcHRpb24ucHJvcCgndGl0bGUnKVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCRvcHRpb24uaXMoJ29wdGdyb3VwJykpIHtcbiAgICAgIGRhdGEgPSB7XG4gICAgICAgIHRleHQ6ICRvcHRpb24ucHJvcCgnbGFiZWwnKSxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICB0aXRsZTogJG9wdGlvbi5wcm9wKCd0aXRsZScpXG4gICAgICB9O1xuXG4gICAgICB2YXIgJGNoaWxkcmVuID0gJG9wdGlvbi5jaGlsZHJlbignb3B0aW9uJyk7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBbXTtcblxuICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCAkY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgdmFyICRjaGlsZCA9ICQoJGNoaWxkcmVuW2NdKTtcblxuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLml0ZW0oJGNoaWxkKTtcblxuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGRhdGEgPSB0aGlzLl9ub3JtYWxpemVJdGVtKGRhdGEpO1xuICAgIGRhdGEuZWxlbWVudCA9ICRvcHRpb25bMF07XG5cbiAgICAkLmRhdGEoJG9wdGlvblswXSwgJ2RhdGEnLCBkYXRhKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIFNlbGVjdEFkYXB0ZXIucHJvdG90eXBlLl9ub3JtYWxpemVJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoISQuaXNQbGFpbk9iamVjdChpdGVtKSkge1xuICAgICAgaXRlbSA9IHtcbiAgICAgICAgaWQ6IGl0ZW0sXG4gICAgICAgIHRleHQ6IGl0ZW1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaXRlbSA9ICQuZXh0ZW5kKHt9LCB7XG4gICAgICB0ZXh0OiAnJ1xuICAgIH0sIGl0ZW0pO1xuXG4gICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgZGlzYWJsZWQ6IGZhbHNlXG4gICAgfTtcblxuICAgIGlmIChpdGVtLmlkICE9IG51bGwpIHtcbiAgICAgIGl0ZW0uaWQgPSBpdGVtLmlkLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0udGV4dCAhPSBudWxsKSB7XG4gICAgICBpdGVtLnRleHQgPSBpdGVtLnRleHQudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5fcmVzdWx0SWQgPT0gbnVsbCAmJiBpdGVtLmlkICYmIHRoaXMuY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgIGl0ZW0uX3Jlc3VsdElkID0gdGhpcy5nZW5lcmF0ZVJlc3VsdElkKHRoaXMuY29udGFpbmVyLCBpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBpdGVtKTtcbiAgfTtcblxuICBTZWxlY3RBZGFwdGVyLnByb3RvdHlwZS5tYXRjaGVzID0gZnVuY3Rpb24gKHBhcmFtcywgZGF0YSkge1xuICAgIHZhciBtYXRjaGVyID0gdGhpcy5vcHRpb25zLmdldCgnbWF0Y2hlcicpO1xuXG4gICAgcmV0dXJuIG1hdGNoZXIocGFyYW1zLCBkYXRhKTtcbiAgfTtcblxuICByZXR1cm4gU2VsZWN0QWRhcHRlcjtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZGF0YS9hcnJheScsW1xuICAnLi9zZWxlY3QnLFxuICAnLi4vdXRpbHMnLFxuICAnanF1ZXJ5J1xuXSwgZnVuY3Rpb24gKFNlbGVjdEFkYXB0ZXIsIFV0aWxzLCAkKSB7XG4gIGZ1bmN0aW9uIEFycmF5QWRhcHRlciAoJGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZ2V0KCdkYXRhJykgfHwgW107XG5cbiAgICBBcnJheUFkYXB0ZXIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgJGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5hZGRPcHRpb25zKHRoaXMuY29udmVydFRvT3B0aW9ucyhkYXRhKSk7XG4gIH1cblxuICBVdGlscy5FeHRlbmQoQXJyYXlBZGFwdGVyLCBTZWxlY3RBZGFwdGVyKTtcblxuICBBcnJheUFkYXB0ZXIucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyICRvcHRpb24gPSB0aGlzLiRlbGVtZW50LmZpbmQoJ29wdGlvbicpLmZpbHRlcihmdW5jdGlvbiAoaSwgZWxtKSB7XG4gICAgICByZXR1cm4gZWxtLnZhbHVlID09IGRhdGEuaWQudG9TdHJpbmcoKTtcbiAgICB9KTtcblxuICAgIGlmICgkb3B0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgJG9wdGlvbiA9IHRoaXMub3B0aW9uKGRhdGEpO1xuXG4gICAgICB0aGlzLmFkZE9wdGlvbnMoJG9wdGlvbik7XG4gICAgfVxuXG4gICAgQXJyYXlBZGFwdGVyLl9fc3VwZXJfXy5zZWxlY3QuY2FsbCh0aGlzLCBkYXRhKTtcbiAgfTtcblxuICBBcnJheUFkYXB0ZXIucHJvdG90eXBlLmNvbnZlcnRUb09wdGlvbnMgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciAkZXhpc3RpbmcgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ29wdGlvbicpO1xuICAgIHZhciBleGlzdGluZ0lkcyA9ICRleGlzdGluZy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYuaXRlbSgkKHRoaXMpKS5pZDtcbiAgICB9KS5nZXQoKTtcblxuICAgIHZhciAkb3B0aW9ucyA9IFtdO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgaXRlbXMgZXhjZXB0IGZvciB0aGUgb25lIHBhc3NlZCBpbiB0aGUgYXJndW1lbnRcbiAgICBmdW5jdGlvbiBvbmx5SXRlbSAoaXRlbSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcykudmFsKCkgPT0gaXRlbS5pZDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkYXRhLmxlbmd0aDsgZCsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuX25vcm1hbGl6ZUl0ZW0oZGF0YVtkXSk7XG5cbiAgICAgIC8vIFNraXAgaXRlbXMgd2hpY2ggd2VyZSBwcmUtbG9hZGVkLCBvbmx5IG1lcmdlIHRoZSBkYXRhXG4gICAgICBpZiAoJC5pbkFycmF5KGl0ZW0uaWQsIGV4aXN0aW5nSWRzKSA+PSAwKSB7XG4gICAgICAgIHZhciAkZXhpc3RpbmdPcHRpb24gPSAkZXhpc3RpbmcuZmlsdGVyKG9ubHlJdGVtKGl0ZW0pKTtcblxuICAgICAgICB2YXIgZXhpc3RpbmdEYXRhID0gdGhpcy5pdGVtKCRleGlzdGluZ09wdGlvbik7XG4gICAgICAgIHZhciBuZXdEYXRhID0gJC5leHRlbmQodHJ1ZSwge30sIGl0ZW0sIGV4aXN0aW5nRGF0YSk7XG5cbiAgICAgICAgdmFyICRuZXdPcHRpb24gPSB0aGlzLm9wdGlvbihuZXdEYXRhKTtcblxuICAgICAgICAkZXhpc3RpbmdPcHRpb24ucmVwbGFjZVdpdGgoJG5ld09wdGlvbik7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciAkb3B0aW9uID0gdGhpcy5vcHRpb24oaXRlbSk7XG5cbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgIHZhciAkY2hpbGRyZW4gPSB0aGlzLmNvbnZlcnRUb09wdGlvbnMoaXRlbS5jaGlsZHJlbik7XG5cbiAgICAgICAgVXRpbHMuYXBwZW5kTWFueSgkb3B0aW9uLCAkY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICAkb3B0aW9ucy5wdXNoKCRvcHRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiAkb3B0aW9ucztcbiAgfTtcblxuICByZXR1cm4gQXJyYXlBZGFwdGVyO1xufSk7XG5cblMyLmRlZmluZSgnc2VsZWN0Mi9kYXRhL2FqYXgnLFtcbiAgJy4vYXJyYXknLFxuICAnLi4vdXRpbHMnLFxuICAnanF1ZXJ5J1xuXSwgZnVuY3Rpb24gKEFycmF5QWRhcHRlciwgVXRpbHMsICQpIHtcbiAgZnVuY3Rpb24gQWpheEFkYXB0ZXIgKCRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy5hamF4T3B0aW9ucyA9IHRoaXMuX2FwcGx5RGVmYXVsdHMob3B0aW9ucy5nZXQoJ2FqYXgnKSk7XG5cbiAgICBpZiAodGhpcy5hamF4T3B0aW9ucy5wcm9jZXNzUmVzdWx0cyAhPSBudWxsKSB7XG4gICAgICB0aGlzLnByb2Nlc3NSZXN1bHRzID0gdGhpcy5hamF4T3B0aW9ucy5wcm9jZXNzUmVzdWx0cztcbiAgICB9XG5cbiAgICBBamF4QWRhcHRlci5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCAkZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICBVdGlscy5FeHRlbmQoQWpheEFkYXB0ZXIsIEFycmF5QWRhcHRlcik7XG5cbiAgQWpheEFkYXB0ZXIucHJvdG90eXBlLl9hcHBseURlZmF1bHRzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBkYXRhOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiAkLmV4dGVuZCh7fSwgcGFyYW1zLCB7XG4gICAgICAgICAgcTogcGFyYW1zLnRlcm1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdHJhbnNwb3J0OiBmdW5jdGlvbiAocGFyYW1zLCBzdWNjZXNzLCBmYWlsdXJlKSB7XG4gICAgICAgIHZhciAkcmVxdWVzdCA9ICQuYWpheChwYXJhbXMpO1xuXG4gICAgICAgICRyZXF1ZXN0LnRoZW4oc3VjY2Vzcyk7XG4gICAgICAgICRyZXF1ZXN0LmZhaWwoZmFpbHVyZSk7XG5cbiAgICAgICAgcmV0dXJuICRyZXF1ZXN0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zLCB0cnVlKTtcbiAgfTtcblxuICBBamF4QWRhcHRlci5wcm90b3R5cGUucHJvY2Vzc1Jlc3VsdHMgPSBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIEFqYXhBZGFwdGVyLnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBbXTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5fcmVxdWVzdCAhPSBudWxsKSB7XG4gICAgICAvLyBKU09OUCByZXF1ZXN0cyBjYW5ub3QgYWx3YXlzIGJlIGFib3J0ZWRcbiAgICAgIGlmICgkLmlzRnVuY3Rpb24odGhpcy5fcmVxdWVzdC5hYm9ydCkpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgb3B0aW9ucyA9ICQuZXh0ZW5kKHtcbiAgICAgIHR5cGU6ICdHRVQnXG4gICAgfSwgdGhpcy5hamF4T3B0aW9ucyk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudXJsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsLmNhbGwodGhpcy4kZWxlbWVudCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9ucy5kYXRhID0gb3B0aW9ucy5kYXRhLmNhbGwodGhpcy4kZWxlbWVudCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXF1ZXN0ICgpIHtcbiAgICAgIHZhciAkcmVxdWVzdCA9IG9wdGlvbnMudHJhbnNwb3J0KG9wdGlvbnMsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciByZXN1bHRzID0gc2VsZi5wcm9jZXNzUmVzdWx0cyhkYXRhLCBwYXJhbXMpO1xuXG4gICAgICAgIGlmIChzZWxmLm9wdGlvbnMuZ2V0KCdkZWJ1ZycpICYmIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVzcG9uc2UgaW5jbHVkZWQgYSBgcmVzdWx0c2Aga2V5LlxuICAgICAgICAgIGlmICghcmVzdWx0cyB8fCAhcmVzdWx0cy5yZXN1bHRzIHx8ICEkLmlzQXJyYXkocmVzdWx0cy5yZXN1bHRzKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgJ1NlbGVjdDI6IFRoZSBBSkFYIHJlc3VsdHMgZGlkIG5vdCByZXR1cm4gYW4gYXJyYXkgaW4gdGhlICcgK1xuICAgICAgICAgICAgICAnYHJlc3VsdHNgIGtleSBvZiB0aGUgcmVzcG9uc2UuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhyZXN1bHRzKTtcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBkZXRlY3QgaWYgYSByZXF1ZXN0IHdhcyBhYm9ydGVkXG4gICAgICAgIC8vIE9ubHkgd29ya3MgaWYgdGhlIHRyYW5zcG9ydCBleHBvc2VzIGEgc3RhdHVzIHByb3BlcnR5XG4gICAgICAgIGlmICgkcmVxdWVzdC5zdGF0dXMgJiYgJHJlcXVlc3Quc3RhdHVzID09PSAnMCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLnRyaWdnZXIoJ3Jlc3VsdHM6bWVzc2FnZScsIHtcbiAgICAgICAgICBtZXNzYWdlOiAnZXJyb3JMb2FkaW5nJ1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZWxmLl9yZXF1ZXN0ID0gJHJlcXVlc3Q7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWpheE9wdGlvbnMuZGVsYXkgJiYgcGFyYW1zLnRlcm0gIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuX3F1ZXJ5VGltZW91dCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3F1ZXJ5VGltZW91dCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3F1ZXJ5VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KHJlcXVlc3QsIHRoaXMuYWpheE9wdGlvbnMuZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0KCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBBamF4QWRhcHRlcjtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZGF0YS90YWdzJyxbXG4gICdqcXVlcnknXG5dLCBmdW5jdGlvbiAoJCkge1xuICBmdW5jdGlvbiBUYWdzIChkZWNvcmF0ZWQsICRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdmFyIHRhZ3MgPSBvcHRpb25zLmdldCgndGFncycpO1xuXG4gICAgdmFyIGNyZWF0ZVRhZyA9IG9wdGlvbnMuZ2V0KCdjcmVhdGVUYWcnKTtcblxuICAgIGlmIChjcmVhdGVUYWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jcmVhdGVUYWcgPSBjcmVhdGVUYWc7XG4gICAgfVxuXG4gICAgdmFyIGluc2VydFRhZyA9IG9wdGlvbnMuZ2V0KCdpbnNlcnRUYWcnKTtcblxuICAgIGlmIChpbnNlcnRUYWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluc2VydFRhZyA9IGluc2VydFRhZztcbiAgICB9XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCAkZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICBpZiAoJC5pc0FycmF5KHRhZ3MpKSB7XG4gICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IHRhZ3MubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgdmFyIHRhZyA9IHRhZ3NbdF07XG4gICAgICAgIHZhciBpdGVtID0gdGhpcy5fbm9ybWFsaXplSXRlbSh0YWcpO1xuXG4gICAgICAgIHZhciAkb3B0aW9uID0gdGhpcy5vcHRpb24oaXRlbSk7XG5cbiAgICAgICAgdGhpcy4kZWxlbWVudC5hcHBlbmQoJG9wdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgVGFncy5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAoZGVjb3JhdGVkLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5fcmVtb3ZlT2xkVGFncygpO1xuXG4gICAgaWYgKHBhcmFtcy50ZXJtID09IG51bGwgfHwgcGFyYW1zLnBhZ2UgIT0gbnVsbCkge1xuICAgICAgZGVjb3JhdGVkLmNhbGwodGhpcywgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd3JhcHBlciAob2JqLCBjaGlsZCkge1xuICAgICAgdmFyIGRhdGEgPSBvYmoucmVzdWx0cztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSBkYXRhW2ldO1xuXG4gICAgICAgIHZhciBjaGVja0NoaWxkcmVuID0gKFxuICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbiAhPSBudWxsICYmXG4gICAgICAgICAgIXdyYXBwZXIoe1xuICAgICAgICAgICAgcmVzdWx0czogb3B0aW9uLmNoaWxkcmVuXG4gICAgICAgICAgfSwgdHJ1ZSlcbiAgICAgICAgKTtcblxuICAgICAgICB2YXIgY2hlY2tUZXh0ID0gb3B0aW9uLnRleHQgPT09IHBhcmFtcy50ZXJtO1xuXG4gICAgICAgIGlmIChjaGVja1RleHQgfHwgY2hlY2tDaGlsZHJlbikge1xuICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9iai5kYXRhID0gZGF0YTtcbiAgICAgICAgICBjYWxsYmFjayhvYmopO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhZyA9IHNlbGYuY3JlYXRlVGFnKHBhcmFtcyk7XG5cbiAgICAgIGlmICh0YWcgIT0gbnVsbCkge1xuICAgICAgICB2YXIgJG9wdGlvbiA9IHNlbGYub3B0aW9uKHRhZyk7XG4gICAgICAgICRvcHRpb24uYXR0cignZGF0YS1zZWxlY3QyLXRhZycsIHRydWUpO1xuXG4gICAgICAgIHNlbGYuYWRkT3B0aW9ucyhbJG9wdGlvbl0pO1xuXG4gICAgICAgIHNlbGYuaW5zZXJ0VGFnKGRhdGEsIHRhZyk7XG4gICAgICB9XG5cbiAgICAgIG9iai5yZXN1bHRzID0gZGF0YTtcblxuICAgICAgY2FsbGJhY2sob2JqKTtcbiAgICB9XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBwYXJhbXMsIHdyYXBwZXIpO1xuICB9O1xuXG4gIFRhZ3MucHJvdG90eXBlLmNyZWF0ZVRhZyA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIHBhcmFtcykge1xuICAgIHZhciB0ZXJtID0gJC50cmltKHBhcmFtcy50ZXJtKTtcblxuICAgIGlmICh0ZXJtID09PSAnJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0ZXJtLFxuICAgICAgdGV4dDogdGVybVxuICAgIH07XG4gIH07XG5cbiAgVGFncy5wcm90b3R5cGUuaW5zZXJ0VGFnID0gZnVuY3Rpb24gKF8sIGRhdGEsIHRhZykge1xuICAgIGRhdGEudW5zaGlmdCh0YWcpO1xuICB9O1xuXG4gIFRhZ3MucHJvdG90eXBlLl9yZW1vdmVPbGRUYWdzID0gZnVuY3Rpb24gKF8pIHtcbiAgICB2YXIgdGFnID0gdGhpcy5fbGFzdFRhZztcblxuICAgIHZhciAkb3B0aW9ucyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnb3B0aW9uW2RhdGEtc2VsZWN0Mi10YWddJyk7XG5cbiAgICAkb3B0aW9ucy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJCh0aGlzKS5yZW1vdmUoKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVGFncztcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZGF0YS90b2tlbml6ZXInLFtcbiAgJ2pxdWVyeSdcbl0sIGZ1bmN0aW9uICgkKSB7XG4gIGZ1bmN0aW9uIFRva2VuaXplciAoZGVjb3JhdGVkLCAkZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciB0b2tlbml6ZXIgPSBvcHRpb25zLmdldCgndG9rZW5pemVyJyk7XG5cbiAgICBpZiAodG9rZW5pemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuICAgIH1cblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsICRlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIFRva2VuaXplci5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGNvbnRhaW5lciwgJGNvbnRhaW5lcikge1xuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsIGNvbnRhaW5lciwgJGNvbnRhaW5lcik7XG5cbiAgICB0aGlzLiRzZWFyY2ggPSAgY29udGFpbmVyLmRyb3Bkb3duLiRzZWFyY2ggfHwgY29udGFpbmVyLnNlbGVjdGlvbi4kc2VhcmNoIHx8XG4gICAgICAkY29udGFpbmVyLmZpbmQoJy5zZWxlY3QyLXNlYXJjaF9fZmllbGQnKTtcbiAgfTtcblxuICBUb2tlbml6ZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKGRlY29yYXRlZCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFuZFNlbGVjdCAoZGF0YSkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSBkYXRhIG9iamVjdCBzbyB3ZSBjYW4gdXNlIGl0IGZvciBjaGVja3NcbiAgICAgIHZhciBpdGVtID0gc2VsZi5fbm9ybWFsaXplSXRlbShkYXRhKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGEgb2JqZWN0IGFscmVhZHkgZXhpc3RzIGFzIGEgdGFnXG4gICAgICAvLyBTZWxlY3QgaXQgaWYgaXQgZG9lc24ndFxuICAgICAgdmFyICRleGlzdGluZ09wdGlvbnMgPSBzZWxmLiRlbGVtZW50LmZpbmQoJ29wdGlvbicpLmZpbHRlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAkKHRoaXMpLnZhbCgpID09PSBpdGVtLmlkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIGFuIGV4aXN0aW5nIG9wdGlvbiB3YXNuJ3QgZm91bmQgZm9yIGl0LCBjcmVhdGUgdGhlIG9wdGlvblxuICAgICAgaWYgKCEkZXhpc3RpbmdPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICB2YXIgJG9wdGlvbiA9IHNlbGYub3B0aW9uKGl0ZW0pO1xuICAgICAgICAkb3B0aW9uLmF0dHIoJ2RhdGEtc2VsZWN0Mi10YWcnLCB0cnVlKTtcblxuICAgICAgICBzZWxmLl9yZW1vdmVPbGRUYWdzKCk7XG4gICAgICAgIHNlbGYuYWRkT3B0aW9ucyhbJG9wdGlvbl0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWxlY3QgdGhlIGl0ZW0sIG5vdyB0aGF0IHdlIGtub3cgdGhlcmUgaXMgYW4gb3B0aW9uIGZvciBpdFxuICAgICAgc2VsZWN0KGl0ZW0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNlbGVjdCAoZGF0YSkge1xuICAgICAgc2VsZi50cmlnZ2VyKCdzZWxlY3QnLCB7XG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHBhcmFtcy50ZXJtID0gcGFyYW1zLnRlcm0gfHwgJyc7XG5cbiAgICB2YXIgdG9rZW5EYXRhID0gdGhpcy50b2tlbml6ZXIocGFyYW1zLCB0aGlzLm9wdGlvbnMsIGNyZWF0ZUFuZFNlbGVjdCk7XG5cbiAgICBpZiAodG9rZW5EYXRhLnRlcm0gIT09IHBhcmFtcy50ZXJtKSB7XG4gICAgICAvLyBSZXBsYWNlIHRoZSBzZWFyY2ggdGVybSBpZiB3ZSBoYXZlIHRoZSBzZWFyY2ggYm94XG4gICAgICBpZiAodGhpcy4kc2VhcmNoLmxlbmd0aCkge1xuICAgICAgICB0aGlzLiRzZWFyY2gudmFsKHRva2VuRGF0YS50ZXJtKTtcbiAgICAgICAgdGhpcy4kc2VhcmNoLmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICAgIHBhcmFtcy50ZXJtID0gdG9rZW5EYXRhLnRlcm07XG4gICAgfVxuXG4gICAgZGVjb3JhdGVkLmNhbGwodGhpcywgcGFyYW1zLCBjYWxsYmFjayk7XG4gIH07XG5cbiAgVG9rZW5pemVyLnByb3RvdHlwZS50b2tlbml6ZXIgPSBmdW5jdGlvbiAoXywgcGFyYW1zLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHZhciBzZXBhcmF0b3JzID0gb3B0aW9ucy5nZXQoJ3Rva2VuU2VwYXJhdG9ycycpIHx8IFtdO1xuICAgIHZhciB0ZXJtID0gcGFyYW1zLnRlcm07XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgdmFyIGNyZWF0ZVRhZyA9IHRoaXMuY3JlYXRlVGFnIHx8IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBwYXJhbXMudGVybSxcbiAgICAgICAgdGV4dDogcGFyYW1zLnRlcm1cbiAgICAgIH07XG4gICAgfTtcblxuICAgIHdoaWxlIChpIDwgdGVybS5sZW5ndGgpIHtcbiAgICAgIHZhciB0ZXJtQ2hhciA9IHRlcm1baV07XG5cbiAgICAgIGlmICgkLmluQXJyYXkodGVybUNoYXIsIHNlcGFyYXRvcnMpID09PSAtMSkge1xuICAgICAgICBpKys7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJ0ID0gdGVybS5zdWJzdHIoMCwgaSk7XG4gICAgICB2YXIgcGFydFBhcmFtcyA9ICQuZXh0ZW5kKHt9LCBwYXJhbXMsIHtcbiAgICAgICAgdGVybTogcGFydFxuICAgICAgfSk7XG5cbiAgICAgIHZhciBkYXRhID0gY3JlYXRlVGFnKHBhcnRQYXJhbXMpO1xuXG4gICAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuXG4gICAgICAvLyBSZXNldCB0aGUgdGVybSB0byBub3QgaW5jbHVkZSB0aGUgdG9rZW5pemVkIHBvcnRpb25cbiAgICAgIHRlcm0gPSB0ZXJtLnN1YnN0cihpICsgMSkgfHwgJyc7XG4gICAgICBpID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVybTogdGVybVxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIFRva2VuaXplcjtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZGF0YS9taW5pbXVtSW5wdXRMZW5ndGgnLFtcblxuXSwgZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNaW5pbXVtSW5wdXRMZW5ndGggKGRlY29yYXRlZCwgJGUsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm1pbmltdW1JbnB1dExlbmd0aCA9IG9wdGlvbnMuZ2V0KCdtaW5pbXVtSW5wdXRMZW5ndGgnKTtcblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsICRlLCBvcHRpb25zKTtcbiAgfVxuXG4gIE1pbmltdW1JbnB1dExlbmd0aC5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAoZGVjb3JhdGVkLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgcGFyYW1zLnRlcm0gPSBwYXJhbXMudGVybSB8fCAnJztcblxuICAgIGlmIChwYXJhbXMudGVybS5sZW5ndGggPCB0aGlzLm1pbmltdW1JbnB1dExlbmd0aCkge1xuICAgICAgdGhpcy50cmlnZ2VyKCdyZXN1bHRzOm1lc3NhZ2UnLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdpbnB1dFRvb1Nob3J0JyxcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIG1pbmltdW06IHRoaXMubWluaW11bUlucHV0TGVuZ3RoLFxuICAgICAgICAgIGlucHV0OiBwYXJhbXMudGVybSxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtc1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsIHBhcmFtcywgY2FsbGJhY2spO1xuICB9O1xuXG4gIHJldHVybiBNaW5pbXVtSW5wdXRMZW5ndGg7XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL2RhdGEvbWF4aW11bUlucHV0TGVuZ3RoJyxbXG5cbl0sIGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWF4aW11bUlucHV0TGVuZ3RoIChkZWNvcmF0ZWQsICRlLCBvcHRpb25zKSB7XG4gICAgdGhpcy5tYXhpbXVtSW5wdXRMZW5ndGggPSBvcHRpb25zLmdldCgnbWF4aW11bUlucHV0TGVuZ3RoJyk7XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCAkZSwgb3B0aW9ucyk7XG4gIH1cblxuICBNYXhpbXVtSW5wdXRMZW5ndGgucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKGRlY29yYXRlZCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgIHBhcmFtcy50ZXJtID0gcGFyYW1zLnRlcm0gfHwgJyc7XG5cbiAgICBpZiAodGhpcy5tYXhpbXVtSW5wdXRMZW5ndGggPiAwICYmXG4gICAgICAgIHBhcmFtcy50ZXJtLmxlbmd0aCA+IHRoaXMubWF4aW11bUlucHV0TGVuZ3RoKSB7XG4gICAgICB0aGlzLnRyaWdnZXIoJ3Jlc3VsdHM6bWVzc2FnZScsIHtcbiAgICAgICAgbWVzc2FnZTogJ2lucHV0VG9vTG9uZycsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBtYXhpbXVtOiB0aGlzLm1heGltdW1JbnB1dExlbmd0aCxcbiAgICAgICAgICBpbnB1dDogcGFyYW1zLnRlcm0sXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgfTtcblxuICByZXR1cm4gTWF4aW11bUlucHV0TGVuZ3RoO1xufSk7XG5cblMyLmRlZmluZSgnc2VsZWN0Mi9kYXRhL21heGltdW1TZWxlY3Rpb25MZW5ndGgnLFtcblxuXSwgZnVuY3Rpb24gKCl7XG4gIGZ1bmN0aW9uIE1heGltdW1TZWxlY3Rpb25MZW5ndGggKGRlY29yYXRlZCwgJGUsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm1heGltdW1TZWxlY3Rpb25MZW5ndGggPSBvcHRpb25zLmdldCgnbWF4aW11bVNlbGVjdGlvbkxlbmd0aCcpO1xuXG4gICAgZGVjb3JhdGVkLmNhbGwodGhpcywgJGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgTWF4aW11bVNlbGVjdGlvbkxlbmd0aC5wcm90b3R5cGUucXVlcnkgPVxuICAgIGZ1bmN0aW9uIChkZWNvcmF0ZWQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgdGhpcy5jdXJyZW50KGZ1bmN0aW9uIChjdXJyZW50RGF0YSkge1xuICAgICAgICB2YXIgY291bnQgPSBjdXJyZW50RGF0YSAhPSBudWxsID8gY3VycmVudERhdGEubGVuZ3RoIDogMDtcbiAgICAgICAgaWYgKHNlbGYubWF4aW11bVNlbGVjdGlvbkxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBjb3VudCA+PSBzZWxmLm1heGltdW1TZWxlY3Rpb25MZW5ndGgpIHtcbiAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3Jlc3VsdHM6bWVzc2FnZScsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdtYXhpbXVtU2VsZWN0ZWQnLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBtYXhpbXVtOiBzZWxmLm1heGltdW1TZWxlY3Rpb25MZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVjb3JhdGVkLmNhbGwoc2VsZiwgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gTWF4aW11bVNlbGVjdGlvbkxlbmd0aDtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZHJvcGRvd24nLFtcbiAgJ2pxdWVyeScsXG4gICcuL3V0aWxzJ1xuXSwgZnVuY3Rpb24gKCQsIFV0aWxzKSB7XG4gIGZ1bmN0aW9uIERyb3Bkb3duICgkZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgPSAkZWxlbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgRHJvcGRvd24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7XG4gIH1cblxuICBVdGlscy5FeHRlbmQoRHJvcGRvd24sIFV0aWxzLk9ic2VydmFibGUpO1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRkcm9wZG93biA9ICQoXG4gICAgICAnPHNwYW4gY2xhc3M9XCJzZWxlY3QyLWRyb3Bkb3duXCI+JyArXG4gICAgICAgICc8c3BhbiBjbGFzcz1cInNlbGVjdDItcmVzdWx0c1wiPjwvc3Bhbj4nICtcbiAgICAgICc8L3NwYW4+J1xuICAgICk7XG5cbiAgICAkZHJvcGRvd24uYXR0cignZGlyJywgdGhpcy5vcHRpb25zLmdldCgnZGlyJykpO1xuXG4gICAgdGhpcy4kZHJvcGRvd24gPSAkZHJvcGRvd247XG5cbiAgICByZXR1cm4gJGRyb3Bkb3duO1xuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLnBvc2l0aW9uID0gZnVuY3Rpb24gKCRkcm9wZG93biwgJGNvbnRhaW5lcikge1xuICAgIC8vIFNob3VsZCBiZSBpbXBsbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBSZW1vdmUgdGhlIGRyb3Bkb3duIGZyb20gdGhlIERPTVxuICAgIHRoaXMuJGRyb3Bkb3duLnJlbW92ZSgpO1xuICB9O1xuXG4gIHJldHVybiBEcm9wZG93bjtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZHJvcGRvd24vc2VhcmNoJyxbXG4gICdqcXVlcnknLFxuICAnLi4vdXRpbHMnXG5dLCBmdW5jdGlvbiAoJCwgVXRpbHMpIHtcbiAgZnVuY3Rpb24gU2VhcmNoICgpIHsgfVxuXG4gIFNlYXJjaC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGRlY29yYXRlZCkge1xuICAgIHZhciAkcmVuZGVyZWQgPSBkZWNvcmF0ZWQuY2FsbCh0aGlzKTtcblxuICAgIHZhciAkc2VhcmNoID0gJChcbiAgICAgICc8c3BhbiBjbGFzcz1cInNlbGVjdDItc2VhcmNoIHNlbGVjdDItc2VhcmNoLS1kcm9wZG93blwiPicgK1xuICAgICAgICAnPGlucHV0IGNsYXNzPVwic2VsZWN0Mi1zZWFyY2hfX2ZpZWxkXCIgdHlwZT1cInNlYXJjaFwiIHRhYmluZGV4PVwiLTFcIicgK1xuICAgICAgICAnIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGF1dG9jb3JyZWN0PVwib2ZmXCIgYXV0b2NhcGl0YWxpemU9XCJvZmZcIicgK1xuICAgICAgICAnIHNwZWxsY2hlY2s9XCJmYWxzZVwiIHJvbGU9XCJ0ZXh0Ym94XCIgLz4nICtcbiAgICAgICc8L3NwYW4+J1xuICAgICk7XG5cbiAgICB0aGlzLiRzZWFyY2hDb250YWluZXIgPSAkc2VhcmNoO1xuICAgIHRoaXMuJHNlYXJjaCA9ICRzZWFyY2guZmluZCgnaW5wdXQnKTtcblxuICAgICRyZW5kZXJlZC5wcmVwZW5kKCRzZWFyY2gpO1xuXG4gICAgcmV0dXJuICRyZW5kZXJlZDtcbiAgfTtcblxuICBTZWFyY2gucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoZGVjb3JhdGVkLCBjb250YWluZXIsICRjb250YWluZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBjb250YWluZXIsICRjb250YWluZXIpO1xuXG4gICAgdGhpcy4kc2VhcmNoLm9uKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgc2VsZi50cmlnZ2VyKCdrZXlwcmVzcycsIGV2dCk7XG5cbiAgICAgIHNlbGYuX2tleVVwUHJldmVudGVkID0gZXZ0LmlzRGVmYXVsdFByZXZlbnRlZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gV29ya2Fyb3VuZCBmb3IgYnJvd3NlcnMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlIGBpbnB1dGAgZXZlbnRcbiAgICAvLyBUaGlzIHdpbGwgcHJldmVudCBkb3VibGUtdHJpZ2dlcmluZyBvZiBldmVudHMgZm9yIGJyb3dzZXJzIHdoaWNoIHN1cHBvcnRcbiAgICAvLyBib3RoIHRoZSBga2V5dXBgIGFuZCBgaW5wdXRgIGV2ZW50cy5cbiAgICB0aGlzLiRzZWFyY2gub24oJ2lucHV0JywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgLy8gVW5iaW5kIHRoZSBkdXBsaWNhdGVkIGBrZXl1cGAgZXZlbnRcbiAgICAgICQodGhpcykub2ZmKCdrZXl1cCcpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kc2VhcmNoLm9uKCdrZXl1cCBpbnB1dCcsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHNlbGYuaGFuZGxlU2VhcmNoKGV2dCk7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ29wZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLiRzZWFyY2guYXR0cigndGFiaW5kZXgnLCAwKTtcblxuICAgICAgc2VsZi4kc2VhcmNoLmZvY3VzKCk7XG5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi4kc2VhcmNoLmZvY3VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9KTtcblxuICAgIGNvbnRhaW5lci5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLiRzZWFyY2guYXR0cigndGFiaW5kZXgnLCAtMSk7XG5cbiAgICAgIHNlbGYuJHNlYXJjaC52YWwoJycpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdmb2N1cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjb250YWluZXIuaXNPcGVuKCkpIHtcbiAgICAgICAgc2VsZi4kc2VhcmNoLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ3Jlc3VsdHM6YWxsJywgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgaWYgKHBhcmFtcy5xdWVyeS50ZXJtID09IG51bGwgfHwgcGFyYW1zLnF1ZXJ5LnRlcm0gPT09ICcnKSB7XG4gICAgICAgIHZhciBzaG93U2VhcmNoID0gc2VsZi5zaG93U2VhcmNoKHBhcmFtcyk7XG5cbiAgICAgICAgaWYgKHNob3dTZWFyY2gpIHtcbiAgICAgICAgICBzZWxmLiRzZWFyY2hDb250YWluZXIucmVtb3ZlQ2xhc3MoJ3NlbGVjdDItc2VhcmNoLS1oaWRlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi4kc2VhcmNoQ29udGFpbmVyLmFkZENsYXNzKCdzZWxlY3QyLXNlYXJjaC0taGlkZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgU2VhcmNoLnByb3RvdHlwZS5oYW5kbGVTZWFyY2ggPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaWYgKCF0aGlzLl9rZXlVcFByZXZlbnRlZCkge1xuICAgICAgdmFyIGlucHV0ID0gdGhpcy4kc2VhcmNoLnZhbCgpO1xuXG4gICAgICB0aGlzLnRyaWdnZXIoJ3F1ZXJ5Jywge1xuICAgICAgICB0ZXJtOiBpbnB1dFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fa2V5VXBQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBTZWFyY2gucHJvdG90eXBlLnNob3dTZWFyY2ggPSBmdW5jdGlvbiAoXywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgcmV0dXJuIFNlYXJjaDtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZHJvcGRvd24vaGlkZVBsYWNlaG9sZGVyJyxbXG5cbl0sIGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSGlkZVBsYWNlaG9sZGVyIChkZWNvcmF0ZWQsICRlbGVtZW50LCBvcHRpb25zLCBkYXRhQWRhcHRlcikge1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLm5vcm1hbGl6ZVBsYWNlaG9sZGVyKG9wdGlvbnMuZ2V0KCdwbGFjZWhvbGRlcicpKTtcblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsICRlbGVtZW50LCBvcHRpb25zLCBkYXRhQWRhcHRlcik7XG4gIH1cblxuICBIaWRlUGxhY2Vob2xkZXIucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGRhdGEpIHtcbiAgICBkYXRhLnJlc3VsdHMgPSB0aGlzLnJlbW92ZVBsYWNlaG9sZGVyKGRhdGEucmVzdWx0cyk7XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBkYXRhKTtcbiAgfTtcblxuICBIaWRlUGxhY2Vob2xkZXIucHJvdG90eXBlLm5vcm1hbGl6ZVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKF8sIHBsYWNlaG9sZGVyKSB7XG4gICAgaWYgKHR5cGVvZiBwbGFjZWhvbGRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBsYWNlaG9sZGVyID0ge1xuICAgICAgICBpZDogJycsXG4gICAgICAgIHRleHQ6IHBsYWNlaG9sZGVyXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgfTtcblxuICBIaWRlUGxhY2Vob2xkZXIucHJvdG90eXBlLnJlbW92ZVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKF8sIGRhdGEpIHtcbiAgICB2YXIgbW9kaWZpZWREYXRhID0gZGF0YS5zbGljZSgwKTtcblxuICAgIGZvciAodmFyIGQgPSBkYXRhLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICB2YXIgaXRlbSA9IGRhdGFbZF07XG5cbiAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyLmlkID09PSBpdGVtLmlkKSB7XG4gICAgICAgIG1vZGlmaWVkRGF0YS5zcGxpY2UoZCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGlmaWVkRGF0YTtcbiAgfTtcblxuICByZXR1cm4gSGlkZVBsYWNlaG9sZGVyO1xufSk7XG5cblMyLmRlZmluZSgnc2VsZWN0Mi9kcm9wZG93bi9pbmZpbml0ZVNjcm9sbCcsW1xuICAnanF1ZXJ5J1xuXSwgZnVuY3Rpb24gKCQpIHtcbiAgZnVuY3Rpb24gSW5maW5pdGVTY3JvbGwgKGRlY29yYXRlZCwgJGVsZW1lbnQsIG9wdGlvbnMsIGRhdGFBZGFwdGVyKSB7XG4gICAgdGhpcy5sYXN0UGFyYW1zID0ge307XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCAkZWxlbWVudCwgb3B0aW9ucywgZGF0YUFkYXB0ZXIpO1xuXG4gICAgdGhpcy4kbG9hZGluZ01vcmUgPSB0aGlzLmNyZWF0ZUxvYWRpbmdNb3JlKCk7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBJbmZpbml0ZVNjcm9sbC5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGRlY29yYXRlZCwgZGF0YSkge1xuICAgIHRoaXMuJGxvYWRpbmdNb3JlLnJlbW92ZSgpO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgZGVjb3JhdGVkLmNhbGwodGhpcywgZGF0YSk7XG5cbiAgICBpZiAodGhpcy5zaG93TG9hZGluZ01vcmUoZGF0YSkpIHtcbiAgICAgIHRoaXMuJHJlc3VsdHMuYXBwZW5kKHRoaXMuJGxvYWRpbmdNb3JlKTtcbiAgICB9XG4gIH07XG5cbiAgSW5maW5pdGVTY3JvbGwucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoZGVjb3JhdGVkLCBjb250YWluZXIsICRjb250YWluZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBjb250YWluZXIsICRjb250YWluZXIpO1xuXG4gICAgY29udGFpbmVyLm9uKCdxdWVyeScsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHNlbGYubGFzdFBhcmFtcyA9IHBhcmFtcztcbiAgICAgIHNlbGYubG9hZGluZyA9IHRydWU7XG4gICAgfSk7XG5cbiAgICBjb250YWluZXIub24oJ3F1ZXJ5OmFwcGVuZCcsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgIHNlbGYubGFzdFBhcmFtcyA9IHBhcmFtcztcbiAgICAgIHNlbGYubG9hZGluZyA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRyZXN1bHRzLm9uKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaXNMb2FkTW9yZVZpc2libGUgPSAkLmNvbnRhaW5zKFxuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgIHNlbGYuJGxvYWRpbmdNb3JlWzBdXG4gICAgICApO1xuXG4gICAgICBpZiAoc2VsZi5sb2FkaW5nIHx8ICFpc0xvYWRNb3JlVmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gc2VsZi4kcmVzdWx0cy5vZmZzZXQoKS50b3AgK1xuICAgICAgICBzZWxmLiRyZXN1bHRzLm91dGVySGVpZ2h0KGZhbHNlKTtcbiAgICAgIHZhciBsb2FkaW5nTW9yZU9mZnNldCA9IHNlbGYuJGxvYWRpbmdNb3JlLm9mZnNldCgpLnRvcCArXG4gICAgICAgIHNlbGYuJGxvYWRpbmdNb3JlLm91dGVySGVpZ2h0KGZhbHNlKTtcblxuICAgICAgaWYgKGN1cnJlbnRPZmZzZXQgKyA1MCA+PSBsb2FkaW5nTW9yZU9mZnNldCkge1xuICAgICAgICBzZWxmLmxvYWRNb3JlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgSW5maW5pdGVTY3JvbGwucHJvdG90eXBlLmxvYWRNb3JlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICB2YXIgcGFyYW1zID0gJC5leHRlbmQoe30sIHtwYWdlOiAxfSwgdGhpcy5sYXN0UGFyYW1zKTtcblxuICAgIHBhcmFtcy5wYWdlKys7XG5cbiAgICB0aGlzLnRyaWdnZXIoJ3F1ZXJ5OmFwcGVuZCcsIHBhcmFtcyk7XG4gIH07XG5cbiAgSW5maW5pdGVTY3JvbGwucHJvdG90eXBlLnNob3dMb2FkaW5nTW9yZSA9IGZ1bmN0aW9uIChfLCBkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEucGFnaW5hdGlvbiAmJiBkYXRhLnBhZ2luYXRpb24ubW9yZTtcbiAgfTtcblxuICBJbmZpbml0ZVNjcm9sbC5wcm90b3R5cGUuY3JlYXRlTG9hZGluZ01vcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRvcHRpb24gPSAkKFxuICAgICAgJzxsaSAnICtcbiAgICAgICdjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9uIHNlbGVjdDItcmVzdWx0c19fb3B0aW9uLS1sb2FkLW1vcmVcIicgK1xuICAgICAgJ3JvbGU9XCJ0cmVlaXRlbVwiIGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCI+PC9saT4nXG4gICAgKTtcblxuICAgIHZhciBtZXNzYWdlID0gdGhpcy5vcHRpb25zLmdldCgndHJhbnNsYXRpb25zJykuZ2V0KCdsb2FkaW5nTW9yZScpO1xuXG4gICAgJG9wdGlvbi5odG1sKG1lc3NhZ2UodGhpcy5sYXN0UGFyYW1zKSk7XG5cbiAgICByZXR1cm4gJG9wdGlvbjtcbiAgfTtcblxuICByZXR1cm4gSW5maW5pdGVTY3JvbGw7XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL2Ryb3Bkb3duL2F0dGFjaEJvZHknLFtcbiAgJ2pxdWVyeScsXG4gICcuLi91dGlscydcbl0sIGZ1bmN0aW9uICgkLCBVdGlscykge1xuICBmdW5jdGlvbiBBdHRhY2hCb2R5IChkZWNvcmF0ZWQsICRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy4kZHJvcGRvd25QYXJlbnQgPSBvcHRpb25zLmdldCgnZHJvcGRvd25QYXJlbnQnKSB8fCAkKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgZGVjb3JhdGVkLmNhbGwodGhpcywgJGVsZW1lbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgQXR0YWNoQm9keS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGNvbnRhaW5lciwgJGNvbnRhaW5lcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBzZXR1cFJlc3VsdHNFdmVudHMgPSBmYWxzZTtcblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsIGNvbnRhaW5lciwgJGNvbnRhaW5lcik7XG5cbiAgICBjb250YWluZXIub24oJ29wZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9zaG93RHJvcGRvd24oKTtcbiAgICAgIHNlbGYuX2F0dGFjaFBvc2l0aW9uaW5nSGFuZGxlcihjb250YWluZXIpO1xuXG4gICAgICBpZiAoIXNldHVwUmVzdWx0c0V2ZW50cykge1xuICAgICAgICBzZXR1cFJlc3VsdHNFdmVudHMgPSB0cnVlO1xuXG4gICAgICAgIGNvbnRhaW5lci5vbigncmVzdWx0czphbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5fcG9zaXRpb25Ecm9wZG93bigpO1xuICAgICAgICAgIHNlbGYuX3Jlc2l6ZURyb3Bkb3duKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRhaW5lci5vbigncmVzdWx0czphcHBlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5fcG9zaXRpb25Ecm9wZG93bigpO1xuICAgICAgICAgIHNlbGYuX3Jlc2l6ZURyb3Bkb3duKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX2hpZGVEcm9wZG93bigpO1xuICAgICAgc2VsZi5fZGV0YWNoUG9zaXRpb25pbmdIYW5kbGVyKGNvbnRhaW5lcik7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRkcm9wZG93bkNvbnRhaW5lci5vbignbW91c2Vkb3duJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICB9O1xuXG4gIEF0dGFjaEJvZHkucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZGVjb3JhdGVkKSB7XG4gICAgZGVjb3JhdGVkLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLiRkcm9wZG93bkNvbnRhaW5lci5yZW1vdmUoKTtcbiAgfTtcblxuICBBdHRhY2hCb2R5LnByb3RvdHlwZS5wb3NpdGlvbiA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsICRkcm9wZG93biwgJGNvbnRhaW5lcikge1xuICAgIC8vIENsb25lIGFsbCBvZiB0aGUgY29udGFpbmVyIGNsYXNzZXNcbiAgICAkZHJvcGRvd24uYXR0cignY2xhc3MnLCAkY29udGFpbmVyLmF0dHIoJ2NsYXNzJykpO1xuXG4gICAgJGRyb3Bkb3duLnJlbW92ZUNsYXNzKCdzZWxlY3QyJyk7XG4gICAgJGRyb3Bkb3duLmFkZENsYXNzKCdzZWxlY3QyLWNvbnRhaW5lci0tb3BlbicpO1xuXG4gICAgJGRyb3Bkb3duLmNzcyh7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHRvcDogLTk5OTk5OVxuICAgIH0pO1xuXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcbiAgfTtcblxuICBBdHRhY2hCb2R5LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoZGVjb3JhdGVkKSB7XG4gICAgdmFyICRjb250YWluZXIgPSAkKCc8c3Bhbj48L3NwYW4+Jyk7XG5cbiAgICB2YXIgJGRyb3Bkb3duID0gZGVjb3JhdGVkLmNhbGwodGhpcyk7XG4gICAgJGNvbnRhaW5lci5hcHBlbmQoJGRyb3Bkb3duKTtcblxuICAgIHRoaXMuJGRyb3Bkb3duQ29udGFpbmVyID0gJGNvbnRhaW5lcjtcblxuICAgIHJldHVybiAkY29udGFpbmVyO1xuICB9O1xuXG4gIEF0dGFjaEJvZHkucHJvdG90eXBlLl9oaWRlRHJvcGRvd24gPSBmdW5jdGlvbiAoZGVjb3JhdGVkKSB7XG4gICAgdGhpcy4kZHJvcGRvd25Db250YWluZXIuZGV0YWNoKCk7XG4gIH07XG5cbiAgQXR0YWNoQm9keS5wcm90b3R5cGUuX2F0dGFjaFBvc2l0aW9uaW5nSGFuZGxlciA9XG4gICAgICBmdW5jdGlvbiAoZGVjb3JhdGVkLCBjb250YWluZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgc2Nyb2xsRXZlbnQgPSAnc2Nyb2xsLnNlbGVjdDIuJyArIGNvbnRhaW5lci5pZDtcbiAgICB2YXIgcmVzaXplRXZlbnQgPSAncmVzaXplLnNlbGVjdDIuJyArIGNvbnRhaW5lci5pZDtcbiAgICB2YXIgb3JpZW50YXRpb25FdmVudCA9ICdvcmllbnRhdGlvbmNoYW5nZS5zZWxlY3QyLicgKyBjb250YWluZXIuaWQ7XG5cbiAgICB2YXIgJHdhdGNoZXJzID0gdGhpcy4kY29udGFpbmVyLnBhcmVudHMoKS5maWx0ZXIoVXRpbHMuaGFzU2Nyb2xsKTtcbiAgICAkd2F0Y2hlcnMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmRhdGEoJ3NlbGVjdDItc2Nyb2xsLXBvc2l0aW9uJywge1xuICAgICAgICB4OiAkKHRoaXMpLnNjcm9sbExlZnQoKSxcbiAgICAgICAgeTogJCh0aGlzKS5zY3JvbGxUb3AoKVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAkd2F0Y2hlcnMub24oc2Nyb2xsRXZlbnQsIGZ1bmN0aW9uIChldikge1xuICAgICAgdmFyIHBvc2l0aW9uID0gJCh0aGlzKS5kYXRhKCdzZWxlY3QyLXNjcm9sbC1wb3NpdGlvbicpO1xuICAgICAgJCh0aGlzKS5zY3JvbGxUb3AocG9zaXRpb24ueSk7XG4gICAgfSk7XG5cbiAgICAkKHdpbmRvdykub24oc2Nyb2xsRXZlbnQgKyAnICcgKyByZXNpemVFdmVudCArICcgJyArIG9yaWVudGF0aW9uRXZlbnQsXG4gICAgICBmdW5jdGlvbiAoZSkge1xuICAgICAgc2VsZi5fcG9zaXRpb25Ecm9wZG93bigpO1xuICAgICAgc2VsZi5fcmVzaXplRHJvcGRvd24oKTtcbiAgICB9KTtcbiAgfTtcblxuICBBdHRhY2hCb2R5LnByb3RvdHlwZS5fZGV0YWNoUG9zaXRpb25pbmdIYW5kbGVyID1cbiAgICAgIGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGNvbnRhaW5lcikge1xuICAgIHZhciBzY3JvbGxFdmVudCA9ICdzY3JvbGwuc2VsZWN0Mi4nICsgY29udGFpbmVyLmlkO1xuICAgIHZhciByZXNpemVFdmVudCA9ICdyZXNpemUuc2VsZWN0Mi4nICsgY29udGFpbmVyLmlkO1xuICAgIHZhciBvcmllbnRhdGlvbkV2ZW50ID0gJ29yaWVudGF0aW9uY2hhbmdlLnNlbGVjdDIuJyArIGNvbnRhaW5lci5pZDtcblxuICAgIHZhciAkd2F0Y2hlcnMgPSB0aGlzLiRjb250YWluZXIucGFyZW50cygpLmZpbHRlcihVdGlscy5oYXNTY3JvbGwpO1xuICAgICR3YXRjaGVycy5vZmYoc2Nyb2xsRXZlbnQpO1xuXG4gICAgJCh3aW5kb3cpLm9mZihzY3JvbGxFdmVudCArICcgJyArIHJlc2l6ZUV2ZW50ICsgJyAnICsgb3JpZW50YXRpb25FdmVudCk7XG4gIH07XG5cbiAgQXR0YWNoQm9keS5wcm90b3R5cGUuX3Bvc2l0aW9uRHJvcGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICR3aW5kb3cgPSAkKHdpbmRvdyk7XG5cbiAgICB2YXIgaXNDdXJyZW50bHlBYm92ZSA9IHRoaXMuJGRyb3Bkb3duLmhhc0NsYXNzKCdzZWxlY3QyLWRyb3Bkb3duLS1hYm92ZScpO1xuICAgIHZhciBpc0N1cnJlbnRseUJlbG93ID0gdGhpcy4kZHJvcGRvd24uaGFzQ2xhc3MoJ3NlbGVjdDItZHJvcGRvd24tLWJlbG93Jyk7XG5cbiAgICB2YXIgbmV3RGlyZWN0aW9uID0gbnVsbDtcblxuICAgIHZhciBvZmZzZXQgPSB0aGlzLiRjb250YWluZXIub2Zmc2V0KCk7XG5cbiAgICBvZmZzZXQuYm90dG9tID0gb2Zmc2V0LnRvcCArIHRoaXMuJGNvbnRhaW5lci5vdXRlckhlaWdodChmYWxzZSk7XG5cbiAgICB2YXIgY29udGFpbmVyID0ge1xuICAgICAgaGVpZ2h0OiB0aGlzLiRjb250YWluZXIub3V0ZXJIZWlnaHQoZmFsc2UpXG4gICAgfTtcblxuICAgIGNvbnRhaW5lci50b3AgPSBvZmZzZXQudG9wO1xuICAgIGNvbnRhaW5lci5ib3R0b20gPSBvZmZzZXQudG9wICsgY29udGFpbmVyLmhlaWdodDtcblxuICAgIHZhciBkcm9wZG93biA9IHtcbiAgICAgIGhlaWdodDogdGhpcy4kZHJvcGRvd24ub3V0ZXJIZWlnaHQoZmFsc2UpXG4gICAgfTtcblxuICAgIHZhciB2aWV3cG9ydCA9IHtcbiAgICAgIHRvcDogJHdpbmRvdy5zY3JvbGxUb3AoKSxcbiAgICAgIGJvdHRvbTogJHdpbmRvdy5zY3JvbGxUb3AoKSArICR3aW5kb3cuaGVpZ2h0KClcbiAgICB9O1xuXG4gICAgdmFyIGVub3VnaFJvb21BYm92ZSA9IHZpZXdwb3J0LnRvcCA8IChvZmZzZXQudG9wIC0gZHJvcGRvd24uaGVpZ2h0KTtcbiAgICB2YXIgZW5vdWdoUm9vbUJlbG93ID0gdmlld3BvcnQuYm90dG9tID4gKG9mZnNldC5ib3R0b20gKyBkcm9wZG93bi5oZWlnaHQpO1xuXG4gICAgdmFyIGNzcyA9IHtcbiAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0LFxuICAgICAgdG9wOiBjb250YWluZXIuYm90dG9tXG4gICAgfTtcblxuICAgIC8vIERldGVybWluZSB3aGF0IHRoZSBwYXJlbnQgZWxlbWVudCBpcyB0byB1c2UgZm9yIGNhbGNpdWxhdGluZyB0aGUgb2Zmc2V0XG4gICAgdmFyICRvZmZzZXRQYXJlbnQgPSB0aGlzLiRkcm9wZG93blBhcmVudDtcblxuICAgIC8vIEZvciBzdGF0aWNhbGx5IHBvc2l0b25lZCBlbGVtZW50cywgd2UgbmVlZCB0byBnZXQgdGhlIGVsZW1lbnRcbiAgICAvLyB0aGF0IGlzIGRldGVybWluaW5nIHRoZSBvZmZzZXRcbiAgICBpZiAoJG9mZnNldFBhcmVudC5jc3MoJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICAkb2Zmc2V0UGFyZW50ID0gJG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQoKTtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50T2Zmc2V0ID0gJG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblxuICAgIGNzcy50b3AgLT0gcGFyZW50T2Zmc2V0LnRvcDtcbiAgICBjc3MubGVmdCAtPSBwYXJlbnRPZmZzZXQubGVmdDtcblxuICAgIGlmICghaXNDdXJyZW50bHlBYm92ZSAmJiAhaXNDdXJyZW50bHlCZWxvdykge1xuICAgICAgbmV3RGlyZWN0aW9uID0gJ2JlbG93JztcbiAgICB9XG5cbiAgICBpZiAoIWVub3VnaFJvb21CZWxvdyAmJiBlbm91Z2hSb29tQWJvdmUgJiYgIWlzQ3VycmVudGx5QWJvdmUpIHtcbiAgICAgIG5ld0RpcmVjdGlvbiA9ICdhYm92ZSc7XG4gICAgfSBlbHNlIGlmICghZW5vdWdoUm9vbUFib3ZlICYmIGVub3VnaFJvb21CZWxvdyAmJiBpc0N1cnJlbnRseUFib3ZlKSB7XG4gICAgICBuZXdEaXJlY3Rpb24gPSAnYmVsb3cnO1xuICAgIH1cblxuICAgIGlmIChuZXdEaXJlY3Rpb24gPT0gJ2Fib3ZlJyB8fFxuICAgICAgKGlzQ3VycmVudGx5QWJvdmUgJiYgbmV3RGlyZWN0aW9uICE9PSAnYmVsb3cnKSkge1xuICAgICAgY3NzLnRvcCA9IGNvbnRhaW5lci50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0gZHJvcGRvd24uaGVpZ2h0O1xuICAgIH1cblxuICAgIGlmIChuZXdEaXJlY3Rpb24gIT0gbnVsbCkge1xuICAgICAgdGhpcy4kZHJvcGRvd25cbiAgICAgICAgLnJlbW92ZUNsYXNzKCdzZWxlY3QyLWRyb3Bkb3duLS1iZWxvdyBzZWxlY3QyLWRyb3Bkb3duLS1hYm92ZScpXG4gICAgICAgIC5hZGRDbGFzcygnc2VsZWN0Mi1kcm9wZG93bi0tJyArIG5ld0RpcmVjdGlvbik7XG4gICAgICB0aGlzLiRjb250YWluZXJcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdzZWxlY3QyLWNvbnRhaW5lci0tYmVsb3cgc2VsZWN0Mi1jb250YWluZXItLWFib3ZlJylcbiAgICAgICAgLmFkZENsYXNzKCdzZWxlY3QyLWNvbnRhaW5lci0tJyArIG5ld0RpcmVjdGlvbik7XG4gICAgfVxuXG4gICAgdGhpcy4kZHJvcGRvd25Db250YWluZXIuY3NzKGNzcyk7XG4gIH07XG5cbiAgQXR0YWNoQm9keS5wcm90b3R5cGUuX3Jlc2l6ZURyb3Bkb3duID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjc3MgPSB7XG4gICAgICB3aWR0aDogdGhpcy4kY29udGFpbmVyLm91dGVyV2lkdGgoZmFsc2UpICsgJ3B4J1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmdldCgnZHJvcGRvd25BdXRvV2lkdGgnKSkge1xuICAgICAgY3NzLm1pbldpZHRoID0gY3NzLndpZHRoO1xuICAgICAgY3NzLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgIGNzcy53aWR0aCA9ICdhdXRvJztcbiAgICB9XG5cbiAgICB0aGlzLiRkcm9wZG93bi5jc3MoY3NzKTtcbiAgfTtcblxuICBBdHRhY2hCb2R5LnByb3RvdHlwZS5fc2hvd0Ryb3Bkb3duID0gZnVuY3Rpb24gKGRlY29yYXRlZCkge1xuICAgIHRoaXMuJGRyb3Bkb3duQ29udGFpbmVyLmFwcGVuZFRvKHRoaXMuJGRyb3Bkb3duUGFyZW50KTtcblxuICAgIHRoaXMuX3Bvc2l0aW9uRHJvcGRvd24oKTtcbiAgICB0aGlzLl9yZXNpemVEcm9wZG93bigpO1xuICB9O1xuXG4gIHJldHVybiBBdHRhY2hCb2R5O1xufSk7XG5cblMyLmRlZmluZSgnc2VsZWN0Mi9kcm9wZG93bi9taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCcsW1xuXG5dLCBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGNvdW50UmVzdWx0cyAoZGF0YSkge1xuICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICBmb3IgKHZhciBkID0gMDsgZCA8IGRhdGEubGVuZ3RoOyBkKyspIHtcbiAgICAgIHZhciBpdGVtID0gZGF0YVtkXTtcblxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgY291bnQgKz0gY291bnRSZXN1bHRzKGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICBmdW5jdGlvbiBNaW5pbXVtUmVzdWx0c0ZvclNlYXJjaCAoZGVjb3JhdGVkLCAkZWxlbWVudCwgb3B0aW9ucywgZGF0YUFkYXB0ZXIpIHtcbiAgICB0aGlzLm1pbmltdW1SZXN1bHRzRm9yU2VhcmNoID0gb3B0aW9ucy5nZXQoJ21pbmltdW1SZXN1bHRzRm9yU2VhcmNoJyk7XG5cbiAgICBpZiAodGhpcy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCA8IDApIHtcbiAgICAgIHRoaXMubWluaW11bVJlc3VsdHNGb3JTZWFyY2ggPSBJbmZpbml0eTtcbiAgICB9XG5cbiAgICBkZWNvcmF0ZWQuY2FsbCh0aGlzLCAkZWxlbWVudCwgb3B0aW9ucywgZGF0YUFkYXB0ZXIpO1xuICB9XG5cbiAgTWluaW11bVJlc3VsdHNGb3JTZWFyY2gucHJvdG90eXBlLnNob3dTZWFyY2ggPSBmdW5jdGlvbiAoZGVjb3JhdGVkLCBwYXJhbXMpIHtcbiAgICBpZiAoY291bnRSZXN1bHRzKHBhcmFtcy5kYXRhLnJlc3VsdHMpIDwgdGhpcy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0ZWQuY2FsbCh0aGlzLCBwYXJhbXMpO1xuICB9O1xuXG4gIHJldHVybiBNaW5pbXVtUmVzdWx0c0ZvclNlYXJjaDtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZHJvcGRvd24vc2VsZWN0T25DbG9zZScsW1xuXG5dLCBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNlbGVjdE9uQ2xvc2UgKCkgeyB9XG5cbiAgU2VsZWN0T25DbG9zZS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGNvbnRhaW5lciwgJGNvbnRhaW5lcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsIGNvbnRhaW5lciwgJGNvbnRhaW5lcik7XG5cbiAgICBjb250YWluZXIub24oJ2Nsb3NlJywgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgc2VsZi5faGFuZGxlU2VsZWN0T25DbG9zZShwYXJhbXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIFNlbGVjdE9uQ2xvc2UucHJvdG90eXBlLl9oYW5kbGVTZWxlY3RPbkNsb3NlID0gZnVuY3Rpb24gKF8sIHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLm9yaWdpbmFsU2VsZWN0MkV2ZW50ICE9IG51bGwpIHtcbiAgICAgIHZhciBldmVudCA9IHBhcmFtcy5vcmlnaW5hbFNlbGVjdDJFdmVudDtcblxuICAgICAgLy8gRG9uJ3Qgc2VsZWN0IGFuIGl0ZW0gaWYgdGhlIGNsb3NlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgZnJvbSBhIHNlbGVjdCBvclxuICAgICAgLy8gdW5zZWxlY3QgZXZlbnRcbiAgICAgIGlmIChldmVudC5fdHlwZSA9PT0gJ3NlbGVjdCcgfHwgZXZlbnQuX3R5cGUgPT09ICd1bnNlbGVjdCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciAkaGlnaGxpZ2h0ZWRSZXN1bHRzID0gdGhpcy5nZXRIaWdobGlnaHRlZFJlc3VsdHMoKTtcblxuICAgIC8vIE9ubHkgc2VsZWN0IGhpZ2hsaWdodGVkIHJlc3VsdHNcbiAgICBpZiAoJGhpZ2hsaWdodGVkUmVzdWx0cy5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSAkaGlnaGxpZ2h0ZWRSZXN1bHRzLmRhdGEoJ2RhdGEnKTtcblxuICAgIC8vIERvbid0IHJlLXNlbGVjdCBhbHJlYWR5IHNlbGVjdGVkIHJlc3VsdGVcbiAgICBpZiAoXG4gICAgICAoZGF0YS5lbGVtZW50ICE9IG51bGwgJiYgZGF0YS5lbGVtZW50LnNlbGVjdGVkKSB8fFxuICAgICAgKGRhdGEuZWxlbWVudCA9PSBudWxsICYmIGRhdGEuc2VsZWN0ZWQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyKCdzZWxlY3QnLCB7XG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gU2VsZWN0T25DbG9zZTtcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvZHJvcGRvd24vY2xvc2VPblNlbGVjdCcsW1xuXG5dLCBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENsb3NlT25TZWxlY3QgKCkgeyB9XG5cbiAgQ2xvc2VPblNlbGVjdC5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChkZWNvcmF0ZWQsIGNvbnRhaW5lciwgJGNvbnRhaW5lcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGRlY29yYXRlZC5jYWxsKHRoaXMsIGNvbnRhaW5lciwgJGNvbnRhaW5lcik7XG5cbiAgICBjb250YWluZXIub24oJ3NlbGVjdCcsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHNlbGYuX3NlbGVjdFRyaWdnZXJlZChldnQpO1xuICAgIH0pO1xuXG4gICAgY29udGFpbmVyLm9uKCd1bnNlbGVjdCcsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHNlbGYuX3NlbGVjdFRyaWdnZXJlZChldnQpO1xuICAgIH0pO1xuICB9O1xuXG4gIENsb3NlT25TZWxlY3QucHJvdG90eXBlLl9zZWxlY3RUcmlnZ2VyZWQgPSBmdW5jdGlvbiAoXywgZXZ0KSB7XG4gICAgdmFyIG9yaWdpbmFsRXZlbnQgPSBldnQub3JpZ2luYWxFdmVudDtcblxuICAgIC8vIERvbid0IGNsb3NlIGlmIHRoZSBjb250cm9sIGtleSBpcyBiZWluZyBoZWxkXG4gICAgaWYgKG9yaWdpbmFsRXZlbnQgJiYgb3JpZ2luYWxFdmVudC5jdHJsS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyKCdjbG9zZScsIHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnQsXG4gICAgICBvcmlnaW5hbFNlbGVjdDJFdmVudDogZXZ0XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIENsb3NlT25TZWxlY3Q7XG59KTtcblxuUzIuZGVmaW5lKCdzZWxlY3QyL2kxOG4vZW4nLFtdLGZ1bmN0aW9uICgpIHtcbiAgLy8gRW5nbGlzaFxuICByZXR1cm4ge1xuICAgIGVycm9yTG9hZGluZzogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICdUaGUgcmVzdWx0cyBjb3VsZCBub3QgYmUgbG9hZGVkLic7XG4gICAgfSxcbiAgICBpbnB1dFRvb0xvbmc6IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICB2YXIgb3ZlckNoYXJzID0gYXJncy5pbnB1dC5sZW5ndGggLSBhcmdzLm1heGltdW07XG5cbiAgICAgIHZhciBtZXNzYWdlID0gJ1BsZWFzZSBkZWxldGUgJyArIG92ZXJDaGFycyArICcgY2hhcmFjdGVyJztcblxuICAgICAgaWYgKG92ZXJDaGFycyAhPSAxKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gJ3MnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuICAgIGlucHV0VG9vU2hvcnQ6IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICB2YXIgcmVtYWluaW5nQ2hhcnMgPSBhcmdzLm1pbmltdW0gLSBhcmdzLmlucHV0Lmxlbmd0aDtcblxuICAgICAgdmFyIG1lc3NhZ2UgPSAnUGxlYXNlIGVudGVyICcgKyByZW1haW5pbmdDaGFycyArICcgb3IgbW9yZSBjaGFyYWN0ZXJzJztcblxuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcbiAgICBsb2FkaW5nTW9yZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICdMb2FkaW5nIG1vcmUgcmVzdWx0c+KApic7XG4gICAgfSxcbiAgICBtYXhpbXVtU2VsZWN0ZWQ6IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdZb3UgY2FuIG9ubHkgc2VsZWN0ICcgKyBhcmdzLm1heGltdW0gKyAnIGl0ZW0nO1xuXG4gICAgICBpZiAoYXJncy5tYXhpbXVtICE9IDEpIHtcbiAgICAgICAgbWVzc2FnZSArPSAncyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0sXG4gICAgbm9SZXN1bHRzOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJ05vIHJlc3VsdHMgZm91bmQnO1xuICAgIH0sXG4gICAgc2VhcmNoaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJ1NlYXJjaGluZ+KApic7XG4gICAgfVxuICB9O1xufSk7XG5cblMyLmRlZmluZSgnc2VsZWN0Mi9kZWZhdWx0cycsW1xuICAnanF1ZXJ5JyxcbiAgJ3JlcXVpcmUnLFxuXG4gICcuL3Jlc3VsdHMnLFxuXG4gICcuL3NlbGVjdGlvbi9zaW5nbGUnLFxuICAnLi9zZWxlY3Rpb24vbXVsdGlwbGUnLFxuICAnLi9zZWxlY3Rpb24vcGxhY2Vob2xkZXInLFxuICAnLi9zZWxlY3Rpb24vYWxsb3dDbGVhcicsXG4gICcuL3NlbGVjdGlvbi9zZWFyY2gnLFxuICAnLi9zZWxlY3Rpb24vZXZlbnRSZWxheScsXG5cbiAgJy4vdXRpbHMnLFxuICAnLi90cmFuc2xhdGlvbicsXG4gICcuL2RpYWNyaXRpY3MnLFxuXG4gICcuL2RhdGEvc2VsZWN0JyxcbiAgJy4vZGF0YS9hcnJheScsXG4gICcuL2RhdGEvYWpheCcsXG4gICcuL2RhdGEvdGFncycsXG4gICcuL2RhdGEvdG9rZW5pemVyJyxcbiAgJy4vZGF0YS9taW5pbXVtSW5wdXRMZW5ndGgnLFxuICAnLi9kYXRhL21heGltdW1JbnB1dExlbmd0aCcsXG4gICcuL2RhdGEvbWF4aW11bVNlbGVjdGlvbkxlbmd0aCcsXG5cbiAgJy4vZHJvcGRvd24nLFxuICAnLi9kcm9wZG93bi9zZWFyY2gnLFxuICAnLi9kcm9wZG93bi9oaWRlUGxhY2Vob2xkZXInLFxuICAnLi9kcm9wZG93bi9pbmZpbml0ZVNjcm9sbCcsXG4gICcuL2Ryb3Bkb3duL2F0dGFjaEJvZHknLFxuICAnLi9kcm9wZG93bi9taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCcsXG4gICcuL2Ryb3Bkb3duL3NlbGVjdE9uQ2xvc2UnLFxuICAnLi9kcm9wZG93bi9jbG9zZU9uU2VsZWN0JyxcblxuICAnLi9pMThuL2VuJ1xuXSwgZnVuY3Rpb24gKCQsIHJlcXVpcmUsXG5cbiAgICAgICAgICAgICBSZXN1bHRzTGlzdCxcblxuICAgICAgICAgICAgIFNpbmdsZVNlbGVjdGlvbiwgTXVsdGlwbGVTZWxlY3Rpb24sIFBsYWNlaG9sZGVyLCBBbGxvd0NsZWFyLFxuICAgICAgICAgICAgIFNlbGVjdGlvblNlYXJjaCwgRXZlbnRSZWxheSxcblxuICAgICAgICAgICAgIFV0aWxzLCBUcmFuc2xhdGlvbiwgRElBQ1JJVElDUyxcblxuICAgICAgICAgICAgIFNlbGVjdERhdGEsIEFycmF5RGF0YSwgQWpheERhdGEsIFRhZ3MsIFRva2VuaXplcixcbiAgICAgICAgICAgICBNaW5pbXVtSW5wdXRMZW5ndGgsIE1heGltdW1JbnB1dExlbmd0aCwgTWF4aW11bVNlbGVjdGlvbkxlbmd0aCxcblxuICAgICAgICAgICAgIERyb3Bkb3duLCBEcm9wZG93blNlYXJjaCwgSGlkZVBsYWNlaG9sZGVyLCBJbmZpbml0ZVNjcm9sbCxcbiAgICAgICAgICAgICBBdHRhY2hCb2R5LCBNaW5pbXVtUmVzdWx0c0ZvclNlYXJjaCwgU2VsZWN0T25DbG9zZSwgQ2xvc2VPblNlbGVjdCxcblxuICAgICAgICAgICAgIEVuZ2xpc2hUcmFuc2xhdGlvbikge1xuICBmdW5jdGlvbiBEZWZhdWx0cyAoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgRGVmYXVsdHMucHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKG9wdGlvbnMuZGF0YUFkYXB0ZXIgPT0gbnVsbCkge1xuICAgICAgaWYgKG9wdGlvbnMuYWpheCAhPSBudWxsKSB7XG4gICAgICAgIG9wdGlvbnMuZGF0YUFkYXB0ZXIgPSBBamF4RGF0YTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgb3B0aW9ucy5kYXRhQWRhcHRlciA9IEFycmF5RGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMuZGF0YUFkYXB0ZXIgPSBTZWxlY3REYXRhO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5taW5pbXVtSW5wdXRMZW5ndGggPiAwKSB7XG4gICAgICAgIG9wdGlvbnMuZGF0YUFkYXB0ZXIgPSBVdGlscy5EZWNvcmF0ZShcbiAgICAgICAgICBvcHRpb25zLmRhdGFBZGFwdGVyLFxuICAgICAgICAgIE1pbmltdW1JbnB1dExlbmd0aFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5tYXhpbXVtSW5wdXRMZW5ndGggPiAwKSB7XG4gICAgICAgIG9wdGlvbnMuZGF0YUFkYXB0ZXIgPSBVdGlscy5EZWNvcmF0ZShcbiAgICAgICAgICBvcHRpb25zLmRhdGFBZGFwdGVyLFxuICAgICAgICAgIE1heGltdW1JbnB1dExlbmd0aFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5tYXhpbXVtU2VsZWN0aW9uTGVuZ3RoID4gMCkge1xuICAgICAgICBvcHRpb25zLmRhdGFBZGFwdGVyID0gVXRpbHMuRGVjb3JhdGUoXG4gICAgICAgICAgb3B0aW9ucy5kYXRhQWRhcHRlcixcbiAgICAgICAgICBNYXhpbXVtU2VsZWN0aW9uTGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRhZ3MpIHtcbiAgICAgICAgb3B0aW9ucy5kYXRhQWRhcHRlciA9IFV0aWxzLkRlY29yYXRlKG9wdGlvbnMuZGF0YUFkYXB0ZXIsIFRhZ3MpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50b2tlblNlcGFyYXRvcnMgIT0gbnVsbCB8fCBvcHRpb25zLnRva2VuaXplciAhPSBudWxsKSB7XG4gICAgICAgIG9wdGlvbnMuZGF0YUFkYXB0ZXIgPSBVdGlscy5EZWNvcmF0ZShcbiAgICAgICAgICBvcHRpb25zLmRhdGFBZGFwdGVyLFxuICAgICAgICAgIFRva2VuaXplclxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5xdWVyeSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBRdWVyeSA9IHJlcXVpcmUob3B0aW9ucy5hbWRCYXNlICsgJ2NvbXBhdC9xdWVyeScpO1xuXG4gICAgICAgIG9wdGlvbnMuZGF0YUFkYXB0ZXIgPSBVdGlscy5EZWNvcmF0ZShcbiAgICAgICAgICBvcHRpb25zLmRhdGFBZGFwdGVyLFxuICAgICAgICAgIFF1ZXJ5XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmluaXRTZWxlY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICB2YXIgSW5pdFNlbGVjdGlvbiA9IHJlcXVpcmUob3B0aW9ucy5hbWRCYXNlICsgJ2NvbXBhdC9pbml0U2VsZWN0aW9uJyk7XG5cbiAgICAgICAgb3B0aW9ucy5kYXRhQWRhcHRlciA9IFV0aWxzLkRlY29yYXRlKFxuICAgICAgICAgIG9wdGlvbnMuZGF0YUFkYXB0ZXIsXG4gICAgICAgICAgSW5pdFNlbGVjdGlvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlc3VsdHNBZGFwdGVyID09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucmVzdWx0c0FkYXB0ZXIgPSBSZXN1bHRzTGlzdDtcblxuICAgICAgaWYgKG9wdGlvbnMuYWpheCAhPSBudWxsKSB7XG4gICAgICAgIG9wdGlvbnMucmVzdWx0c0FkYXB0ZXIgPSBVdGlscy5EZWNvcmF0ZShcbiAgICAgICAgICBvcHRpb25zLnJlc3VsdHNBZGFwdGVyLFxuICAgICAgICAgIEluZmluaXRlU2Nyb2xsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnBsYWNlaG9sZGVyICE9IG51bGwpIHtcbiAgICAgICAgb3B0aW9ucy5yZXN1bHRzQWRhcHRlciA9IFV0aWxzLkRlY29yYXRlKFxuICAgICAgICAgIG9wdGlvbnMucmVzdWx0c0FkYXB0ZXIsXG4gICAgICAgICAgSGlkZVBsYWNlaG9sZGVyXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnNlbGVjdE9uQ2xvc2UpIHtcbiAgICAgICAgb3B0aW9ucy5yZXN1bHRzQWRhcHRlciA9IFV0aWxzLkRlY29yYXRlKFxuICAgICAgICAgIG9wdGlvbnMucmVzdWx0c0FkYXB0ZXIsXG4gICAgICAgICAgU2VsZWN0T25DbG9zZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRyb3Bkb3duQWRhcHRlciA9PSBudWxsKSB7XG4gICAgICBpZiAob3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgICBvcHRpb25zLmRyb3Bkb3duQWRhcHRlciA9IERyb3Bkb3duO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIFNlYXJjaGFibGVEcm9wZG93biA9IFV0aWxzLkRlY29yYXRlKERyb3Bkb3duLCBEcm9wZG93blNlYXJjaCk7XG5cbiAgICAgICAgb3B0aW9ucy5kcm9wZG93bkFkYXB0ZXIgPSBTZWFyY2hhYmxlRHJvcGRvd247XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLm1pbmltdW1SZXN1bHRzRm9yU2VhcmNoICE9PSAwKSB7XG4gICAgICAgIG9wdGlvbnMuZHJvcGRvd25BZGFwdGVyID0gVXRpbHMuRGVjb3JhdGUoXG4gICAgICAgICAgb3B0aW9ucy5kcm9wZG93bkFkYXB0ZXIsXG4gICAgICAgICAgTWluaW11bVJlc3VsdHNGb3JTZWFyY2hcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY2xvc2VPblNlbGVjdCkge1xuICAgICAgICBvcHRpb25zLmRyb3Bkb3duQWRhcHRlciA9IFV0aWxzLkRlY29yYXRlKFxuICAgICAgICAgIG9wdGlvbnMuZHJvcGRvd25BZGFwdGVyLFxuICAgICAgICAgIENsb3NlT25TZWxlY3RcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zLmRyb3Bkb3duQ3NzQ2xhc3MgIT0gbnVsbCB8fFxuICAgICAgICBvcHRpb25zLmRyb3Bkb3duQ3NzICE9IG51bGwgfHxcbiAgICAgICAgb3B0aW9ucy5hZGFwdERyb3Bkb3duQ3NzQ2xhc3MgIT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHZhciBEcm9wZG93bkNTUyA9IHJlcXVpcmUob3B0aW9ucy5hbWRCYXNlICsgJ2NvbXBhdC9kcm9wZG93bkNzcycpO1xuXG4gICAgICAgIG9wdGlvbnMuZHJvcGRvd25BZGFwdGVyID0gVXRpbHMuRGVjb3JhdGUoXG4gICAgICAgICAgb3B0aW9ucy5kcm9wZG93bkFkYXB0ZXIsXG4gICAgICAgICAgRHJvcGRvd25DU1NcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5kcm9wZG93bkFkYXB0ZXIgPSBVdGlscy5EZWNvcmF0ZShcbiAgICAgICAgb3B0aW9ucy5kcm9wZG93bkFkYXB0ZXIsXG4gICAgICAgIEF0dGFjaEJvZHlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2VsZWN0aW9uQWRhcHRlciA9PSBudWxsKSB7XG4gICAgICBpZiAob3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgICBvcHRpb25zLnNlbGVjdGlvbkFkYXB0ZXIgPSBNdWx0aXBsZVNlbGVjdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMuc2VsZWN0aW9uQWRhcHRlciA9IFNpbmdsZVNlbGVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBwbGFjZWhvbGRlciBtaXhpbiBpZiBhIHBsYWNlaG9sZGVyIHdhcyBzcGVjaWZpZWRcbiAgICAgIGlmIChvcHRpb25zLnBsYWNlaG9sZGVyICE9IG51bGwpIHtcbiAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb25BZGFwdGVyID0gVXRpbHMuRGVjb3JhdGUoXG4gICAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb25BZGFwdGVyLFxuICAgICAgICAgIFBsYWNlaG9sZGVyXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmFsbG93Q2xlYXIpIHtcbiAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb25BZGFwdGVyID0gVXRpbHMuRGVjb3JhdGUoXG4gICAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb25BZGFwdGVyLFxuICAgICAgICAgIEFsbG93Q2xlYXJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb25BZGFwdGVyID0gVXRpbHMuRGVjb3JhdGUoXG4gICAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb25BZGFwdGVyLFxuICAgICAgICAgIFNlbGVjdGlvblNlYXJjaFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMuY29udGFpbmVyQ3NzQ2xhc3MgIT0gbnVsbCB8fFxuICAgICAgICBvcHRpb25zLmNvbnRhaW5lckNzcyAhPSBudWxsIHx8XG4gICAgICAgIG9wdGlvbnMuYWRhcHRDb250YWluZXJDc3NDbGFzcyAhPSBudWxsXG4gICAgICApIHtcbiAgICAgICAgdmFyIENvbnRhaW5lckNTUyA9IHJlcXVpcmUob3B0aW9ucy5hbWRCYXNlICsgJ2NvbXBhdC9jb250YWluZXJDc3MnKTtcblxuICAgICAgICBvcHRpb25zLnNlbGVjdGlvbkFkYXB0ZXIgPSBVdGlscy5EZWNvcmF0ZShcbiAgICAgICAgICBvcHRpb25zLnNlbGVjdGlvbkFkYXB0ZXIsXG4gICAgICAgICAgQ29udGFpbmVyQ1NTXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMuc2VsZWN0aW9uQWRhcHRlciA9IFV0aWxzLkRlY29yYXRlKFxuICAgICAgICBvcHRpb25zLnNlbGVjdGlvbkFkYXB0ZXIsXG4gICAgICAgIEV2ZW50UmVsYXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmxhbmd1YWdlID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxhbmd1YWdlIGlzIHNwZWNpZmllZCB3aXRoIGEgcmVnaW9uXG4gICAgICBpZiAob3B0aW9ucy5sYW5ndWFnZS5pbmRleE9mKCctJykgPiAwKSB7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIHJlZ2lvbiBpbmZvcm1hdGlvbiBpZiBpdCBpcyBpbmNsdWRlZFxuICAgICAgICB2YXIgbGFuZ3VhZ2VQYXJ0cyA9IG9wdGlvbnMubGFuZ3VhZ2Uuc3BsaXQoJy0nKTtcbiAgICAgICAgdmFyIGJhc2VMYW5ndWFnZSA9IGxhbmd1YWdlUGFydHNbMF07XG5cbiAgICAgICAgb3B0aW9ucy5sYW5ndWFnZSA9IFtvcHRpb25zLmxhbmd1YWdlLCBiYXNlTGFuZ3VhZ2VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5sYW5ndWFnZSA9IFtvcHRpb25zLmxhbmd1YWdlXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJC5pc0FycmF5KG9wdGlvbnMubGFuZ3VhZ2UpKSB7XG4gICAgICB2YXIgbGFuZ3VhZ2VzID0gbmV3IFRyYW5zbGF0aW9uKCk7XG4gICAgICBvcHRpb25zLmxhbmd1YWdlLnB1c2goJ2VuJyk7XG5cbiAgICAgIHZhciBsYW5ndWFnZU5hbWVzID0gb3B0aW9ucy5sYW5ndWFnZTtcblxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBsYW5ndWFnZU5hbWVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIHZhciBuYW1lID0gbGFuZ3VhZ2VOYW1lc1tsXTtcbiAgICAgICAgdmFyIGxhbmd1YWdlID0ge307XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUcnkgdG8gbG9hZCBpdCB3aXRoIHRoZSBvcmlnaW5hbCBuYW1lXG4gICAgICAgICAgbGFuZ3VhZ2UgPSBUcmFuc2xhdGlvbi5sb2FkUGF0aChuYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBsb2FkIGl0LCBjaGVjayBpZiBpdCB3YXNuJ3QgdGhlIGZ1bGwgcGF0aFxuICAgICAgICAgICAgbmFtZSA9IHRoaXMuZGVmYXVsdHMuYW1kTGFuZ3VhZ2VCYXNlICsgbmFtZTtcbiAgICAgICAgICAgIGxhbmd1YWdlID0gVHJhbnNsYXRpb24ubG9hZFBhdGgobmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIC8vIFRoZSB0cmFuc2xhdGlvbiBjb3VsZCBub3QgYmUgbG9hZGVkIGF0IGFsbC4gU29tZXRpbWVzIHRoaXMgaXNcbiAgICAgICAgICAgIC8vIGJlY2F1c2Ugb2YgYSBjb25maWd1cmF0aW9uIHByb2JsZW0sIG90aGVyIHRpbWVzIHRoaXMgY2FuIGJlXG4gICAgICAgICAgICAvLyBiZWNhdXNlIG9mIGhvdyBTZWxlY3QyIGhlbHBzIGxvYWQgYWxsIHBvc3NpYmxlIHRyYW5zbGF0aW9uIGZpbGVzLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVidWcgJiYgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAnU2VsZWN0MjogVGhlIGxhbmd1YWdlIGZpbGUgZm9yIFwiJyArIG5hbWUgKyAnXCIgY291bGQgbm90IGJlICcgK1xuICAgICAgICAgICAgICAgICdhdXRvbWF0aWNhbGx5IGxvYWRlZC4gQSBmYWxsYmFjayB3aWxsIGJlIHVzZWQgaW5zdGVhZC4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhbmd1YWdlcy5leHRlbmQobGFuZ3VhZ2UpO1xuICAgICAgfVxuXG4gICAgICBvcHRpb25zLnRyYW5zbGF0aW9ucyA9IGxhbmd1YWdlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJhc2VUcmFuc2xhdGlvbiA9IFRyYW5zbGF0aW9uLmxvYWRQYXRoKFxuICAgICAgICB0aGlzLmRlZmF1bHRzLmFtZExhbmd1YWdlQmFzZSArICdlbidcbiAgICAgICk7XG4gICAgICB2YXIgY3VzdG9tVHJhbnNsYXRpb24gPSBuZXcgVHJhbnNsYXRpb24ob3B0aW9ucy5sYW5ndWFnZSk7XG5cbiAgICAgIGN1c3RvbVRyYW5zbGF0aW9uLmV4dGVuZChiYXNlVHJhbnNsYXRpb24pO1xuXG4gICAgICBvcHRpb25zLnRyYW5zbGF0aW9ucyA9IGN1c3RvbVRyYW5zbGF0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9O1xuXG4gIERlZmF1bHRzLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBzdHJpcERpYWNyaXRpY3MgKHRleHQpIHtcbiAgICAgIC8vIFVzZWQgJ3VuaSByYW5nZSArIG5hbWVkIGZ1bmN0aW9uJyBmcm9tIGh0dHA6Ly9qc3BlcmYuY29tL2RpYWNyaXRpY3MvMThcbiAgICAgIGZ1bmN0aW9uIG1hdGNoKGEpIHtcbiAgICAgICAgcmV0dXJuIERJQUNSSVRJQ1NbYV0gfHwgYTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvW15cXHUwMDAwLVxcdTAwN0VdL2csIG1hdGNoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaGVyIChwYXJhbXMsIGRhdGEpIHtcbiAgICAgIC8vIEFsd2F5cyByZXR1cm4gdGhlIG9iamVjdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBhcmVcbiAgICAgIGlmICgkLnRyaW0ocGFyYW1zLnRlcm0pID09PSAnJykge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gRG8gYSByZWN1cnNpdmUgY2hlY2sgZm9yIG9wdGlvbnMgd2l0aCBjaGlsZHJlblxuICAgICAgaWYgKGRhdGEuY2hpbGRyZW4gJiYgZGF0YS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIENsb25lIHRoZSBkYXRhIG9iamVjdCBpZiB0aGVyZSBhcmUgY2hpbGRyZW5cbiAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBhcyB3ZSBtb2RpZnkgdGhlIG9iamVjdCB0byByZW1vdmUgYW55IG5vbi1tYXRjaGVzXG4gICAgICAgIHZhciBtYXRjaCA9ICQuZXh0ZW5kKHRydWUsIHt9LCBkYXRhKTtcblxuICAgICAgICAvLyBDaGVjayBlYWNoIGNoaWxkIG9mIHRoZSBvcHRpb25cbiAgICAgICAgZm9yICh2YXIgYyA9IGRhdGEuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgYyA+PSAwOyBjLS0pIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBkYXRhLmNoaWxkcmVuW2NdO1xuXG4gICAgICAgICAgdmFyIG1hdGNoZXMgPSBtYXRjaGVyKHBhcmFtcywgY2hpbGQpO1xuXG4gICAgICAgICAgLy8gSWYgdGhlcmUgd2Fzbid0IGEgbWF0Y2gsIHJlbW92ZSB0aGUgb2JqZWN0IGluIHRoZSBhcnJheVxuICAgICAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHtcbiAgICAgICAgICAgIG1hdGNoLmNoaWxkcmVuLnNwbGljZShjLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBhbnkgY2hpbGRyZW4gbWF0Y2hlZCwgcmV0dXJuIHRoZSBuZXcgb2JqZWN0XG4gICAgICAgIGlmIChtYXRjaC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgd2VyZSBubyBtYXRjaGluZyBjaGlsZHJlbiwgY2hlY2sganVzdCB0aGUgcGxhaW4gb2JqZWN0XG4gICAgICAgIHJldHVybiBtYXRjaGVyKHBhcmFtcywgbWF0Y2gpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3JpZ2luYWwgPSBzdHJpcERpYWNyaXRpY3MoZGF0YS50ZXh0KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgdmFyIHRlcm0gPSBzdHJpcERpYWNyaXRpY3MocGFyYW1zLnRlcm0pLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0ZXh0IGNvbnRhaW5zIHRoZSB0ZXJtXG4gICAgICBpZiAob3JpZ2luYWwuaW5kZXhPZih0ZXJtKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCBkb2Vzbid0IGNvbnRhaW4gdGhlIHRlcm0sIGRvbid0IHJldHVybiBhbnl0aGluZ1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIGFtZEJhc2U6ICcuLycsXG4gICAgICBhbWRMYW5ndWFnZUJhc2U6ICcuL2kxOG4vJyxcbiAgICAgIGNsb3NlT25TZWxlY3Q6IHRydWUsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICBkcm9wZG93bkF1dG9XaWR0aDogZmFsc2UsXG4gICAgICBlc2NhcGVNYXJrdXA6IFV0aWxzLmVzY2FwZU1hcmt1cCxcbiAgICAgIGxhbmd1YWdlOiBFbmdsaXNoVHJhbnNsYXRpb24sXG4gICAgICBtYXRjaGVyOiBtYXRjaGVyLFxuICAgICAgbWluaW11bUlucHV0TGVuZ3RoOiAwLFxuICAgICAgbWF4aW11bUlucHV0TGVuZ3RoOiAwLFxuICAgICAgbWF4aW11bVNlbGVjdGlvbkxlbmd0aDogMCxcbiAgICAgIG1pbmltdW1SZXN1bHRzRm9yU2VhcmNoOiAwLFxuICAgICAgc2VsZWN0T25DbG9zZTogZmFsc2UsXG4gICAgICBzb3J0ZXI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSxcbiAgICAgIHRlbXBsYXRlUmVzdWx0OiBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgICAgIH0sXG4gICAgICB0ZW1wbGF0ZVNlbGVjdGlvbjogZnVuY3Rpb24gKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLnRleHQ7XG4gICAgICB9LFxuICAgICAgdGhlbWU6ICdkZWZhdWx0JyxcbiAgICAgIHdpZHRoOiAncmVzb2x2ZSdcbiAgICB9O1xuICB9O1xuXG4gIERlZmF1bHRzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBjYW1lbEtleSA9ICQuY2FtZWxDYXNlKGtleSk7XG5cbiAgICB2YXIgZGF0YSA9IHt9O1xuICAgIGRhdGFbY2FtZWxLZXldID0gdmFsdWU7XG5cbiAgICB2YXIgY29udmVydGVkRGF0YSA9IFV0aWxzLl9jb252ZXJ0RGF0YShkYXRhKTtcblxuICAgICQuZXh0ZW5kKHRoaXMuZGVmYXVsdHMsIGNvbnZlcnRlZERhdGEpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0cyA9IG5ldyBEZWZhdWx0cygpO1xuXG4gIHJldHVybiBkZWZhdWx0cztcbn0pO1xuXG5TMi5kZWZpbmUoJ3NlbGVjdDIvb3B0aW9ucycsW1xuICAncmVxdWlyZScsXG4gICdqcXVlcnknLFxuICAnLi9kZWZhdWx0cycsXG4gICcuL3V0aWxzJ1xuXSwgZnVuY3Rpb24gKHJlcXVpcmUsICQsIERlZmF1bHRzLCBVdGlscykge1xuICBmdW5jdGlvbiBPcHRpb25zIChvcHRpb25zLCAkZWxlbWVudCkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBpZiAoJGVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5mcm9tRWxlbWVudCgkZWxlbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zID0gRGVmYXVsdHMuYXBwbHkodGhpcy5vcHRpb25zKTtcblxuICAgIGlmICgkZWxlbWVudCAmJiAkZWxlbWVudC5pcygnaW5wdXQnKSkge1xuICAgICAgdmFyIElucHV0Q29tcGF0ID0gcmVxdWlyZSh0aGlzLmdldCgnYW1kQmFzZScpICsgJ2NvbXBhdC9pbnB1dERhdGEnKTtcblxuICAgICAgdGhpcy5vcHRpb25zLmRhdGFBZGFwdGVyID0gVXRpbHMuRGVjb3JhdGUoXG4gICAgICAgIHRoaXMub3B0aW9ucy5kYXRhQWRhcHRlcixcbiAgICAgICAgSW5wdXRDb21wYXRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgT3B0aW9ucy5wcm90b3R5cGUuZnJvbUVsZW1lbnQgPSBmdW5jdGlvbiAoJGUpIHtcbiAgICB2YXIgZXhjbHVkZWREYXRhID0gWydzZWxlY3QyJ107XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlID09IG51bGwpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5tdWx0aXBsZSA9ICRlLnByb3AoJ211bHRpcGxlJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgPSAkZS5wcm9wKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UgPT0gbnVsbCkge1xuICAgICAgaWYgKCRlLnByb3AoJ2xhbmcnKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UgPSAkZS5wcm9wKCdsYW5nJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAoJGUuY2xvc2VzdCgnW2xhbmddJykucHJvcCgnbGFuZycpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sYW5ndWFnZSA9ICRlLmNsb3Nlc3QoJ1tsYW5nXScpLnByb3AoJ2xhbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRpciA9PSBudWxsKSB7XG4gICAgICBpZiAoJGUucHJvcCgnZGlyJykpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmRpciA9ICRlLnByb3AoJ2RpcicpO1xuICAgICAgfSBlbHNlIGlmICgkZS5jbG9zZXN0KCdbZGlyXScpLnByb3AoJ2RpcicpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5kaXIgPSAkZS5jbG9zZXN0KCdbZGlyXScpLnByb3AoJ2RpcicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmRpciA9ICdsdHInO1xuICAgICAgfVxuICAgIH1cblxuICAgICRlLnByb3AoJ2Rpc2FibGVkJywgdGhpcy5vcHRpb25zLmRpc2FibGVkKTtcbiAgICAkZS5wcm9wKCdtdWx0aXBsZScsIHRoaXMub3B0aW9ucy5tdWx0aXBsZSk7XG5cbiAgICBpZiAoJGUuZGF0YSgnc2VsZWN0MlRhZ3MnKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1ZyAmJiB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdTZWxlY3QyOiBUaGUgYGRhdGEtc2VsZWN0Mi10YWdzYCBhdHRyaWJ1dGUgaGFzIGJlZW4gY2hhbmdlZCB0byAnICtcbiAgICAgICAgICAndXNlIHRoZSBgZGF0YS1kYXRhYCBhbmQgYGRhdGEtdGFncz1cInRydWVcImAgYXR0cmlidXRlcyBhbmQgd2lsbCBiZSAnICtcbiAgICAgICAgICAncmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgU2VsZWN0Mi4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgICRlLmRhdGEoJ2RhdGEnLCAkZS5kYXRhKCdzZWxlY3QyVGFncycpKTtcbiAgICAgICRlLmRhdGEoJ3RhZ3MnLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoJGUuZGF0YSgnYWpheFVybCcpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnICYmIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1NlbGVjdDI6IFRoZSBgZGF0YS1hamF4LXVybGAgYXR0cmlidXRlIGhhcyBiZWVuIGNoYW5nZWQgdG8gJyArXG4gICAgICAgICAgJ2BkYXRhLWFqYXgtLXVybGAgYW5kIHN1cHBvcnQgZm9yIHRoZSBvbGQgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCcgK1xuICAgICAgICAgICcgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNlbGVjdDIuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAkZS5hdHRyKCdhamF4LS11cmwnLCAkZS5kYXRhKCdhamF4VXJsJykpO1xuICAgICAgJGUuZGF0YSgnYWpheC0tdXJsJywgJGUuZGF0YSgnYWpheFVybCcpKTtcbiAgICB9XG5cbiAgICB2YXIgZGF0YXNldCA9IHt9O1xuXG4gICAgLy8gUHJlZmVyIHRoZSBlbGVtZW50J3MgYGRhdGFzZXRgIGF0dHJpYnV0ZSBpZiBpdCBleGlzdHNcbiAgICAvLyBqUXVlcnkgMS54IGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgZGF0YSBhdHRyaWJ1dGVzIHdpdGggbXVsdGlwbGUgZGFzaGVzXG4gICAgaWYgKCQuZm4uanF1ZXJ5ICYmICQuZm4uanF1ZXJ5LnN1YnN0cigwLCAyKSA9PSAnMS4nICYmICRlWzBdLmRhdGFzZXQpIHtcbiAgICAgIGRhdGFzZXQgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJGVbMF0uZGF0YXNldCwgJGUuZGF0YSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YXNldCA9ICRlLmRhdGEoKTtcbiAgICB9XG5cbiAgICB2YXIgZGF0YSA9ICQuZXh0ZW5kKHRydWUsIHt9LCBkYXRhc2V0KTtcblxuICAgIGRhdGEgPSBVdGlscy5fY29udmVydERhdGEoZGF0YSk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKCQuaW5BcnJheShrZXksIGV4Y2x1ZGVkRGF0YSkgPiAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCQuaXNQbGFpbk9iamVjdCh0aGlzLm9wdGlvbnNba2V5XSkpIHtcbiAgICAgICAgJC5leHRlbmQodGhpcy5vcHRpb25zW2tleV0sIGRhdGFba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wdGlvbnNba2V5XSA9IGRhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBPcHRpb25zLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc1trZXldO1xuICB9O1xuXG4gIE9wdGlvbnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbCkge1xuICAgIHRoaXMub3B0aW9uc1trZXldID0gdmFsO1xuICB9O1xuXG4gIHJldHVybiBPcHRpb25zO1xufSk7XG5cblMyLmRlZmluZSgnc2VsZWN0Mi9jb3JlJyxbXG4gICdqcXVlcnknLFxuICAnLi9vcHRpb25zJyxcbiAgJy4vdXRpbHMnLFxuICAnLi9rZXlzJ1xuXSwgZnVuY3Rpb24gKCQsIE9wdGlvbnMsIFV0aWxzLCBLRVlTKSB7XG4gIHZhciBTZWxlY3QyID0gZnVuY3Rpb24gKCRlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKCRlbGVtZW50LmRhdGEoJ3NlbGVjdDInKSAhPSBudWxsKSB7XG4gICAgICAkZWxlbWVudC5kYXRhKCdzZWxlY3QyJykuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuJGVsZW1lbnQgPSAkZWxlbWVudDtcblxuICAgIHRoaXMuaWQgPSB0aGlzLl9nZW5lcmF0ZUlkKCRlbGVtZW50KTtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgdGhpcy5vcHRpb25zID0gbmV3IE9wdGlvbnMob3B0aW9ucywgJGVsZW1lbnQpO1xuXG4gICAgU2VsZWN0Mi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzKTtcblxuICAgIC8vIFNldCB1cCB0aGUgdGFiaW5kZXhcblxuICAgIHZhciB0YWJpbmRleCA9ICRlbGVtZW50LmF0dHIoJ3RhYmluZGV4JykgfHwgMDtcbiAgICAkZWxlbWVudC5kYXRhKCdvbGQtdGFiaW5kZXgnLCB0YWJpbmRleCk7XG4gICAgJGVsZW1lbnQuYXR0cigndGFiaW5kZXgnLCAnLTEnKTtcblxuICAgIC8vIFNldCB1cCBjb250YWluZXJzIGFuZCBhZGFwdGVyc1xuXG4gICAgdmFyIERhdGFBZGFwdGVyID0gdGhpcy5vcHRpb25zLmdldCgnZGF0YUFkYXB0ZXInKTtcbiAgICB0aGlzLmRhdGFBZGFwdGVyID0gbmV3IERhdGFBZGFwdGVyKCRlbGVtZW50LCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgdmFyICRjb250YWluZXIgPSB0aGlzLnJlbmRlcigpO1xuXG4gICAgdGhpcy5fcGxhY2VDb250YWluZXIoJGNvbnRhaW5lcik7XG5cbiAgICB2YXIgU2VsZWN0aW9uQWRhcHRlciA9IHRoaXMub3B0aW9ucy5nZXQoJ3NlbGVjdGlvbkFkYXB0ZXInKTtcbiAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCRlbGVtZW50LCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuJHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLnJlbmRlcigpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24ucG9zaXRpb24odGhpcy4kc2VsZWN0aW9uLCAkY29udGFpbmVyKTtcblxuICAgIHZhciBEcm9wZG93bkFkYXB0ZXIgPSB0aGlzLm9wdGlvbnMuZ2V0KCdkcm9wZG93bkFkYXB0ZXInKTtcbiAgICB0aGlzLmRyb3Bkb3duID0gbmV3IERyb3Bkb3duQWRhcHRlcigkZWxlbWVudCwgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLiRkcm9wZG93biA9IHRoaXMuZHJvcGRvd24ucmVuZGVyKCk7XG5cbiAgICB0aGlzLmRyb3Bkb3duLnBvc2l0aW9uKHRoaXMuJGRyb3Bkb3duLCAkY29udGFpbmVyKTtcblxuICAgIHZhciBSZXN1bHRzQWRhcHRlciA9IHRoaXMub3B0aW9ucy5nZXQoJ3Jlc3VsdHNBZGFwdGVyJyk7XG4gICAgdGhpcy5yZXN1bHRzID0gbmV3IFJlc3VsdHNBZGFwdGVyKCRlbGVtZW50LCB0aGlzLm9wdGlvbnMsIHRoaXMuZGF0YUFkYXB0ZXIpO1xuICAgIHRoaXMuJHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMucmVuZGVyKCk7XG5cbiAgICB0aGlzLnJlc3VsdHMucG9zaXRpb24odGhpcy4kcmVzdWx0cywgdGhpcy4kZHJvcGRvd24pO1xuXG4gICAgLy8gQmluZCBldmVudHNcblxuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIEJpbmQgdGhlIGNvbnRhaW5lciB0byBhbGwgb2YgdGhlIGFkYXB0ZXJzXG4gICAgdGhpcy5fYmluZEFkYXB0ZXJzKCk7XG5cbiAgICAvLyBSZWdpc3RlciBhbnkgRE9NIGV2ZW50IGhhbmRsZXJzXG4gICAgdGhpcy5fcmVnaXN0ZXJEb21FdmVudHMoKTtcblxuICAgIC8vIFJlZ2lzdGVyIGFueSBpbnRlcm5hbCBldmVudCBoYW5kbGVyc1xuICAgIHRoaXMuX3JlZ2lzdGVyRGF0YUV2ZW50cygpO1xuICAgIHRoaXMuX3JlZ2lzdGVyU2VsZWN0aW9uRXZlbnRzKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEcm9wZG93bkV2ZW50cygpO1xuICAgIHRoaXMuX3JlZ2lzdGVyUmVzdWx0c0V2ZW50cygpO1xuICAgIHRoaXMuX3JlZ2lzdGVyRXZlbnRzKCk7XG5cbiAgICAvLyBTZXQgdGhlIGluaXRpYWwgc3RhdGVcbiAgICB0aGlzLmRhdGFBZGFwdGVyLmN1cnJlbnQoZnVuY3Rpb24gKGluaXRpYWxEYXRhKSB7XG4gICAgICBzZWxmLnRyaWdnZXIoJ3NlbGVjdGlvbjp1cGRhdGUnLCB7XG4gICAgICAgIGRhdGE6IGluaXRpYWxEYXRhXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhpZGUgdGhlIG9yaWdpbmFsIHNlbGVjdFxuICAgICRlbGVtZW50LmFkZENsYXNzKCdzZWxlY3QyLWhpZGRlbi1hY2Nlc3NpYmxlJyk7XG4gICAgJGVsZW1lbnQuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgLy8gU3luY2hyb25pemUgYW55IG1vbml0b3JlZCBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc3luY0F0dHJpYnV0ZXMoKTtcblxuICAgICRlbGVtZW50LmRhdGEoJ3NlbGVjdDInLCB0aGlzKTtcbiAgfTtcblxuICBVdGlscy5FeHRlbmQoU2VsZWN0MiwgVXRpbHMuT2JzZXJ2YWJsZSk7XG5cbiAgU2VsZWN0Mi5wcm90b3R5cGUuX2dlbmVyYXRlSWQgPSBmdW5jdGlvbiAoJGVsZW1lbnQpIHtcbiAgICB2YXIgaWQgPSAnJztcblxuICAgIGlmICgkZWxlbWVudC5hdHRyKCdpZCcpICE9IG51bGwpIHtcbiAgICAgIGlkID0gJGVsZW1lbnQuYXR0cignaWQnKTtcbiAgICB9IGVsc2UgaWYgKCRlbGVtZW50LmF0dHIoJ25hbWUnKSAhPSBudWxsKSB7XG4gICAgICBpZCA9ICRlbGVtZW50LmF0dHIoJ25hbWUnKSArICctJyArIFV0aWxzLmdlbmVyYXRlQ2hhcnMoMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkID0gVXRpbHMuZ2VuZXJhdGVDaGFycyg0KTtcbiAgICB9XG5cbiAgICBpZCA9IGlkLnJlcGxhY2UoLyg6fFxcLnxcXFt8XFxdfCwpL2csICcnKTtcbiAgICBpZCA9ICdzZWxlY3QyLScgKyBpZDtcblxuICAgIHJldHVybiBpZDtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5fcGxhY2VDb250YWluZXIgPSBmdW5jdGlvbiAoJGNvbnRhaW5lcikge1xuICAgICRjb250YWluZXIuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudCk7XG5cbiAgICB2YXIgd2lkdGggPSB0aGlzLl9yZXNvbHZlV2lkdGgodGhpcy4kZWxlbWVudCwgdGhpcy5vcHRpb25zLmdldCgnd2lkdGgnKSk7XG5cbiAgICBpZiAod2lkdGggIT0gbnVsbCkge1xuICAgICAgJGNvbnRhaW5lci5jc3MoJ3dpZHRoJywgd2lkdGgpO1xuICAgIH1cbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5fcmVzb2x2ZVdpZHRoID0gZnVuY3Rpb24gKCRlbGVtZW50LCBtZXRob2QpIHtcbiAgICB2YXIgV0lEVEggPSAvXndpZHRoOigoWy0rXT8oWzAtOV0qXFwuKT9bMC05XSspKHB4fGVtfGV4fCV8aW58Y218bW18cHR8cGMpKS9pO1xuXG4gICAgaWYgKG1ldGhvZCA9PSAncmVzb2x2ZScpIHtcbiAgICAgIHZhciBzdHlsZVdpZHRoID0gdGhpcy5fcmVzb2x2ZVdpZHRoKCRlbGVtZW50LCAnc3R5bGUnKTtcblxuICAgICAgaWYgKHN0eWxlV2lkdGggIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3R5bGVXaWR0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVXaWR0aCgkZWxlbWVudCwgJ2VsZW1lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09ICdlbGVtZW50Jykge1xuICAgICAgdmFyIGVsZW1lbnRXaWR0aCA9ICRlbGVtZW50Lm91dGVyV2lkdGgoZmFsc2UpO1xuXG4gICAgICBpZiAoZWxlbWVudFdpZHRoIDw9IDApIHtcbiAgICAgICAgcmV0dXJuICdhdXRvJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZW1lbnRXaWR0aCArICdweCc7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PSAnc3R5bGUnKSB7XG4gICAgICB2YXIgc3R5bGUgPSAkZWxlbWVudC5hdHRyKCdzdHlsZScpO1xuXG4gICAgICBpZiAodHlwZW9mKHN0eWxlKSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRycyA9IHN0eWxlLnNwbGl0KCc7Jyk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXR0cnMubGVuZ3RoOyBpIDwgbDsgaSA9IGkgKyAxKSB7XG4gICAgICAgIHZhciBhdHRyID0gYXR0cnNbaV0ucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSBhdHRyLm1hdGNoKFdJRFRIKTtcblxuICAgICAgICBpZiAobWF0Y2hlcyAhPT0gbnVsbCAmJiBtYXRjaGVzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoZXNbMV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGhvZDtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5fYmluZEFkYXB0ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGF0YUFkYXB0ZXIuYmluZCh0aGlzLCB0aGlzLiRjb250YWluZXIpO1xuICAgIHRoaXMuc2VsZWN0aW9uLmJpbmQodGhpcywgdGhpcy4kY29udGFpbmVyKTtcblxuICAgIHRoaXMuZHJvcGRvd24uYmluZCh0aGlzLCB0aGlzLiRjb250YWluZXIpO1xuICAgIHRoaXMucmVzdWx0cy5iaW5kKHRoaXMsIHRoaXMuJGNvbnRhaW5lcik7XG4gIH07XG5cbiAgU2VsZWN0Mi5wcm90b3R5cGUuX3JlZ2lzdGVyRG9tRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHRoaXMuJGVsZW1lbnQub24oJ2NoYW5nZS5zZWxlY3QyJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5kYXRhQWRhcHRlci5jdXJyZW50KGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHNlbGYudHJpZ2dlcignc2VsZWN0aW9uOnVwZGF0ZScsIHtcbiAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRlbGVtZW50Lm9uKCdmb2N1cy5zZWxlY3QyJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgc2VsZi50cmlnZ2VyKCdmb2N1cycsIGV2dCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zeW5jQSA9IFV0aWxzLmJpbmQodGhpcy5fc3luY0F0dHJpYnV0ZXMsIHRoaXMpO1xuICAgIHRoaXMuX3N5bmNTID0gVXRpbHMuYmluZCh0aGlzLl9zeW5jU3VidHJlZSwgdGhpcyk7XG5cbiAgICBpZiAodGhpcy4kZWxlbWVudFswXS5hdHRhY2hFdmVudCkge1xuICAgICAgdGhpcy4kZWxlbWVudFswXS5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIHRoaXMuX3N5bmNBKTtcbiAgICB9XG5cbiAgICB2YXIgb2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fFxuICAgICAgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIgfHxcbiAgICAgIHdpbmRvdy5Nb3pNdXRhdGlvbk9ic2VydmVyXG4gICAgO1xuXG4gICAgaWYgKG9ic2VydmVyICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gbmV3IG9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHtcbiAgICAgICAgJC5lYWNoKG11dGF0aW9ucywgc2VsZi5fc3luY0EpO1xuICAgICAgICAkLmVhY2gobXV0YXRpb25zLCBzZWxmLl9zeW5jUyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUodGhpcy4kZWxlbWVudFswXSwge1xuICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJGVsZW1lbnRbMF0uYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgdGhpcy4kZWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnRE9NQXR0ck1vZGlmaWVkJyxcbiAgICAgICAgc2VsZi5fc3luY0EsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgdGhpcy4kZWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnRE9NTm9kZUluc2VydGVkJyxcbiAgICAgICAgc2VsZi5fc3luY1MsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgdGhpcy4kZWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAnRE9NTm9kZVJlbW92ZWQnLFxuICAgICAgICBzZWxmLl9zeW5jUyxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIFNlbGVjdDIucHJvdG90eXBlLl9yZWdpc3RlckRhdGFFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5kYXRhQWRhcHRlci5vbignKicsIGZ1bmN0aW9uIChuYW1lLCBwYXJhbXMpIHtcbiAgICAgIHNlbGYudHJpZ2dlcihuYW1lLCBwYXJhbXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIFNlbGVjdDIucHJvdG90eXBlLl9yZWdpc3RlclNlbGVjdGlvbkV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG5vblJlbGF5RXZlbnRzID0gWyd0b2dnbGUnLCAnZm9jdXMnXTtcblxuICAgIHRoaXMuc2VsZWN0aW9uLm9uKCd0b2dnbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvbi5vbignZm9jdXMnLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICBzZWxmLmZvY3VzKHBhcmFtcyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvbi5vbignKicsIGZ1bmN0aW9uIChuYW1lLCBwYXJhbXMpIHtcbiAgICAgIGlmICgkLmluQXJyYXkobmFtZSwgbm9uUmVsYXlFdmVudHMpICE9PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYudHJpZ2dlcihuYW1lLCBwYXJhbXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIFNlbGVjdDIucHJvdG90eXBlLl9yZWdpc3RlckRyb3Bkb3duRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHRoaXMuZHJvcGRvd24ub24oJyonLCBmdW5jdGlvbiAobmFtZSwgcGFyYW1zKSB7XG4gICAgICBzZWxmLnRyaWdnZXIobmFtZSwgcGFyYW1zKTtcbiAgICB9KTtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5fcmVnaXN0ZXJSZXN1bHRzRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHRoaXMucmVzdWx0cy5vbignKicsIGZ1bmN0aW9uIChuYW1lLCBwYXJhbXMpIHtcbiAgICAgIHNlbGYudHJpZ2dlcihuYW1lLCBwYXJhbXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIFNlbGVjdDIucHJvdG90eXBlLl9yZWdpc3RlckV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLm9uKCdvcGVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi4kY29udGFpbmVyLmFkZENsYXNzKCdzZWxlY3QyLWNvbnRhaW5lci0tb3BlbicpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLiRjb250YWluZXIucmVtb3ZlQ2xhc3MoJ3NlbGVjdDItY29udGFpbmVyLS1vcGVuJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdlbmFibGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLiRjb250YWluZXIucmVtb3ZlQ2xhc3MoJ3NlbGVjdDItY29udGFpbmVyLS1kaXNhYmxlZCcpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignZGlzYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuJGNvbnRhaW5lci5hZGRDbGFzcygnc2VsZWN0Mi1jb250YWluZXItLWRpc2FibGVkJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdibHVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi4kY29udGFpbmVyLnJlbW92ZUNsYXNzKCdzZWxlY3QyLWNvbnRhaW5lci0tZm9jdXMnKTtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ3F1ZXJ5JywgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgaWYgKCFzZWxmLmlzT3BlbigpKSB7XG4gICAgICAgIHNlbGYudHJpZ2dlcignb3BlbicsIHt9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhQWRhcHRlci5xdWVyeShwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHNlbGYudHJpZ2dlcigncmVzdWx0czphbGwnLCB7XG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBxdWVyeTogcGFyYW1zXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdxdWVyeTphcHBlbmQnLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB0aGlzLmRhdGFBZGFwdGVyLnF1ZXJ5KHBhcmFtcywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgc2VsZi50cmlnZ2VyKCdyZXN1bHRzOmFwcGVuZCcsIHtcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIHF1ZXJ5OiBwYXJhbXNcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2tleXByZXNzJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgdmFyIGtleSA9IGV2dC53aGljaDtcblxuICAgICAgaWYgKHNlbGYuaXNPcGVuKCkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gS0VZUy5FU0MgfHwga2V5ID09PSBLRVlTLlRBQiB8fFxuICAgICAgICAgICAgKGtleSA9PT0gS0VZUy5VUCAmJiBldnQuYWx0S2V5KSkge1xuICAgICAgICAgIHNlbGYuY2xvc2UoKTtcblxuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gS0VZUy5FTlRFUikge1xuICAgICAgICAgIHNlbGYudHJpZ2dlcigncmVzdWx0czpzZWxlY3QnLCB7fSk7XG5cbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICgoa2V5ID09PSBLRVlTLlNQQUNFICYmIGV2dC5jdHJsS2V5KSkge1xuICAgICAgICAgIHNlbGYudHJpZ2dlcigncmVzdWx0czp0b2dnbGUnLCB7fSk7XG5cbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IEtFWVMuVVApIHtcbiAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3Jlc3VsdHM6cHJldmlvdXMnLCB7fSk7XG5cbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IEtFWVMuRE9XTikge1xuICAgICAgICAgIHNlbGYudHJpZ2dlcigncmVzdWx0czpuZXh0Jywge30pO1xuXG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChrZXkgPT09IEtFWVMuRU5URVIgfHwga2V5ID09PSBLRVlTLlNQQUNFIHx8XG4gICAgICAgICAgICAoa2V5ID09PSBLRVlTLkRPV04gJiYgZXZ0LmFsdEtleSkpIHtcbiAgICAgICAgICBzZWxmLm9wZW4oKTtcblxuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgU2VsZWN0Mi5wcm90b3R5cGUuX3N5bmNBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub3B0aW9ucy5zZXQoJ2Rpc2FibGVkJywgdGhpcy4kZWxlbWVudC5wcm9wKCdkaXNhYmxlZCcpKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ2V0KCdkaXNhYmxlZCcpKSB7XG4gICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJpZ2dlcignZGlzYWJsZScsIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmlnZ2VyKCdlbmFibGUnLCB7fSk7XG4gICAgfVxuICB9O1xuXG4gIFNlbGVjdDIucHJvdG90eXBlLl9zeW5jU3VidHJlZSA9IGZ1bmN0aW9uIChldnQsIG11dGF0aW9ucykge1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gSWdub3JlIGFueSBtdXRhdGlvbiBldmVudHMgcmFpc2VkIGZvciBlbGVtZW50cyB0aGF0IGFyZW4ndCBvcHRpb25zIG9yXG4gICAgLy8gb3B0Z3JvdXBzLiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiB0aGUgc2VsZWN0IGVsZW1lbnQgaXMgZGVzdHJveWVkXG4gICAgaWYgKFxuICAgICAgZXZ0ICYmIGV2dC50YXJnZXQgJiYgKFxuICAgICAgICBldnQudGFyZ2V0Lm5vZGVOYW1lICE9PSAnT1BUSU9OJyAmJiBldnQudGFyZ2V0Lm5vZGVOYW1lICE9PSAnT1BUR1JPVVAnXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFtdXRhdGlvbnMpIHtcbiAgICAgIC8vIElmIG11dGF0aW9uIGV2ZW50cyBhcmVuJ3Qgc3VwcG9ydGVkLCB0aGVuIHdlIGNhbiBvbmx5IGFzc3VtZSB0aGF0IHRoZVxuICAgICAgLy8gY2hhbmdlIGFmZmVjdGVkIHRoZSBzZWxlY3Rpb25zXG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG11dGF0aW9ucy5hZGRlZE5vZGVzICYmIG11dGF0aW9ucy5hZGRlZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbXV0YXRpb25zLmFkZGVkTm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBtdXRhdGlvbnMuYWRkZWROb2Rlc1tuXTtcblxuICAgICAgICBpZiAobm9kZS5zZWxlY3RlZCkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtdXRhdGlvbnMucmVtb3ZlZE5vZGVzICYmIG11dGF0aW9ucy5yZW1vdmVkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gT25seSByZS1wdWxsIHRoZSBkYXRhIGlmIHdlIHRoaW5rIHRoZXJlIGlzIGEgY2hhbmdlXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMuZGF0YUFkYXB0ZXIuY3VycmVudChmdW5jdGlvbiAoY3VycmVudERhdGEpIHtcbiAgICAgICAgc2VsZi50cmlnZ2VyKCdzZWxlY3Rpb246dXBkYXRlJywge1xuICAgICAgICAgIGRhdGE6IGN1cnJlbnREYXRhXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdHJpZ2dlciBtZXRob2QgdG8gYXV0b21hdGljYWxseSB0cmlnZ2VyIHByZS1ldmVudHMgd2hlblxuICAgKiB0aGVyZSBhcmUgZXZlbnRzIHRoYXQgY2FuIGJlIHByZXZlbnRlZC5cbiAgICovXG4gIFNlbGVjdDIucHJvdG90eXBlLnRyaWdnZXIgPSBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgIHZhciBhY3R1YWxUcmlnZ2VyID0gU2VsZWN0Mi5fX3N1cGVyX18udHJpZ2dlcjtcbiAgICB2YXIgcHJlVHJpZ2dlck1hcCA9IHtcbiAgICAgICdvcGVuJzogJ29wZW5pbmcnLFxuICAgICAgJ2Nsb3NlJzogJ2Nsb3NpbmcnLFxuICAgICAgJ3NlbGVjdCc6ICdzZWxlY3RpbmcnLFxuICAgICAgJ3Vuc2VsZWN0JzogJ3Vuc2VsZWN0aW5nJ1xuICAgIH07XG5cbiAgICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgaW4gcHJlVHJpZ2dlck1hcCkge1xuICAgICAgdmFyIHByZVRyaWdnZXJOYW1lID0gcHJlVHJpZ2dlck1hcFtuYW1lXTtcbiAgICAgIHZhciBwcmVUcmlnZ2VyQXJncyA9IHtcbiAgICAgICAgcHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgYXJnczogYXJnc1xuICAgICAgfTtcblxuICAgICAgYWN0dWFsVHJpZ2dlci5jYWxsKHRoaXMsIHByZVRyaWdnZXJOYW1lLCBwcmVUcmlnZ2VyQXJncyk7XG5cbiAgICAgIGlmIChwcmVUcmlnZ2VyQXJncy5wcmV2ZW50ZWQpIHtcbiAgICAgICAgYXJncy5wcmV2ZW50ZWQgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhY3R1YWxUcmlnZ2VyLmNhbGwodGhpcywgbmFtZSwgYXJncyk7XG4gIH07XG5cbiAgU2VsZWN0Mi5wcm90b3R5cGUudG9nZ2xlRHJvcGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5nZXQoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH07XG5cbiAgU2VsZWN0Mi5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlcigncXVlcnknLCB7fSk7XG4gIH07XG5cbiAgU2VsZWN0Mi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyKCdjbG9zZScsIHt9KTtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5pc09wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuJGNvbnRhaW5lci5oYXNDbGFzcygnc2VsZWN0Mi1jb250YWluZXItLW9wZW4nKTtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5oYXNGb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy4kY29udGFpbmVyLmhhc0NsYXNzKCdzZWxlY3QyLWNvbnRhaW5lci0tZm9jdXMnKTtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgLy8gTm8gbmVlZCB0byByZS10cmlnZ2VyIGZvY3VzIGV2ZW50cyBpZiB3ZSBhcmUgYWxyZWFkeSBmb2N1c2VkXG4gICAgaWYgKHRoaXMuaGFzRm9jdXMoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuJGNvbnRhaW5lci5hZGRDbGFzcygnc2VsZWN0Mi1jb250YWluZXItLWZvY3VzJyk7XG4gICAgdGhpcy50cmlnZ2VyKCdmb2N1cycsIHt9KTtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoYXJncykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZ2V0KCdkZWJ1ZycpICYmIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnU2VsZWN0MjogVGhlIGBzZWxlY3QyKFwiZW5hYmxlXCIpYCBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCcgK1xuICAgICAgICAnIGJlIHJlbW92ZWQgaW4gbGF0ZXIgU2VsZWN0MiB2ZXJzaW9ucy4gVXNlICRlbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKScgK1xuICAgICAgICAnIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBhcmdzID0gW3RydWVdO1xuICAgIH1cblxuICAgIHZhciBkaXNhYmxlZCA9ICFhcmdzWzBdO1xuXG4gICAgdGhpcy4kZWxlbWVudC5wcm9wKCdkaXNhYmxlZCcsIGRpc2FibGVkKTtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZ2V0KCdkZWJ1ZycpICYmXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnU2VsZWN0MjogRGF0YSBjYW4gbm8gbG9uZ2VyIGJlIHNldCB1c2luZyBgc2VsZWN0MihcImRhdGFcIilgLiBZb3UgJyArXG4gICAgICAgICdzaG91bGQgY29uc2lkZXIgc2V0dGluZyB0aGUgdmFsdWUgaW5zdGVhZCB1c2luZyBgJGVsZW1lbnQudmFsKClgLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSBbXTtcblxuICAgIHRoaXMuZGF0YUFkYXB0ZXIuY3VycmVudChmdW5jdGlvbiAoY3VycmVudERhdGEpIHtcbiAgICAgIGRhdGEgPSBjdXJyZW50RGF0YTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIFNlbGVjdDIucHJvdG90eXBlLnZhbCA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5nZXQoJ2RlYnVnJykgJiYgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdTZWxlY3QyOiBUaGUgYHNlbGVjdDIoXCJ2YWxcIilgIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlJyArXG4gICAgICAgICcgcmVtb3ZlZCBpbiBsYXRlciBTZWxlY3QyIHZlcnNpb25zLiBVc2UgJGVsZW1lbnQudmFsKCkgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLiRlbGVtZW50LnZhbCgpO1xuICAgIH1cblxuICAgIHZhciBuZXdWYWwgPSBhcmdzWzBdO1xuXG4gICAgaWYgKCQuaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICBuZXdWYWwgPSAkLm1hcChuZXdWYWwsIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy4kZWxlbWVudC52YWwobmV3VmFsKS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuJGNvbnRhaW5lci5yZW1vdmUoKTtcblxuICAgIGlmICh0aGlzLiRlbGVtZW50WzBdLmRldGFjaEV2ZW50KSB7XG4gICAgICB0aGlzLiRlbGVtZW50WzBdLmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgdGhpcy5fc3luY0EpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vYnNlcnZlciAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLl9vYnNlcnZlciA9IG51bGw7XG4gICAgfSBlbHNlIGlmICh0aGlzLiRlbGVtZW50WzBdLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnRbMF1cbiAgICAgICAgLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUF0dHJNb2RpZmllZCcsIHRoaXMuX3N5bmNBLCBmYWxzZSk7XG4gICAgICB0aGlzLiRlbGVtZW50WzBdXG4gICAgICAgIC5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCB0aGlzLl9zeW5jUywgZmFsc2UpO1xuICAgICAgdGhpcy4kZWxlbWVudFswXVxuICAgICAgICAucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCB0aGlzLl9zeW5jUywgZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuX3N5bmNBID0gbnVsbDtcbiAgICB0aGlzLl9zeW5jUyA9IG51bGw7XG5cbiAgICB0aGlzLiRlbGVtZW50Lm9mZignLnNlbGVjdDInKTtcbiAgICB0aGlzLiRlbGVtZW50LmF0dHIoJ3RhYmluZGV4JywgdGhpcy4kZWxlbWVudC5kYXRhKCdvbGQtdGFiaW5kZXgnKSk7XG5cbiAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCdzZWxlY3QyLWhpZGRlbi1hY2Nlc3NpYmxlJyk7XG4gICAgdGhpcy4kZWxlbWVudC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlRGF0YSgnc2VsZWN0MicpO1xuXG4gICAgdGhpcy5kYXRhQWRhcHRlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgIHRoaXMuZHJvcGRvd24uZGVzdHJveSgpO1xuICAgIHRoaXMucmVzdWx0cy5kZXN0cm95KCk7XG5cbiAgICB0aGlzLmRhdGFBZGFwdGVyID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGlvbiA9IG51bGw7XG4gICAgdGhpcy5kcm9wZG93biA9IG51bGw7XG4gICAgdGhpcy5yZXN1bHRzID0gbnVsbDtcbiAgfTtcblxuICBTZWxlY3QyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRjb250YWluZXIgPSAkKFxuICAgICAgJzxzcGFuIGNsYXNzPVwic2VsZWN0MiBzZWxlY3QyLWNvbnRhaW5lclwiPicgK1xuICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZWxlY3Rpb25cIj48L3NwYW4+JyArXG4gICAgICAgICc8c3BhbiBjbGFzcz1cImRyb3Bkb3duLXdyYXBwZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+JyArXG4gICAgICAnPC9zcGFuPidcbiAgICApO1xuXG4gICAgJGNvbnRhaW5lci5hdHRyKCdkaXInLCB0aGlzLm9wdGlvbnMuZ2V0KCdkaXInKSk7XG5cbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xuXG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKCdzZWxlY3QyLWNvbnRhaW5lci0tJyArIHRoaXMub3B0aW9ucy5nZXQoJ3RoZW1lJykpO1xuXG4gICAgJGNvbnRhaW5lci5kYXRhKCdlbGVtZW50JywgdGhpcy4kZWxlbWVudCk7XG5cbiAgICByZXR1cm4gJGNvbnRhaW5lcjtcbiAgfTtcblxuICByZXR1cm4gU2VsZWN0Mjtcbn0pO1xuXG5TMi5kZWZpbmUoJ2pxdWVyeS1tb3VzZXdoZWVsJyxbXG4gICdqcXVlcnknXG5dLCBmdW5jdGlvbiAoJCkge1xuICAvLyBVc2VkIHRvIHNoaW0galF1ZXJ5Lm1vdXNld2hlZWwgZm9yIG5vbi1mdWxsIGJ1aWxkcy5cbiAgcmV0dXJuICQ7XG59KTtcblxuUzIuZGVmaW5lKCdqcXVlcnkuc2VsZWN0MicsW1xuICAnanF1ZXJ5JyxcbiAgJ2pxdWVyeS1tb3VzZXdoZWVsJyxcblxuICAnLi9zZWxlY3QyL2NvcmUnLFxuICAnLi9zZWxlY3QyL2RlZmF1bHRzJ1xuXSwgZnVuY3Rpb24gKCQsIF8sIFNlbGVjdDIsIERlZmF1bHRzKSB7XG4gIGlmICgkLmZuLnNlbGVjdDIgPT0gbnVsbCkge1xuICAgIC8vIEFsbCBtZXRob2RzIHRoYXQgc2hvdWxkIHJldHVybiB0aGUgZWxlbWVudFxuICAgIHZhciB0aGlzTWV0aG9kcyA9IFsnb3BlbicsICdjbG9zZScsICdkZXN0cm95J107XG5cbiAgICAkLmZuLnNlbGVjdDIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2VPcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIG9wdGlvbnMpO1xuXG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gbmV3IFNlbGVjdDIoJCh0aGlzKSwgaW5zdGFuY2VPcHRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgcmV0O1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSAkKHRoaXMpLmRhdGEoJ3NlbGVjdDInKTtcblxuICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsICYmIHdpbmRvdy5jb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdUaGUgc2VsZWN0MihcXCcnICsgb3B0aW9ucyArICdcXCcpIG1ldGhvZCB3YXMgY2FsbGVkIG9uIGFuICcgK1xuICAgICAgICAgICAgICAnZWxlbWVudCB0aGF0IGlzIG5vdCB1c2luZyBTZWxlY3QyLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0ID0gaW5zdGFuY2Vbb3B0aW9uc10uYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgYmUgcmV0dXJuaW5nIGB0aGlzYFxuICAgICAgICBpZiAoJC5pbkFycmF5KG9wdGlvbnMsIHRoaXNNZXRob2RzKSA+IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBmb3IgU2VsZWN0MjogJyArIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBpZiAoJC5mbi5zZWxlY3QyLmRlZmF1bHRzID09IG51bGwpIHtcbiAgICAkLmZuLnNlbGVjdDIuZGVmYXVsdHMgPSBEZWZhdWx0cztcbiAgfVxuXG4gIHJldHVybiBTZWxlY3QyO1xufSk7XG5cbiAgLy8gUmV0dXJuIHRoZSBBTUQgbG9hZGVyIGNvbmZpZ3VyYXRpb24gc28gaXQgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGlzIGZpbGVcbiAgcmV0dXJuIHtcbiAgICBkZWZpbmU6IFMyLmRlZmluZSxcbiAgICByZXF1aXJlOiBTMi5yZXF1aXJlXG4gIH07XG59KCkpO1xuXG4gIC8vIEF1dG9sb2FkIHRoZSBqUXVlcnkgYmluZGluZ3NcbiAgLy8gV2Uga25vdyB0aGF0IGFsbCBvZiB0aGUgbW9kdWxlcyBleGlzdCBhYm92ZSB0aGlzLCBzbyB3ZSdyZSBzYWZlXG4gIHZhciBzZWxlY3QyID0gUzIucmVxdWlyZSgnanF1ZXJ5LnNlbGVjdDInKTtcblxuICAvLyBIb2xkIHRoZSBBTUQgbW9kdWxlIHJlZmVyZW5jZXMgb24gdGhlIGpRdWVyeSBmdW5jdGlvbiB0aGF0IHdhcyBqdXN0IGxvYWRlZFxuICAvLyBUaGlzIGFsbG93cyBTZWxlY3QyIHRvIHVzZSB0aGUgaW50ZXJuYWwgbG9hZGVyIG91dHNpZGUgb2YgdGhpcyBmaWxlLCBzdWNoXG4gIC8vIGFzIGluIHRoZSBsYW5ndWFnZSBmaWxlcy5cbiAgalF1ZXJ5LmZuLnNlbGVjdDIuYW1kID0gUzI7XG5cbiAgLy8gUmV0dXJuIHRoZSBTZWxlY3QyIGluc3RhbmNlIGZvciBhbnlvbmUgd2hvIGlzIGltcG9ydGluZyBpdC5cbiAgcmV0dXJuIHNlbGVjdDI7XG59KSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wdWJsaWMvYXNzZXRzL3ZlbmRvci9zZWxlY3QyL2Rpc3QvanMvc2VsZWN0Mi5qcyJdLCJzb3VyY2VSb290IjoiIn0=