diff --git a/aliases.js b/aliases.js index f3c6098..6e4556b 100644 --- a/aliases.js +++ b/aliases.js @@ -1,9 +1,9 @@ const path = require('path'); const tsconfig = require('./tsconfig'); -const { compilerOptions: { baseUrl, paths } } = tsconfig; +const { compilerOptions: { paths } } = tsconfig; const aliasReg = (str) => str.replace(/^(.*)\/\*$/, '$1'); module.exports = Object.keys(paths).reduce( - (obj, a) => (obj[aliasReg(a)] = path.resolve(__dirname, aliasReg(`${baseUrl}/${paths[a]}`)), obj), + (obj, a) => (obj[aliasReg(a)] = path.resolve(__dirname, aliasReg(paths[a][0])), obj), {} ); \ No newline at end of file diff --git a/docs/scripts/bundle.js b/docs/scripts/bundle.js index 8485771..bb9b74f 100644 --- a/docs/scripts/bundle.js +++ b/docs/scripts/bundle.js @@ -1 +1 @@ -(()=>{var __webpack_modules__={966(module,exports){eval('{var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(){var r=null;\n(function(){function X(e){function j(){try{J.doScroll("left")}catch(e){P(j,50);return}w("poll")}function w(j){if(!(j.type=="readystatechange"&&x.readyState!="complete")&&((j.type=="load"?n:x)[z](i+j.type,w,!1),!m&&(m=!0)))e.call(n,j.type||j)}var Y=x.addEventListener,m=!1,C=!0,t=Y?"addEventListener":"attachEvent",z=Y?"removeEventListener":"detachEvent",i=Y?"":"on";if(x.readyState=="complete")e.call(n,"lazy");else{if(x.createEventObject&&J.doScroll){try{C=!n.frameElement}catch(A){}C&&j()}x[t](i+"DOMContentLoaded",\nw,!1);x[t](i+"readystatechange",w,!1);n[t](i+"load",w,!1)}}function Q(){S&&X(function(){var e=K.length;$(e?function(){for(var j=0;j=0;){var M=A[m],T=M.src.match(/^[^#?]*\\/run_prettify\\.js(\\?[^#]*)?(?:#.*)?$/);if(T){z=T[1]||"";M.parentNode.removeChild(M);break}}var S=!0,D=\n[],N=[],K=[];z.replace(/[&?]([^&=]+)=([^&]+)/g,function(e,j,w){w=decodeURIComponent(w);j=decodeURIComponent(j);j=="autorun"?S=!/^[0fn]/i.test(w):j=="lang"?D.push(w):j=="skin"?N.push(w):j=="callback"&&K.push(w)});m=0;for(z=D.length;m122||(o<65||k>90||f.push([Math.max(65,k)|32,Math.min(o,90)|32]),o<97||k>122||f.push([Math.max(97,k)&-33,Math.min(o,122)&-33]))}}f.sort(function(f,a){return f[0]-\na[0]||a[1]-f[1]});b=[];g=[];for(a=0;ak[0]&&(k[1]+1>k[0]&&c.push("-"),c.push(h(k[1])));c.push("]");return c.join("")}function e(f){for(var a=f.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),c=a.length,d=[],g=0,k=0;g=2&&f==="["?a[g]=b(o):f!=="\\\\"&&(a[g]=o.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var j=0,F=!1,l=!1,I=0,c=a.length;I=5&&"lang-"===y.substring(0,5))&&!(u&&typeof u[1]==="string"))g=!1,y="src";g||(m[B]=y)}k=c;c+=B.length;if(g){g=u[1];var o=B.indexOf(g),H=o+g.length;u[2]&&(H=B.length-u[2].length,o=H-g.length);y=y.substring(5);n(l+k,B.substring(0,o),h,j);n(l+k+o,g,A(y,\ng),j);n(l+k+H,B.substring(H),h,j)}else j.push(l+k,y)}a.g=j}var b={},e;(function(){for(var h=a.concat(d),l=[],i={},c=0,p=h.length;c=0;)b[q.charAt(f)]=m;m=m[1];q=""+m;i.hasOwnProperty(q)||(l.push(m),i[q]=r)}l.push(/[\\S\\s]/);e=j(l)})();var i=d.length;return h}function t(a){var d=[],h=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\\\]|\\\\[\\S\\s]|\'\'?(?=[^\']))*(?:\'\'\'|$)|"""(?:[^"\\\\]|\\\\[\\S\\s]|""?(?=[^"]))*(?:"""|$)|\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$))/,\nr,"\'\\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,r,"\'\\"`"]):d.push(["str",/^(?:\'(?:[^\\n\\r\'\\\\]|\\\\.)*(?:\'|$)|"(?:[^\\n\\r"\\\\]|\\\\.)*(?:"|$))/,r,"\\"\'"]);a.verbatimStrings&&h.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,r]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,r,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,\nr,"#"]),h.push(["str",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,r])):d.push(["com",/^#[^\\n\\r]*/,r,"#"]));a.cStyleComments&&(h.push(["com",/^\\/\\/[^\\n\\r]*/,r]),h.push(["com",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,r]));if(b=a.regexLiterals){var e=(b=b>1?"":"\\n\\r")?".":"[\\\\S\\\\s]";h.push(["lang-regex",RegExp("^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*("+\n("/(?=[^/*"+b+"])(?:[^/\\\\x5B\\\\x5C"+b+"]|\\\\x5C"+e+"|\\\\x5B(?:[^\\\\x5C\\\\x5D"+b+"]|\\\\x5C"+e+")*(?:\\\\x5D|$))+/")+")")])}(b=a.types)&&h.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&h.push(["kwd",RegExp("^(?:"+b.replace(/[\\s,]+/g,"|")+")\\\\b"),r]);d.push(["pln",/^\\s+/,r," \\r\\n\\t\\u00a0"]);b="^.[^\\\\s\\\\w.$@\'\\"`/\\\\\\\\]*";a.regexLiterals&&(b+="(?!s*/)");h.push(["lit",/^@[$_a-z][\\w$@]*/i,r],["typ",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,r],["pln",/^[$_a-z][\\w$@]*/i,r],["lit",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,\nr,"0123456789"],["pln",/^\\\\[\\S\\s]?/,r],["pun",RegExp(b),r]);return C(d,h)}function z(a,d,h){function b(a){var c=a.nodeType;if(c==1&&!j.test(a.className))if("br"===a.nodeName)e(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&h){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),e(a),c||a.parentNode.removeChild(a)}}\nfunction e(a){function b(a,c){var d=c?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),h=a.nextSibling;f.appendChild(d);for(var e=h;e;e=h)h=e.nextSibling,f.appendChild(e)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var j=/(?:^|\\s)nocode(?:\\s|$)/,m=/\\r\\n?|\\n/,l=a.ownerDocument,i=l.createElement("li");a.firstChild;)i.appendChild(a.firstChild);for(var c=[i],p=0;p=0;){var b=d[h];U.hasOwnProperty(b)?V.console&&console.warn("cannot override language handler %s",b):U[b]=a}}function A(a,d){if(!a||!U.hasOwnProperty(a))a=/^\\s*=o&&(b+=2);h>=H&&(t+=2)}}finally{if(g)g.style.display=k}}catch(v){V.console&&console.log(v&&v.stack||v)}}var V=window,G=["break,continue,do,else,for,if,return,while"],O=[[G,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],\n"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],J=[O,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],K=[O,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],\nL=[K,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],O=[O,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],M=[G,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],\nN=[G,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],R=[G,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],G=[G,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],Q=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,\nS=/\\S/,T=t({keywords:[J,L,O,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",M,N,G],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),U={};i(T,["default-code"]);i(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],["lang-",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],["lang-",/^<%([\\S\\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",\n/^]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],["lang-js",/^]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],["lang-css",/^]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],["lang-in.tag",/^(<\\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);i(C([["pln",/^\\s+/,r," \\t\\r\\n"],["atv",/^(?:"[^"]*"?|\'[^\']*\'?)/,r,"\\"\'"]],[["tag",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],["atn",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],["lang-uq.val",/^=\\s*([^\\s"\'>]*(?:[^\\s"\'/>]|\\/(?=\\s)))/],["pun",/^[/<->]+/],\n["lang-js",/^on\\w+\\s*=\\s*"([^"]+)"/i],["lang-js",/^on\\w+\\s*=\\s*\'([^\']+)\'/i],["lang-js",/^on\\w+\\s*=\\s*([^\\s"\'>]+)/i],["lang-css",/^style\\s*=\\s*"([^"]+)"/i],["lang-css",/^style\\s*=\\s*\'([^\']+)\'/i],["lang-css",/^style\\s*=\\s*([^\\s"\'>]+)/i]]),["in.tag"]);i(C([],[["atv",/^[\\S\\s]+/]]),["uq.val"]);i(t({keywords:J,hashComments:!0,cStyleComments:!0,types:Q}),["c","cc","cpp","cxx","cyc","m"]);i(t({keywords:"null,true,false"}),["json"]);i(t({keywords:L,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:Q}),\n["cs"]);i(t({keywords:K,cStyleComments:!0}),["java"]);i(t({keywords:G,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);i(t({keywords:M,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);i(t({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);i(t({keywords:N,\nhashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);i(t({keywords:O,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);i(t({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);i(t({keywords:R,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);\ni(C([],[["str",/^[\\S\\s]+/]]),["regex"]);var X=V.PR={createSimpleLexer:C,registerLangHandler:i,sourceDecorator:t,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:function(a,d,e){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;e&&z(b,e,!0);D({h:d,j:e,c:b,i:1});return b.innerHTML},\nprettyPrint:e=e=function(a,d){function e(){for(var b=V.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nfunction Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type)\n var encoding = match ? match[1] : 'utf-8'\n reader.readAsText(blob, encoding)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._noBody = true;\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nfunction Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime())\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n try {\n headers.append(key, value)\n } catch (error) {\n console.warn('Response ' + error.message)\n }\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nfunction Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 200, statusText: ''})\n response.ok = false\n response.status = 0\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nvar DOMException = g.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nfunction fetch_fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob'\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer'\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name))\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value)\n }\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch_fetch.polyfill = true\n\nif (!g.fetch) {\n g.fetch = fetch_fetch\n g.Headers = Headers\n g.Request = Request\n g.Response = Response\n}\n\n;// ./src/constants/enums.ts\nvar ColorModel;\n(function (ColorModel) {\n ColorModel[\"HEX\"] = \"HEX\";\n ColorModel[\"RGB\"] = \"RGB\";\n ColorModel[\"HWB\"] = \"HWB\";\n ColorModel[\"HSL\"] = \"HSL\";\n ColorModel[\"CIELab\"] = \"CIELab\";\n ColorModel[\"LCH\"] = \"LCH\";\n ColorModel[\"CMYK\"] = \"CMYK\";\n})(ColorModel || (ColorModel = {}));\nvar Harmony;\n(function (Harmony) {\n Harmony[\"ANALOGOUS\"] = \"ANALOGOUS\";\n Harmony[\"COMPLEMENTARY\"] = \"COMPLEMENTARY\";\n Harmony[\"SPLIT_COMPLEMENTARY\"] = \"SPLIT_COMPLEMENTARY\";\n Harmony[\"TRIADIC\"] = \"TRIADIC\";\n Harmony[\"TETRADIC\"] = \"TETRADIC\";\n Harmony[\"SQUARE\"] = \"SQUARE\";\n})(Harmony || (Harmony = {}));\nvar Mix;\n(function (Mix) {\n Mix[\"ADDITIVE\"] = \"ADDITIVE\";\n Mix[\"SUBTRACTIVE\"] = \"SUBTRACTIVE\";\n})(Mix || (Mix = {}));\nvar AnglesUnitEnum;\n(function (AnglesUnitEnum) {\n AnglesUnitEnum[\"NONE\"] = \"none\";\n AnglesUnitEnum[\"DEGREES\"] = \"deg\";\n AnglesUnitEnum[\"GRADIANS\"] = \"grad\";\n AnglesUnitEnum[\"RADIANS\"] = \"rad\";\n AnglesUnitEnum[\"TURNS\"] = \"turn\";\n})(AnglesUnitEnum || (AnglesUnitEnum = {}));\nvar ColorUnitEnum;\n(function (ColorUnitEnum) {\n ColorUnitEnum[\"NONE\"] = \"none\";\n ColorUnitEnum[\"PERCENT\"] = \"percent\";\n})(ColorUnitEnum || (ColorUnitEnum = {}));\nvar CMYKFunctionEnum;\n(function (CMYKFunctionEnum) {\n CMYKFunctionEnum[\"DEVICE_CMYK\"] = \"device-cmyk\";\n CMYKFunctionEnum[\"CMYK\"] = \"cmyk\";\n})(CMYKFunctionEnum || (CMYKFunctionEnum = {}));\nvar ColorKeywords;\n(function (ColorKeywords) {\n ColorKeywords[\"black\"] = \"#000000\";\n ColorKeywords[\"silver\"] = \"#C0C0C0\";\n ColorKeywords[\"gray\"] = \"#808080\";\n ColorKeywords[\"white\"] = \"#FFFFFF\";\n ColorKeywords[\"maroon\"] = \"#800000\";\n ColorKeywords[\"red\"] = \"#FF0000\";\n ColorKeywords[\"purple\"] = \"#800080\";\n ColorKeywords[\"fuchsia\"] = \"#FF00FF\";\n ColorKeywords[\"green\"] = \"#008000\";\n ColorKeywords[\"lime\"] = \"#00FF00\";\n ColorKeywords[\"olive\"] = \"#808000\";\n ColorKeywords[\"yellow\"] = \"#FFFF00\";\n ColorKeywords[\"navy\"] = \"#000080\";\n ColorKeywords[\"blue\"] = \"#0000FF\";\n ColorKeywords[\"teal\"] = \"#008080\";\n ColorKeywords[\"aqua\"] = \"#00FFFF\";\n ColorKeywords[\"orange\"] = \"#FFA500\";\n ColorKeywords[\"aliceblue\"] = \"#F0F8FF\";\n ColorKeywords[\"antiquewhite\"] = \"#FAEBD7\";\n ColorKeywords[\"aquamarine\"] = \"#7FFFD4\";\n ColorKeywords[\"azure\"] = \"#F0FFFF\";\n ColorKeywords[\"beige\"] = \"#F5F5DC\";\n ColorKeywords[\"bisque\"] = \"#FFE4C4\";\n ColorKeywords[\"blanchedalmond\"] = \"#FFEBCD\";\n ColorKeywords[\"blueviolet\"] = \"#8A2BE2\";\n ColorKeywords[\"brown\"] = \"#A52A2A\";\n ColorKeywords[\"burlywood\"] = \"#DEB887\";\n ColorKeywords[\"cadetblue\"] = \"#5F9EA0\";\n ColorKeywords[\"chartreuse\"] = \"#7FFF00\";\n ColorKeywords[\"chocolate\"] = \"#D2691E\";\n ColorKeywords[\"coral\"] = \"#FF7F50\";\n ColorKeywords[\"cornflowerblue\"] = \"#6495ED\";\n ColorKeywords[\"cornsilk\"] = \"#FFF8DC\";\n ColorKeywords[\"crimson\"] = \"#DC143C\";\n ColorKeywords[\"cyan\"] = \"#00FFFF\";\n ColorKeywords[\"darkblue\"] = \"#00008B\";\n ColorKeywords[\"darkcyan\"] = \"#008B8B\";\n ColorKeywords[\"darkgoldenrod\"] = \"#B8860B\";\n ColorKeywords[\"darkgray\"] = \"#A9A9A9\";\n ColorKeywords[\"darkgreen\"] = \"#006400\";\n ColorKeywords[\"darkgrey\"] = \"#A9A9A9\";\n ColorKeywords[\"darkkhaki\"] = \"#BDB76B\";\n ColorKeywords[\"darkmagenta\"] = \"#8B008B\";\n ColorKeywords[\"darkolivegreen\"] = \"#556B2F\";\n ColorKeywords[\"darkorange\"] = \"#FF8C00\";\n ColorKeywords[\"darkorchid\"] = \"#9932CC\";\n ColorKeywords[\"darkred\"] = \"#8B0000\";\n ColorKeywords[\"darksalmon\"] = \"#E9967A\";\n ColorKeywords[\"darkseagreen\"] = \"#8FBC8F\";\n ColorKeywords[\"darkslateblue\"] = \"#483D8B\";\n ColorKeywords[\"darkslategray\"] = \"#2F4F4F\";\n ColorKeywords[\"darkslategrey\"] = \"#2F4F4F\";\n ColorKeywords[\"darkturquoise\"] = \"#00CED1\";\n ColorKeywords[\"darkviolet\"] = \"#9400D3\";\n ColorKeywords[\"deeppink\"] = \"#FF1493\";\n ColorKeywords[\"deepskyblue\"] = \"#00BFFF\";\n ColorKeywords[\"dimgray\"] = \"#696969\";\n ColorKeywords[\"dimgrey\"] = \"#696969\";\n ColorKeywords[\"dodgerblue\"] = \"#1E90FF\";\n ColorKeywords[\"firebrick\"] = \"#B22222\";\n ColorKeywords[\"floralwhite\"] = \"#FFFAF0\";\n ColorKeywords[\"forestgreen\"] = \"#228B22\";\n ColorKeywords[\"gainsboro\"] = \"#DCDCDC\";\n ColorKeywords[\"ghostwhite\"] = \"#F8F8FF\";\n ColorKeywords[\"gold\"] = \"#FFD700\";\n ColorKeywords[\"goldenrod\"] = \"#DAA520\";\n ColorKeywords[\"greenyellow\"] = \"#ADFF2F\";\n ColorKeywords[\"grey\"] = \"#808080\";\n ColorKeywords[\"honeydew\"] = \"#F0FFF0\";\n ColorKeywords[\"hotpink\"] = \"#FF69B4\";\n ColorKeywords[\"indianred\"] = \"#CD5C5C\";\n ColorKeywords[\"indigo\"] = \"#4B0082\";\n ColorKeywords[\"ivory\"] = \"#FFFFF0\";\n ColorKeywords[\"khaki\"] = \"#F0E68C\";\n ColorKeywords[\"lavender\"] = \"#E6E6FA\";\n ColorKeywords[\"lavenderblush\"] = \"#FFF0F5\";\n ColorKeywords[\"lawngreen\"] = \"#7CFC00\";\n ColorKeywords[\"lemonchiffon\"] = \"#FFFACD\";\n ColorKeywords[\"lightblue\"] = \"#ADD8E6\";\n ColorKeywords[\"lightcoral\"] = \"#F08080\";\n ColorKeywords[\"lightcyan\"] = \"#E0FFFF\";\n ColorKeywords[\"lightgoldenrodyellow\"] = \"#FAFAD2\";\n ColorKeywords[\"lightgray\"] = \"#D3D3D3\";\n ColorKeywords[\"lightgreen\"] = \"#90EE90\";\n ColorKeywords[\"lightgrey\"] = \"#D3D3D3\";\n ColorKeywords[\"lightpink\"] = \"#FFB6C1\";\n ColorKeywords[\"lightsalmon\"] = \"#FFA07A\";\n ColorKeywords[\"lightseagreen\"] = \"#20B2AA\";\n ColorKeywords[\"lightskyblue\"] = \"#87CEFA\";\n ColorKeywords[\"lightslategray\"] = \"#778899\";\n ColorKeywords[\"lightslategrey\"] = \"#778899\";\n ColorKeywords[\"lightsteelblue\"] = \"#B0C4DE\";\n ColorKeywords[\"lightyellow\"] = \"#FFFFE0\";\n ColorKeywords[\"limegreen\"] = \"#32CD32\";\n ColorKeywords[\"linen\"] = \"#FAF0E6\";\n ColorKeywords[\"magenta\"] = \"#FF00FF\";\n ColorKeywords[\"mediumaquamarine\"] = \"#66CDAA\";\n ColorKeywords[\"mediumblue\"] = \"#0000CD\";\n ColorKeywords[\"mediumorchid\"] = \"#BA55D3\";\n ColorKeywords[\"mediumpurple\"] = \"#9370DB\";\n ColorKeywords[\"mediumseagreen\"] = \"#3CB371\";\n ColorKeywords[\"mediumslateblue\"] = \"#7B68EE\";\n ColorKeywords[\"mediumspringgreen\"] = \"#00FA9A\";\n ColorKeywords[\"mediumturquoise\"] = \"#48D1CC\";\n ColorKeywords[\"mediumvioletred\"] = \"#C71585\";\n ColorKeywords[\"midnightblue\"] = \"#191970\";\n ColorKeywords[\"mintcream\"] = \"#F5FFFA\";\n ColorKeywords[\"mistyrose\"] = \"#FFE4E1\";\n ColorKeywords[\"moccasin\"] = \"#FFE4B5\";\n ColorKeywords[\"navajowhite\"] = \"#FFDEAD\";\n ColorKeywords[\"oldlace\"] = \"#FDF5E6\";\n ColorKeywords[\"olivedrab\"] = \"#6B8E23\";\n ColorKeywords[\"orangered\"] = \"#FF4500\";\n ColorKeywords[\"orchid\"] = \"#DA70D6\";\n ColorKeywords[\"palegoldenrod\"] = \"#EEE8AA\";\n ColorKeywords[\"palegreen\"] = \"#98FB98\";\n ColorKeywords[\"paleturquoise\"] = \"#AFEEEE\";\n ColorKeywords[\"palevioletred\"] = \"#DB7093\";\n ColorKeywords[\"papayawhip\"] = \"#FFEFD5\";\n ColorKeywords[\"peachpuff\"] = \"#FFDAB9\";\n ColorKeywords[\"peru\"] = \"#CD853F\";\n ColorKeywords[\"pink\"] = \"#FFC0CB\";\n ColorKeywords[\"plum\"] = \"#DDA0DD\";\n ColorKeywords[\"powderblue\"] = \"#B0E0E6\";\n ColorKeywords[\"rosybrown\"] = \"#BC8F8F\";\n ColorKeywords[\"royalblue\"] = \"#4169E1\";\n ColorKeywords[\"saddlebrown\"] = \"#8B4513\";\n ColorKeywords[\"salmon\"] = \"#FA8072\";\n ColorKeywords[\"sandybrown\"] = \"#F4A460\";\n ColorKeywords[\"seagreen\"] = \"#2E8B57\";\n ColorKeywords[\"seashell\"] = \"#FFF5EE\";\n ColorKeywords[\"sienna\"] = \"#A0522D\";\n ColorKeywords[\"skyblue\"] = \"#87CEEB\";\n ColorKeywords[\"slateblue\"] = \"#6A5ACD\";\n ColorKeywords[\"slategray\"] = \"#708090\";\n ColorKeywords[\"slategrey\"] = \"#708090\";\n ColorKeywords[\"snow\"] = \"#FFFAFA\";\n ColorKeywords[\"springgreen\"] = \"#00FF7F\";\n ColorKeywords[\"steelblue\"] = \"#4682B4\";\n ColorKeywords[\"tan\"] = \"#D2B48C\";\n ColorKeywords[\"thistle\"] = \"#D8BFD8\";\n ColorKeywords[\"tomato\"] = \"#FF6347\";\n ColorKeywords[\"turquoise\"] = \"#40E0D0\";\n ColorKeywords[\"violet\"] = \"#EE82EE\";\n ColorKeywords[\"wheat\"] = \"#F5DEB3\";\n ColorKeywords[\"whitesmoke\"] = \"#F5F5F5\";\n ColorKeywords[\"yellowgreen\"] = \"#9ACD32\";\n ColorKeywords[\"rebeccapurple\"] = \"#663399\";\n})(ColorKeywords || (ColorKeywords = {}));\n\n;// ./src/constants/regexps.ts\n\nconst COLORREGS = {\n [ColorModel.HEX]: /^#(?:(?[a-f\\d])(?[a-f\\d])(?[a-f\\d])(?[a-f\\d])?|(?[a-f\\d]{2})(?[a-f\\d]{2})(?[a-f\\d]{2})(?[a-f\\d]{2})?)$/i,\n [ColorModel.RGB]: /^rgba?\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)(?:\\s*,\\s*(?(?:\\d*\\.)?\\d+))?|(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[rgb]|(?:\\d*\\.)?\\d+|calc\\([rgb()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[rgb]|(?:\\d*\\.)?\\d+|calc\\([rgb()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[rgb]|(?:\\d*\\.)?\\d+|calc\\([rgb()/*\\-+\\d.\\s]+\\)))(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.HWB]: /^hwb\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s+(?(?:\\d*\\.)?\\d+)%\\s+(?(?:\\d*\\.)?\\d+)%(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[hwb]|(?:\\d*\\.)?\\d+|calc\\([hwb()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[hwb]|(?:\\d*\\.)?\\d+|calc\\([hwb()/*\\-+\\d.\\s]+\\)))%?\\s+(?(?:[hwb]|(?:\\d*\\.)?\\d+|calc\\([hwb()/*\\-+\\d.\\s]+\\)))%?(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.HSL]: /^hsla?\\s*\\(\\s*(?:(?-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s*,\\s*(?(?:\\d*\\.)?\\d+)%\\s*,\\s*(?(?:\\d*\\.)?\\d+)%(?:\\s*,\\s*(?(?:\\d*\\.)?\\d+))?|(?-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s+(?(?:\\d*\\.)?\\d+)%?\\s+(?(?:\\d*\\.)?\\d+)%?(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[hsl]|(?:\\d*\\.)?\\d+|calc\\([hsl()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[hsl]|(?:\\d*\\.)?\\d+|calc\\([hsl()/*\\-+\\d.\\s]+\\)))%?\\s+(?(?:[hsl]|(?:\\d*\\.)?\\d+|calc\\([hsl()/*\\-+\\d.\\s]+\\)))%?(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.CIELab]: /^lab\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+%?)\\s+(?-?(?:\\d*\\.)?\\d+%?)\\s+(?-?(?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[lab]|(?:\\d*\\.)?\\d+|calc\\([lab()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[lab]|(?:\\d*\\.)?\\d+|calc\\([lab()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[lab]|(?:\\d*\\.)?\\d+|calc\\([lab()/*\\-+\\d.\\s]+\\)))(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.LCH]: /^lch\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+%?)\\s+(?-?(?:\\d*\\.)?\\d+%?)\\s+(?-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[lch]|(?:\\d*\\.)?\\d+|calc\\([lch()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[lch]|(?:\\d*\\.)?\\d+|calc\\([lch()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[lch]|(?:\\d*\\.)?\\d+|calc\\([lch()/*\\-+\\d.\\s]+\\)))(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.CMYK]: /^(?:device-cmyk|cmyk)\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)(?:\\s*,\\s*(?(?:\\d*\\.)?\\d+))?|(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?)\\s*\\)$/\n};\nconst CALC = {\n REGEXP: /^calc\\(\\s*(?[\\d./*+-\\w\\s]+)\\s*\\)$/,\n SCOPED: /\\(\\s*([^()]+)\\s*\\)/g,\n DIVISION: /\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*/,\n MULTIPLICATION: /\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*\\*\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*/,\n SUM: /\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*\\+\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*/,\n REST: /\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*-\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*/\n};\nconst HSL_HUE = /^(?-?(?:\\d*\\.)?\\d+)(?(?:deg|grad|rad|turn)?)$/;\nconst PCENT = /^(-?\\d+(?:\\.\\d+)?|-?\\.\\d+)%$/;\nconst HEX = /^0x([a-f\\d]{1,2})$/i;\nconst TEMPLATE_VAR = /\\{(\\d+)\\}/g;\nconst COMMAS_AND_NEXT_CHARS = /,( +|\\d+)/g;\nconst SPACES = / +/;\n\n;// ./src/constants/index.ts\n\nconst MAX_DECIMALS = 6;\nconst DEFAULT_BLEND_STEPS = 5;\nconst DEFAULT_SHADES_TINTS_STEPS = 5;\nconst BASE_255 = 255;\nconst MAX_HUE = 360;\nconst MAX_PCENT = 100;\nconst MAX_ALPHA = 1;\nconst MAX_LAB = 125;\nconst MAX_LCH_C = 150;\nconst GRADIANS = 10 / 9;\nconst COLOR_PROPS = Object.freeze({\n HEX: ['R', 'G', 'B', 'A'],\n RGB: ['R', 'G', 'B', 'A'],\n HSL: ['H', 'S', 'L', 'A'],\n HWB: ['H', 'W', 'B', 'A'],\n CIELab: ['L', 'a', 'b', 'A'],\n LCH: ['L', 'C', 'H', 'A'],\n CMYK: ['C', 'M', 'Y', 'K', 'A']\n});\nconst COMMA = ',';\nconst VALID_COLOR_OBJECTS = Object.freeze({\n ABGR: ColorModel.RGB,\n ABHW: ColorModel.HWB,\n ACHL: ColorModel.LCH,\n ACKMY: ColorModel.CMYK,\n AHLS: ColorModel.HSL,\n ALAB: ColorModel.CIELab,\n BGR: ColorModel.RGB,\n BHW: ColorModel.HWB,\n CHL: ColorModel.LCH,\n CKMY: ColorModel.CMYK,\n HLS: ColorModel.HSL,\n LAB: ColorModel.CIELab\n});\nconst DEFAULT_OPTIONS = Object.freeze({\n decimals: MAX_DECIMALS,\n legacyCSS: false,\n spacesAfterCommas: false,\n anglesUnit: AnglesUnitEnum.NONE,\n rgbUnit: ColorUnitEnum.NONE,\n labUnit: ColorUnitEnum.NONE,\n lchUnit: ColorUnitEnum.NONE,\n cmykUnit: ColorUnitEnum.PERCENT,\n alphaUnit: ColorUnitEnum.NONE,\n cmykFunction: CMYKFunctionEnum.DEVICE_CMYK\n});\nconst ERRORS = Object.freeze({\n NOT_ACCEPTED_INPUT: `The provided string color doesn't have a correct format`,\n NOT_A_VALID_RELATIVE_COLOR: 'is not a valid operation for a relative color'\n});\n\n\n\n;// ./src/utilities/index.ts\n\nconst getOrderedArrayString = (keys) => [...keys].sort().join('').toUpperCase();\nconst isString = (input) => typeof input === 'string';\nconst isNumber = (input) => typeof input === 'number';\nconst isBoolean = (input) => typeof input === 'boolean';\nconst isUndefined = (input) => input === undefined;\nconst getColorModel = (color) => {\n return VALID_COLOR_OBJECTS[getOrderedArrayString(Object.keys(color))];\n};\nconst isRGBObject = (color) => getColorModel(color) === ColorModel.RGB;\nconst isHSLObject = (color) => getColorModel(color) === ColorModel.HSL;\nconst isHWBObject = (color) => getColorModel(color) === ColorModel.HWB;\nconst isCIELabObject = (color) => getColorModel(color) === ColorModel.CIELab;\nconst isLCHObject = (color) => getColorModel(color) === ColorModel.LCH;\nconst isCMYKObject = (color) => getColorModel(color) === ColorModel.CMYK;\nconst isColorKeyword = (color) => color in ColorKeywords;\nconst isHarmony = (param) => {\n return `${param}` in Harmony;\n};\nconst isMix = (param) => {\n return `${param}` in Mix;\n};\nconst percentNumber = (percent) => {\n return +`${percent}`.replace(PCENT, '$1');\n};\nconst percent = (percent) => PCENT.test(`${percent}`)\n ? percentNumber(percent)\n : Math.min(+percent, 100);\nconst getDEC = (hex) => {\n if (hex.length === 1) {\n hex += hex;\n }\n return parseInt(hex, 16);\n};\nconst getHEX = (number) => {\n const hex = round(number, 0).toString(16).toUpperCase();\n if (hex.length === 1) {\n return `0x0${hex}`;\n }\n return `0x${hex}`;\n};\nconst toHEX = (h) => {\n let hex = round(h, 0).toString(16).toUpperCase();\n if (hex.length === 1) {\n hex = `0${hex}`;\n }\n return hex;\n};\nconst from255NumberToPercent = (value, decimals) => round(value / BASE_255 * 100, decimals);\nconst from125NumberToPercent = (value, decimals) => round(value / MAX_LAB * 100, decimals);\nconst from150NumberToPercent = (value, decimals) => round(value / MAX_LCH_C * 100, decimals);\nconst getBase255Number = (color, alpha = false) => {\n if (!alpha && PCENT.test(color)) {\n return Math.min(BASE_255 * percentNumber(color) / 100, BASE_255);\n }\n if (HEX.test(color)) {\n if (color.length === 3) {\n color += color.slice(-1);\n }\n return alpha\n ? round(color) / BASE_255\n : round(color);\n }\n return Math.min(+color, alpha ? 1 : BASE_255);\n};\nconst getBase125Number = (color) => {\n if (PCENT.test(color)) {\n return minmax(MAX_LAB * percentNumber(color) / 100, -MAX_LAB, MAX_LAB);\n }\n return minmax(+color, -MAX_LAB, MAX_LAB);\n};\nconst getBase150Number = (color) => {\n if (PCENT.test(color)) {\n return minmax(MAX_LCH_C * percentNumber(color) / 100, -MAX_LCH_C, MAX_LCH_C);\n }\n return minmax(+color, -MAX_LCH_C, MAX_LCH_C);\n};\nconst getCMYKNumber = (color, base100) => {\n const value = PCENT.test(color)\n ? percentNumber(color)\n : +color;\n if (base100) {\n return Math.min(value * 100, 100);\n }\n return Math.min(value, 100);\n};\nconst round = (value, decimals = MAX_DECIMALS) => {\n const exp = Math.pow(10, decimals);\n return Math.round(+value * exp) / exp;\n};\nconst minmax = (n, min, max) => Math.max(min, Math.min(n, max));\nconst degrees = (radian) => radian * 180 / Math.PI;\nconst radians = (degrees) => degrees * Math.PI / 180;\nconst normalizeHue = (hue) => {\n if (isString(hue)) {\n const matches = hue.match(HSL_HUE);\n const groups = matches.groups;\n const value = +groups.number;\n const units = groups.units;\n switch (units) {\n case AnglesUnitEnum.RADIANS:\n hue = round(degrees(value));\n break;\n case AnglesUnitEnum.TURNS:\n hue = round(value * MAX_HUE);\n break;\n case AnglesUnitEnum.GRADIANS:\n hue = round(9 / 10 * value);\n break;\n case AnglesUnitEnum.DEGREES:\n default:\n hue = value;\n }\n }\n if (hue >= MAX_HUE || hue < 0) {\n hue -= Math.floor(hue / MAX_HUE) * MAX_HUE;\n }\n return hue;\n};\nconst normalizeAlpha = (alpha) => {\n if (isString(alpha)) {\n if (PCENT.test(alpha)) {\n alpha = percentNumber(alpha) / 100;\n }\n else {\n alpha = +alpha;\n }\n }\n return (isNaN(+alpha) || alpha > MAX_ALPHA) ? MAX_ALPHA : round(alpha);\n};\nconst translateDegrees = (degrees, units) => {\n let hue;\n switch (units) {\n case AnglesUnitEnum.RADIANS:\n hue = round(radians(degrees));\n break;\n case AnglesUnitEnum.TURNS:\n hue = round(degrees / MAX_HUE);\n break;\n case AnglesUnitEnum.GRADIANS:\n hue = round(GRADIANS * degrees);\n break;\n case AnglesUnitEnum.DEGREES:\n case AnglesUnitEnum.NONE:\n default:\n hue = degrees;\n }\n return hue;\n};\nconst getAngleUnit = (unit) => {\n if (unit) {\n const angleUnitMatch = unit.match(HSL_HUE);\n const angleUnit = angleUnitMatch.groups.units;\n return angleUnit === ''\n ? AnglesUnitEnum.NONE\n : angleUnit;\n }\n return AnglesUnitEnum.NONE;\n};\n\n;// ./src/color/translators.ts\n\n\nconst MATRIX_LRGB_XYZ_D50 = [\n [0.4360747, 0.3850649, 0.1430804],\n [0.2225045, 0.7168786, 0.0606169],\n [0.0139322, 0.0971045, 0.7141733]\n];\nconst MATRIX_XYZ_D50_LRGB = [\n [3.1338561, -1.6168667, -0.4906146],\n [-0.9787684, 1.9161415, 0.033454],\n [0.0719453, -0.2289914, 1.4052427]\n];\nconst TRISTIMULUS_D50 = MATRIX_LRGB_XYZ_D50.map((matrix) => {\n return matrix.reduce((sum, value) => sum + value, 0);\n});\nconst hueToRgb = (t1, t2, hue) => {\n if (hue < 0) {\n hue += 6;\n }\n if (hue >= 6) {\n hue -= 6;\n }\n if (hue < 1) {\n return round(((t2 - t1) * hue + t1) * BASE_255);\n }\n else if (hue < 3) {\n return round(t2 * BASE_255);\n }\n else if (hue < 4) {\n return round(((t2 - t1) * (4 - hue) + t1) * BASE_255);\n }\n else {\n return round(t1 * BASE_255);\n }\n};\nconst rgbToLinearLightRgb = (value) => {\n return value <= 0.04045\n ? value / 12.92\n : ((value + 0.055) / 1.055) ** 2.4;\n};\nconst linearLightRgbToRgb = (value) => {\n return value <= 0.0031308\n ? 12.92 * value\n : 1.055 * (value ** (1 / 2.4)) - 0.055;\n};\nconst matrixVectorMultiplication = (v1, v2, v3, matrix) => {\n const result = [0, 0, 0];\n const linearRgb = [v1, v2, v3];\n matrix.forEach((array, index) => {\n array.forEach((value, mindex) => {\n result[index] += value * linearRgb[mindex];\n });\n });\n return result;\n};\nconst from_CIE_XYZ_D50_to_CIE_LAB = (x, y, z) => {\n const f = (t) => {\n return t > (6 / 29) ** 3\n ? Math.cbrt(t)\n : t / (3 * (6 / 29) ** 2) + (4 / 29);\n };\n const fx = f(x / TRISTIMULUS_D50[0]);\n const fy = f(y / TRISTIMULUS_D50[1]);\n const fz = f(z / TRISTIMULUS_D50[2]);\n return [\n 116 * fy - 16,\n 500 * (fx - fy),\n 200 * (fy - fz)\n ];\n};\nconst from_CIE_LAB_to_CIE_XYZ_D50 = (L, a, b) => {\n const f = (t) => {\n return t > 6 / 29\n ? t ** 3\n : 3 * (6 / 29) ** 2 * (t - 4 / 29);\n };\n const fl = (L + 16) / 116;\n const fa = a / 500;\n const fb = b / 200;\n return [\n TRISTIMULUS_D50[0] * f(fl + fa),\n TRISTIMULUS_D50[1] * f(fl),\n TRISTIMULUS_D50[2] * f(fl - fb)\n ];\n};\nconst hslToRgb = (H, S, L) => {\n H /= 60;\n S /= 100;\n L /= 100;\n const t2 = (L <= .5)\n ? L * (S + 1)\n : L + S - (L * S);\n const t1 = L * 2 - t2;\n const R = hueToRgb(t1, t2, H + 2);\n const G = hueToRgb(t1, t2, H);\n const B = hueToRgb(t1, t2, H - 2);\n return { R, G, B };\n};\nconst rgbToHsl = (R, G, B, A = 1) => {\n R /= BASE_255;\n G /= BASE_255;\n B /= BASE_255;\n A = Math.min(A, MAX_ALPHA);\n const MAX = Math.max(R, G, B);\n const MIN = Math.min(R, G, B);\n const D = MAX - MIN;\n let H = 0;\n let S = 0;\n const L = (MAX + MIN) / 2;\n if (D !== 0) {\n switch (MAX) {\n case R:\n H = ((G - B) / D) % 6;\n break;\n case G:\n H = (B - R) / D + 2;\n break;\n case B:\n H = (R - G) / D + 4;\n break;\n }\n H = round(H * 60);\n if (H < 0) {\n H += 360;\n }\n S = D / (1 - Math.abs(2 * L - 1));\n }\n return {\n H,\n S: round(S * 100),\n L: round(L * 100),\n A\n };\n};\nconst rgbToLab = (R, G, B) => {\n const LINEAR_LIGHT_RGB = [\n R / BASE_255,\n G / BASE_255,\n B / BASE_255\n ].map(rgbToLinearLightRgb);\n const CIE_XYZ_D50 = matrixVectorMultiplication(LINEAR_LIGHT_RGB[0], LINEAR_LIGHT_RGB[1], LINEAR_LIGHT_RGB[2], MATRIX_LRGB_XYZ_D50);\n const CIE_LAB = from_CIE_XYZ_D50_to_CIE_LAB(CIE_XYZ_D50[0], CIE_XYZ_D50[1], CIE_XYZ_D50[2]);\n return {\n L: CIE_LAB[0],\n a: CIE_LAB[1],\n b: CIE_LAB[2]\n };\n};\nconst labToRgb = (L, a, b) => {\n const CIE_XYZ_D50 = from_CIE_LAB_to_CIE_XYZ_D50(L, a, b);\n const LINEAR_LIGHT_RGB = matrixVectorMultiplication(CIE_XYZ_D50[0], CIE_XYZ_D50[1], CIE_XYZ_D50[2], MATRIX_XYZ_D50_LRGB);\n const rgb = LINEAR_LIGHT_RGB.map(linearLightRgbToRgb);\n return {\n R: minmax(rgb[0] * BASE_255, 0, BASE_255),\n G: minmax(rgb[1] * BASE_255, 0, BASE_255),\n B: minmax(rgb[2] * BASE_255, 0, BASE_255)\n };\n};\nconst labToLch = (L, a, b) => {\n const C = Math.sqrt(a ** 2 + b ** 2);\n const H = degrees(Math.atan2(b, a));\n return {\n L,\n C,\n H: normalizeHue(H)\n };\n};\nconst lchToLab = (L, C, H) => {\n const radH = radians(H);\n const a = C * Math.cos(radH);\n const b = C * Math.sin(radH);\n return {\n L,\n a,\n b\n };\n};\nconst rgbToLch = (R, G, B) => {\n const lab = rgbToLab(R, G, B);\n return labToLch(lab.L, lab.a, lab.b);\n};\nconst lchToRgb = (L, C, H) => {\n const lab = lchToLab(L, C, H);\n return labToRgb(lab.L, lab.a, lab.b);\n};\nconst rgbToHwb = (R, G, B, A = 1) => {\n const hsl = rgbToHsl(R, G, B, A);\n return {\n H: hsl.H,\n W: round(Math.min(R, G, B) / BASE_255 * 100),\n B: round((1 - Math.max(R, G, B) / BASE_255) * 100),\n A\n };\n};\nconst hwbToRgb = (H, W, B) => {\n W /= 100;\n B /= 100;\n const v = 1 - B;\n const c = v - W;\n const x = c * (1 - Math.abs((H / 60) % 2 - 1));\n let rgbR;\n let rgbG;\n let rgbB;\n if (H < 60) {\n rgbR = c;\n rgbG = x;\n rgbB = 0;\n }\n else if (H >= 60 && H < 120) {\n rgbR = x;\n rgbG = c;\n rgbB = 0;\n }\n else if (H >= 120 && H < 180) {\n rgbR = 0;\n rgbG = c;\n rgbB = x;\n }\n else if (H >= 180 && H < 240) {\n rgbR = 0;\n rgbG = x;\n rgbB = c;\n }\n else if (H >= 240 && H < 300) {\n rgbR = x;\n rgbG = 0;\n rgbB = c;\n }\n else {\n rgbR = c;\n rgbG = 0;\n rgbB = x;\n }\n rgbR += W;\n rgbG += W;\n rgbB += W;\n return {\n R: minmax(rgbR * BASE_255, 0, BASE_255),\n G: minmax(rgbG * BASE_255, 0, BASE_255),\n B: minmax(rgbB * BASE_255, 0, BASE_255)\n };\n};\nconst cmykToRgb = (C, M, Y, K) => {\n K = 1 - K;\n return {\n R: minmax(round(BASE_255 * (1 - C) * K), 0, BASE_255),\n G: minmax(round(BASE_255 * (1 - M) * K), 0, BASE_255),\n B: minmax(round(BASE_255 * (1 - Y) * K), 0, BASE_255)\n };\n};\nconst rgbToCmyk = (R, G, B) => {\n R /= BASE_255;\n G /= BASE_255;\n B /= BASE_255;\n const K = 1 - Math.max(R, G, B);\n const K1 = 1 - K;\n const C = K1 && (K1 - R) / K1;\n const M = K1 && (K1 - G) / K1;\n const Y = K1 && (K1 - B) / K1;\n return {\n C: round(C * 100),\n M: round(M * 100),\n Y: round(Y * 100),\n K: round(K * 100)\n };\n};\nconst rgbToRyb = (R, G, B) => {\n const Iw = Math.min(R, G, B);\n const Ib = Math.min(BASE_255 - R, BASE_255 - G, BASE_255 - B);\n const rRgb = R - Iw;\n const gRgb = G - Iw;\n const bRgb = B - Iw;\n const minRg = Math.min(rRgb, gRgb);\n const rRyb = rRgb - minRg;\n const yRyb = (gRgb + minRg) / 2;\n const bRyb = (bRgb + gRgb - minRg) / 2;\n const n = Math.max(rRyb, yRyb, bRyb) / Math.max(rRgb, gRgb, bRgb);\n const N = isNaN(n) || n === Infinity || n <= 0 ? 1 : n;\n return {\n R: rRyb / N + Ib,\n Y: yRyb / N + Ib,\n B: bRyb / N + Ib\n };\n};\nconst rybToRgb = (R, Y, B) => {\n const Iw = Math.min(R, Y, B);\n const Ib = Math.min(BASE_255 - R, BASE_255 - Y, BASE_255 - B);\n const rRyb = R - Iw;\n const yRyb = Y - Iw;\n const bRyb = B - Iw;\n const minYb = Math.min(yRyb, bRyb);\n const rRgb = rRyb + yRyb - minYb;\n const gRgb = yRyb + minYb;\n const bRgb = 2 * (bRyb - minYb);\n const n = Math.max(rRgb, gRgb, bRgb) / Math.max(rRyb, yRyb, bRyb);\n const N = isNaN(n) || n === Infinity || n <= 0 ? 1 : n;\n return {\n R: rRgb / N + Ib,\n G: gRgb / N + Ib,\n B: bRgb / N + Ib\n };\n};\nconst hueRyb = (hue, toRyb) => {\n if (hue < 0)\n hue += 360;\n if (hue > 360)\n hue -= 360;\n if (hue === 360 || hue === 0)\n return hue;\n const map1 = [\n [0, 120],\n [120, 180],\n [180, 240],\n [240, 360]\n ];\n const map2 = [\n [0, 60],\n [60, 120],\n [120, 240],\n [240, 360]\n ];\n const from = toRyb ? map1 : map2;\n const to = toRyb ? map2 : map1;\n let A = 0;\n let B = 0;\n let C = 0;\n let D = 0;\n from.find((arr, index) => {\n if (hue >= arr[0] && hue < arr[1]) {\n A = arr[0];\n B = arr[1];\n C = to[index][0];\n D = to[index][1];\n return true;\n }\n return false;\n });\n return C + (hue - A) * ((D - C) / (B - A));\n};\n\n;// ./src/classes/ColorParserContext.ts\n\n\nclass ColorParserContext {\n constructor(parsers) {\n this._parsers = parsers;\n }\n getParser(input) {\n for (const parser of this._parsers.values()) {\n if (parser.supports(input)) {\n return parser;\n }\n }\n throw new Error(ERRORS.NOT_ACCEPTED_INPUT);\n }\n parse(input) {\n const parser = this.getParser(input);\n return parser.parse(input, this);\n }\n convert(input, model, decimals = DEFAULT_OPTIONS.decimals, withAlpha = false) {\n const color = this.parse(input);\n const parser = this._parsers.get(model);\n return parser.convert(color, decimals, withAlpha);\n }\n convertCSS(input, model, options = {}, withAlpha = false) {\n const color = this.parse(input);\n const parser = this._parsers.get(model);\n return parser.convertCSS(color, options, withAlpha);\n }\n}\nclass ColorParser {\n hasAlpha(input) {\n if (isString(input)) {\n return this.getCSSOptions(input).hasAlpha;\n }\n return !isUndefined(input.A);\n }\n ;\n}\n\n;// ./src/color/rgb.ts\n\n\nconst getRGB = (color) => {\n const alpha = isUndefined(color.A)\n ? {}\n : {\n A: +color.A\n };\n if (isHSLObject(color)) {\n return {\n ...hslToRgb(color.H, color.S, color.L),\n ...alpha\n };\n }\n if (isHWBObject(color)) {\n return {\n ...hwbToRgb(color.H, color.W, color.B),\n ...alpha\n };\n }\n if (isCIELabObject(color)) {\n return {\n ...labToRgb(color.L, color.a, color.b),\n ...alpha\n };\n }\n if (isLCHObject(color)) {\n return {\n ...lchToRgb(color.L, color.C, color.H),\n ...alpha\n };\n }\n if (isCMYKObject(color)) {\n return {\n ...cmykToRgb(color.C, color.M, color.Y, color.K),\n ...alpha\n };\n }\n return color;\n};\n\n;// ./src/css/index.ts\n\n\nconst getCSSComma = (withSpace) => withSpace\n ? `${COMMA} `\n : COMMA;\nconst prepareColorForCss = (color, transformer) => {\n const props = getOrderedArrayString(Object.keys(color));\n const model = VALID_COLOR_OBJECTS[props];\n const keys = COLOR_PROPS[model];\n return keys.reduce((result, key, index) => {\n const value = color[key];\n if (!isUndefined(value)) {\n result.push(transformer(value, index));\n }\n return result;\n }, []);\n};\nconst getResultFromCSSTemplate = (template, vars) => {\n return template.replace(TEMPLATE_VAR, (__match, indexStr) => {\n const index = +indexStr - 1;\n return `${vars[index]}`;\n });\n};\nconst getCSSAlpha = (value, options, ignoreLegacy = false) => {\n const { alphaUnit, legacyCSS, decimals } = options;\n if (alphaUnit === ColorUnitEnum.PERCENT &&\n (!legacyCSS ||\n ignoreLegacy)) {\n return `${round(value * 100, decimals)}%`;\n }\n return round(value, decimals);\n};\nconst buildCSSHueTransformer = (options) => {\n const { anglesUnit, decimals } = options;\n return (value, index) => {\n if (index === 0 &&\n anglesUnit !== AnglesUnitEnum.NONE) {\n const translated = round(translateDegrees(value, anglesUnit), decimals);\n return `${translated}${anglesUnit}`;\n }\n return index === 3\n ? getCSSAlpha(value, options)\n : round(value, decimals);\n };\n};\n\n;// ./src/classes/HEXParser.ts\n\n\n\n\n\nclass HEXParser extends ColorParser {\n _extract(input) {\n const colorStr = isColorKeyword(input)\n ? ColorKeywords[input]\n : input;\n const match = colorStr.match(COLORREGS.HEX);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return (COLORREGS.HEX.test(input) ||\n isColorKeyword(input));\n }\n const hasInvalidHex = Object.entries(input).some((item) => {\n return !HEX.test(`${item[1]}`);\n });\n return isRGBObject(input) && !hasInvalidHex;\n }\n parse(input) {\n if (isString(input)) {\n const groups = this._extract(input);\n const r = groups.r ?? groups.rr;\n const g = groups.g ?? groups.gg;\n const b = groups.b ?? groups.bb;\n const a = groups.a ?? groups.aa;\n return {\n R: getDEC(r),\n G: getDEC(g),\n B: getDEC(b),\n ...(isUndefined(a)\n ? {}\n : {\n A: getDEC(a) / BASE_255\n })\n };\n }\n return {\n R: getBase255Number(`${input.R}`),\n G: getBase255Number(`${input.G}`),\n B: getBase255Number(`${input.B}`),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: Math.min(getBase255Number(`${input.A}`, true), 1)\n })\n };\n }\n convert(color, __decimals, withAlpha) {\n const rgb = isRGBObject(color)\n ? color\n : getRGB(color);\n return {\n R: getHEX(rgb.R),\n G: getHEX(rgb.G),\n B: getHEX(rgb.B),\n ...(withAlpha\n ? {\n A: isUndefined(rgb.A)\n ? '0xFF'\n : getHEX(rgb.A * BASE_255)\n }\n : {})\n };\n }\n convertCSS(color, options, withAlpha) {\n const rgb = this.convert(color, options.decimals, withAlpha);\n const transformer = (value) => toHEX(round(value));\n const values = prepareColorForCss(rgb, transformer);\n const template = values.length === 4\n ? '#{1}{2}{3}{4}'\n : '#{1}{2}{3}';\n return getResultFromCSSTemplate(template, values);\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n return {\n hasAlpha: !isUndefined(groups.a ?? groups.aa)\n };\n }\n get model() {\n return ColorModel.HEX;\n }\n}\n\n;// ./src/classes/CalcParser.ts\n\nconst MAX_STACK = 100;\nclass CalcParser {\n constructor(colorIndex, calc, vars) {\n this._operations = new Map([\n [CALC.DIVISION, this._division],\n [CALC.MULTIPLICATION, this._multiplication],\n [CALC.SUM, this._sum],\n [CALC.REST, this._rest]\n ]);\n this._colorIndex = colorIndex;\n let calcString = calc;\n let stack = 0;\n if (!Number.isNaN(+calc)) {\n this._result = +calc;\n }\n else if (calc in vars) {\n this._result = vars[calc];\n }\n else if (CALC.REGEXP.test(calcString)) {\n CALC.REGEXP.lastIndex = 0;\n this._result = this._getCalcValue(calcString, vars);\n }\n else {\n while (CALC.SCOPED.test(calcString) && stack < MAX_STACK) {\n CALC.SCOPED.lastIndex = 0;\n calcString = calcString.replace(CALC.SCOPED, (__match, operation) => {\n return this._calculate(operation, vars).toString();\n });\n if (CALC.REGEXP.test(calcString)) {\n CALC.REGEXP.lastIndex = 0;\n break;\n }\n stack++;\n }\n this._result = this._getCalcValue(calcString, vars);\n }\n }\n _division(left, right) {\n return left / right;\n }\n _multiplication(left, right) {\n return left * right;\n }\n _sum(left, right) {\n return left + right;\n }\n _rest(left, right) {\n return left - right;\n }\n _getCalcValue(calc, vars) {\n const match = calc.match(CALC.REGEXP);\n const operation = match.groups.operation;\n const value = this._calculate(operation, vars);\n if (Number.isNaN(value)) {\n throw new Error(`Invalid value for ${this._colorIndex}. ${operation} ${ERRORS.NOT_A_VALID_RELATIVE_COLOR}`);\n }\n return value;\n }\n _calculate(operation, vars) {\n this._operations.forEach((method, regExp) => {\n let stack = 0;\n while (regExp.test(operation) && stack < MAX_STACK) {\n operation = operation.replace(regExp, (__match, left, right) => {\n return method(vars[left] ?? +left, vars[right] ?? +right).toString();\n });\n stack++;\n }\n });\n return +operation;\n }\n get result() {\n return this._result;\n }\n}\n\n;// ./src/classes/RGBParser.ts\n\n\n\n\n\n\nclass RGBParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.RGB);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.RGB.test(input);\n }\n const hasInvalidRegb = Object.entries(input).some((item) => {\n return !(PCENT.test(`${item[1]}`) ||\n (!HEX.test(`${item[1]}`) &&\n !isNaN(+item[1]) &&\n +item[1] <= BASE_255));\n });\n return isRGBObject(input) && !hasInvalidRegb;\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { r_legacy, g_legacy, b_legacy, a_legacy, r, g, b, a, from, relative_r, relative_g, relative_b, relative_a } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromRGBVars = {\n r: fromRGB.R,\n g: fromRGB.G,\n b: fromRGB.B,\n alpha: fromRGB.A ?? 1\n };\n const R = new CalcParser('r', relative_r, fromRGBVars).result;\n const G = new CalcParser('g', relative_g, fromRGBVars).result;\n const B = new CalcParser('b', relative_b, fromRGBVars).result;\n const rgb = {\n R: Math.min(R, BASE_255),\n G: Math.min(G, BASE_255),\n B: Math.min(B, BASE_255)\n };\n if (relative_a) {\n const A = new CalcParser('alpha', relative_a, fromRGBVars).result;\n rgb.A = Math.min(A, 1);\n }\n return rgb;\n }\n else {\n const R = r_legacy ?? r;\n const G = g_legacy ?? g;\n const B = b_legacy ?? b;\n const A = a_legacy ?? a;\n return {\n R: Math.min(getBase255Number(R), BASE_255),\n G: Math.min(getBase255Number(G), BASE_255),\n B: Math.min(getBase255Number(B), BASE_255),\n ...(isUndefined(A)\n ? {}\n : {\n A: normalizeAlpha(A)\n })\n };\n }\n }\n return {\n R: getBase255Number(`${input.R}`),\n G: getBase255Number(`${input.G}`),\n B: getBase255Number(`${input.B}`),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: Math.min(getBase255Number(`${input.A}`, true), 1)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n const rgb = isRGBObject(color)\n ? color\n : getRGB(color);\n return this._roundRGBObject({\n R: rgb.R,\n G: rgb.G,\n B: rgb.B,\n ...(withAlpha\n ? {\n A: rgb.A ?? 1\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { decimals, legacyCSS, spacesAfterCommas, rgbUnit } = options;\n const rgb = this.convert(color, options.decimals, withAlpha);\n const comma = getCSSComma(spacesAfterCommas);\n const transformer = (value, index) => {\n return rgbUnit === ColorUnitEnum.PERCENT && index < 3\n ? `${from255NumberToPercent(value, decimals)}%`\n : (index === 3\n ? getCSSAlpha(value, options)\n : round(value, decimals));\n };\n const values = prepareColorForCss(rgb, transformer);\n const template = legacyCSS\n ? (values.length === 4\n ? `rgba({1}${comma}{2}${comma}{3}${comma}{4})`\n : `rgb({1}${comma}{2}${comma}{3})`)\n : (values.length === 4\n ? `rgb({1} {2} {3} / {4})`\n : `rgb({1} {2} {3})`);\n return getResultFromCSSTemplate(template, values);\n }\n _roundRGBObject(color, decimals) {\n const R = round(color.R, decimals);\n const G = round(color.G, decimals);\n const B = round(color.B, decimals);\n return {\n R,\n G,\n B,\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n const { r_legacy, g_legacy, b_legacy, a_legacy, r, g, b, a } = groups;\n return {\n hasPercentageValues: (PCENT.test(r_legacy ?? r) &&\n PCENT.test(g_legacy ?? g) &&\n PCENT.test(b_legacy ?? b)),\n hasPercentageAlpha: PCENT.test(a_legacy ?? a),\n hasAlpha: !isUndefined(a_legacy ?? a)\n };\n }\n get model() {\n return ColorModel.RGB;\n }\n}\n\n;// ./src/classes/HSLParser.ts\n\n\n\n\n\n\n\nclass HSLParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.HSL);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.HSL.test(input);\n }\n return isHSLObject(input);\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { h_legacy, s_legacy, l_legacy, a_legacy, h, s, l, a, from, relative_h, relative_s, relative_l, relative_a } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromHSL = rgbToHsl(fromRGB.R, fromRGB.G, fromRGB.B, fromRGB.A);\n const fromHSLVars = {\n h: fromHSL.H,\n s: fromHSL.S,\n l: fromHSL.L,\n alpha: fromHSL.A\n };\n const H = new CalcParser('h', relative_h, fromHSLVars).result;\n const S = new CalcParser('s', relative_s, fromHSLVars).result;\n const L = new CalcParser('l', relative_l, fromHSLVars).result;\n const hsl = {\n H: normalizeHue(H),\n S: percent(S),\n L: percent(L)\n };\n if (relative_a) {\n const A = new CalcParser('alpha', relative_a, fromHSLVars).result;\n hsl.A = minmax(A, 0, MAX_ALPHA);\n }\n return hsl;\n }\n else {\n const H = h_legacy ?? h;\n const S = s_legacy ?? s;\n const L = l_legacy ?? l;\n const A = a_legacy ?? a;\n return {\n H: normalizeHue(H),\n S: percent(S),\n L: percent(L),\n ...(isUndefined(A)\n ? {}\n : {\n A: normalizeAlpha(A)\n })\n };\n }\n }\n return {\n H: normalizeHue(input.H),\n S: percent(`${input.S}`),\n L: percent(`${input.L}`),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: minmax(+input.A, 0, MAX_ALPHA)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let hsl;\n if (isHSLObject(color)) {\n hsl = color;\n }\n else {\n const rgb = getRGB(color);\n hsl = rgbToHsl(rgb.R, rgb.G, rgb.B, rgb.A);\n }\n return this._roundHSLObject({\n H: hsl.H,\n S: hsl.S,\n L: hsl.L,\n ...(withAlpha\n ? {\n A: hsl.A ?? 1\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { legacyCSS, spacesAfterCommas } = options;\n const comma = getCSSComma(spacesAfterCommas);\n const hsl = this.convert(color, options.decimals, withAlpha);\n const transformer = buildCSSHueTransformer(options);\n const values = prepareColorForCss(hsl, transformer);\n const template = legacyCSS\n ? (values.length === 4\n ? `hsla({1}${comma}{2}%${comma}{3}%${comma}{4})`\n : `hsl({1}${comma}{2}%${comma}{3}%)`)\n : (values.length === 4\n ? `hsl({1} {2}% {3}% / {4})`\n : `hsl({1} {2}% {3}%)`);\n return getResultFromCSSTemplate(template, values);\n }\n _roundHSLObject(color, decimals) {\n return {\n H: round(normalizeHue(color.H), decimals),\n S: round(color.S, decimals),\n L: round(color.L, decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n const { h_legacy, h, a_legacy, a } = groups;\n return {\n angleUnit: getAngleUnit(h_legacy ?? h),\n hasPercentageAlpha: PCENT.test(a_legacy ?? a),\n hasAlpha: !isUndefined(a_legacy ?? a)\n };\n }\n get model() {\n return ColorModel.HSL;\n }\n}\n\n;// ./src/classes/HWBParser.ts\n\n\n\n\n\n\n\nclass HWBParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.HWB);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.HWB.test(input);\n }\n return isHWBObject(input);\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { h, w, b, a, from, relative_h, relative_w, relative_b, relative_a } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromHWB = rgbToHwb(fromRGB.R, fromRGB.G, fromRGB.B, fromRGB.A);\n const fromHWBVars = {\n h: fromHWB.H,\n w: fromHWB.W,\n b: fromHWB.B,\n alpha: fromHWB.A\n };\n const H = new CalcParser('h', relative_h, fromHWBVars).result;\n const W = new CalcParser('w', relative_w, fromHWBVars).result;\n const B = new CalcParser('b', relative_b, fromHWBVars).result;\n const hwb = {\n H: minmax(H, 0, MAX_HUE),\n W: minmax(W, 0, MAX_PCENT),\n B: minmax(B, 0, MAX_PCENT)\n };\n if (relative_a) {\n const A = new CalcParser('alpha', relative_a, fromHWBVars).result;\n hwb.A = minmax(A, 0, MAX_ALPHA);\n }\n return hwb;\n }\n else {\n return {\n H: normalizeHue(h),\n W: percent(w),\n B: percent(b),\n ...(isUndefined(a)\n ? {}\n : {\n A: normalizeAlpha(a)\n })\n };\n }\n }\n return {\n H: normalizeHue(input.H),\n W: percent(input.W),\n B: percent(input.B),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: normalizeAlpha(input.A)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let hwb;\n if (isHWBObject(color)) {\n hwb = color;\n }\n else {\n const rgb = getRGB(color);\n hwb = rgbToHwb(rgb.R, rgb.G, rgb.B, rgb.A);\n }\n return this._roundHWBObject({\n H: hwb.H,\n W: hwb.W,\n B: hwb.B,\n ...(withAlpha\n ? {\n A: hwb.A ?? 1\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const hwb = this.convert(color, options.decimals, withAlpha);\n const transformer = buildCSSHueTransformer(options);\n const values = prepareColorForCss(hwb, transformer);\n const template = values.length === 4\n ? `hwb({1} {2}% {3}% / {4})`\n : `hwb({1} {2}% {3}%)`;\n return getResultFromCSSTemplate(template, values);\n }\n _roundHWBObject(color, decimals) {\n return {\n H: round(normalizeHue(color.H), decimals),\n W: round(color.W, decimals),\n B: round(color.B, decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n return {\n angleUnit: getAngleUnit(groups.h),\n hasPercentageAlpha: PCENT.test(groups.a),\n hasAlpha: !isUndefined(groups.a)\n };\n }\n get model() {\n return ColorModel.HWB;\n }\n}\n\n;// ./src/classes/CIELabParser.ts\n\n\n\n\n\n\n\nclass CIELabParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.CIELab);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.CIELab.test(input);\n }\n return isCIELabObject(input);\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { L, a, b, A, from, relative_L, relative_a, relative_b, relative_A } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromCIELab = rgbToLab(fromRGB.R, fromRGB.G, fromRGB.B);\n const fromCIELabVars = {\n l: fromCIELab.L,\n a: fromCIELab.a,\n b: fromCIELab.b,\n alpha: fromRGB.A ?? 1\n };\n const L = new CalcParser('l', relative_L, fromCIELabVars).result;\n const a = new CalcParser('a', relative_a, fromCIELabVars).result;\n const b = new CalcParser('b', relative_b, fromCIELabVars).result;\n const CIELab = {\n L: minmax(L, 0, MAX_PCENT),\n a: minmax(a, -MAX_LAB, MAX_LAB),\n b: minmax(b, -MAX_LAB, MAX_LAB)\n };\n if (relative_A) {\n const A = new CalcParser('alpha', relative_A, fromCIELabVars).result;\n CIELab.A = minmax(A, 0, MAX_ALPHA);\n }\n return CIELab;\n }\n else {\n return {\n L: percent(L),\n a: getBase125Number(a),\n b: getBase125Number(b),\n ...(isUndefined(A)\n ? {}\n : {\n A: normalizeAlpha(A)\n })\n };\n }\n }\n return {\n L: percent(input.L),\n a: getBase125Number(`${input.a}`),\n b: getBase125Number(`${input.b}`),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: normalizeAlpha(input.A)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let lab;\n if (isCIELabObject(color)) {\n lab = color;\n }\n else {\n const rgb = getRGB(color);\n lab = rgbToLab(rgb.R, rgb.G, rgb.B);\n }\n return this._roundCIELabObject({\n L: lab.L,\n a: lab.a,\n b: lab.b,\n ...(withAlpha\n ? {\n A: +(color.A ?? 1)\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { decimals, labUnit } = options;\n const lab = this.convert(color, options.decimals, withAlpha);\n const transformer = (value, index) => {\n if (index === 0) {\n const L = round(percent(value), decimals);\n return labUnit === ColorUnitEnum.PERCENT\n ? `${L}%`\n : `${L}`;\n }\n if (index < 3) {\n return labUnit === ColorUnitEnum.PERCENT\n ? `${from125NumberToPercent(value, decimals)}%`\n : round(value, decimals);\n }\n return getCSSAlpha(value, options, true);\n };\n const values = prepareColorForCss(lab, transformer);\n const template = values.length === 4\n ? `lab({1} {2} {3} / {4})`\n : `lab({1} {2} {3})`;\n return getResultFromCSSTemplate(template, values);\n }\n _roundCIELabObject(color, decimals) {\n return {\n L: round(color.L, decimals),\n a: round(color.a, decimals),\n b: round(color.b, decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n const { L, a, b, A } = groups;\n return {\n hasPercentageValues: (PCENT.test(L) &&\n PCENT.test(a) &&\n PCENT.test(b)),\n hasPercentageAlpha: PCENT.test(A),\n hasAlpha: !isUndefined(A)\n };\n }\n get model() {\n return ColorModel.CIELab;\n }\n}\n\n;// ./src/classes/LCHParser.ts\n\n\n\n\n\n\n\nclass LCHParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.LCH);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.LCH.test(input);\n }\n return isLCHObject(input);\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { l, c, h, a, from, relative_l, relative_c, relative_h, relative_a } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromLCH = rgbToLch(fromRGB.R, fromRGB.G, fromRGB.B);\n const fromLCHVars = {\n l: fromLCH.L,\n c: fromLCH.C,\n h: fromLCH.H,\n alpha: fromRGB.A ?? 1\n };\n const L = new CalcParser('l', relative_l, fromLCHVars).result;\n const C = new CalcParser('c', relative_c, fromLCHVars).result;\n const H = new CalcParser('h', relative_h, fromLCHVars).result;\n const lch = {\n L: minmax(L, 0, MAX_PCENT),\n C: minmax(C, -MAX_LCH_C, MAX_LCH_C),\n H: normalizeHue(H)\n };\n if (relative_a) {\n const A = new CalcParser('alpha', relative_a, fromLCHVars).result;\n lch.A = minmax(A, 0, MAX_ALPHA);\n }\n return lch;\n }\n else {\n return {\n L: percent(l),\n C: getBase150Number(c),\n H: normalizeHue(h),\n ...(isUndefined(a)\n ? {}\n : {\n A: normalizeAlpha(a)\n })\n };\n }\n }\n return {\n L: percent(input.L),\n C: getBase150Number(`${input.C}`),\n H: normalizeHue(input.H),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: normalizeAlpha(input.A)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let lch;\n if (isLCHObject(color)) {\n lch = color;\n }\n else {\n const rgb = getRGB(color);\n lch = rgbToLch(rgb.R, rgb.G, rgb.B);\n }\n return this._roundLCHObject({\n L: lch.L,\n C: lch.C,\n H: lch.H,\n ...(withAlpha\n ? {\n A: +(color.A ?? 1)\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { decimals, lchUnit, anglesUnit } = options;\n const lch = this.convert(color, options.decimals, withAlpha);\n const transformer = (value, index) => {\n if (index === 0) {\n const L = round(percent(value), decimals);\n return lchUnit === ColorUnitEnum.PERCENT\n ? `${L}%`\n : `${L}`;\n }\n if (index === 1) {\n return lchUnit === ColorUnitEnum.PERCENT\n ? `${from150NumberToPercent(value, decimals)}%`\n : round(value, decimals);\n }\n if (index === 2) {\n if (anglesUnit !== AnglesUnitEnum.NONE) {\n const translated = round(translateDegrees(value, anglesUnit), decimals);\n return `${translated}${anglesUnit}`;\n }\n return round(value, decimals);\n }\n return getCSSAlpha(value, options, true);\n };\n const values = prepareColorForCss(lch, transformer);\n const template = values.length === 4\n ? `lch({1} {2} {3} / {4})`\n : `lch({1} {2} {3})`;\n return getResultFromCSSTemplate(template, values);\n }\n _roundLCHObject(color, decimals) {\n return {\n L: round(color.L, decimals),\n C: round(color.C, decimals),\n H: round(normalizeHue(color.H), decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n return {\n angleUnit: getAngleUnit(groups.h),\n hasPercentageValues: (PCENT.test(groups.l) &&\n PCENT.test(groups.c)),\n hasPercentageAlpha: PCENT.test(groups.a),\n hasAlpha: !isUndefined(groups.a)\n };\n }\n get model() {\n return ColorModel.LCH;\n }\n}\n\n;// ./src/classes/CMYKParser.ts\n\n\n\n\n\n\nclass CMYKParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.CMYK);\n return match.groups;\n }\n _shouldMultiplyBy100(...colors) {\n return !colors.some((color) => +color > 1);\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.CMYK.test(input);\n }\n return isCMYKObject(input);\n }\n parse(input) {\n if (isString(input)) {\n const groups = this._extract(input);\n const c = groups.c_legacy ?? groups.c;\n const m = groups.m_legacy ?? groups.m;\n const y = groups.y_legacy ?? groups.y;\n const k = groups.k_legacy ?? groups.k;\n const a = groups.a_legacy ?? groups.a;\n const shouldMultiplyBy100 = this._shouldMultiplyBy100(c, m, y, k);\n return {\n C: getCMYKNumber(c, shouldMultiplyBy100),\n M: getCMYKNumber(m, shouldMultiplyBy100),\n Y: getCMYKNumber(y, shouldMultiplyBy100),\n K: getCMYKNumber(k, shouldMultiplyBy100),\n ...(isUndefined(a)\n ? {}\n : {\n A: normalizeAlpha(a)\n })\n };\n }\n const shouldMultiplyBy100 = this._shouldMultiplyBy100(input.C, input.M, input.Y, input.K);\n return {\n C: getCMYKNumber(`${input.C}`, shouldMultiplyBy100),\n M: getCMYKNumber(`${input.M}`, shouldMultiplyBy100),\n Y: getCMYKNumber(`${input.Y}`, shouldMultiplyBy100),\n K: getCMYKNumber(`${input.K}`, shouldMultiplyBy100),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: normalizeAlpha(input.A)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let cmyk;\n if (isCMYKObject(color)) {\n cmyk = color;\n }\n else {\n const rgb = getRGB(color);\n cmyk = rgbToCmyk(rgb.R, rgb.G, rgb.B);\n }\n return this._roundCMYKObject({\n C: cmyk.C,\n M: cmyk.M,\n Y: cmyk.Y,\n K: cmyk.K,\n ...(withAlpha\n ? {\n A: +(color.A ?? 1)\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { decimals, legacyCSS, spacesAfterCommas, cmykUnit, cmykFunction } = options;\n const comma = getCSSComma(spacesAfterCommas);\n const cmyk = this.convert(color, options.decimals, withAlpha);\n const transformer = (value, index) => {\n if (cmykUnit === ColorUnitEnum.PERCENT &&\n index < 4) {\n return `${round(value, decimals)}%`;\n }\n return index === 4\n ? getCSSAlpha(value, options)\n : round(value / 100, decimals);\n };\n const values = prepareColorForCss(cmyk, transformer);\n const template = legacyCSS\n ? (values.length === 5\n ? `${cmykFunction}({1}${comma}{2}${comma}{3}${comma}{4}${comma}{5})`\n : `${cmykFunction}({1}${comma}{2}${comma}{3}${comma}{4})`)\n : (values.length === 5\n ? `${cmykFunction}({1} {2} {3} {4} / {5})`\n : `${cmykFunction}({1} {2} {3} {4})`);\n return getResultFromCSSTemplate(template, values);\n }\n _roundCMYKObject(color, decimals) {\n return {\n C: round(color.C, decimals),\n M: round(color.M, decimals),\n Y: round(color.Y, decimals),\n K: round(color.K, decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n const { c_legacy, m_legacy, y_legacy, k_legacy, a_legacy, c, m, y, k, a } = groups;\n return {\n hasPercentageValues: (PCENT.test(c_legacy ?? c) &&\n PCENT.test(m_legacy ?? m) &&\n PCENT.test(y_legacy ?? y) &&\n PCENT.test(k_legacy ?? k)),\n hasPercentageAlpha: PCENT.test(a_legacy ?? a),\n hasAlpha: !isUndefined(a_legacy ?? a)\n };\n }\n get model() {\n return ColorModel.CMYK;\n }\n}\n\n;// ./src/parsers/index.ts\n\n\n\n\n\n\n\n\n\n\nconst hexParser = new HEXParser();\nconst rgbParser = new RGBParser();\nconst hslParser = new HSLParser();\nconst hwbParser = new HWBParser();\nconst cieLabParser = new CIELabParser();\nconst lchParser = new LCHParser();\nconst cmykParser = new CMYKParser();\nconst colorParserContext = new ColorParserContext(new Map([\n [ColorModel.HEX, hexParser],\n [ColorModel.RGB, rgbParser],\n [ColorModel.HSL, hslParser],\n [ColorModel.HWB, hwbParser],\n [ColorModel.CIELab, cieLabParser],\n [ColorModel.LCH, lchParser],\n [ColorModel.CMYK, cmykParser]\n]));\nconst getOptionsFromColorInput = (options, ...colors) => {\n const cssColors = [];\n const anglesUnits = [];\n const rgbColors = [];\n const labColors = [];\n const lchColors = [];\n const cmykColors = [];\n const alphaValues = [];\n const anglesUnitValues = Object.values(AnglesUnitEnum);\n const colorUnitValues = Object.values(ColorUnitEnum);\n const cmykFunctionValues = Object.values(CMYKFunctionEnum);\n const matchOptions = {\n legacyCSS: 0,\n spacesAfterCommas: 0,\n cmykFunction: 0\n };\n for (const color of colors) {\n if (isString(color)) {\n cssColors.push(color);\n if (color.includes(COMMA)) {\n matchOptions.legacyCSS++;\n const commasWithNextCharacter = color.match(COMMAS_AND_NEXT_CHARS);\n if (new Set(commasWithNextCharacter).size === 1 &&\n SPACES.test(commasWithNextCharacter[0].slice(1))) {\n matchOptions.spacesAfterCommas++;\n }\n }\n if (hslParser.supports(color)) {\n const options = hslParser.getCSSOptions(color);\n anglesUnits.push(options.angleUnit);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (hwbParser.supports(color)) {\n const options = hwbParser.getCSSOptions(color);\n anglesUnits.push(options.angleUnit);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (rgbParser.supports(color)) {\n const options = rgbParser.getCSSOptions(color);\n rgbColors.push(options.hasPercentageValues);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (cieLabParser.supports(color)) {\n const options = cieLabParser.getCSSOptions(color);\n labColors.push(options.hasPercentageValues);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (lchParser.supports(color)) {\n const options = lchParser.getCSSOptions(color);\n anglesUnits.push(options.angleUnit);\n lchColors.push(options.hasPercentageValues);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (cmykParser.supports(color)) {\n const options = cmykParser.getCSSOptions(color);\n cmykColors.push(options.hasPercentageValues);\n if (color.startsWith(CMYKFunctionEnum.CMYK)) {\n matchOptions.cmykFunction++;\n }\n alphaValues.push(options.hasPercentageAlpha);\n }\n }\n }\n return {\n decimals: isNumber(options.decimals)\n ? options.decimals\n : DEFAULT_OPTIONS.decimals,\n legacyCSS: isBoolean(options.legacyCSS)\n ? options.legacyCSS\n : Boolean(cssColors.length &&\n matchOptions.legacyCSS === cssColors.length) || DEFAULT_OPTIONS.legacyCSS,\n spacesAfterCommas: isBoolean(options.spacesAfterCommas)\n ? options.spacesAfterCommas\n : Boolean(cssColors.length &&\n matchOptions.spacesAfterCommas === cssColors.length) || DEFAULT_OPTIONS.spacesAfterCommas,\n anglesUnit: options.anglesUnit && anglesUnitValues.includes(options.anglesUnit)\n ? options.anglesUnit\n : (new Set(anglesUnits).size === 1\n ? anglesUnits[0]\n : DEFAULT_OPTIONS.anglesUnit),\n rgbUnit: options.rgbUnit && colorUnitValues.includes(options.rgbUnit)\n ? options.rgbUnit\n : (new Set(rgbColors).size === 1 && rgbColors[0]\n ? ColorUnitEnum.PERCENT\n : DEFAULT_OPTIONS.rgbUnit),\n labUnit: options.labUnit && colorUnitValues.includes(options.labUnit)\n ? options.labUnit\n : (new Set(labColors).size === 1 && labColors[0]\n ? ColorUnitEnum.PERCENT\n : DEFAULT_OPTIONS.labUnit),\n lchUnit: options.lchUnit && colorUnitValues.includes(options.lchUnit)\n ? options.lchUnit\n : (new Set(lchColors).size === 1 && lchColors[0]\n ? ColorUnitEnum.PERCENT\n : DEFAULT_OPTIONS.lchUnit),\n cmykUnit: options.cmykUnit && colorUnitValues.includes(options.cmykUnit)\n ? options.cmykUnit\n : (new Set(cmykColors).size === 1 && !cmykColors[0]\n ? ColorUnitEnum.NONE\n : DEFAULT_OPTIONS.cmykUnit),\n alphaUnit: options.alphaUnit && colorUnitValues.includes(options.alphaUnit)\n ? options.alphaUnit\n : (new Set(alphaValues).size === 1 && alphaValues[0]\n ? ColorUnitEnum.PERCENT\n : DEFAULT_OPTIONS.alphaUnit),\n cmykFunction: options.cmykFunction && cmykFunctionValues.includes(options.cmykFunction)\n ? options.cmykFunction\n : (cmykColors.length && cmykColors.length === matchOptions.cmykFunction\n ? CMYKFunctionEnum.CMYK\n : DEFAULT_OPTIONS.cmykFunction)\n };\n};\n\n;// ./src/returns/index.ts\n\n\n\n\n\nconst blend = (from, to, steps) => {\n const div = steps - 1;\n const diffR = (to.R - from.R) / div;\n const diffG = (to.G - from.G) / div;\n const diffB = (to.B - from.B) / div;\n const fromA = normalizeAlpha(from.A);\n const toA = normalizeAlpha(to.A);\n const diffA = (toA - fromA) / div;\n return Array(steps).fill(null).map((__n, i) => {\n if (i === 0) {\n return from;\n }\n if (i === div) {\n return to;\n }\n return {\n R: round(from.R + diffR * i),\n G: round(from.G + diffG * i),\n B: round(from.B + diffB * i),\n A: round(fromA + diffA * i)\n };\n });\n};\nfunction getBlendReturn(from, to, model, css, withAlpha, steps = DEFAULT_BLEND_STEPS, options = {}) {\n if (steps < 1)\n steps = DEFAULT_BLEND_STEPS;\n const fromParsed = colorParserContext.parse(from);\n const toParsed = colorParserContext.parse(to);\n const fromRGBObject = getRGB(fromParsed);\n const toRGBObject = getRGB(toParsed);\n const blendArray = blend(fromRGBObject, toRGBObject, steps);\n return blendArray.map((color) => {\n if (css) {\n return colorParserContext.convertCSS(color, model, getOptionsFromColorInput(options, from, to), withAlpha);\n }\n return colorParserContext.convert(color, model, options.decimals, withAlpha);\n });\n}\nconst getBlendReturnParams = (thirdParameter, fourthParameter) => {\n const stepsParameter = isNumber(thirdParameter)\n ? thirdParameter\n : undefined;\n const optionsParameter = isNumber(thirdParameter)\n ? fourthParameter\n : thirdParameter;\n return [\n stepsParameter,\n optionsParameter\n ];\n};\nfunction getMixReturn(colors, model, css, withAlpha, mode = Mix.ADDITIVE, options = {}) {\n const rgbMap = colors.map((color) => {\n return colorParserContext.convert(color, ColorModel.RGB, options.decimals, withAlpha);\n });\n const rybMap = mode === Mix.SUBTRACTIVE\n ? rgbMap.map((color) => {\n const RYB = rgbToRyb(color.R, color.G, color.B);\n if (!isUndefined(color.A)) {\n RYB.A = color.A;\n }\n return RYB;\n })\n : null;\n function createMix(items) {\n const initial = mode === Mix.ADDITIVE\n ? { R: 0, G: 0, B: 0, A: 0 }\n : { R: 0, Y: 0, B: 0, A: 0 };\n return items.reduce((mix, color) => {\n const colorA = isUndefined(color.A)\n ? 1\n : color.A;\n const common = {\n R: Math.min(mix.R + color.R * colorA, BASE_255),\n B: Math.min(mix.B + color.B * colorA, BASE_255),\n A: 1 - (1 - colorA) * (1 - mix.A)\n };\n const mixGY = 'G' in mix\n ? mix.G\n : mix.Y;\n const colorGY = 'G' in color\n ? color.G\n : color.Y;\n return {\n ...common,\n ...(mode === Mix.ADDITIVE\n ? { G: Math.min(mixGY + colorGY * colorA, BASE_255) }\n : { Y: Math.min(mixGY + colorGY * colorA, BASE_255) })\n };\n }, initial);\n }\n let mix;\n if (mode === Mix.ADDITIVE) {\n mix = createMix(rgbMap);\n }\n else {\n const RYB = createMix(rybMap);\n mix = rybToRgb(RYB.R, RYB.Y, RYB.B);\n mix.A = RYB.A;\n }\n if (css) {\n return colorParserContext.convertCSS(mix, model, getOptionsFromColorInput(options, ...colors), withAlpha);\n }\n return colorParserContext.convert(mix, model, options.decimals, withAlpha);\n}\n;\nconst getMixReturnParameters = (secondParameter, thirdParameter) => {\n const modeParam = isString(secondParameter)\n ? secondParameter\n : undefined;\n const optionsParam = isString(secondParameter)\n ? thirdParameter\n : secondParameter;\n return [\n modeParam,\n optionsParam\n ];\n};\nfunction getShadesOrTintsReturn(shades, color, steps = DEFAULT_SHADES_TINTS_STEPS, options = {}) {\n const isCSS = isString(color);\n const parser = colorParserContext.getParser(color);\n const model = parser.model;\n const withAlpha = parser.hasAlpha(color);\n const hsl = colorParserContext.convert(color, ColorModel.HSL, undefined, withAlpha);\n const increment = shades\n ? hsl.L / (steps + 1)\n : (100 - hsl.L) / (steps + 1);\n const hslMap = Array.from(Array(steps)).map((__n, i) => ({\n ...hsl,\n L: hsl.L + increment * (i + 1) * (1 - +shades * 2)\n }));\n if (isCSS) {\n return hslMap.map((hslColor) => {\n return colorParserContext.convertCSS(hslColor, model, getOptionsFromColorInput(options, color), withAlpha);\n });\n }\n return hslMap.map((hslColor) => {\n return colorParserContext.convert(hslColor, model, options.decimals, withAlpha);\n });\n}\nconst getShadesOrTintsReturnParameters = (secondParameter, thirdParameter) => {\n const stepsParam = isNumber(secondParameter)\n ? secondParameter\n : undefined;\n const optionsParam = isNumber(secondParameter)\n ? thirdParameter\n : secondParameter;\n return [\n stepsParam,\n optionsParam\n ];\n};\nconst harmony = (color, angles, mode) => angles.reduce((arr, num) => {\n return [\n ...arr,\n {\n ...color,\n H: mode === Mix.ADDITIVE\n ? normalizeHue(color.H + num)\n : normalizeHue(hueRyb(hueRyb(color.H, false) + num, true))\n }\n ];\n}, [{ ...color }]);\nconst HARMONIES = new Map([\n [\n Harmony.ANALOGOUS,\n (color, mode) => harmony(color, [30, -30], mode)\n ],\n [\n Harmony.COMPLEMENTARY,\n (color, mode) => harmony(color, [180], mode)\n ],\n [\n Harmony.SPLIT_COMPLEMENTARY,\n (color, mode) => harmony(color, [150, -150], mode)\n ],\n [\n Harmony.TRIADIC,\n (color, mode) => harmony(color, [120, -120], mode)\n ],\n [\n Harmony.TETRADIC,\n (color, mode) => harmony(color, [60, -120, 180], mode)\n ],\n [\n Harmony.SQUARE,\n (color, mode) => harmony(color, [90, -90, 180], mode)\n ]\n]);\nconst getHarmonyReturn = (color, harmony, mode, options = {}) => {\n const harmonyFunction = HARMONIES.get(harmony);\n const isCSS = isString(color);\n const parser = colorParserContext.getParser(color);\n const model = parser.model;\n const withAlpha = parser.hasAlpha(color);\n const hsl = colorParserContext.convert(color, ColorModel.HSL);\n const array = harmonyFunction(hsl, mode);\n if (isCSS) {\n return array.map((harmonyColor) => {\n return colorParserContext.convertCSS(harmonyColor, model, getOptionsFromColorInput(options, color), withAlpha);\n });\n }\n return array.map((harmonyColor) => {\n return colorParserContext.convert(harmonyColor, model, options.decimals, withAlpha);\n });\n};\nconst getHarmonyReturnParameters = (secondParam, thirdParam, fourthParam) => {\n if (isHarmony(secondParam)) {\n return [\n secondParam,\n isMix(thirdParam)\n ? thirdParam\n : Mix.ADDITIVE,\n isMix(thirdParam)\n ? fourthParam\n : thirdParam\n ];\n }\n if (isMix(secondParam)) {\n return [\n Harmony.COMPLEMENTARY,\n secondParam,\n thirdParam\n ];\n }\n return [\n Harmony.COMPLEMENTARY,\n Mix.ADDITIVE,\n secondParam\n ];\n};\n\n;// ./src/classes/ColorTranslator.ts\n\n\n\n\n\nclass ColorTranslator {\n constructor(color, options = {}) {\n this._options = getOptionsFromColorInput(options, color);\n const parsedColor = colorParserContext.parse(color);\n const model = getColorModel(parsedColor);\n switch (model) {\n case ColorModel.HSL:\n this.hsl = parsedColor;\n this.update('hsl');\n break;\n case ColorModel.HWB:\n this.hwb = parsedColor;\n this.updateRGBFromHWB();\n this.update('hwb', 'rgb');\n break;\n case ColorModel.CIELab:\n this.lab = parsedColor;\n this.updateRGBFromLAB();\n this.update('lab', 'rgb');\n break;\n case ColorModel.LCH:\n this.lch = parsedColor;\n this.updateRGBFromLCH();\n this.update('lch', 'rgb');\n break;\n case ColorModel.CMYK:\n this.cmyk = parsedColor;\n this.updateRGBFromCMYK();\n this.update('cmyk', 'rgb');\n break;\n default:\n this.rgb = parsedColor;\n this.update('rgb');\n }\n }\n update(...exclude) {\n if (!exclude.includes('rgb')) {\n this.updateRGB();\n }\n if (!exclude.includes('hsl')) {\n this.updateHSL();\n }\n if (!exclude.includes('hwb')) {\n this.updateHWB();\n }\n if (!exclude.includes('lab')) {\n this.updateLAB();\n }\n if (!exclude.includes('lch')) {\n this.updateLCH();\n }\n if (!exclude.includes('cmyk')) {\n this.updateCMYK();\n }\n }\n updateRGB() {\n this.rgb = {\n ...hslToRgb(this.hsl.H, this.hsl.S, this.hsl.L),\n A: this.hsl.A ?? 1\n };\n }\n updateHSL() {\n this.hsl = rgbToHsl(this.rgb.R, this.rgb.G, this.rgb.B, this.rgb.A);\n }\n updateHWB() {\n this.hwb = rgbToHwb(this.rgb.R, this.rgb.G, this.rgb.B, this.rgb.A);\n }\n updateLAB() {\n this.lab = {\n ...rgbToLab(this.rgb.R, this.rgb.G, this.rgb.B),\n A: this.rgb.A ?? 1\n };\n }\n updateLCH() {\n this.lch = {\n ...rgbToLch(this.rgb.R, this.rgb.G, this.rgb.B),\n A: this.rgb.A ?? 1\n };\n }\n updateCMYK() {\n this.cmyk = {\n ...rgbToCmyk(this.rgb.R, this.rgb.G, this.rgb.B),\n A: this.rgb.A ?? 1\n };\n }\n updateRGBFromHWB() {\n this.rgb = {\n ...hwbToRgb(this.hwb.H, this.hwb.W, this.hwb.B),\n A: this.hwb?.A ?? 1\n };\n }\n updateRGBFromLCH() {\n this.rgb = {\n ...lchToRgb(this.lch.L, this.lch.C, this.lch.H),\n A: this.lch.A ?? 1\n };\n }\n updateRGBFromCMYK() {\n this.rgb = {\n ...cmykToRgb(this.cmyk.C, this.cmyk.M, this.cmyk.Y, this.cmyk.K),\n A: this.cmyk.A ?? 1\n };\n }\n updateRGBFromLAB() {\n this.rgb = {\n ...labToRgb(this.lab.L, this.lab.a, this.lab.b),\n A: this.lab.A ?? 1\n };\n }\n updateLCHFromLAB() {\n this.lch = {\n ...labToLch(this.lab.L, this.lab.a, this.lab.b),\n A: this.lab.A\n };\n }\n updateLABromLCH() {\n this.lab = {\n ...lchToLab(this.lch.L, this.lch.C, this.lch.H),\n A: this.lch.A\n };\n }\n setOptions(options = {}) {\n this._options = {\n ...this._options,\n ...options\n };\n return this;\n }\n setR(R) {\n this.rgb.R = minmax(R, 0, BASE_255);\n this.update('rgb');\n return;\n }\n setG(G) {\n this.rgb.G = minmax(G, 0, BASE_255);\n this.update('rgb');\n return this;\n }\n setB(B) {\n this.rgb.B = minmax(B, 0, BASE_255);\n this.update('rgb');\n return this;\n }\n setH(H) {\n this.hsl.H = normalizeHue(H);\n this.update('hsl');\n return this;\n }\n setS(S) {\n this.hsl.S = minmax(S, 0, MAX_PCENT);\n this.update('hsl');\n return this;\n }\n setL(L) {\n this.hsl.L = minmax(L, 0, MAX_PCENT);\n this.update('hsl');\n return this;\n }\n setWhiteness(W) {\n this.hwb.W = minmax(W, 0, MAX_PCENT);\n this.updateRGBFromHWB();\n this.update('rgb', 'hwb');\n return this;\n }\n setBlackness(B) {\n this.hwb.B = minmax(B, 0, MAX_PCENT);\n this.updateRGBFromHWB();\n this.update('rgb', 'hwb');\n return this;\n }\n setCIEL(L) {\n this.lab.L = minmax(L, 0, MAX_PCENT);\n this.updateRGBFromLAB();\n this.updateLCHFromLAB();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setCIEa(a) {\n this.lab.a = minmax(a, -MAX_LAB, MAX_LAB);\n this.updateRGBFromLAB();\n this.updateLCHFromLAB();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setCIEb(b) {\n this.lab.b = minmax(b, -MAX_LAB, MAX_LAB);\n this.updateRGBFromLAB();\n this.updateLCHFromLAB();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setLCHL(l) {\n this.lch.L = minmax(l, 0, MAX_PCENT);\n this.updateRGBFromLCH();\n this.updateLABromLCH();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setLCHC(c) {\n this.lch.C = minmax(c, 0, MAX_LCH_C);\n this.updateRGBFromLCH();\n this.updateLABromLCH();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setLCHH(h) {\n this.lch.H = normalizeHue(h);\n this.updateRGBFromLCH();\n this.updateLABromLCH();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setA(A) {\n const alpha = minmax(A, 0, MAX_ALPHA);\n this.rgb.A = alpha;\n this.hsl.A = alpha;\n this.hwb.A = alpha;\n this.lab.A = alpha;\n this.lch.A = alpha;\n this.cmyk.A = alpha;\n return this;\n }\n setC(C) {\n this.cmyk.C = minmax(C, 0, 100);\n this.updateRGBFromCMYK();\n this.update('cmyk');\n return this;\n }\n setM(M) {\n this.cmyk.M = minmax(M, 0, 100);\n this.updateRGBFromCMYK();\n this.update('cmyk');\n return this;\n }\n setY(Y) {\n this.cmyk.Y = minmax(Y, 0, 100);\n this.updateRGBFromCMYK();\n this.update('cmyk');\n return this;\n }\n setK(K) {\n this.cmyk.K = minmax(K, 0, 100);\n this.updateRGBFromCMYK();\n this.update('cmyk');\n return this;\n }\n get options() {\n return this._options;\n }\n get R() {\n return round(this.rgb.R, this.options.decimals);\n }\n get G() {\n return round(this.rgb.G, this.options.decimals);\n }\n get B() {\n return round(this.rgb.B, this.options.decimals);\n }\n get H() {\n return round(this.hsl.H, this.options.decimals);\n }\n get S() {\n return round(this.hsl.S, this.options.decimals);\n }\n get L() {\n return round(this.hsl.L, this.options.decimals);\n }\n get Whiteness() {\n return round(this.hwb.W, this.options.decimals);\n }\n get Blackness() {\n return round(this.hwb.B, this.options.decimals);\n }\n get CIEL() {\n return round(this.lab.L, this.options.decimals);\n }\n get CIEa() {\n return round(this.lab.a, this.options.decimals);\n }\n get CIEb() {\n return round(this.lab.b, this.options.decimals);\n }\n get LCHL() {\n return round(this.lch.L, this.options.decimals);\n }\n get LCHC() {\n return round(this.lch.C, this.options.decimals);\n }\n get LCHH() {\n return round(this.lch.H, this.options.decimals);\n }\n get A() {\n return round(this.hsl.A, this.options.decimals);\n }\n get C() {\n return round(this.cmyk.C, this.options.decimals);\n }\n get M() {\n return round(this.cmyk.M, this.options.decimals);\n }\n get Y() {\n return round(this.cmyk.Y, this.options.decimals);\n }\n get K() {\n return round(this.cmyk.K, this.options.decimals);\n }\n get HEXObject() {\n return colorParserContext.convert(this.rgb, ColorModel.HEX);\n }\n get HEXAObject() {\n return colorParserContext.convert(this.rgb, ColorModel.HEX, 0, true);\n }\n get RGBObject() {\n return colorParserContext.convert(this.rgb, ColorModel.RGB, this.options.decimals);\n }\n get RGBAObject() {\n return colorParserContext.convert(this.rgb, ColorModel.RGB, this.options.decimals, true);\n }\n get HSLObject() {\n return colorParserContext.convert(this.hsl, ColorModel.HSL, this.options.decimals);\n }\n get HSLAObject() {\n return colorParserContext.convert(this.hsl, ColorModel.HSL, this.options.decimals, true);\n }\n get HWBObject() {\n return colorParserContext.convert(this.hwb, ColorModel.HWB, this.options.decimals);\n }\n get HWBAObject() {\n return colorParserContext.convert(this.hwb, ColorModel.HWB, this.options.decimals, true);\n }\n get CIELabObject() {\n return colorParserContext.convert(this.lab, ColorModel.CIELab, this.options.decimals);\n }\n get CIELabAObject() {\n return colorParserContext.convert(this.lab, ColorModel.CIELab, this.options.decimals, true);\n }\n get LCHObject() {\n return colorParserContext.convert(this.lch, ColorModel.LCH, this.options.decimals);\n }\n get LCHAObject() {\n return colorParserContext.convert(this.lch, ColorModel.LCH, this.options.decimals, true);\n }\n get CMYKObject() {\n return colorParserContext.convert(this.cmyk, ColorModel.CMYK, this.options.decimals);\n }\n get CMYKAObject() {\n return colorParserContext.convert(this.cmyk, ColorModel.CMYK, this.options.decimals, true);\n }\n get HEX() {\n return colorParserContext.convertCSS(this.rgb, ColorModel.HEX);\n }\n get HEXA() {\n return colorParserContext.convertCSS(this.rgb, ColorModel.HEX, {}, true);\n }\n get RGB() {\n return colorParserContext.convertCSS(this.rgb, ColorModel.RGB, this.options);\n }\n get RGBA() {\n return colorParserContext.convertCSS(this.rgb, ColorModel.RGB, this.options, true);\n }\n get HSL() {\n return colorParserContext.convertCSS(this.hsl, ColorModel.HSL, this.options);\n }\n get HSLA() {\n return colorParserContext.convertCSS(this.hsl, ColorModel.HSL, this.options, true);\n }\n get HWB() {\n return colorParserContext.convertCSS(this.hwb, ColorModel.HWB, this.options);\n }\n get HWBA() {\n return colorParserContext.convertCSS(this.hwb, ColorModel.HWB, this.options, true);\n }\n get CIELab() {\n return colorParserContext.convertCSS(this.lab, ColorModel.CIELab, this.options);\n }\n get CIELabA() {\n return colorParserContext.convertCSS(this.lab, ColorModel.CIELab, this.options, true);\n }\n get LCH() {\n return colorParserContext.convertCSS(this.lch, ColorModel.LCH, this.options);\n }\n get LCHA() {\n return colorParserContext.convertCSS(this.lch, ColorModel.LCH, this.options, true);\n }\n get CMYK() {\n return colorParserContext.convertCSS(this.cmyk, ColorModel.CMYK, this.options);\n }\n get CMYKA() {\n return colorParserContext.convertCSS(this.cmyk, ColorModel.CMYK, this.options, true);\n }\n static toHEXObject(color) {\n return colorParserContext.convert(color, ColorModel.HEX);\n }\n static toHEX(color) {\n return colorParserContext.convertCSS(color, ColorModel.HEX);\n }\n static toHEXAObject(color) {\n return colorParserContext.convert(color, ColorModel.HEX, undefined, true);\n }\n static toHEXA(color) {\n return colorParserContext.convertCSS(color, ColorModel.HEX, undefined, true);\n }\n static toRGBObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.RGB, options.decimals);\n }\n static toRGB(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.RGB, getOptionsFromColorInput(options, color));\n }\n static toRGBAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.RGB, options.decimals, true);\n }\n static toRGBA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.RGB, getOptionsFromColorInput(options, color), true);\n }\n static toHSLObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.HSL, options.decimals);\n }\n static toHSL(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.HSL, getOptionsFromColorInput(options, color));\n }\n static toHSLAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.HSL, options.decimals, true);\n }\n static toHSLA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.HSL, getOptionsFromColorInput(options, color), true);\n }\n static toHWBObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.HWB, options.decimals);\n }\n static toHWB(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.HWB, getOptionsFromColorInput(options, color));\n }\n static toHWBAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.HWB, options.decimals, true);\n }\n static toHWBA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.HWB, getOptionsFromColorInput(options, color), true);\n }\n static toCIELabObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.CIELab, options.decimals);\n }\n static toCIELab(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.CIELab, getOptionsFromColorInput(options, color));\n }\n static toCIELabAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.CIELab, options.decimals, true);\n }\n static toCIELabA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.CIELab, getOptionsFromColorInput(options, color), true);\n }\n static toLCHObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.LCH, options.decimals);\n }\n static toLCH(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.LCH, getOptionsFromColorInput(options, color));\n }\n static toLCHAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.LCH, options.decimals, true);\n }\n static toLCHA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.LCH, getOptionsFromColorInput(options, color), true);\n }\n static toCMYKObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.CMYK, options.decimals);\n }\n static toCMYK(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.CMYK, getOptionsFromColorInput(options, color));\n }\n static toCMYKAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.CMYK, options.decimals, true);\n }\n static toCMYKA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.CMYK, getOptionsFromColorInput(options, color), true);\n }\n static getBlendHEXObject(from, to, steps) {\n return getBlendReturn(from, to, ColorModel.HEX, false, false, steps);\n }\n static getBlendHEX(from, to, steps) {\n return getBlendReturn(from, to, ColorModel.HEX, true, false, steps);\n }\n static getBlendHEXAObject(from, to, steps) {\n return getBlendReturn(from, to, ColorModel.HEX, false, true, steps);\n }\n static getBlendHEXA(from, to, steps) {\n return getBlendReturn(from, to, ColorModel.HEX, true, true, steps);\n }\n static getBlendRGBObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.RGB, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendRGB(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.RGB, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendRGBAObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.RGB, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendRGBA(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.RGB, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendHSLObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.HSL, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendHSL(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.HSL, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendHSLAObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.HSL, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendHSLA(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.HSL, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendHWBObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.HWB, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendHWB(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.HWB, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendHWBAObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.HWB, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendHWBA(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.HWB, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendCIELabObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.CIELab, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendCIELab(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.CIELab, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendCIELabAObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.CIELab, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendCIELabA(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.CIELab, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendLCHObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.LCH, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendLCH(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.LCH, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendLCHAObject(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.LCH, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getBlendLCHA(from, to, thirdParameter, fourthParameter) {\n return getBlendReturn(from, to, ColorModel.LCH, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\n }\n static getMixHEXObject(colors, mode) {\n return getMixReturn(colors, ColorModel.HEX, false, false, mode);\n }\n static getMixHEX(colors, mode = Mix.ADDITIVE) {\n return getMixReturn(colors, ColorModel.HEX, true, false, mode);\n }\n static getMixHEXAObject(colors, mode = Mix.ADDITIVE) {\n return getMixReturn(colors, ColorModel.HEX, false, true, mode);\n }\n static getMixHEXA(colors, mode = Mix.ADDITIVE) {\n return getMixReturn(colors, ColorModel.HEX, true, true, mode);\n }\n static getMixRGBObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.RGB, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixRGB(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.RGB, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixRGBAObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.RGB, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixRGBA(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.RGB, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixHSLObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.HSL, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixHSL(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.HSL, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixHSLAObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.HSL, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixHSLA(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.HSL, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixHWBObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.HWB, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixHWB(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.HWB, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixHWBAObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.HWB, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixHWBA(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.HWB, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixCIELabObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.CIELab, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixCIELab(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.CIELab, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixCIELabAObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.CIELab, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixCIELabA(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.CIELab, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixLCHObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.LCH, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixLCH(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.LCH, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixLCHAObject(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.LCH, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getMixLCHA(colors, secondParameter, thirdParameter) {\n return getMixReturn(colors, ColorModel.LCH, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n }\n static getShades(color, secondParameter, thirdParameter) {\n return getShadesOrTintsReturn(true, color, ...getShadesOrTintsReturnParameters(secondParameter, thirdParameter));\n }\n static getTints(color, secondParameter, thirdParameter) {\n return getShadesOrTintsReturn(false, color, ...getShadesOrTintsReturnParameters(secondParameter, thirdParameter));\n }\n static getHarmony(color, secondParam, thirdParam, fourthParam) {\n return getHarmonyReturn(color, ...getHarmonyReturnParameters(secondParam, thirdParam, fourthParam));\n }\n}\n\n;// ./src/index.ts\n\n\n\n;// ./src/@demo/demo1/index.js\n\n\n/* harmony default export */ const demo1 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const color = new ColorTranslator('hsl(180 100% 50%)', { decimals: 0 });\n\n for (let row = 0; row < 10; row++) {\n\n for (let col = 0; col < 10; col++) {\n\n color\n .setS(row * 10)\n .setL(col * 5 + 30);\n\n const box = document.createElement('div');\n\n box.classList.add('box');\n box.style.background = color.HEX;\n\n box.innerText =\n `R:${color.R}\n G:${color.G}\n B:${color.B}`;\n container.appendChild(box);\n\n }\n }\n\n return container;\n\n});\n;// ./src/@demo/demo2/index.js\n\n\n/* harmony default export */ const demo2 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const color = new ColorTranslator({ R: 255, G: 0, B: 0 });\n const hue = [0, 30, 60, 120, 240, 280, 320, 0];\n let rainbow;\n\n for (let r = 0; r < hue.length; r++) {\n\n color.setH(hue[r]);\n\n const bow = document.createElement('div');\n\n bow.classList.add('rainbow');\n bow.style.background = color.HEX;\n\n if (rainbow) {\n rainbow.appendChild(bow);\n } else {\n container.appendChild(bow);\n }\n\n rainbow = bow;\n }\n\n rainbow.style.background = '#333';\n\n return container;\n\n});\n;// ./src/@demo/demo3/index.js\n\n\n/* harmony default export */ const demo3 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const hsl = { H: 0, S: '90%', L: '50%' };\n const hue = [undefined, 55, 30, 0, 290, 220, 130];\n const total = hue.length;\n\n for (let row = 0; row < total; row++) {\n\n for (let col = 0; col < total; col++) {\n\n let index = total - row + col;\n if (index >= total) {\n index -= total;\n }\n hsl.H = hue[index];\n const rgb = hue[index] === undefined\n ? '#FFF'\n : ColorTranslator.toHEX(hsl);\n const box = document.createElement('div');\n\n box.classList.add('flag');\n box.style.background = rgb;\n\n container.appendChild(box);\n\n }\n }\n\n return container;\n\n});\n;// ./src/@demo/demo4/index.js\n\n\n/* harmony default export */ const demo4 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const hexColors = [\n '#FE2712', '#FE5409', '#FB9902',\n '#FABD03', '#FFFE32', '#D1EA2C',\n '#66B132', '#0392CE', '#0247FE',\n '#3D00A5', '#8601B0', '#A7194B'\n ];\n\n hexColors.forEach((color) => {\n\n const rgb = ColorTranslator.toRGB(color);\n const hsl = ColorTranslator.toHSL(color, { decimals: 0 });\n const hwb = ColorTranslator.toHWB(color, { decimals: 0 });\n const lab = ColorTranslator.toCIELab(color, { decimals: 0 });\n const lch = ColorTranslator.toLCH(color, { decimals: 0 });\n\n const rgbDiv = document.createElement('div');\n const hslDiv = document.createElement('div');\n const hwbDiv = document.createElement('div');\n const labDiv = document.createElement('div');\n const lchDiv = document.createElement('div');\n\n rgbDiv.style.backgroundColor = rgb;\n rgbDiv.textContent = rgb;\n\n hslDiv.style.backgroundColor = hsl;\n hslDiv.textContent = hsl;\n\n hwbDiv.style.backgroundColor = hwb;\n hwbDiv.textContent = hwb;\n\n labDiv.style.backgroundColor = lab;\n labDiv.textContent = lab;\n\n lchDiv.style.backgroundColor = lch;\n lchDiv.textContent = lch;\n\n container.appendChild(rgbDiv);\n container.appendChild(hslDiv);\n container.appendChild(hwbDiv);\n container.appendChild(labDiv);\n container.appendChild(lchDiv);\n\n });\n\n return container;\n\n});\n;// ./src/@demo/demo5/index.js\n\n\n/* harmony default export */ const demo5 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const colors = [\n 'red',\n 'lime',\n 'blue',\n 'aqua',\n 'yellow',\n 'fuchsia'\n ];\n const total = colors.length;\n\n for (let row = 0; row < total; row++) {\n\n const hsl = ColorTranslator.toHSLObject(colors[row]);\n const step = hsl.S / (total - 1);\n\n for (let col = 0; col < total; col++) {\n\n const rgb = ColorTranslator.toHEX(hsl);\n const cmyk = ColorTranslator.toCMYKObject(hsl, { decimals: 0 });\n\n const box = document.createElement('div');\n box.classList.add('box');\n box.style.background = rgb;\n box.innerText = `C:${cmyk.C}\n M:${cmyk.M}\n Y:${cmyk.Y}\n K:${cmyk.K}`;\n\n container.appendChild(box);\n\n hsl.S -= step;\n\n }\n }\n\n return container;\n\n});\n;// ./src/@demo/demo6/index.js\n\n\n/* harmony default export */ const demo6 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const rows = 11;\n const mult = 3;\n\n for (let i = 0; i < rows; i++) {\n\n const blends = ColorTranslator.getBlendHEX('#F00', '#FF0', mult + i * mult);\n\n blends.forEach((blend, index) => {\n const box = document.createElement('div');\n box.classList.add('box', `file${i}`);\n box.style.background = blend;\n box.innerText = index + 1;\n container.appendChild(box);\n });\n\n }\n\n return container;\n\n});\n;// ./src/@demo/demo7/index.js\n\n\n/* harmony default export */ const demo7 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n\n const colors = ['#F00', '#FF8000', '#FF0', '#0F0', '#00F', '#A0F', '#F0A'];\n\n const createBox = (color, type) => {\n const box = document.createElement('div');\n box.classList.add('box');\n box.style.backgroundColor = color;\n if (type) box.dataset.type = type;\n container.appendChild(box);\n };\n\n colors.forEach((color) => {\n const shades = ColorTranslator.getShades(color, 3).reverse();\n const tints = ColorTranslator.getTints(color, 3);\n shades.forEach((shade) => createBox(shade, 'shade'));\n createBox(color);\n tints.forEach((tint) => createBox(tint, 'tint'));\n });\n\n return container;\n\n});\n;// ./src/@demo/demo8/index.js\n\n\n\n/* harmony default export */ const demo8 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n\n const mixes = [\n '#F00',\n '#0F0',\n '#00F',\n [1, 3],\n [1, 2],\n [2, 3],\n [1, 2, 3]\n ];\n\n const fillPlanes = () => {\n const planes = container.querySelectorAll('#planes path');\n planes.forEach((plane, index) => {\n let color = '#CCC';\n if (typeof mixes[index] === 'string') {\n color = mixes[index];\n } else if(mixes[index]) {\n const colors = mixes[index].map((i) => mixes[i - 1]);\n color = mixes[index] = ColorTranslator.getMixHEX(colors);\n }\n plane.setAttribute('fill', color);\n });\n };\n\n fetch('images/color-mixes.svg')\n .then(result => result.text())\n .then((svgCode) => {\n container.innerHTML = svgCode;\n fillPlanes();\n });\n\n return container;\n\n});\n;// ./src/@demo/demo9/index.js\n\n\n/* harmony default export */ const demo9 = ((ColorTranslator, { Mix }) => {\n\n const container = document.createElement('div');\n\n const mixes = [\n '#F00',\n '#FF0',\n '#00F',\n [1, 3],\n [1, 2],\n [2, 3],\n [1, 2, 3]\n ];\n\n const fillPlanes = () => {\n const planes = container.querySelectorAll('#planes path');\n planes.forEach((plane, index) => {\n let color = '#CCC';\n if (typeof mixes[index] === 'string') {\n color = mixes[index];\n } else if(mixes[index]) {\n const colors = mixes[index].map((i) => mixes[i - 1]);\n color = mixes[index] = ColorTranslator.getMixHEX(colors, Mix.SUBTRACTIVE);\n }\n plane.setAttribute('fill', color);\n });\n };\n\n fetch('images/color-mixes.svg')\n .then(result => result.text())\n .then((svgCode) => {\n container.innerHTML = svgCode;\n fillPlanes();\n });\n\n return container;\n\n});\n;// ./src/@demo/demo10/index.js\n\n\n/* harmony default export */ const demo10 = ((ColorTranslator, { Harmony }) => {\n\n const container = document.createElement('div');\n\n const harmonies = [\n { label: 'Complementary', value: Harmony.COMPLEMENTARY },\n { label: 'Split Complementary', value: Harmony.SPLIT_COMPLEMENTARY },\n { label: 'Analogous', value: Harmony.ANALOGOUS },\n { label: 'Triadic', value: Harmony.TRIADIC },\n { label: 'Tetradic', value: Harmony.TETRADIC },\n { label: 'Square', value: Harmony.SQUARE }\n ];\n\n const baseColor = '#F00';\n\n const createElement = (className, parent) => {\n const div = document.createElement('div');\n div.classList.add(className);\n parent.appendChild(div);\n return div;\n };\n\n const createHarmony = (item) => {\n\n const wrapper = createElement('wrapper', container);\n const wheel = createElement('wheel', wrapper);\n const harmony = createElement('harmony', wrapper);\n createElement('label', wrapper).innerText = item.label;\n\n fetch('images/wheel-additive.svg')\n .then(result => result.text())\n .then((svgCode) => {\n const harmonyColors = ColorTranslator.getHarmony(baseColor, item.value);\n const selector = 'path' + harmonyColors.map((color) => `:not([fill=\"${color}\"])`).join('');\n wheel.innerHTML = svgCode;\n harmonyColors.forEach((hex) => createElement('box', harmony).style.background = hex);\n wheel.querySelectorAll(selector).forEach((path) => path.setAttribute('fill-opacity', '0.25'));\n });\n\n };\n\n harmonies.forEach((item) => createHarmony(item));\n\n return container;\n\n});\n;// ./src/@demo/demo11/index.js\n\n\n/* harmony default export */ const demo11 = ((ColorTranslator, { Harmony, Mix }) => {\n\n const container = document.createElement('div');\n\n const harmonies = [\n { label: 'Complementary', value: Harmony.COMPLEMENTARY },\n { label: 'Split Complementary', value: Harmony.SPLIT_COMPLEMENTARY },\n { label: 'Analogous', value: Harmony.ANALOGOUS },\n { label: 'Triadic', value: Harmony.TRIADIC },\n { label: 'Tetradic', value: Harmony.TETRADIC },\n { label: 'Square', value: Harmony.SQUARE }\n ];\n\n const baseColor = '#F00';\n\n const createElement = (className, parent) => {\n const div = document.createElement('div');\n div.classList.add(className);\n parent.appendChild(div);\n return div;\n };\n\n const createHarmony = (item) => {\n\n const wrapper = createElement('wrapper', container);\n const wheel = createElement('wheel', wrapper);\n const harmony = createElement('harmony', wrapper);\n createElement('label', wrapper).innerText = item.label;\n\n fetch('images/wheel-subtractive.svg')\n .then(result => result.text())\n .then((svgCode) => {\n const harmonyColors = ColorTranslator.getHarmony(baseColor, item.value, Mix.SUBTRACTIVE);\n const selector = 'path' + harmonyColors.map((color) => `:not([fill=\"${color}\"])`).join('');\n wheel.innerHTML = svgCode;\n harmonyColors.forEach((hex) => createElement('box', harmony).style.background = hex);\n wheel.querySelectorAll(selector).forEach((path) => path.setAttribute('fill-opacity', '0.25'));\n });\n\n };\n\n harmonies.forEach((item) => createHarmony(item));\n\n return container;\n\n});\n;// ./src/@demo/demo.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst functioToString = (fn) => {\n const article = document.createElement('article');\n const pre = document.createElement('pre');\n article.classList.add('function-container');\n pre.classList.add('prettyprint');\n article.appendChild(pre);\n pre.innerHTML = fn.toString().replace('(ColorTranslator)', '()');\n return article;\n};\n\nconst demos = new Map([\n ['demo1', demo1],\n ['demo2', demo2],\n ['demo3', demo3],\n ['demo4', demo4],\n ['demo5', demo5],\n ['demo6', demo6],\n ['demo7', demo7],\n ['demo8', demo8],\n ['demo9', demo9],\n ['demo10', demo10],\n ['demo11', demo11]\n]);\n\ndocument.addEventListener('DOMContentLoaded', () => {\n demos.forEach((module, div) => {\n const demo = document.getElementById(div);\n const container = document.createElement('div');\n const wrapper = document.createElement('div');\n\n container.classList.add('demo-container');\n wrapper.classList.add('demo-wrapper');\n\n wrapper.appendChild(module(ColorTranslator, { Harmony: Harmony, Mix: Mix }));\n container.appendChild(wrapper);\n demo.appendChild(container);\n demo.appendChild(functioToString(module));\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE0LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBTSxvQkFBb0IscUJBQU07QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUiw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7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Q2hDO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0Q0FBNEM7QUFDdEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzQ0FBc0M7OztBQ2hNRjtBQUM5QjtBQUNQLEtBQUssVUFBVSxpRkFBaUYsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRTtBQUNySixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ0EseUJBQXlCLElBQUk7QUFDN0Isd0JBQXdCLE9BQU87QUFDL0I7QUFDQTs7O0FDdkIrRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ007QUFDQTtBQUNQLFVBQVUsVUFBVTtBQUNwQixVQUFVLFVBQVU7QUFDcEIsVUFBVSxVQUFVO0FBQ3BCLFdBQVcsVUFBVTtBQUNyQixVQUFVLFVBQVU7QUFDcEIsVUFBVSxVQUFVO0FBQ3BCLFNBQVMsVUFBVTtBQUNuQixTQUFTLFVBQVU7QUFDbkIsU0FBUyxVQUFVO0FBQ25CLFVBQVUsVUFBVTtBQUNwQixTQUFTLFVBQVU7QUFDbkIsU0FBUyxVQUFVO0FBQ25CLENBQUM7QUFDTTtBQUNQO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCLGFBQWEsYUFBYTtBQUMxQixhQUFhLGFBQWE7QUFDMUIsYUFBYSxhQUFhO0FBQzFCLGNBQWMsYUFBYTtBQUMzQixlQUFlLGFBQWE7QUFDNUIsa0JBQWtCLGdCQUFnQjtBQUNsQyxDQUFDO0FBQ007QUFDUDtBQUNBO0FBQ0EsQ0FBQztBQUN5QjtBQUNGOzs7QUNwRGlMO0FBQ2xNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNQLFdBQVcsbUJBQW1CO0FBQzlCO0FBQ08sd0RBQXdELFVBQVU7QUFDbEUsd0RBQXdELFVBQVU7QUFDbEUsd0RBQXdELFVBQVU7QUFDbEUsMkRBQTJELFVBQVU7QUFDckUsd0RBQXdELFVBQVU7QUFDbEUseURBQXlELFVBQVU7QUFDbkUsMkNBQTJDLGFBQWE7QUFDeEQ7QUFDUCxjQUFjLE1BQU0sS0FBSyxPQUFPO0FBQ2hDO0FBQ087QUFDUCxjQUFjLE1BQU0sS0FBSyxHQUFHO0FBQzVCO0FBQ087QUFDUCxlQUFlLFFBQVEsVUFBVSxLQUFLO0FBQ3RDO0FBQ08sNkJBQTZCLEtBQUssU0FBUyxRQUFRO0FBQzFEO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxxQkFBcUIsSUFBSTtBQUN6QjtBQUNBLGdCQUFnQixJQUFJO0FBQ3BCO0FBQ087QUFDUDtBQUNBO0FBQ0Esa0JBQWtCLElBQUk7QUFDdEI7QUFDQTtBQUNBO0FBQ08sa0VBQWtFLFFBQVE7QUFDMUUsa0VBQWtFLE9BQU87QUFDekUsa0VBQWtFLFNBQVM7QUFDM0U7QUFDUCxrQkFBa0IsS0FBSztBQUN2Qix3QkFBd0IsUUFBUSwrQkFBK0IsUUFBUTtBQUN2RTtBQUNBLFFBQVEsR0FBRztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFFBQVE7QUFDckM7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ087QUFDUCxRQUFRLEtBQUs7QUFDYixzQkFBc0IsT0FBTyxnQ0FBZ0MsT0FBTyxFQUFFLE9BQU87QUFDN0U7QUFDQSwyQkFBMkIsT0FBTyxFQUFFLE9BQU87QUFDM0M7QUFDTztBQUNQLFFBQVEsS0FBSztBQUNiLHNCQUFzQixTQUFTLGdDQUFnQyxTQUFTLEVBQUUsU0FBUztBQUNuRjtBQUNBLDJCQUEyQixTQUFTLEVBQUUsU0FBUztBQUMvQztBQUNPO0FBQ1Asa0JBQWtCLEtBQUs7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxpQ0FBaUMsWUFBWTtBQUNwRDtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNQO0FBQ0Esa0NBQWtDLE9BQU87QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsY0FBYztBQUMvQjtBQUNBO0FBQ0EsaUJBQWlCLGNBQWM7QUFDL0Isb0NBQW9DLE9BQU87QUFDM0M7QUFDQSxpQkFBaUIsY0FBYztBQUMvQjtBQUNBO0FBQ0EsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZ0NBQWdDLE9BQU8sSUFBSSxPQUFPO0FBQ2xEO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFNBQVMsSUFBSSxTQUFTO0FBQzNEO0FBQ087QUFDUDtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0Isa0NBQWtDLE9BQU87QUFDekM7QUFDQSxhQUFhLGNBQWM7QUFDM0Isd0JBQXdCLFFBQVE7QUFDaEM7QUFDQSxhQUFhLGNBQWM7QUFDM0IsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsMENBQTBDLE9BQU87QUFDakQ7QUFDQTtBQUNBLGNBQWMsY0FBYztBQUM1QjtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCOzs7QUM5SmlEO0FBQzBCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLLDBCQUEwQixRQUFRO0FBQ3REO0FBQ0E7QUFDQSxlQUFlLEtBQUssTUFBTSxRQUFRO0FBQ2xDO0FBQ0E7QUFDQSxlQUFlLEtBQUssZ0NBQWdDLFFBQVE7QUFDNUQ7QUFDQTtBQUNBLGVBQWUsS0FBSyxNQUFNLFFBQVE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsU0FBUyxRQUFRO0FBQ2pCLFNBQVMsUUFBUTtBQUNqQixTQUFTLFFBQVE7QUFDakIsb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTSxVQUFVLFFBQVEsS0FBSyxRQUFRO0FBQ2hELFdBQVcsTUFBTSxVQUFVLFFBQVEsS0FBSyxRQUFRO0FBQ2hELFdBQVcsTUFBTSxVQUFVLFFBQVEsS0FBSyxRQUFRO0FBQ2hEO0FBQ0E7QUFDTztBQUNQO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ087QUFDUCxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLLHFCQUFxQixRQUFRO0FBQzdDLFdBQVcsS0FBSywwQkFBMEIsUUFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTSxRQUFRLFFBQVEsS0FBSyxRQUFRO0FBQzlDLFdBQVcsTUFBTSxRQUFRLFFBQVEsS0FBSyxRQUFRO0FBQzlDLFdBQVcsTUFBTSxRQUFRLFFBQVEsS0FBSyxRQUFRO0FBQzlDO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxXQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxvQkFBb0IsUUFBUTtBQUM1RCxXQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxvQkFBb0IsUUFBUTtBQUM1RCxXQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxvQkFBb0IsUUFBUTtBQUM1RDtBQUNBO0FBQ087QUFDUCxTQUFTLFFBQVE7QUFDakIsU0FBUyxRQUFRO0FBQ2pCLFNBQVMsUUFBUTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEI7QUFDQTtBQUNPO0FBQ1A7QUFDQSx3QkFBd0IsUUFBUSxNQUFNLFFBQVEsTUFBTSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx3QkFBd0IsUUFBUSxNQUFNLFFBQVEsTUFBTSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQ2xWcUQ7QUFDRjtBQUM1QztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixNQUFNO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsZUFBZTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0EsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBOzs7QUNyQ3VGO0FBQ3VCO0FBQ3ZHO0FBQ1Asa0JBQWtCLFdBQVc7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFdBQVc7QUFDbkI7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxXQUFXO0FBQ25CO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLFFBQVEsY0FBYztBQUN0QjtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQSxRQUFRLFdBQVc7QUFDbkI7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxZQUFZO0FBQ3BCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZDa0g7QUFDekI7QUFDbEY7QUFDUCxTQUFTLEtBQUssRUFBRTtBQUNoQixNQUFNLEtBQUs7QUFDSjtBQUNQLGtCQUFrQixxQkFBcUI7QUFDdkMsa0JBQWtCLG1CQUFtQjtBQUNyQyxpQkFBaUIsV0FBVztBQUM1QjtBQUNBO0FBQ0EsYUFBYSxXQUFXO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1AsNEJBQTRCLFlBQVk7QUFDeEM7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QixLQUFLO0FBQ0w7QUFDTztBQUNQLFlBQVksaUNBQWlDO0FBQzdDLHNCQUFzQixhQUFhO0FBQ25DO0FBQ0E7QUFDQSxrQkFBa0IsS0FBSyx3QkFBd0I7QUFDL0M7QUFDQSxXQUFXLEtBQUs7QUFDaEI7QUFDTztBQUNQLFlBQVksdUJBQXVCO0FBQ25DO0FBQ0E7QUFDQSwyQkFBMkIsY0FBYztBQUN6QywrQkFBK0IsS0FBSyxDQUFDLGdCQUFnQjtBQUNyRCxzQkFBc0IsV0FBVyxFQUFFLFdBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsY0FBYyxLQUFLO0FBQ25CO0FBQ0E7OztBQzVDaUY7QUFDN0M7QUFDZ0M7QUFDNEQ7QUFDN0U7QUFDNUMsd0JBQXdCLFdBQVc7QUFDMUM7QUFDQSx5QkFBeUIsY0FBYztBQUN2QyxjQUFjLGFBQWE7QUFDM0I7QUFDQSxxQ0FBcUMsU0FBUztBQUM5QztBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsb0JBQW9CLFNBQVM7QUFDN0IsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBLG9CQUFvQixHQUFHLFNBQVMsUUFBUTtBQUN4QyxTQUFTO0FBQ1QsZUFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE1BQU07QUFDekIsbUJBQW1CLE1BQU07QUFDekIsbUJBQW1CLE1BQU07QUFDekIsb0JBQW9CLFdBQVc7QUFDL0I7QUFDQTtBQUNBLDJCQUEyQixNQUFNLE1BQU0sUUFBUTtBQUMvQyxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0IsSUFBSSxRQUFRO0FBQzNDLGVBQWUsZ0JBQWdCLElBQUksUUFBUTtBQUMzQyxlQUFlLGdCQUFnQixJQUFJLFFBQVE7QUFDM0MsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLGdDQUFnQyxnQkFBZ0IsSUFBSSxRQUFRO0FBQzVELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsV0FBVztBQUMvQjtBQUNBLGNBQWMsTUFBTTtBQUNwQjtBQUNBLGVBQWUsTUFBTTtBQUNyQixlQUFlLE1BQU07QUFDckIsZUFBZSxNQUFNO0FBQ3JCO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBLDBCQUEwQixNQUFNLFNBQVMsUUFBUTtBQUNqRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxLQUFLLENBQUMsS0FBSztBQUNsRCx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0EsaUJBQWlCLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDNUIsaUJBQWlCLEdBQUcsR0FBRyxFQUFFO0FBQ3pCLGVBQWUsd0JBQXdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQ3ZGMEM7QUFDMUM7QUFDTztBQUNQO0FBQ0E7QUFDQSxhQUFhLElBQUk7QUFDakIsYUFBYSxJQUFJO0FBQ2pCLGFBQWEsSUFBSTtBQUNqQixhQUFhLElBQUk7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsSUFBSTtBQUNyQixZQUFZLElBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLElBQUk7QUFDdkIsZ0JBQWdCLElBQUk7QUFDcEIsZ0RBQWdELElBQUk7QUFDcEQ7QUFDQSxpQkFBaUI7QUFDakIsb0JBQW9CLElBQUk7QUFDeEIsb0JBQW9CLElBQUk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxJQUFJO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQkFBaUIsSUFBSSxXQUFXLEVBQUUsTUFBTSw0QkFBNEI7QUFDckg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxRXdGO0FBQ3lDO0FBQ25DO0FBQzFEO0FBQ007QUFDUztBQUM1Qyx3QkFBd0IsV0FBVztBQUMxQztBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0EscUJBQXFCLEtBQUssU0FBUyxRQUFRO0FBQzNDLGtCQUFrQixHQUFHLFNBQVMsUUFBUTtBQUN0QztBQUNBLGdDQUFnQyxRQUFRO0FBQ3hDLFNBQVM7QUFDVCxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBLG9CQUFvQiwyR0FBMkc7QUFDL0g7QUFDQTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDO0FBQ0EsbUNBQW1DLFFBQVE7QUFDM0MsbUNBQW1DLFFBQVE7QUFDM0MsbUNBQW1DLFFBQVE7QUFDM0M7QUFDQTtBQUNBLGtDQUFrQyxVQUFVO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdCQUFnQixLQUFLLFFBQVE7QUFDN0QsZ0NBQWdDLGdCQUFnQixLQUFLLFFBQVE7QUFDN0QsZ0NBQWdDLGdCQUFnQixLQUFLLFFBQVE7QUFDN0Qsd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBLCtCQUErQixjQUFjO0FBQzdDLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCLElBQUksUUFBUTtBQUMzQyxlQUFlLGdCQUFnQixJQUFJLFFBQVE7QUFDM0MsZUFBZSxnQkFBZ0IsSUFBSSxRQUFRO0FBQzNDLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSxnQ0FBZ0MsZ0JBQWdCLElBQUksUUFBUTtBQUM1RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFdBQVc7QUFDL0I7QUFDQSxjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixTQUFTO0FBQ1Q7QUFDQTtBQUNBLGdCQUFnQixrREFBa0Q7QUFDbEU7QUFDQSxzQkFBc0IsV0FBVztBQUNqQztBQUNBLCtCQUErQixhQUFhO0FBQzVDLHFCQUFxQixzQkFBc0Isa0JBQWtCO0FBQzdEO0FBQ0Esc0JBQXNCLFdBQVc7QUFDakMsc0JBQXNCLEtBQUs7QUFDM0I7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQSx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUM1RCx3QkFBd0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUNoRDtBQUNBLHdCQUF3QixJQUFJLElBQUksR0FBRyxHQUFHLEVBQUU7QUFDeEMsd0JBQXdCLElBQUksSUFBSSxFQUFFO0FBQ2xDLGVBQWUsd0JBQXdCO0FBQ3ZDO0FBQ0E7QUFDQSxrQkFBa0IsS0FBSztBQUN2QixrQkFBa0IsS0FBSztBQUN2QixrQkFBa0IsS0FBSztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsS0FBSztBQUM1QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscURBQXFEO0FBQ3JFO0FBQ0Esa0NBQWtDLEtBQUs7QUFDdkMsZ0JBQWdCLEtBQUs7QUFDckIsZ0JBQWdCLEtBQUs7QUFDckIsZ0NBQWdDLEtBQUs7QUFDckMsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQy9JcUU7QUFDK0Q7QUFDM0I7QUFDckU7QUFDVTtBQUNKO0FBQ1M7QUFDNUMsd0JBQXdCLFdBQVc7QUFDMUM7QUFDQSxrQ0FBa0MsU0FBUztBQUMzQztBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBLG9CQUFvQiwyR0FBMkc7QUFDL0g7QUFDQTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDLGdDQUFnQyxRQUFRO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkMsdUJBQXVCLE9BQU87QUFDOUIsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBLGtDQUFrQyxVQUFVO0FBQzVDLDRCQUE0QixNQUFNLE9BQU8sU0FBUztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsT0FBTztBQUM5Qix1QkFBdUIsT0FBTztBQUM5Qix3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0MseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCLGVBQWUsT0FBTyxJQUFJLFFBQVE7QUFDbEMsZUFBZSxPQUFPLElBQUksUUFBUTtBQUNsQyxnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0EsdUJBQXVCLE1BQU0sY0FBYyxTQUFTO0FBQ3BELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksV0FBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsTUFBTTtBQUM5QixrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQkFBZ0IsK0JBQStCO0FBQy9DLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0EsNEJBQTRCLHNCQUFzQjtBQUNsRCx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQSx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRTtBQUM5RCx3QkFBd0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRTtBQUNqRDtBQUNBLHdCQUF3QixJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUMxQyx3QkFBd0IsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNuQyxlQUFlLHdCQUF3QjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUssQ0FBQyxZQUFZO0FBQ2pDLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUs7QUFDcEIsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLHVCQUF1QixLQUFLO0FBQzVCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiwyQkFBMkI7QUFDM0M7QUFDQSx1QkFBdUIsWUFBWTtBQUNuQyxnQ0FBZ0MsS0FBSztBQUNyQyx1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTs7O0FDckl5RjtBQUMyQztBQUN4QztBQUN4RDtBQUNVO0FBQ0o7QUFDUztBQUM1Qyx3QkFBd0IsV0FBVztBQUMxQztBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixtQkFBbUIsU0FBUztBQUM1QjtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0Esb0JBQW9CLG1FQUFtRTtBQUN2RjtBQUNBO0FBQ0EsZ0NBQWdDLE1BQU07QUFDdEMsZ0NBQWdDLFFBQVE7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEMsOEJBQThCLFVBQVU7QUFDeEMsOEJBQThCLFVBQVU7QUFDeEM7QUFDQSx1QkFBdUIsTUFBTSxPQUFPLE9BQU87QUFDM0MsdUJBQXVCLE1BQU0sT0FBTyxTQUFTO0FBQzdDLHVCQUF1QixNQUFNLE9BQU8sU0FBUztBQUM3QztBQUNBO0FBQ0Esa0NBQWtDLFVBQVU7QUFDNUMsNEJBQTRCLE1BQU0sT0FBTyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsT0FBTztBQUM5Qix1QkFBdUIsT0FBTztBQUM5Qix3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0MseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLHVCQUF1QixjQUFjO0FBQ3JDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksV0FBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsTUFBTTtBQUM5QixrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzQkFBc0I7QUFDbEQsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBLG9CQUFvQixJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUN0QyxvQkFBb0IsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUMvQixlQUFlLHdCQUF3QjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUssQ0FBQyxZQUFZO0FBQ2pDLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUs7QUFDcEIsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLHVCQUF1QixLQUFLO0FBQzVCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkMsZ0NBQWdDLEtBQUs7QUFDckMsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQzFId0c7QUFDNkM7QUFDcEU7QUFDN0M7QUFDVTtBQUNKO0FBQ1M7QUFDNUMsMkJBQTJCLFdBQVc7QUFDN0M7QUFDQSxrQ0FBa0MsU0FBUztBQUMzQztBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQSxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBLG9CQUFvQixtRUFBbUU7QUFDdkY7QUFDQTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDO0FBQ0EsdUJBQXVCLE1BQU0sT0FBTyxTQUFTO0FBQzdDLHVCQUF1QixNQUFNLEtBQUssT0FBTyxFQUFFLE9BQU87QUFDbEQsdUJBQXVCLE1BQU0sS0FBSyxPQUFPLEVBQUUsT0FBTztBQUNsRDtBQUNBO0FBQ0Esa0NBQWtDLFVBQVU7QUFDNUMsK0JBQStCLE1BQU0sT0FBTyxTQUFTO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsT0FBTztBQUM5Qix1QkFBdUIsZ0JBQWdCO0FBQ3ZDLHVCQUF1QixnQkFBZ0I7QUFDdkMsd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBLCtCQUErQixjQUFjO0FBQzdDLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLGdCQUFnQixJQUFJLFFBQVE7QUFDM0MsZUFBZSxnQkFBZ0IsSUFBSSxRQUFRO0FBQzNDLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsY0FBYztBQUNyQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGNBQWM7QUFDMUI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE1BQU07QUFDOUIsa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsS0FBSyxDQUFDLE9BQU87QUFDdkMsbUNBQW1DLGFBQWE7QUFDaEQseUJBQXlCLEVBQUU7QUFDM0IseUJBQXlCLEVBQUU7QUFDM0I7QUFDQTtBQUNBLG1DQUFtQyxhQUFhO0FBQ2hELHlCQUF5QixzQkFBc0Isa0JBQWtCO0FBQ2pFLHNCQUFzQixLQUFLO0FBQzNCO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0Esb0JBQW9CLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNwQyxvQkFBb0IsSUFBSSxJQUFJLEVBQUU7QUFDOUIsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUs7QUFDcEIsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLHVCQUF1QixLQUFLO0FBQzVCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0Esa0NBQWtDLEtBQUs7QUFDdkMsZ0JBQWdCLEtBQUs7QUFDckIsZ0JBQWdCLEtBQUs7QUFDckIsZ0NBQWdDLEtBQUs7QUFDckMsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQzNJMEg7QUFDc0U7QUFDL0c7QUFDN0M7QUFDVTtBQUNKO0FBQ1M7QUFDNUMsd0JBQXdCLFdBQVc7QUFDMUM7QUFDQSxrQ0FBa0MsU0FBUztBQUMzQztBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBLG9CQUFvQixtRUFBbUU7QUFDdkY7QUFDQTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDLGdDQUFnQyxRQUFRO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDO0FBQ0EsdUJBQXVCLE1BQU0sT0FBTyxTQUFTO0FBQzdDLHVCQUF1QixNQUFNLEtBQUssU0FBUyxFQUFFLFNBQVM7QUFDdEQsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBLGtDQUFrQyxVQUFVO0FBQzVDLDRCQUE0QixNQUFNLE9BQU8sU0FBUztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLE9BQU87QUFDOUIsdUJBQXVCLGdCQUFnQjtBQUN2Qyx1QkFBdUIsWUFBWTtBQUNuQyx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0MseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsZ0JBQWdCLElBQUksUUFBUTtBQUMzQyxlQUFlLFlBQVk7QUFDM0IsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLHVCQUF1QixjQUFjO0FBQ3JDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksV0FBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsTUFBTTtBQUM5QixrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQkFBZ0IsZ0NBQWdDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixLQUFLLENBQUMsT0FBTztBQUN2QyxtQ0FBbUMsYUFBYTtBQUNoRCx5QkFBeUIsRUFBRTtBQUMzQix5QkFBeUIsRUFBRTtBQUMzQjtBQUNBO0FBQ0EsbUNBQW1DLGFBQWE7QUFDaEQseUJBQXlCLHNCQUFzQixrQkFBa0I7QUFDakUsc0JBQXNCLEtBQUs7QUFDM0I7QUFDQTtBQUNBLG1DQUFtQyxjQUFjO0FBQ2pELHVDQUF1QyxLQUFLLENBQUMsZ0JBQWdCO0FBQzdELDhCQUE4QixXQUFXLEVBQUUsV0FBVztBQUN0RDtBQUNBLHVCQUF1QixLQUFLO0FBQzVCO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0Esb0JBQW9CLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNwQyxvQkFBb0IsSUFBSSxJQUFJLEVBQUU7QUFDOUIsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUssQ0FBQyxZQUFZO0FBQ2pDLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsS0FBSztBQUM1QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixZQUFZO0FBQ25DLGtDQUFrQyxLQUFLO0FBQ3ZDLGdCQUFnQixLQUFLO0FBQ3JCLGdDQUFnQyxLQUFLO0FBQ3JDLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBOzs7QUNqSnlFO0FBQzhCO0FBQ1Q7QUFDMUQ7QUFDVztBQUNJO0FBQzVDLHlCQUF5QixXQUFXO0FBQzNDO0FBQ0Esa0NBQWtDLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixhQUFhO0FBQ2hDLG1CQUFtQixhQUFhO0FBQ2hDLG1CQUFtQixhQUFhO0FBQ2hDLG1CQUFtQixhQUFhO0FBQ2hDLG9CQUFvQixXQUFXO0FBQy9CO0FBQ0E7QUFDQSwyQkFBMkIsY0FBYztBQUN6QyxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGFBQWEsSUFBSSxRQUFRO0FBQ3hDLGVBQWUsYUFBYSxJQUFJLFFBQVE7QUFDeEMsZUFBZSxhQUFhLElBQUksUUFBUTtBQUN4QyxlQUFlLGFBQWEsSUFBSSxRQUFRO0FBQ3hDLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsY0FBYztBQUNyQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE1BQU07QUFDOUIsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQkFBZ0IsaUVBQWlFO0FBQ2pGLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQSw2QkFBNkIsYUFBYTtBQUMxQztBQUNBLDBCQUEwQixLQUFLLGtCQUFrQjtBQUNqRDtBQUNBO0FBQ0Esa0JBQWtCLFdBQVc7QUFDN0Isa0JBQWtCLEtBQUs7QUFDdkI7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQSxxQkFBcUIsYUFBYSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUU7QUFDbEYscUJBQXFCLGFBQWEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQ3ZFO0FBQ0EscUJBQXFCLGFBQWEsRUFBRSxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUN4RCxxQkFBcUIsYUFBYSxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUU7QUFDbEQsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUs7QUFDcEIsZUFBZSxLQUFLO0FBQ3BCLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsS0FBSztBQUM1QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0VBQWtFO0FBQ2xGO0FBQ0Esa0NBQWtDLEtBQUs7QUFDdkMsZ0JBQWdCLEtBQUs7QUFDckIsZ0JBQWdCLEtBQUs7QUFDckIsZ0JBQWdCLEtBQUs7QUFDckIsZ0NBQWdDLEtBQUs7QUFDckMsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQzlIZ0o7QUFDckY7QUFDTTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNNO0FBQ047QUFDRTtBQUMxQyxzQkFBc0IsU0FBUztBQUMvQixzQkFBc0IsU0FBUztBQUMvQixzQkFBc0IsU0FBUztBQUMvQixzQkFBc0IsU0FBUztBQUMvQix5QkFBeUIsWUFBWTtBQUNyQyxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsVUFBVTtBQUNqQywrQkFBK0Isa0JBQWtCO0FBQ3hELEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxjQUFjO0FBQ3pELDBDQUEwQyxhQUFhO0FBQ3ZELDZDQUE2QyxnQkFBZ0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0EsK0JBQStCLEtBQUs7QUFDcEM7QUFDQSw0REFBNEQscUJBQXFCO0FBQ2pGO0FBQ0Esb0JBQW9CLE1BQU07QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsZ0JBQWdCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQSxjQUFjLGVBQWU7QUFDN0IsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLGdFQUFnRSxlQUFlO0FBQy9FLDJCQUEyQixTQUFTO0FBQ3BDO0FBQ0E7QUFDQSx3RUFBd0UsZUFBZTtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEMsa0JBQWtCLGVBQWU7QUFDakM7QUFDQTs7O0FDOUlpSDtBQUNHO0FBQ3BEO0FBQzVCO0FBQ29DO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQyxnQkFBZ0IsY0FBYztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEIsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUs7QUFDcEI7QUFDQSxLQUFLO0FBQ0w7QUFDTyxpRUFBaUUsbUJBQW1CLGNBQWM7QUFDekc7QUFDQSxnQkFBZ0IsbUJBQW1CO0FBQ25DLHVCQUF1QixrQkFBa0I7QUFDekMscUJBQXFCLGtCQUFrQjtBQUN2QywwQkFBMEIsTUFBTTtBQUNoQyx3QkFBd0IsTUFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsa0JBQWtCLDBCQUEwQix3QkFBd0I7QUFDdkY7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQyxLQUFLO0FBQ0w7QUFDTztBQUNQLDJCQUEyQixRQUFRO0FBQ25DO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDREQUE0RCxHQUFHLHVCQUF1QjtBQUM3RjtBQUNBLGVBQWUsa0JBQWtCLGdCQUFnQixVQUFVO0FBQzNELEtBQUs7QUFDTCw0QkFBNEIsR0FBRztBQUMvQjtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDLGlCQUFpQixXQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsaUNBQWlDLEdBQUc7QUFDcEMsZ0JBQWdCO0FBQ2hCLGdCQUFnQjtBQUNoQjtBQUNBLDJCQUEyQixXQUFXO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxRQUFRO0FBQzlELHNEQUFzRCxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEdBQUc7QUFDaEMsd0JBQXdCLHNDQUFzQyxRQUFRO0FBQ3RFLHdCQUF3QixzQ0FBc0MsUUFBUSxHQUFHO0FBQ3pFO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxpQkFBaUIsR0FBRztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQix3QkFBd0Isd0JBQXdCO0FBQ2pGO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNPO0FBQ1Asc0JBQXNCLFFBQVE7QUFDOUI7QUFDQTtBQUNBLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sdURBQXVELDBCQUEwQixjQUFjO0FBQ3RHLGtCQUFrQixRQUFRO0FBQzFCLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTtBQUNBLGdCQUFnQixrQkFBa0IsZ0JBQWdCLFVBQVU7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsa0JBQWtCLDZCQUE2Qix3QkFBd0I7QUFDMUYsU0FBUztBQUNUO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQyxLQUFLO0FBQ0w7QUFDTztBQUNQLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0E7QUFDQSx5QkFBeUIsUUFBUTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsR0FBRztBQUMzQixrQkFBa0IsWUFBWTtBQUM5QixrQkFBa0IsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQzVDO0FBQ0E7QUFDQSxDQUFDLEtBQUssVUFBVTtBQUNoQjtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ08sNERBQTREO0FBQ25FO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0EsZ0JBQWdCLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsa0JBQWtCLGlDQUFpQyx3QkFBd0I7QUFDOUYsU0FBUztBQUNUO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQyxLQUFLO0FBQ0w7QUFDTztBQUNQLFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCO0FBQ0Esa0JBQWtCLEdBQUc7QUFDckIsWUFBWSxLQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxLQUFLO0FBQ2I7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsT0FBTztBQUNmLFFBQVEsR0FBRztBQUNYO0FBQ0E7QUFDQTs7O0FDMU9pRztBQUM2RDtBQUN0RjtBQUNBO0FBQ3NJO0FBQ3ZNO0FBQ1AsbUNBQW1DO0FBQ25DLHdCQUF3Qix3QkFBd0I7QUFDaEQsNEJBQTRCLGtCQUFrQjtBQUM5QyxzQkFBc0IsYUFBYTtBQUNuQztBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFVBQVU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsVUFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFlBQVk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsTUFBTSxPQUFPLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsTUFBTSxPQUFPLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsTUFBTSxPQUFPLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixNQUFNLE9BQU8sU0FBUztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixNQUFNLEtBQUssT0FBTyxFQUFFLE9BQU87QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sS0FBSyxPQUFPLEVBQUUsT0FBTztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsTUFBTSxPQUFPLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixZQUFZO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFNLE9BQU8sU0FBUztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBTTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE1BQU07QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBTTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLG1CQUFtQixVQUFVO0FBQzlEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLG1CQUFtQixVQUFVO0FBQzlEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLG1CQUFtQixVQUFVO0FBQzlEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLG1CQUFtQixVQUFVO0FBQzlEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixvQkFBb0IsVUFBVTtBQUMvRDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0Isb0JBQW9CLFVBQVU7QUFDL0Q7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHNCQUFzQixVQUFVO0FBQ2pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVSxRQUFRO0FBQ3pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVTtBQUNqRTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0Isc0JBQXNCLFVBQVU7QUFDakU7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHNCQUFzQixVQUFVO0FBQ2pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVTtBQUNqRTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0Isc0JBQXNCLFVBQVU7QUFDakU7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHNCQUFzQixVQUFVO0FBQ2pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVTtBQUNqRTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0Isc0JBQXNCLFVBQVU7QUFDakU7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHNCQUFzQixVQUFVO0FBQ2pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVTtBQUNqRTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsdUJBQXVCLFVBQVU7QUFDbEU7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHVCQUF1QixVQUFVO0FBQ2xFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLGdCQUFnQixVQUFVO0FBQzNEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBLDBDQUEwQztBQUMxQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLG9DQUFvQztBQUNwQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDBDQUEwQztBQUMxQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLG9DQUFvQztBQUNwQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDBDQUEwQztBQUMxQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLG9DQUFvQztBQUNwQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDZDQUE2QztBQUM3QyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHVDQUF1QztBQUN2QyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxTQUFTLHdCQUF3QjtBQUMvRjtBQUNBLDhDQUE4QztBQUM5QyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHdDQUF3QztBQUN4QyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxTQUFTLHdCQUF3QjtBQUMvRjtBQUNBLDBDQUEwQztBQUMxQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLG9DQUFvQztBQUNwQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxPQUFPLHdCQUF3QjtBQUM3RjtBQUNBLDRDQUE0QztBQUM1QyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHNDQUFzQztBQUN0QyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxPQUFPLHdCQUF3QjtBQUM3RjtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVTtBQUNsRDtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVTtBQUNsRDtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVTtBQUNsRDtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVTtBQUNsRDtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVSx1QkFBdUIsb0JBQW9CO0FBQzdGO0FBQ0E7QUFDQSxlQUFlLGNBQWMsV0FBVyxVQUFVLHNCQUFzQixvQkFBb0I7QUFDNUY7QUFDQTtBQUNBLGVBQWUsY0FBYyxXQUFXLFVBQVUsc0JBQXNCLG9CQUFvQjtBQUM1RjtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVSxxQkFBcUIsb0JBQW9CO0FBQzNGO0FBQ0E7QUFDQSxlQUFlLGNBQWMsV0FBVyxVQUFVLHVCQUF1QixvQkFBb0I7QUFDN0Y7QUFDQTtBQUNBLGVBQWUsY0FBYyxXQUFXLFVBQVUsc0JBQXNCLG9CQUFvQjtBQUM1RjtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQzVGO0FBQ0E7QUFDQSxlQUFlLGNBQWMsV0FBVyxVQUFVLHFCQUFxQixvQkFBb0I7QUFDM0Y7QUFDQTtBQUNBLGVBQWUsY0FBYyxXQUFXLFVBQVUsdUJBQXVCLG9CQUFvQjtBQUM3RjtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQzVGO0FBQ0E7QUFDQSxlQUFlLGNBQWMsV0FBVyxVQUFVLHNCQUFzQixvQkFBb0I7QUFDNUY7QUFDQTtBQUNBLGVBQWUsY0FBYyxXQUFXLFVBQVUscUJBQXFCLG9CQUFvQjtBQUMzRjtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVSwwQkFBMEIsb0JBQW9CO0FBQ2hHO0FBQ0E7QUFDQSxlQUFlLGNBQWMsV0FBVyxVQUFVLHlCQUF5QixvQkFBb0I7QUFDL0Y7QUFDQTtBQUNBLGVBQWUsY0FBYyxXQUFXLFVBQVUseUJBQXlCLG9CQUFvQjtBQUMvRjtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVSx3QkFBd0Isb0JBQW9CO0FBQzlGO0FBQ0E7QUFDQSxlQUFlLGNBQWMsV0FBVyxVQUFVLHVCQUF1QixvQkFBb0I7QUFDN0Y7QUFDQTtBQUNBLGVBQWUsY0FBYyxXQUFXLFVBQVUsc0JBQXNCLG9CQUFvQjtBQUM1RjtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQzVGO0FBQ0E7QUFDQSxlQUFlLGNBQWMsV0FBVyxVQUFVLHFCQUFxQixvQkFBb0I7QUFDM0Y7QUFDQTtBQUNBLGVBQWUsWUFBWSxTQUFTLFVBQVU7QUFDOUM7QUFDQSxvQ0FBb0MsR0FBRztBQUN2QyxlQUFlLFlBQVksU0FBUyxVQUFVO0FBQzlDO0FBQ0EsMkNBQTJDLEdBQUc7QUFDOUMsZUFBZSxZQUFZLFNBQVMsVUFBVTtBQUM5QztBQUNBLHFDQUFxQyxHQUFHO0FBQ3hDLGVBQWUsWUFBWSxTQUFTLFVBQVU7QUFDOUM7QUFDQTtBQUNBLGVBQWUsWUFBWSxTQUFTLFVBQVUsdUJBQXVCLHNCQUFzQjtBQUMzRjtBQUNBO0FBQ0EsZUFBZSxZQUFZLFNBQVMsVUFBVSxzQkFBc0Isc0JBQXNCO0FBQzFGO0FBQ0E7QUFDQSxlQUFlLFlBQVksU0FBUyxVQUFVLHNCQUFzQixzQkFBc0I7QUFDMUY7QUFDQTtBQUNBLGVBQWUsWUFBWSxTQUFTLFVBQVUscUJBQXFCLHNCQUFzQjtBQUN6RjtBQUNBO0FBQ0EsZUFBZSxZQUFZLFNBQVMsVUFBVSx1QkFBdUIsc0JBQXNCO0FBQzNGO0FBQ0E7QUFDQSxlQUFlLFlBQVksU0FBUyxVQUFVLHNCQUFzQixzQkFBc0I7QUFDMUY7QUFDQTtBQUNBLGVBQWUsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUMxRjtBQUNBO0FBQ0EsZUFBZSxZQUFZLFNBQVMsVUFBVSxxQkFBcUIsc0JBQXNCO0FBQ3pGO0FBQ0E7QUFDQSxlQUFlLFlBQVksU0FBUyxVQUFVLHVCQUF1QixzQkFBc0I7QUFDM0Y7QUFDQTtBQUNBLGVBQWUsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUMxRjtBQUNBO0FBQ0EsZUFBZSxZQUFZLFNBQVMsVUFBVSxzQkFBc0Isc0JBQXNCO0FBQzFGO0FBQ0E7QUFDQSxlQUFlLFlBQVksU0FBUyxVQUFVLHFCQUFxQixzQkFBc0I7QUFDekY7QUFDQTtBQUNBLGVBQWUsWUFBWSxTQUFTLFVBQVUsMEJBQTBCLHNCQUFzQjtBQUM5RjtBQUNBO0FBQ0EsZUFBZSxZQUFZLFNBQVMsVUFBVSx5QkFBeUIsc0JBQXNCO0FBQzdGO0FBQ0E7QUFDQSxlQUFlLFlBQVksU0FBUyxVQUFVLHlCQUF5QixzQkFBc0I7QUFDN0Y7QUFDQTtBQUNBLGVBQWUsWUFBWSxTQUFTLFVBQVUsd0JBQXdCLHNCQUFzQjtBQUM1RjtBQUNBO0FBQ0EsZUFBZSxZQUFZLFNBQVMsVUFBVSx1QkFBdUIsc0JBQXNCO0FBQzNGO0FBQ0E7QUFDQSxlQUFlLFlBQVksU0FBUyxVQUFVLHNCQUFzQixzQkFBc0I7QUFDMUY7QUFDQTtBQUNBLGVBQWUsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUMxRjtBQUNBO0FBQ0EsZUFBZSxZQUFZLFNBQVMsVUFBVSxxQkFBcUIsc0JBQXNCO0FBQ3pGO0FBQ0E7QUFDQSxlQUFlLHNCQUFzQixpQkFBaUIsZ0NBQWdDO0FBQ3RGO0FBQ0E7QUFDQSxlQUFlLHNCQUFzQixrQkFBa0IsZ0NBQWdDO0FBQ3ZGO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQixXQUFXLDBCQUEwQjtBQUNwRTtBQUNBOzs7QUN4bkIwQztBQUNpQjs7O0FDRHBDOztBQUV2Qiw0Q0FBZTs7QUFFZjtBQUNBLDZEQUE2RCxhQUFhOztBQUUxRSxzQkFBc0IsVUFBVTs7QUFFaEMsMEJBQTBCLFVBQVU7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCLHFCQUFxQjtBQUNyQixxQkFBcUIsUUFBUTtBQUM3Qjs7QUFFQTtBQUNBOztBQUVBOztBQUVBLENBQUMsRTs7QUMvQnNCOztBQUV2Qiw0Q0FBZTs7QUFFZjtBQUNBLHdDQUF3QyxvQkFBb0I7QUFDNUQ7QUFDQTs7QUFFQSxvQkFBb0IsZ0JBQWdCOztBQUVwQzs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLENBQUMsRTs7QUMvQnNCOztBQUV2Qiw0Q0FBZTs7QUFFZjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBLHNCQUFzQixhQUFhOztBQUVuQywwQkFBMEIsYUFBYTs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxDQUFDLEU7O0FDakNzQjs7QUFFdkIsNENBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxtREFBbUQsYUFBYTtBQUNoRSxtREFBbUQsYUFBYTtBQUNoRSxzREFBc0QsYUFBYTtBQUNuRSxtREFBbUQsYUFBYTs7QUFFaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLOztBQUVMOztBQUVBLENBQUMsRTs7QUNuRHNCOztBQUV2Qiw0Q0FBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsYUFBYTs7QUFFbkM7QUFDQTs7QUFFQSwwQkFBMEIsYUFBYTs7QUFFdkM7QUFDQSw2REFBNkQsYUFBYTs7QUFFMUU7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsaUNBQWlDLE9BQU87O0FBRXhDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQyxFOztBQzFDc0I7O0FBRXZCLDRDQUFlOztBQUVmO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsVUFBVTs7QUFFOUI7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QyxFQUFFO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7O0FBRUEsQ0FBQyxFOztBQ3hCc0I7O0FBRXZCLDRDQUFlOztBQUVmOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUEsQ0FBQyxFOztBQzFCc0I7OztBQUd2Qiw0Q0FBZTs7QUFFZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBLENBQUMsRTs7QUN4Q3NCOztBQUV2Qiw0Q0FBZSxvQkFBb0IsS0FBSzs7QUFFeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQSxDQUFDLEU7O0FDdkNzQjs7QUFFdkIsNkNBQWUsb0JBQW9CLFNBQVM7O0FBRTVDOztBQUVBO0FBQ0EsVUFBVSw0REFBNEQ7QUFDdEUsVUFBVSxrRUFBa0U7QUFDNUUsVUFBVSx3REFBd0Q7QUFDbEUsVUFBVSxzREFBc0Q7QUFDaEUsVUFBVSx1REFBdUQ7QUFDakUsVUFBVTtBQUNWOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNGQUFzRixNQUFNO0FBQzVGO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7O0FBRUE7O0FBRUE7O0FBRUEsQ0FBQyxFOztBQy9Dc0I7O0FBRXZCLDZDQUFlLG9CQUFvQixjQUFjOztBQUVqRDs7QUFFQTtBQUNBLFVBQVUsNERBQTREO0FBQ3RFLFVBQVUsa0VBQWtFO0FBQzVFLFVBQVUsd0RBQXdEO0FBQ2xFLFVBQVUsc0RBQXNEO0FBQ2hFLFVBQVUsdURBQXVEO0FBQ2pFLFVBQVU7QUFDVjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRkFBc0YsTUFBTTtBQUM1RjtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViOztBQUVBOztBQUVBOztBQUVBLENBQUMsRTs7QUMvQ3FFO0FBQ0E7QUFDSDtBQUM3QztBQUNDO0FBQzZCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFO0FBQ0E7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGVBQWUsTUFBTTtBQUNyQixlQUFlLE1BQU07QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1DQUFtQyxlQUFlLElBQUksT0FBTyxjQUFLLE9BQUU7QUFDcEU7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9ub2RlX21vZHVsZXMvLnBucG0vd2hhdHdnLWZldGNoQDMuNi4yMC9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzP2Q0Y2IiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbnN0YW50cy9lbnVtcy50cz82NGZiIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb25zdGFudHMvcmVnZXhwcy50cz84NTZlIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb25zdGFudHMvaW5kZXgudHM/NjYxYyIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvdXRpbGl0aWVzL2luZGV4LnRzP2QxMmUiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbG9yL3RyYW5zbGF0b3JzLnRzPzI1NTkiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvQ29sb3JQYXJzZXJDb250ZXh0LnRzPzFkYjQiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbG9yL3JnYi50cz8zZTI2Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jc3MvaW5kZXgudHM/MjA4ZiIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY2xhc3Nlcy9IRVhQYXJzZXIudHM/NjZlYSIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY2xhc3Nlcy9DYWxjUGFyc2VyLnRzPzM3YWMiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvUkdCUGFyc2VyLnRzPzczNTkiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvSFNMUGFyc2VyLnRzPzBhOWYiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvSFdCUGFyc2VyLnRzP2QxNzYiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvQ0lFTGFiUGFyc2VyLnRzPzY0OWQiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvTENIUGFyc2VyLnRzP2E1NGQiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvQ01ZS1BhcnNlci50cz84YjczIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9wYXJzZXJzL2luZGV4LnRzPzQwMTQiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL3JldHVybnMvaW5kZXgudHM/MTdkNCIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY2xhc3Nlcy9Db2xvclRyYW5zbGF0b3IudHM/MTZlMyIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvaW5kZXgudHM/YTU4ZiIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzEvaW5kZXguanM/Mzk2NSIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzIvaW5kZXguanM/ZDhkYyIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzMvaW5kZXguanM/ZDM4NiIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzQvaW5kZXguanM/NjE5ZiIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzUvaW5kZXguanM/ZDhjYyIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzYvaW5kZXguanM/M2EzMiIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzcvaW5kZXguanM/ODM0MyIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzgvaW5kZXguanM/NzcyNSIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzkvaW5kZXguanM/ODUzMiIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtbzEwL2luZGV4LmpzPzRmNjciLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8xMS9pbmRleC5qcz9kYmU2Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vLmpzPzliN2QiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXG52YXIgZyA9XG4gICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCkgfHxcbiAge31cblxudmFyIHN1cHBvcnQgPSB7XG4gIHNlYXJjaFBhcmFtczogJ1VSTFNlYXJjaFBhcmFtcycgaW4gZyxcbiAgaXRlcmFibGU6ICdTeW1ib2wnIGluIGcgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gIGJsb2I6XG4gICAgJ0ZpbGVSZWFkZXInIGluIGcgJiZcbiAgICAnQmxvYicgaW4gZyAmJlxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBCbG9iKClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSkoKSxcbiAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gZyxcbiAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gZ1xufVxuXG5mdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikge1xuICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbn1cblxuaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHZpZXdDbGFzc2VzID0gW1xuICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nXG4gIF1cblxuICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPVxuICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fFxuICAgIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB2aWV3Q2xhc3Nlcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSA+IC0xXG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIG5hbWUgPSBTdHJpbmcobmFtZSlcbiAgfVxuICBpZiAoL1teYS16MC05XFwtIyQlJicqKy5eX2B8fiFdL2kudGVzdChuYW1lKSB8fCBuYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lOiBcIicgKyBuYW1lICsgJ1wiJylcbiAgfVxuICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8vIEJ1aWxkIGEgZGVzdHJ1Y3RpdmUgaXRlcmF0b3IgZm9yIHRoZSB2YWx1ZSBsaXN0XG5mdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpXG4gICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgIGl0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gIHRoaXMubWFwID0ge31cblxuICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIGlmIChoZWFkZXIubGVuZ3RoICE9IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSGVhZGVycyBjb25zdHJ1Y3RvcjogZXhwZWN0ZWQgbmFtZS92YWx1ZSBwYWlyIHRvIGJlIGxlbmd0aCAyLCBmb3VuZCcgKyBoZWFkZXIubGVuZ3RoKVxuICAgICAgfVxuICAgICAgdGhpcy5hcHBlbmQoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCBoZWFkZXJzW25hbWVdKVxuICAgIH0sIHRoaXMpXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbiAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV1cbiAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywgJyArIHZhbHVlIDogdmFsdWVcbn1cblxuSGVhZGVycy5wcm90b3R5cGVbJ2RlbGV0ZSddID0gZnVuY3Rpb24obmFtZSkge1xuICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkge1xuICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLm1hcFtuYW1lXSA6IG51bGxcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gIGZvciAodmFyIG5hbWUgaW4gdGhpcy5tYXApIHtcbiAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpXG4gICAgfVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChuYW1lKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpdGVtcy5wdXNoKHZhbHVlKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChbbmFtZSwgdmFsdWVdKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbmlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gIEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzXG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgaWYgKGJvZHkuX25vQm9keSkgcmV0dXJuXG4gIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKVxuICB9XG4gIGJvZHkuYm9keVVzZWQgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdClcbiAgICB9XG4gICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgdmFyIG1hdGNoID0gL2NoYXJzZXQ9KFtBLVphLXowLTlfLV0rKS8uZXhlYyhibG9iLnR5cGUpXG4gIHZhciBlbmNvZGluZyA9IG1hdGNoID8gbWF0Y2hbMV0gOiAndXRmLTgnXG4gIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IsIGVuY29kaW5nKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7XG4gIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICB2YXIgY2hhcnMgPSBuZXcgQXJyYXkodmlldy5sZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pXG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1Zikge1xuICBpZiAoYnVmLnNsaWNlKSB7XG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICB9IGVsc2Uge1xuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpXG4gICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICByZXR1cm4gdmlldy5idWZmZXJcbiAgfVxufVxuXG5mdW5jdGlvbiBCb2R5KCkge1xuICB0aGlzLmJvZHlVc2VkID0gZmFsc2VcblxuICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICAvKlxuICAgICAgZmV0Y2gtbW9jayB3cmFwcyB0aGUgUmVzcG9uc2Ugb2JqZWN0IGluIGFuIEVTNiBQcm94eSB0b1xuICAgICAgcHJvdmlkZSB1c2VmdWwgdGVzdCBoYXJuZXNzIGZlYXR1cmVzIHN1Y2ggYXMgZmx1c2guIEhvd2V2ZXIsIG9uXG4gICAgICBFUzUgYnJvd3NlcnMgd2l0aG91dCBmZXRjaCBvciBQcm94eSBzdXBwb3J0IHBvbGx5ZmlsbHMgbXVzdCBiZSB1c2VkO1xuICAgICAgdGhlIHByb3h5LXBvbGx5ZmlsbCBpcyB1bmFibGUgdG8gcHJveHkgYW4gYXR0cmlidXRlIHVubGVzcyBpdCBleGlzdHNcbiAgICAgIG9uIHRoZSBvYmplY3QgYmVmb3JlIHRoZSBQcm94eSBpcyBjcmVhdGVkLiBUaGlzIGNoYW5nZSBlbnN1cmVzXG4gICAgICBSZXNwb25zZS5ib2R5VXNlZCBleGlzdHMgb24gdGhlIGluc3RhbmNlLCB3aGlsZSBtYWludGFpbmluZyB0aGVcbiAgICAgIHNlbWFudGljIG9mIHNldHRpbmcgUmVxdWVzdC5ib2R5VXNlZCBpbiB0aGUgY29uc3RydWN0b3IgYmVmb3JlXG4gICAgICBfaW5pdEJvZHkgaXMgY2FsbGVkLlxuICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtYXNzaWduXG4gICAgdGhpcy5ib2R5VXNlZCA9IHRoaXMuYm9keVVzZWRcbiAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHlcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHRoaXMuX25vQm9keSA9IHRydWU7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlCbG9iID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keS5idWZmZXIpXG4gICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpIHx8IGlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpKSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04JylcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUJsb2IgJiYgdGhpcy5fYm9keUJsb2IudHlwZSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgdGhpcy5ibG9iID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIGlzQ29uc3VtZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgaWYgKGlzQ29uc3VtZWQpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uc3VtZWRcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnVmZmVyLnNsaWNlKFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCArIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgcmV0dXJuIHRoaXMuYmxvYigpLnRoZW4ocmVhZEJsb2JBc0FycmF5QnVmZmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIGFzIEFycmF5QnVmZmVyJylcbiAgICB9XG4gIH1cblxuICB0aGlzLnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICByZXR1cm4gcmVhZEJsb2JBc1RleHQodGhpcy5fYm9keUJsb2IpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVhZEFycmF5QnVmZmVyQXNUZXh0KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0JylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dClcbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5mb3JtRGF0YSkge1xuICAgIHRoaXMuZm9ybURhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICB9XG4gIH1cblxuICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSFRUUCBtZXRob2RzIHdob3NlIGNhcGl0YWxpemF0aW9uIHNob3VsZCBiZSBub3JtYWxpemVkXG52YXIgbWV0aG9kcyA9IFsnQ09OTkVDVCcsICdERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdQQVRDSCcsICdQT1NUJywgJ1BVVCcsICdUUkFDRSddXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgdmFyIHVwY2FzZWQgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICByZXR1cm4gbWV0aG9kcy5pbmRleE9mKHVwY2FzZWQpID4gLTEgPyB1cGNhc2VkIDogbWV0aG9kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXF1ZXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBib2R5ID0gb3B0aW9ucy5ib2R5XG5cbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJylcbiAgICB9XG4gICAgdGhpcy51cmwgPSBpbnB1dC51cmxcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHNcbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycylcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2RcbiAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlXG4gICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWxcbiAgICBpZiAoIWJvZHkgJiYgaW5wdXQuX2JvZHlJbml0ICE9IG51bGwpIHtcbiAgICAgIGJvZHkgPSBpbnB1dC5fYm9keUluaXRcbiAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dClcbiAgfVxuXG4gIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJ1xuICBpZiAob3B0aW9ucy5oZWFkZXJzIHx8ICF0aGlzLmhlYWRlcnMpIHtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIH1cbiAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpXG4gIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbFxuICB0aGlzLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IHRoaXMuc2lnbmFsIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCdBYm9ydENvbnRyb2xsZXInIGluIGcpIHtcbiAgICAgIHZhciBjdHJsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmV0dXJuIGN0cmwuc2lnbmFsO1xuICAgIH1cbiAgfSgpKTtcbiAgdGhpcy5yZWZlcnJlciA9IG51bGxcblxuICBpZiAoKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSAmJiBib2R5KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICB9XG4gIHRoaXMuX2luaXRCb2R5KGJvZHkpXG5cbiAgaWYgKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgaWYgKG9wdGlvbnMuY2FjaGUgPT09ICduby1zdG9yZScgfHwgb3B0aW9ucy5jYWNoZSA9PT0gJ25vLWNhY2hlJykge1xuICAgICAgLy8gU2VhcmNoIGZvciBhICdfJyBwYXJhbWV0ZXIgaW4gdGhlIHF1ZXJ5IHN0cmluZ1xuICAgICAgdmFyIHJlUGFyYW1TZWFyY2ggPSAvKFs/Jl0pXz1bXiZdKi9cbiAgICAgIGlmIChyZVBhcmFtU2VhcmNoLnRlc3QodGhpcy51cmwpKSB7XG4gICAgICAgIC8vIElmIGl0IGFscmVhZHkgZXhpc3RzIHRoZW4gc2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgdGhpcy51cmwgPSB0aGlzLnVybC5yZXBsYWNlKHJlUGFyYW1TZWFyY2gsICckMV89JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBhIG5ldyAnXycgcGFyYW1ldGVyIHRvIHRoZSBlbmQgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHZhciByZVF1ZXJ5U3RyaW5nID0gL1xcPy9cbiAgICAgICAgdGhpcy51cmwgKz0gKHJlUXVlcnlTdHJpbmcudGVzdCh0aGlzLnVybCkgPyAnJicgOiAnPycpICsgJ189JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblJlcXVlc3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVxdWVzdCh0aGlzLCB7Ym9keTogdGhpcy5fYm9keUluaXR9KVxufVxuXG5mdW5jdGlvbiBkZWNvZGUoYm9keSkge1xuICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gIGJvZHlcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCcmJylcbiAgICAuZm9yRWFjaChmdW5jdGlvbihieXRlcykge1xuICAgICAgaWYgKGJ5dGVzKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IGJ5dGVzLnNwbGl0KCc9JylcbiAgICAgICAgdmFyIG5hbWUgPSBzcGxpdC5zaGlmdCgpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIHZhciB2YWx1ZSA9IHNwbGl0LmpvaW4oJz0nKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGZvcm1cbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHtcbiAgdmFyIGhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIC8vIFJlcGxhY2UgaW5zdGFuY2VzIG9mIFxcclxcbiBhbmQgXFxuIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBzcGFjZSBvciBob3Jpem9udGFsIHRhYiB3aXRoIGEgc3BhY2VcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjJcbiAgdmFyIHByZVByb2Nlc3NlZEhlYWRlcnMgPSByYXdIZWFkZXJzLnJlcGxhY2UoL1xccj9cXG5bXFx0IF0rL2csICcgJylcbiAgLy8gQXZvaWRpbmcgc3BsaXQgdmlhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgY29tbW9uIElFMTEgYnVnIHdpdGggdGhlIGNvcmUtanMgMy42LjAgcmVnZXggcG9seWZpbGxcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi9mZXRjaC9pc3N1ZXMvNzQ4XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy83NTFcbiAgcHJlUHJvY2Vzc2VkSGVhZGVyc1xuICAgIC5zcGxpdCgnXFxyJylcbiAgICAubWFwKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgcmV0dXJuIGhlYWRlci5pbmRleE9mKCdcXG4nKSA9PT0gMCA/IGhlYWRlci5zdWJzdHIoMSwgaGVhZGVyLmxlbmd0aCkgOiBoZWFkZXJcbiAgICB9KVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKVxuICAgICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoZWFkZXJzLmFwcGVuZChrZXksIHZhbHVlKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignUmVzcG9uc2UgJyArIGVycm9yLm1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICByZXR1cm4gaGVhZGVyc1xufVxuXG5Cb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpXG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGxlYXNlIHVzZSB0aGUgXCJuZXdcIiBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKVxuICB9XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgdGhpcy50eXBlID0gJ2RlZmF1bHQnXG4gIHRoaXMuc3RhdHVzID0gb3B0aW9ucy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDIwMCA6IG9wdGlvbnMuc3RhdHVzXG4gIGlmICh0aGlzLnN0YXR1cyA8IDIwMCB8fCB0aGlzLnN0YXR1cyA+IDU5OSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUmVzcG9uc2UnOiBUaGUgc3RhdHVzIHByb3ZpZGVkICgwKSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMjAwLCA1OTldLlwiKVxuICB9XG4gIHRoaXMub2sgPSB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDBcbiAgdGhpcy5zdGF0dXNUZXh0ID0gb3B0aW9ucy5zdGF0dXNUZXh0ID09PSB1bmRlZmluZWQgPyAnJyA6ICcnICsgb3B0aW9ucy5zdGF0dXNUZXh0XG4gIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgdGhpcy51cmwgPSBvcHRpb25zLnVybCB8fCAnJ1xuICB0aGlzLl9pbml0Qm9keShib2R5SW5pdClcbn1cblxuQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSlcblxuUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgIHVybDogdGhpcy51cmxcbiAgfSlcbn1cblxuUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IDIwMCwgc3RhdHVzVGV4dDogJyd9KVxuICByZXNwb25zZS5vayA9IGZhbHNlXG4gIHJlc3BvbnNlLnN0YXR1cyA9IDBcbiAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcidcbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbnZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG5SZXNwb25zZS5yZWRpcmVjdCA9IGZ1bmN0aW9uKHVybCwgc3RhdHVzKSB7XG4gIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBzdGF0dXMgY29kZScpXG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IHN0YXR1cywgaGVhZGVyczoge2xvY2F0aW9uOiB1cmx9fSlcbn1cblxuZXhwb3J0IHZhciBET01FeGNlcHRpb24gPSBnLkRPTUV4Y2VwdGlvblxudHJ5IHtcbiAgbmV3IERPTUV4Y2VwdGlvbigpXG59IGNhdGNoIChlcnIpIHtcbiAgRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgbmFtZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2VcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSlcbiAgICB0aGlzLnN0YWNrID0gZXJyb3Iuc3RhY2tcbiAgfVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpXG4gIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBET01FeGNlcHRpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsICYmIHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3QobmV3IERPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgfVxuXG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG5cbiAgICBmdW5jdGlvbiBhYm9ydFhocigpIHtcbiAgICAgIHhoci5hYm9ydCgpXG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKVxuICAgICAgfVxuICAgICAgLy8gVGhpcyBjaGVjayBpZiBzcGVjaWZpY2FsbHkgZm9yIHdoZW4gYSB1c2VyIGZldGNoZXMgYSBmaWxlIGxvY2FsbHkgZnJvbSB0aGUgZmlsZSBzeXN0ZW1cbiAgICAgIC8vIE9ubHkgaWYgdGhlIHN0YXR1cyBpcyBvdXQgb2YgYSBub3JtYWwgcmFuZ2VcbiAgICAgIGlmIChyZXF1ZXN0LnVybC5pbmRleE9mKCdmaWxlOi8vJykgPT09IDAgJiYgKHhoci5zdGF0dXMgPCAyMDAgfHwgeGhyLnN0YXR1cyA+IDU5OSkpIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSAyMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLnN0YXR1cyA9IHhoci5zdGF0dXM7XG4gICAgICB9XG4gICAgICBvcHRpb25zLnVybCA9ICdyZXNwb25zZVVSTCcgaW4geGhyID8geGhyLnJlc3BvbnNlVVJMIDogb3B0aW9ucy5oZWFkZXJzLmdldCgnWC1SZXF1ZXN0LVVSTCcpXG4gICAgICB2YXIgYm9keSA9ICdyZXNwb25zZScgaW4geGhyID8geGhyLnJlc3BvbnNlIDogeGhyLnJlc3BvbnNlVGV4dFxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IHRpbWVkIG91dCcpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaXhVcmwodXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXJsID09PSAnJyAmJiBnLmxvY2F0aW9uLmhyZWYgPyBnLmxvY2F0aW9uLmhyZWYgOiB1cmxcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHVybFxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCBmaXhVcmwocmVxdWVzdC51cmwpLCB0cnVlKVxuXG4gICAgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdvbWl0Jykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCdyZXNwb25zZVR5cGUnIGluIHhocikge1xuICAgICAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InXG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBzdXBwb3J0LmFycmF5QnVmZmVyXG4gICAgICApIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcidcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5oZWFkZXJzID09PSAnb2JqZWN0JyAmJiAhKGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMgfHwgKGcuSGVhZGVycyAmJiBpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBnLkhlYWRlcnMpKSkge1xuICAgICAgdmFyIG5hbWVzID0gW107XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbml0LmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICBuYW1lcy5wdXNoKG5vcm1hbGl6ZU5hbWUobmFtZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIG5vcm1hbGl6ZVZhbHVlKGluaXQuaGVhZGVyc1tuYW1lXSkpXG4gICAgICB9KVxuICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWVzLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5zaWduYWwpIHtcbiAgICAgIHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpXG5cbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRE9ORSAoc3VjY2VzcyBvciBmYWlsdXJlKVxuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICByZXF1ZXN0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLnNlbmQodHlwZW9mIHJlcXVlc3QuX2JvZHlJbml0ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiByZXF1ZXN0Ll9ib2R5SW5pdClcbiAgfSlcbn1cblxuZmV0Y2gucG9seWZpbGwgPSB0cnVlXG5cbmlmICghZy5mZXRjaCkge1xuICBnLmZldGNoID0gZmV0Y2hcbiAgZy5IZWFkZXJzID0gSGVhZGVyc1xuICBnLlJlcXVlc3QgPSBSZXF1ZXN0XG4gIGcuUmVzcG9uc2UgPSBSZXNwb25zZVxufVxuIiwiZXhwb3J0IHZhciBDb2xvck1vZGVsO1xuKGZ1bmN0aW9uIChDb2xvck1vZGVsKSB7XG4gICAgQ29sb3JNb2RlbFtcIkhFWFwiXSA9IFwiSEVYXCI7XG4gICAgQ29sb3JNb2RlbFtcIlJHQlwiXSA9IFwiUkdCXCI7XG4gICAgQ29sb3JNb2RlbFtcIkhXQlwiXSA9IFwiSFdCXCI7XG4gICAgQ29sb3JNb2RlbFtcIkhTTFwiXSA9IFwiSFNMXCI7XG4gICAgQ29sb3JNb2RlbFtcIkNJRUxhYlwiXSA9IFwiQ0lFTGFiXCI7XG4gICAgQ29sb3JNb2RlbFtcIkxDSFwiXSA9IFwiTENIXCI7XG4gICAgQ29sb3JNb2RlbFtcIkNNWUtcIl0gPSBcIkNNWUtcIjtcbn0pKENvbG9yTW9kZWwgfHwgKENvbG9yTW9kZWwgPSB7fSkpO1xuZXhwb3J0IHZhciBIYXJtb255O1xuKGZ1bmN0aW9uIChIYXJtb255KSB7XG4gICAgSGFybW9ueVtcIkFOQUxPR09VU1wiXSA9IFwiQU5BTE9HT1VTXCI7XG4gICAgSGFybW9ueVtcIkNPTVBMRU1FTlRBUllcIl0gPSBcIkNPTVBMRU1FTlRBUllcIjtcbiAgICBIYXJtb255W1wiU1BMSVRfQ09NUExFTUVOVEFSWVwiXSA9IFwiU1BMSVRfQ09NUExFTUVOVEFSWVwiO1xuICAgIEhhcm1vbnlbXCJUUklBRElDXCJdID0gXCJUUklBRElDXCI7XG4gICAgSGFybW9ueVtcIlRFVFJBRElDXCJdID0gXCJURVRSQURJQ1wiO1xuICAgIEhhcm1vbnlbXCJTUVVBUkVcIl0gPSBcIlNRVUFSRVwiO1xufSkoSGFybW9ueSB8fCAoSGFybW9ueSA9IHt9KSk7XG5leHBvcnQgdmFyIE1peDtcbihmdW5jdGlvbiAoTWl4KSB7XG4gICAgTWl4W1wiQURESVRJVkVcIl0gPSBcIkFERElUSVZFXCI7XG4gICAgTWl4W1wiU1VCVFJBQ1RJVkVcIl0gPSBcIlNVQlRSQUNUSVZFXCI7XG59KShNaXggfHwgKE1peCA9IHt9KSk7XG5leHBvcnQgdmFyIEFuZ2xlc1VuaXRFbnVtO1xuKGZ1bmN0aW9uIChBbmdsZXNVbml0RW51bSkge1xuICAgIEFuZ2xlc1VuaXRFbnVtW1wiTk9ORVwiXSA9IFwibm9uZVwiO1xuICAgIEFuZ2xlc1VuaXRFbnVtW1wiREVHUkVFU1wiXSA9IFwiZGVnXCI7XG4gICAgQW5nbGVzVW5pdEVudW1bXCJHUkFESUFOU1wiXSA9IFwiZ3JhZFwiO1xuICAgIEFuZ2xlc1VuaXRFbnVtW1wiUkFESUFOU1wiXSA9IFwicmFkXCI7XG4gICAgQW5nbGVzVW5pdEVudW1bXCJUVVJOU1wiXSA9IFwidHVyblwiO1xufSkoQW5nbGVzVW5pdEVudW0gfHwgKEFuZ2xlc1VuaXRFbnVtID0ge30pKTtcbmV4cG9ydCB2YXIgQ29sb3JVbml0RW51bTtcbihmdW5jdGlvbiAoQ29sb3JVbml0RW51bSkge1xuICAgIENvbG9yVW5pdEVudW1bXCJOT05FXCJdID0gXCJub25lXCI7XG4gICAgQ29sb3JVbml0RW51bVtcIlBFUkNFTlRcIl0gPSBcInBlcmNlbnRcIjtcbn0pKENvbG9yVW5pdEVudW0gfHwgKENvbG9yVW5pdEVudW0gPSB7fSkpO1xuZXhwb3J0IHZhciBDTVlLRnVuY3Rpb25FbnVtO1xuKGZ1bmN0aW9uIChDTVlLRnVuY3Rpb25FbnVtKSB7XG4gICAgQ01ZS0Z1bmN0aW9uRW51bVtcIkRFVklDRV9DTVlLXCJdID0gXCJkZXZpY2UtY215a1wiO1xuICAgIENNWUtGdW5jdGlvbkVudW1bXCJDTVlLXCJdID0gXCJjbXlrXCI7XG59KShDTVlLRnVuY3Rpb25FbnVtIHx8IChDTVlLRnVuY3Rpb25FbnVtID0ge30pKTtcbmV4cG9ydCB2YXIgQ29sb3JLZXl3b3JkcztcbihmdW5jdGlvbiAoQ29sb3JLZXl3b3Jkcykge1xuICAgIENvbG9yS2V5d29yZHNbXCJibGFja1wiXSA9IFwiIzAwMDAwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzaWx2ZXJcIl0gPSBcIiNDMEMwQzBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ3JheVwiXSA9IFwiIzgwODA4MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ3aGl0ZVwiXSA9IFwiI0ZGRkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtYXJvb25cIl0gPSBcIiM4MDAwMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicmVkXCJdID0gXCIjRkYwMDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInB1cnBsZVwiXSA9IFwiIzgwMDA4MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJmdWNoc2lhXCJdID0gXCIjRkYwMEZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImdyZWVuXCJdID0gXCIjMDA4MDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpbWVcIl0gPSBcIiMwMEZGMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib2xpdmVcIl0gPSBcIiM4MDgwMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wieWVsbG93XCJdID0gXCIjRkZGRjAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm5hdnlcIl0gPSBcIiMwMDAwODBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmx1ZVwiXSA9IFwiIzAwMDBGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0ZWFsXCJdID0gXCIjMDA4MDgwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImFxdWFcIl0gPSBcIiMwMEZGRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib3JhbmdlXCJdID0gXCIjRkZBNTAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImFsaWNlYmx1ZVwiXSA9IFwiI0YwRjhGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJhbnRpcXVld2hpdGVcIl0gPSBcIiNGQUVCRDdcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYXF1YW1hcmluZVwiXSA9IFwiIzdGRkZENFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJhenVyZVwiXSA9IFwiI0YwRkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJiZWlnZVwiXSA9IFwiI0Y1RjVEQ1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJiaXNxdWVcIl0gPSBcIiNGRkU0QzRcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmxhbmNoZWRhbG1vbmRcIl0gPSBcIiNGRkVCQ0RcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmx1ZXZpb2xldFwiXSA9IFwiIzhBMkJFMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJicm93blwiXSA9IFwiI0E1MkEyQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJidXJseXdvb2RcIl0gPSBcIiNERUI4ODdcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiY2FkZXRibHVlXCJdID0gXCIjNUY5RUEwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNoYXJ0cmV1c2VcIl0gPSBcIiM3RkZGMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiY2hvY29sYXRlXCJdID0gXCIjRDI2OTFFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNvcmFsXCJdID0gXCIjRkY3RjUwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNvcm5mbG93ZXJibHVlXCJdID0gXCIjNjQ5NUVEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNvcm5zaWxrXCJdID0gXCIjRkZGOERDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNyaW1zb25cIl0gPSBcIiNEQzE0M0NcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiY3lhblwiXSA9IFwiIzAwRkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrYmx1ZVwiXSA9IFwiIzAwMDA4QlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrY3lhblwiXSA9IFwiIzAwOEI4QlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrZ29sZGVucm9kXCJdID0gXCIjQjg4NjBCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtncmF5XCJdID0gXCIjQTlBOUE5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtncmVlblwiXSA9IFwiIzAwNjQwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrZ3JleVwiXSA9IFwiI0E5QTlBOVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJra2hha2lcIl0gPSBcIiNCREI3NkJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya21hZ2VudGFcIl0gPSBcIiM4QjAwOEJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya29saXZlZ3JlZW5cIl0gPSBcIiM1NTZCMkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya29yYW5nZVwiXSA9IFwiI0ZGOEMwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrb3JjaGlkXCJdID0gXCIjOTkzMkNDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtyZWRcIl0gPSBcIiM4QjAwMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3NhbG1vblwiXSA9IFwiI0U5OTY3QVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrc2VhZ3JlZW5cIl0gPSBcIiM4RkJDOEZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3NsYXRlYmx1ZVwiXSA9IFwiIzQ4M0Q4QlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrc2xhdGVncmF5XCJdID0gXCIjMkY0RjRGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtzbGF0ZWdyZXlcIl0gPSBcIiMyRjRGNEZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3R1cnF1b2lzZVwiXSA9IFwiIzAwQ0VEMVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrdmlvbGV0XCJdID0gXCIjOTQwMEQzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRlZXBwaW5rXCJdID0gXCIjRkYxNDkzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRlZXBza3libHVlXCJdID0gXCIjMDBCRkZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRpbWdyYXlcIl0gPSBcIiM2OTY5NjlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGltZ3JleVwiXSA9IFwiIzY5Njk2OVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkb2RnZXJibHVlXCJdID0gXCIjMUU5MEZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImZpcmVicmlja1wiXSA9IFwiI0IyMjIyMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJmbG9yYWx3aGl0ZVwiXSA9IFwiI0ZGRkFGMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJmb3Jlc3RncmVlblwiXSA9IFwiIzIyOEIyMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJnYWluc2Jvcm9cIl0gPSBcIiNEQ0RDRENcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ2hvc3R3aGl0ZVwiXSA9IFwiI0Y4RjhGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJnb2xkXCJdID0gXCIjRkZENzAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImdvbGRlbnJvZFwiXSA9IFwiI0RBQTUyMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJncmVlbnllbGxvd1wiXSA9IFwiI0FERkYyRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJncmV5XCJdID0gXCIjODA4MDgwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImhvbmV5ZGV3XCJdID0gXCIjRjBGRkYwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImhvdHBpbmtcIl0gPSBcIiNGRjY5QjRcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiaW5kaWFucmVkXCJdID0gXCIjQ0Q1QzVDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImluZGlnb1wiXSA9IFwiIzRCMDA4MlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJpdm9yeVwiXSA9IFwiI0ZGRkZGMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJraGFraVwiXSA9IFwiI0YwRTY4Q1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsYXZlbmRlclwiXSA9IFwiI0U2RTZGQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsYXZlbmRlcmJsdXNoXCJdID0gXCIjRkZGMEY1XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxhd25ncmVlblwiXSA9IFwiIzdDRkMwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsZW1vbmNoaWZmb25cIl0gPSBcIiNGRkZBQ0RcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRibHVlXCJdID0gXCIjQUREOEU2XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Y29yYWxcIl0gPSBcIiNGMDgwODBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRjeWFuXCJdID0gXCIjRTBGRkZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Z29sZGVucm9keWVsbG93XCJdID0gXCIjRkFGQUQyXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Z3JheVwiXSA9IFwiI0QzRDNEM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGdyZWVuXCJdID0gXCIjOTBFRTkwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Z3JleVwiXSA9IFwiI0QzRDNEM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodHBpbmtcIl0gPSBcIiNGRkI2QzFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzYWxtb25cIl0gPSBcIiNGRkEwN0FcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzZWFncmVlblwiXSA9IFwiIzIwQjJBQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodHNreWJsdWVcIl0gPSBcIiM4N0NFRkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzbGF0ZWdyYXlcIl0gPSBcIiM3Nzg4OTlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzbGF0ZWdyZXlcIl0gPSBcIiM3Nzg4OTlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzdGVlbGJsdWVcIl0gPSBcIiNCMEM0REVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHR5ZWxsb3dcIl0gPSBcIiNGRkZGRTBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGltZWdyZWVuXCJdID0gXCIjMzJDRDMyXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpbmVuXCJdID0gXCIjRkFGMEU2XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1hZ2VudGFcIl0gPSBcIiNGRjAwRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtYXF1YW1hcmluZVwiXSA9IFwiIzY2Q0RBQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW1ibHVlXCJdID0gXCIjMDAwMENEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bW9yY2hpZFwiXSA9IFwiI0JBNTVEM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW1wdXJwbGVcIl0gPSBcIiM5MzcwREJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtc2VhZ3JlZW5cIl0gPSBcIiMzQ0IzNzFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtc2xhdGVibHVlXCJdID0gXCIjN0I2OEVFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bXNwcmluZ2dyZWVuXCJdID0gXCIjMDBGQTlBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bXR1cnF1b2lzZVwiXSA9IFwiIzQ4RDFDQ1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW12aW9sZXRyZWRcIl0gPSBcIiNDNzE1ODVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWlkbmlnaHRibHVlXCJdID0gXCIjMTkxOTcwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1pbnRjcmVhbVwiXSA9IFwiI0Y1RkZGQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtaXN0eXJvc2VcIl0gPSBcIiNGRkU0RTFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibW9jY2FzaW5cIl0gPSBcIiNGRkU0QjVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibmF2YWpvd2hpdGVcIl0gPSBcIiNGRkRFQURcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib2xkbGFjZVwiXSA9IFwiI0ZERjVFNlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJvbGl2ZWRyYWJcIl0gPSBcIiM2QjhFMjNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib3JhbmdlcmVkXCJdID0gXCIjRkY0NTAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9yY2hpZFwiXSA9IFwiI0RBNzBENlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwYWxlZ29sZGVucm9kXCJdID0gXCIjRUVFOEFBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBhbGVncmVlblwiXSA9IFwiIzk4RkI5OFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwYWxldHVycXVvaXNlXCJdID0gXCIjQUZFRUVFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBhbGV2aW9sZXRyZWRcIl0gPSBcIiNEQjcwOTNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGFwYXlhd2hpcFwiXSA9IFwiI0ZGRUZENVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwZWFjaHB1ZmZcIl0gPSBcIiNGRkRBQjlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGVydVwiXSA9IFwiI0NEODUzRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwaW5rXCJdID0gXCIjRkZDMENCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBsdW1cIl0gPSBcIiNEREEwRERcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicG93ZGVyYmx1ZVwiXSA9IFwiI0IwRTBFNlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJyb3N5YnJvd25cIl0gPSBcIiNCQzhGOEZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicm95YWxibHVlXCJdID0gXCIjNDE2OUUxXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNhZGRsZWJyb3duXCJdID0gXCIjOEI0NTEzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNhbG1vblwiXSA9IFwiI0ZBODA3MlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzYW5keWJyb3duXCJdID0gXCIjRjRBNDYwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNlYWdyZWVuXCJdID0gXCIjMkU4QjU3XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNlYXNoZWxsXCJdID0gXCIjRkZGNUVFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNpZW5uYVwiXSA9IFwiI0EwNTIyRFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJza3libHVlXCJdID0gXCIjODdDRUVCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNsYXRlYmx1ZVwiXSA9IFwiIzZBNUFDRFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzbGF0ZWdyYXlcIl0gPSBcIiM3MDgwOTBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2xhdGVncmV5XCJdID0gXCIjNzA4MDkwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNub3dcIl0gPSBcIiNGRkZBRkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic3ByaW5nZ3JlZW5cIl0gPSBcIiMwMEZGN0ZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic3RlZWxibHVlXCJdID0gXCIjNDY4MkI0XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInRhblwiXSA9IFwiI0QyQjQ4Q1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0aGlzdGxlXCJdID0gXCIjRDhCRkQ4XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInRvbWF0b1wiXSA9IFwiI0ZGNjM0N1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0dXJxdW9pc2VcIl0gPSBcIiM0MEUwRDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1widmlvbGV0XCJdID0gXCIjRUU4MkVFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIndoZWF0XCJdID0gXCIjRjVERUIzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIndoaXRlc21va2VcIl0gPSBcIiNGNUY1RjVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wieWVsbG93Z3JlZW5cIl0gPSBcIiM5QUNEMzJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicmViZWNjYXB1cnBsZVwiXSA9IFwiIzY2MzM5OVwiO1xufSkoQ29sb3JLZXl3b3JkcyB8fCAoQ29sb3JLZXl3b3JkcyA9IHt9KSk7XG4iLCJpbXBvcnQgeyBDb2xvck1vZGVsIH0gZnJvbSAnLi9lbnVtcyc7XG5leHBvcnQgY29uc3QgQ09MT1JSRUdTID0ge1xuICAgIFtDb2xvck1vZGVsLkhFWF06IC9eIyg/Oig/PHI+W2EtZlxcZF0pKD88Zz5bYS1mXFxkXSkoPzxiPlthLWZcXGRdKSg/PGE+W2EtZlxcZF0pP3woPzxycj5bYS1mXFxkXXsyfSkoPzxnZz5bYS1mXFxkXXsyfSkoPzxiYj5bYS1mXFxkXXsyfSkoPzxhYT5bYS1mXFxkXXsyfSk/KSQvaSxcbiAgICBbQ29sb3JNb2RlbC5SR0JdOiAvXnJnYmE/XFxzKlxcKFxccyooPzooPzxyX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrJT8pXFxzKixcXHMqKD88Z19sZWdhY3k+KD86XFxkKlxcLik/XFxkKyU/KVxccyosXFxzKig/PGJfbGVnYWN5Pig/OlxcZCpcXC4pP1xcZCslPykoPzpcXHMqLFxccyooPzxhX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrKSk/fCg/PHI+KD86XFxkKlxcLik/XFxkKyU/KVxccysoPzxnPig/OlxcZCpcXC4pP1xcZCslPylcXHMrKD88Yj4oPzpcXGQqXFwuKT9cXGQrJT8pKD86XFxzKlxcL1xccyooPzxhPig/OlxcZCpcXC4pP1xcZCslPykpP3xmcm9tXFxzKyg/PGZyb20+KD86XFx3K3xcXHcrXFwoXFxzKlteKCkpXStcXHMqXFwpfFxcdytcXChmcm9tXFxzK1xcdytcXCguKlxcKVxccypcXCl8I1thLWZBLUZcXGRdKykpXFxzKyg/PHJlbGF0aXZlX3I+KD86W3JnYl18KD86XFxkKlxcLik/XFxkK3xjYWxjXFwoW3JnYigpLypcXC0rXFxkLlxcc10rXFwpKSlcXHMrKD88cmVsYXRpdmVfZz4oPzpbcmdiXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbcmdiKCkvKlxcLStcXGQuXFxzXStcXCkpKVxccysoPzxyZWxhdGl2ZV9iPig/OltyZ2JdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtyZ2IoKS8qXFwtK1xcZC5cXHNdK1xcKSkpKD86XFxzKlxcL1xccyooPzxyZWxhdGl2ZV9hPig/Oig/OlxcZCpcXC4pP1xcZCslP3xjYWxjXFwoWygpLypcXC0rXFxkLlxcc1xcd10qKD86YWxwaGEpP1soKS8qXFwtK1xcZC5cXHNcXHddKlxcKXxhbHBoYSkpKT8pXFxzKlxcKSQvLFxuICAgIFtDb2xvck1vZGVsLkhXQl06IC9eaHdiXFxzKlxcKFxccyooPzooPzxoPig/OlxcZCpcXC4pP1xcZCsoPzpkZWd8Z3JhZHxyYWR8dHVybik/KVxccysoPzx3Pig/OlxcZCpcXC4pP1xcZCspJVxccysoPzxiPig/OlxcZCpcXC4pP1xcZCspJSg/OlxccypcXC9cXHMqKD88YT4oPzpcXGQqXFwuKT9cXGQrJT8pKT98ZnJvbVxccysoPzxmcm9tPig/Olxcdyt8XFx3K1xcKFxccypbXigpKV0rXFxzKlxcKXxcXHcrXFwoZnJvbVxccytcXHcrXFwoLipcXClcXHMqXFwpfCNbYS1mQS1GXFxkXSspKVxccysoPzxyZWxhdGl2ZV9oPig/Oltod2JdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtod2IoKS8qXFwtK1xcZC5cXHNdK1xcKSkpXFxzKyg/PHJlbGF0aXZlX3c+KD86W2h3Yl18KD86XFxkKlxcLik/XFxkK3xjYWxjXFwoW2h3YigpLypcXC0rXFxkLlxcc10rXFwpKSklP1xccysoPzxyZWxhdGl2ZV9iPig/Oltod2JdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtod2IoKS8qXFwtK1xcZC5cXHNdK1xcKSkpJT8oPzpcXHMqXFwvXFxzKig/PHJlbGF0aXZlX2E+KD86KD86XFxkKlxcLik/XFxkKyU/fGNhbGNcXChbKCkvKlxcLStcXGQuXFxzXFx3XSooPzphbHBoYSk/WygpLypcXC0rXFxkLlxcc1xcd10qXFwpfGFscGhhKSkpPylcXHMqXFwpJC8sXG4gICAgW0NvbG9yTW9kZWwuSFNMXTogL15oc2xhP1xccypcXChcXHMqKD86KD88aF9sZWdhY3k+LT8oPzpcXGQqXFwuKT9cXGQrKD86ZGVnfGdyYWR8cmFkfHR1cm4pPylcXHMqLFxccyooPzxzX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrKSVcXHMqLFxccyooPzxsX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrKSUoPzpcXHMqLFxccyooPzxhX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrKSk/fCg/PGg+LT8oPzpcXGQqXFwuKT9cXGQrKD86ZGVnfGdyYWR8cmFkfHR1cm4pPylcXHMrKD88cz4oPzpcXGQqXFwuKT9cXGQrKSU/XFxzKyg/PGw+KD86XFxkKlxcLik/XFxkKyklPyg/OlxccypcXC9cXHMqKD88YT4oPzpcXGQqXFwuKT9cXGQrJT8pKT98ZnJvbVxccysoPzxmcm9tPig/Olxcdyt8XFx3K1xcKFxccypbXigpKV0rXFxzKlxcKXxcXHcrXFwoZnJvbVxccytcXHcrXFwoLipcXClcXHMqXFwpfCNbYS1mQS1GXFxkXSspKVxccysoPzxyZWxhdGl2ZV9oPig/Oltoc2xdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtoc2woKS8qXFwtK1xcZC5cXHNdK1xcKSkpXFxzKyg/PHJlbGF0aXZlX3M+KD86W2hzbF18KD86XFxkKlxcLik/XFxkK3xjYWxjXFwoW2hzbCgpLypcXC0rXFxkLlxcc10rXFwpKSklP1xccysoPzxyZWxhdGl2ZV9sPig/Oltoc2xdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtoc2woKS8qXFwtK1xcZC5cXHNdK1xcKSkpJT8oPzpcXHMqXFwvXFxzKig/PHJlbGF0aXZlX2E+KD86KD86XFxkKlxcLik/XFxkKyU/fGNhbGNcXChbKCkvKlxcLStcXGQuXFxzXFx3XSooPzphbHBoYSk/WygpLypcXC0rXFxkLlxcc1xcd10qXFwpfGFscGhhKSkpPylcXHMqXFwpJC8sXG4gICAgW0NvbG9yTW9kZWwuQ0lFTGFiXTogL15sYWJcXHMqXFwoXFxzKig/Oig/PEw+KD86XFxkKlxcLik/XFxkKyU/KVxccysoPzxhPi0/KD86XFxkKlxcLik/XFxkKyU/KVxccysoPzxiPi0/KD86XFxkKlxcLik/XFxkKyU/KSg/OlxccypcXC9cXHMqKD88QT4oPzpcXGQqXFwuKT9cXGQrJT8pKT98ZnJvbVxccysoPzxmcm9tPig/Olxcdyt8XFx3K1xcKFxccypbXigpKV0rXFxzKlxcKXxcXHcrXFwoZnJvbVxccytcXHcrXFwoLipcXClcXHMqXFwpfCNbYS1mQS1GXFxkXSspKVxccysoPzxyZWxhdGl2ZV9MPig/OltsYWJdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtsYWIoKS8qXFwtK1xcZC5cXHNdK1xcKSkpXFxzKyg/PHJlbGF0aXZlX2E+KD86W2xhYl18KD86XFxkKlxcLik/XFxkK3xjYWxjXFwoW2xhYigpLypcXC0rXFxkLlxcc10rXFwpKSlcXHMrKD88cmVsYXRpdmVfYj4oPzpbbGFiXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbbGFiKCkvKlxcLStcXGQuXFxzXStcXCkpKSg/OlxccypcXC9cXHMqKD88cmVsYXRpdmVfQT4oPzooPzpcXGQqXFwuKT9cXGQrJT98Y2FsY1xcKFsoKS8qXFwtK1xcZC5cXHNcXHddKig/OmFscGhhKT9bKCkvKlxcLStcXGQuXFxzXFx3XSpcXCl8YWxwaGEpKSk/KVxccypcXCkkLyxcbiAgICBbQ29sb3JNb2RlbC5MQ0hdOiAvXmxjaFxccypcXChcXHMqKD86KD88bD4oPzpcXGQqXFwuKT9cXGQrJT8pXFxzKyg/PGM+LT8oPzpcXGQqXFwuKT9cXGQrJT8pXFxzKyg/PGg+LT8oPzpcXGQqXFwuKT9cXGQrKD86ZGVnfGdyYWR8cmFkfHR1cm4pPykoPzpcXHMqXFwvXFxzKig/PGE+KD86XFxkKlxcLik/XFxkKyU/KSk/fGZyb21cXHMrKD88ZnJvbT4oPzpcXHcrfFxcdytcXChcXHMqW14oKSldK1xccypcXCl8XFx3K1xcKGZyb21cXHMrXFx3K1xcKC4qXFwpXFxzKlxcKXwjW2EtZkEtRlxcZF0rKSlcXHMrKD88cmVsYXRpdmVfbD4oPzpbbGNoXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbbGNoKCkvKlxcLStcXGQuXFxzXStcXCkpKVxccysoPzxyZWxhdGl2ZV9jPig/OltsY2hdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtsY2goKS8qXFwtK1xcZC5cXHNdK1xcKSkpXFxzKyg/PHJlbGF0aXZlX2g+KD86W2xjaF18KD86XFxkKlxcLik/XFxkK3xjYWxjXFwoW2xjaCgpLypcXC0rXFxkLlxcc10rXFwpKSkoPzpcXHMqXFwvXFxzKig/PHJlbGF0aXZlX2E+KD86KD86XFxkKlxcLik/XFxkKyU/fGNhbGNcXChbKCkvKlxcLStcXGQuXFxzXFx3XSooPzphbHBoYSk/WygpLypcXC0rXFxkLlxcc1xcd10qXFwpfGFscGhhKSkpPylcXHMqXFwpJC8sXG4gICAgW0NvbG9yTW9kZWwuQ01ZS106IC9eKD86ZGV2aWNlLWNteWt8Y215aylcXHMqXFwoXFxzKig/Oig/PGNfbGVnYWN5Pig/OlxcZCpcXC4pP1xcZCslPylcXHMqLFxccyooPzxtX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrJT8pXFxzKixcXHMqKD88eV9sZWdhY3k+KD86XFxkKlxcLik/XFxkKyU/KVxccyosXFxzKig/PGtfbGVnYWN5Pig/OlxcZCpcXC4pP1xcZCslPykoPzpcXHMqLFxccyooPzxhX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrKSk/fCg/PGM+KD86XFxkKlxcLik/XFxkKyU/KVxccysoPzxtPig/OlxcZCpcXC4pP1xcZCslPylcXHMrKD88eT4oPzpcXGQqXFwuKT9cXGQrJT8pXFxzKyg/PGs+KD86XFxkKlxcLik/XFxkKyU/KSg/OlxccypcXC9cXHMqKD88YT4oPzpcXGQqXFwuKT9cXGQrJT8pKT8pXFxzKlxcKSQvXG59O1xuZXhwb3J0IGNvbnN0IENBTEMgPSB7XG4gICAgUkVHRVhQOiAvXmNhbGNcXChcXHMqKD88b3BlcmF0aW9uPltcXGQuLyorLVxcd1xcc10rKVxccypcXCkkLyxcbiAgICBTQ09QRUQ6IC9cXChcXHMqKFteKCldKylcXHMqXFwpL2csXG4gICAgRElWSVNJT046IC9cXHMqKD88bGVmdD4oPzooPzpcXGQqXFwuKT9cXGQrfFxcdyspKVxccypcXC9cXHMqKD88cmlnaHQ+KD86KD86XFxkKlxcLik/XFxkK3xcXHcrKSlcXHMqLyxcbiAgICBNVUxUSVBMSUNBVElPTjogL1xccyooPzxsZWZ0Pig/Oig/OlxcZCpcXC4pP1xcZCt8XFx3KykpXFxzKlxcKlxccyooPzxyaWdodD4oPzooPzpcXGQqXFwuKT9cXGQrfFxcdyspKVxccyovLFxuICAgIFNVTTogL1xccyooPzxsZWZ0Pig/Oig/OlxcZCpcXC4pP1xcZCt8XFx3KykpXFxzKlxcK1xccyooPzxyaWdodD4oPzooPzpcXGQqXFwuKT9cXGQrfFxcdyspKVxccyovLFxuICAgIFJFU1Q6IC9cXHMqKD88bGVmdD4oPzooPzpcXGQqXFwuKT9cXGQrfFxcdyspKVxccyotXFxzKig/PHJpZ2h0Pig/Oig/OlxcZCpcXC4pP1xcZCt8XFx3KykpXFxzKi9cbn07XG5leHBvcnQgY29uc3QgSFNMX0hVRSA9IC9eKD88bnVtYmVyPi0/KD86XFxkKlxcLik/XFxkKykoPzx1bml0cz4oPzpkZWd8Z3JhZHxyYWR8dHVybik/KSQvO1xuZXhwb3J0IGNvbnN0IFBDRU5UID0gL14oLT9cXGQrKD86XFwuXFxkKyk/fC0/XFwuXFxkKyklJC87XG5leHBvcnQgY29uc3QgSEVYID0gL14weChbYS1mXFxkXXsxLDJ9KSQvaTtcbmV4cG9ydCBjb25zdCBURU1QTEFURV9WQVIgPSAvXFx7KFxcZCspXFx9L2c7XG5leHBvcnQgY29uc3QgQ09NTUFTX0FORF9ORVhUX0NIQVJTID0gLywoICt8XFxkKykvZztcbmV4cG9ydCBjb25zdCBTUEFDRVMgPSAvICsvO1xuIiwiaW1wb3J0IHsgQW5nbGVzVW5pdEVudW0sIENvbG9yTW9kZWwsIENvbG9yVW5pdEVudW0sIENNWUtGdW5jdGlvbkVudW0gfSBmcm9tICcuL2VudW1zJztcbmV4cG9ydCBjb25zdCBNQVhfREVDSU1BTFMgPSA2O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkxFTkRfU1RFUFMgPSA1O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0hBREVTX1RJTlRTX1NURVBTID0gNTtcbmV4cG9ydCBjb25zdCBCQVNFXzI1NSA9IDI1NTtcbmV4cG9ydCBjb25zdCBNQVhfSFVFID0gMzYwO1xuZXhwb3J0IGNvbnN0IE1BWF9QQ0VOVCA9IDEwMDtcbmV4cG9ydCBjb25zdCBNQVhfQUxQSEEgPSAxO1xuZXhwb3J0IGNvbnN0IE1BWF9MQUIgPSAxMjU7XG5leHBvcnQgY29uc3QgTUFYX0xDSF9DID0gMTUwO1xuZXhwb3J0IGNvbnN0IEdSQURJQU5TID0gMTAgLyA5O1xuZXhwb3J0IGNvbnN0IENPTE9SX1BST1BTID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgSEVYOiBbJ1InLCAnRycsICdCJywgJ0EnXSxcbiAgICBSR0I6IFsnUicsICdHJywgJ0InLCAnQSddLFxuICAgIEhTTDogWydIJywgJ1MnLCAnTCcsICdBJ10sXG4gICAgSFdCOiBbJ0gnLCAnVycsICdCJywgJ0EnXSxcbiAgICBDSUVMYWI6IFsnTCcsICdhJywgJ2InLCAnQSddLFxuICAgIExDSDogWydMJywgJ0MnLCAnSCcsICdBJ10sXG4gICAgQ01ZSzogWydDJywgJ00nLCAnWScsICdLJywgJ0EnXVxufSk7XG5leHBvcnQgY29uc3QgQ09NTUEgPSAnLCc7XG5leHBvcnQgY29uc3QgVkFMSURfQ09MT1JfT0JKRUNUUyA9IE9iamVjdC5mcmVlemUoe1xuICAgIEFCR1I6IENvbG9yTW9kZWwuUkdCLFxuICAgIEFCSFc6IENvbG9yTW9kZWwuSFdCLFxuICAgIEFDSEw6IENvbG9yTW9kZWwuTENILFxuICAgIEFDS01ZOiBDb2xvck1vZGVsLkNNWUssXG4gICAgQUhMUzogQ29sb3JNb2RlbC5IU0wsXG4gICAgQUxBQjogQ29sb3JNb2RlbC5DSUVMYWIsXG4gICAgQkdSOiBDb2xvck1vZGVsLlJHQixcbiAgICBCSFc6IENvbG9yTW9kZWwuSFdCLFxuICAgIENITDogQ29sb3JNb2RlbC5MQ0gsXG4gICAgQ0tNWTogQ29sb3JNb2RlbC5DTVlLLFxuICAgIEhMUzogQ29sb3JNb2RlbC5IU0wsXG4gICAgTEFCOiBDb2xvck1vZGVsLkNJRUxhYlxufSk7XG5leHBvcnQgY29uc3QgREVGQVVMVF9PUFRJT05TID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgZGVjaW1hbHM6IE1BWF9ERUNJTUFMUyxcbiAgICBsZWdhY3lDU1M6IGZhbHNlLFxuICAgIHNwYWNlc0FmdGVyQ29tbWFzOiBmYWxzZSxcbiAgICBhbmdsZXNVbml0OiBBbmdsZXNVbml0RW51bS5OT05FLFxuICAgIHJnYlVuaXQ6IENvbG9yVW5pdEVudW0uTk9ORSxcbiAgICBsYWJVbml0OiBDb2xvclVuaXRFbnVtLk5PTkUsXG4gICAgbGNoVW5pdDogQ29sb3JVbml0RW51bS5OT05FLFxuICAgIGNteWtVbml0OiBDb2xvclVuaXRFbnVtLlBFUkNFTlQsXG4gICAgYWxwaGFVbml0OiBDb2xvclVuaXRFbnVtLk5PTkUsXG4gICAgY215a0Z1bmN0aW9uOiBDTVlLRnVuY3Rpb25FbnVtLkRFVklDRV9DTVlLXG59KTtcbmV4cG9ydCBjb25zdCBFUlJPUlMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBOT1RfQUNDRVBURURfSU5QVVQ6IGBUaGUgcHJvdmlkZWQgc3RyaW5nIGNvbG9yIGRvZXNuJ3QgaGF2ZSBhIGNvcnJlY3QgZm9ybWF0YCxcbiAgICBOT1RfQV9WQUxJRF9SRUxBVElWRV9DT0xPUjogJ2lzIG5vdCBhIHZhbGlkIG9wZXJhdGlvbiBmb3IgYSByZWxhdGl2ZSBjb2xvcidcbn0pO1xuZXhwb3J0ICogZnJvbSAnLi9yZWdleHBzJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuIiwiaW1wb3J0IHsgQW5nbGVzVW5pdEVudW0sIEJBU0VfMjU1LCBDb2xvck1vZGVsLCBDb2xvcktleXdvcmRzLCBHUkFESUFOUywgSGFybW9ueSwgSEVYLCBIU0xfSFVFLCBNQVhfQUxQSEEsIE1BWF9ERUNJTUFMUywgTUFYX0hVRSwgTUFYX0xBQiwgTUFYX0xDSF9DLCBNaXgsIFBDRU5ULCBWQUxJRF9DT0xPUl9PQkpFQ1RTIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5leHBvcnQgY29uc3QgZ2V0T3JkZXJlZEFycmF5U3RyaW5nID0gKGtleXMpID0+IFsuLi5rZXlzXS5zb3J0KCkuam9pbignJykudG9VcHBlckNhc2UoKTtcbmV4cG9ydCBjb25zdCBpc1N0cmluZyA9IChpbnB1dCkgPT4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcbmV4cG9ydCBjb25zdCBpc051bWJlciA9IChpbnB1dCkgPT4gdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJztcbmV4cG9ydCBjb25zdCBpc0Jvb2xlYW4gPSAoaW5wdXQpID0+IHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nO1xuZXhwb3J0IGNvbnN0IGlzVW5kZWZpbmVkID0gKGlucHV0KSA9PiBpbnB1dCA9PT0gdW5kZWZpbmVkO1xuZXhwb3J0IGNvbnN0IGdldENvbG9yTW9kZWwgPSAoY29sb3IpID0+IHtcbiAgICByZXR1cm4gVkFMSURfQ09MT1JfT0JKRUNUU1tnZXRPcmRlcmVkQXJyYXlTdHJpbmcoT2JqZWN0LmtleXMoY29sb3IpKV07XG59O1xuZXhwb3J0IGNvbnN0IGlzUkdCT2JqZWN0ID0gKGNvbG9yKSA9PiBnZXRDb2xvck1vZGVsKGNvbG9yKSA9PT0gQ29sb3JNb2RlbC5SR0I7XG5leHBvcnQgY29uc3QgaXNIU0xPYmplY3QgPSAoY29sb3IpID0+IGdldENvbG9yTW9kZWwoY29sb3IpID09PSBDb2xvck1vZGVsLkhTTDtcbmV4cG9ydCBjb25zdCBpc0hXQk9iamVjdCA9IChjb2xvcikgPT4gZ2V0Q29sb3JNb2RlbChjb2xvcikgPT09IENvbG9yTW9kZWwuSFdCO1xuZXhwb3J0IGNvbnN0IGlzQ0lFTGFiT2JqZWN0ID0gKGNvbG9yKSA9PiBnZXRDb2xvck1vZGVsKGNvbG9yKSA9PT0gQ29sb3JNb2RlbC5DSUVMYWI7XG5leHBvcnQgY29uc3QgaXNMQ0hPYmplY3QgPSAoY29sb3IpID0+IGdldENvbG9yTW9kZWwoY29sb3IpID09PSBDb2xvck1vZGVsLkxDSDtcbmV4cG9ydCBjb25zdCBpc0NNWUtPYmplY3QgPSAoY29sb3IpID0+IGdldENvbG9yTW9kZWwoY29sb3IpID09PSBDb2xvck1vZGVsLkNNWUs7XG5leHBvcnQgY29uc3QgaXNDb2xvcktleXdvcmQgPSAoY29sb3IpID0+IGNvbG9yIGluIENvbG9yS2V5d29yZHM7XG5leHBvcnQgY29uc3QgaXNIYXJtb255ID0gKHBhcmFtKSA9PiB7XG4gICAgcmV0dXJuIGAke3BhcmFtfWAgaW4gSGFybW9ueTtcbn07XG5leHBvcnQgY29uc3QgaXNNaXggPSAocGFyYW0pID0+IHtcbiAgICByZXR1cm4gYCR7cGFyYW19YCBpbiBNaXg7XG59O1xuZXhwb3J0IGNvbnN0IHBlcmNlbnROdW1iZXIgPSAocGVyY2VudCkgPT4ge1xuICAgIHJldHVybiArYCR7cGVyY2VudH1gLnJlcGxhY2UoUENFTlQsICckMScpO1xufTtcbmV4cG9ydCBjb25zdCBwZXJjZW50ID0gKHBlcmNlbnQpID0+IFBDRU5ULnRlc3QoYCR7cGVyY2VudH1gKVxuICAgID8gcGVyY2VudE51bWJlcihwZXJjZW50KVxuICAgIDogTWF0aC5taW4oK3BlcmNlbnQsIDEwMCk7XG5leHBvcnQgY29uc3QgZ2V0REVDID0gKGhleCkgPT4ge1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGhleCArPSBoZXg7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0SEVYID0gKG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGhleCA9IHJvdW5kKG51bWJlciwgMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGAweDAke2hleH1gO1xuICAgIH1cbiAgICByZXR1cm4gYDB4JHtoZXh9YDtcbn07XG5leHBvcnQgY29uc3QgdG9IRVggPSAoaCkgPT4ge1xuICAgIGxldCBoZXggPSByb3VuZChoLCAwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBoZXggPSBgMCR7aGV4fWA7XG4gICAgfVxuICAgIHJldHVybiBoZXg7XG59O1xuZXhwb3J0IGNvbnN0IGZyb20yNTVOdW1iZXJUb1BlcmNlbnQgPSAodmFsdWUsIGRlY2ltYWxzKSA9PiByb3VuZCh2YWx1ZSAvIEJBU0VfMjU1ICogMTAwLCBkZWNpbWFscyk7XG5leHBvcnQgY29uc3QgZnJvbTEyNU51bWJlclRvUGVyY2VudCA9ICh2YWx1ZSwgZGVjaW1hbHMpID0+IHJvdW5kKHZhbHVlIC8gTUFYX0xBQiAqIDEwMCwgZGVjaW1hbHMpO1xuZXhwb3J0IGNvbnN0IGZyb20xNTBOdW1iZXJUb1BlcmNlbnQgPSAodmFsdWUsIGRlY2ltYWxzKSA9PiByb3VuZCh2YWx1ZSAvIE1BWF9MQ0hfQyAqIDEwMCwgZGVjaW1hbHMpO1xuZXhwb3J0IGNvbnN0IGdldEJhc2UyNTVOdW1iZXIgPSAoY29sb3IsIGFscGhhID0gZmFsc2UpID0+IHtcbiAgICBpZiAoIWFscGhhICYmIFBDRU5ULnRlc3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbihCQVNFXzI1NSAqIHBlcmNlbnROdW1iZXIoY29sb3IpIC8gMTAwLCBCQVNFXzI1NSk7XG4gICAgfVxuICAgIGlmIChIRVgudGVzdChjb2xvcikpIHtcbiAgICAgICAgaWYgKGNvbG9yLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgY29sb3IgKz0gY29sb3Iuc2xpY2UoLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbHBoYVxuICAgICAgICAgICAgPyByb3VuZChjb2xvcikgLyBCQVNFXzI1NVxuICAgICAgICAgICAgOiByb3VuZChjb2xvcik7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1pbigrY29sb3IsIGFscGhhID8gMSA6IEJBU0VfMjU1KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0QmFzZTEyNU51bWJlciA9IChjb2xvcikgPT4ge1xuICAgIGlmIChQQ0VOVC50ZXN0KGNvbG9yKSkge1xuICAgICAgICByZXR1cm4gbWlubWF4KE1BWF9MQUIgKiBwZXJjZW50TnVtYmVyKGNvbG9yKSAvIDEwMCwgLU1BWF9MQUIsIE1BWF9MQUIpO1xuICAgIH1cbiAgICByZXR1cm4gbWlubWF4KCtjb2xvciwgLU1BWF9MQUIsIE1BWF9MQUIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRCYXNlMTUwTnVtYmVyID0gKGNvbG9yKSA9PiB7XG4gICAgaWYgKFBDRU5ULnRlc3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiBtaW5tYXgoTUFYX0xDSF9DICogcGVyY2VudE51bWJlcihjb2xvcikgLyAxMDAsIC1NQVhfTENIX0MsIE1BWF9MQ0hfQyk7XG4gICAgfVxuICAgIHJldHVybiBtaW5tYXgoK2NvbG9yLCAtTUFYX0xDSF9DLCBNQVhfTENIX0MpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRDTVlLTnVtYmVyID0gKGNvbG9yLCBiYXNlMTAwKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBQQ0VOVC50ZXN0KGNvbG9yKVxuICAgICAgICA/IHBlcmNlbnROdW1iZXIoY29sb3IpXG4gICAgICAgIDogK2NvbG9yO1xuICAgIGlmIChiYXNlMTAwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSAqIDEwMCwgMTAwKTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKHZhbHVlLCAxMDApO1xufTtcbmV4cG9ydCBjb25zdCByb3VuZCA9ICh2YWx1ZSwgZGVjaW1hbHMgPSBNQVhfREVDSU1BTFMpID0+IHtcbiAgICBjb25zdCBleHAgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCt2YWx1ZSAqIGV4cCkgLyBleHA7XG59O1xuZXhwb3J0IGNvbnN0IG1pbm1heCA9IChuLCBtaW4sIG1heCkgPT4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihuLCBtYXgpKTtcbmV4cG9ydCBjb25zdCBkZWdyZWVzID0gKHJhZGlhbikgPT4gcmFkaWFuICogMTgwIC8gTWF0aC5QSTtcbmV4cG9ydCBjb25zdCByYWRpYW5zID0gKGRlZ3JlZXMpID0+IGRlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUh1ZSA9IChodWUpID0+IHtcbiAgICBpZiAoaXNTdHJpbmcoaHVlKSkge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gaHVlLm1hdGNoKEhTTF9IVUUpO1xuICAgICAgICBjb25zdCBncm91cHMgPSBtYXRjaGVzLmdyb3VwcztcbiAgICAgICAgY29uc3QgdmFsdWUgPSArZ3JvdXBzLm51bWJlcjtcbiAgICAgICAgY29uc3QgdW5pdHMgPSBncm91cHMudW5pdHM7XG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgQW5nbGVzVW5pdEVudW0uUkFESUFOUzpcbiAgICAgICAgICAgICAgICBodWUgPSByb3VuZChkZWdyZWVzKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFuZ2xlc1VuaXRFbnVtLlRVUk5TOlxuICAgICAgICAgICAgICAgIGh1ZSA9IHJvdW5kKHZhbHVlICogTUFYX0hVRSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFuZ2xlc1VuaXRFbnVtLkdSQURJQU5TOlxuICAgICAgICAgICAgICAgIGh1ZSA9IHJvdW5kKDkgLyAxMCAqIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQW5nbGVzVW5pdEVudW0uREVHUkVFUzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh1ZSA+PSBNQVhfSFVFIHx8IGh1ZSA8IDApIHtcbiAgICAgICAgaHVlIC09IE1hdGguZmxvb3IoaHVlIC8gTUFYX0hVRSkgKiBNQVhfSFVFO1xuICAgIH1cbiAgICByZXR1cm4gaHVlO1xufTtcbmV4cG9ydCBjb25zdCBub3JtYWxpemVBbHBoYSA9IChhbHBoYSkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhhbHBoYSkpIHtcbiAgICAgICAgaWYgKFBDRU5ULnRlc3QoYWxwaGEpKSB7XG4gICAgICAgICAgICBhbHBoYSA9IHBlcmNlbnROdW1iZXIoYWxwaGEpIC8gMTAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWxwaGEgPSArYWxwaGE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChpc05hTigrYWxwaGEpIHx8IGFscGhhID4gTUFYX0FMUEhBKSA/IE1BWF9BTFBIQSA6IHJvdW5kKGFscGhhKTtcbn07XG5leHBvcnQgY29uc3QgdHJhbnNsYXRlRGVncmVlcyA9IChkZWdyZWVzLCB1bml0cykgPT4ge1xuICAgIGxldCBodWU7XG4gICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICBjYXNlIEFuZ2xlc1VuaXRFbnVtLlJBRElBTlM6XG4gICAgICAgICAgICBodWUgPSByb3VuZChyYWRpYW5zKGRlZ3JlZXMpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEFuZ2xlc1VuaXRFbnVtLlRVUk5TOlxuICAgICAgICAgICAgaHVlID0gcm91bmQoZGVncmVlcyAvIE1BWF9IVUUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5nbGVzVW5pdEVudW0uR1JBRElBTlM6XG4gICAgICAgICAgICBodWUgPSByb3VuZChHUkFESUFOUyAqIGRlZ3JlZXMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5nbGVzVW5pdEVudW0uREVHUkVFUzpcbiAgICAgICAgY2FzZSBBbmdsZXNVbml0RW51bS5OT05FOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaHVlID0gZGVncmVlcztcbiAgICB9XG4gICAgcmV0dXJuIGh1ZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0QW5nbGVVbml0ID0gKHVuaXQpID0+IHtcbiAgICBpZiAodW5pdCkge1xuICAgICAgICBjb25zdCBhbmdsZVVuaXRNYXRjaCA9IHVuaXQubWF0Y2goSFNMX0hVRSk7XG4gICAgICAgIGNvbnN0IGFuZ2xlVW5pdCA9IGFuZ2xlVW5pdE1hdGNoLmdyb3Vwcy51bml0cztcbiAgICAgICAgcmV0dXJuIGFuZ2xlVW5pdCA9PT0gJydcbiAgICAgICAgICAgID8gQW5nbGVzVW5pdEVudW0uTk9ORVxuICAgICAgICAgICAgOiBhbmdsZVVuaXQ7XG4gICAgfVxuICAgIHJldHVybiBBbmdsZXNVbml0RW51bS5OT05FO1xufTtcbiIsImltcG9ydCB7IEJBU0VfMjU1LCBNQVhfQUxQSEEgfSBmcm9tICcjY29uc3RhbnRzJztcbmltcG9ydCB7IGRlZ3JlZXMsIG1pbm1heCwgbm9ybWFsaXplSHVlLCByYWRpYW5zLCByb3VuZCB9IGZyb20gJyN1dGlsaXRpZXMnO1xuY29uc3QgTUFUUklYX0xSR0JfWFlaX0Q1MCA9IFtcbiAgICBbMC40MzYwNzQ3LCAwLjM4NTA2NDksIDAuMTQzMDgwNF0sXG4gICAgWzAuMjIyNTA0NSwgMC43MTY4Nzg2LCAwLjA2MDYxNjldLFxuICAgIFswLjAxMzkzMjIsIDAuMDk3MTA0NSwgMC43MTQxNzMzXVxuXTtcbmNvbnN0IE1BVFJJWF9YWVpfRDUwX0xSR0IgPSBbXG4gICAgWzMuMTMzODU2MSwgLTEuNjE2ODY2NywgLTAuNDkwNjE0Nl0sXG4gICAgWy0wLjk3ODc2ODQsIDEuOTE2MTQxNSwgMC4wMzM0NTRdLFxuICAgIFswLjA3MTk0NTMsIC0wLjIyODk5MTQsIDEuNDA1MjQyN11cbl07XG5jb25zdCBUUklTVElNVUxVU19ENTAgPSBNQVRSSVhfTFJHQl9YWVpfRDUwLm1hcCgobWF0cml4KSA9PiB7XG4gICAgcmV0dXJuIG1hdHJpeC5yZWR1Y2UoKHN1bSwgdmFsdWUpID0+IHN1bSArIHZhbHVlLCAwKTtcbn0pO1xuY29uc3QgaHVlVG9SZ2IgPSAodDEsIHQyLCBodWUpID0+IHtcbiAgICBpZiAoaHVlIDwgMCkge1xuICAgICAgICBodWUgKz0gNjtcbiAgICB9XG4gICAgaWYgKGh1ZSA+PSA2KSB7XG4gICAgICAgIGh1ZSAtPSA2O1xuICAgIH1cbiAgICBpZiAoaHVlIDwgMSkge1xuICAgICAgICByZXR1cm4gcm91bmQoKCh0MiAtIHQxKSAqIGh1ZSArIHQxKSAqIEJBU0VfMjU1KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaHVlIDwgMykge1xuICAgICAgICByZXR1cm4gcm91bmQodDIgKiBCQVNFXzI1NSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGh1ZSA8IDQpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKCgodDIgLSB0MSkgKiAoNCAtIGh1ZSkgKyB0MSkgKiBCQVNFXzI1NSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcm91bmQodDEgKiBCQVNFXzI1NSk7XG4gICAgfVxufTtcbmNvbnN0IHJnYlRvTGluZWFyTGlnaHRSZ2IgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgPD0gMC4wNDA0NVxuICAgICAgICA/IHZhbHVlIC8gMTIuOTJcbiAgICAgICAgOiAoKHZhbHVlICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNDtcbn07XG5jb25zdCBsaW5lYXJMaWdodFJnYlRvUmdiID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlIDw9IDAuMDAzMTMwOFxuICAgICAgICA/IDEyLjkyICogdmFsdWVcbiAgICAgICAgOiAxLjA1NSAqICh2YWx1ZSAqKiAoMSAvIDIuNCkpIC0gMC4wNTU7XG59O1xuY29uc3QgbWF0cml4VmVjdG9yTXVsdGlwbGljYXRpb24gPSAodjEsIHYyLCB2MywgbWF0cml4KSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gWzAsIDAsIDBdO1xuICAgIGNvbnN0IGxpbmVhclJnYiA9IFt2MSwgdjIsIHYzXTtcbiAgICBtYXRyaXguZm9yRWFjaCgoYXJyYXksIGluZGV4KSA9PiB7XG4gICAgICAgIGFycmF5LmZvckVhY2goKHZhbHVlLCBtaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gKz0gdmFsdWUgKiBsaW5lYXJSZ2JbbWluZGV4XTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCBmcm9tX0NJRV9YWVpfRDUwX3RvX0NJRV9MQUIgPSAoeCwgeSwgeikgPT4ge1xuICAgIGNvbnN0IGYgPSAodCkgPT4ge1xuICAgICAgICByZXR1cm4gdCA+ICg2IC8gMjkpICoqIDNcbiAgICAgICAgICAgID8gTWF0aC5jYnJ0KHQpXG4gICAgICAgICAgICA6IHQgLyAoMyAqICg2IC8gMjkpICoqIDIpICsgKDQgLyAyOSk7XG4gICAgfTtcbiAgICBjb25zdCBmeCA9IGYoeCAvIFRSSVNUSU1VTFVTX0Q1MFswXSk7XG4gICAgY29uc3QgZnkgPSBmKHkgLyBUUklTVElNVUxVU19ENTBbMV0pO1xuICAgIGNvbnN0IGZ6ID0gZih6IC8gVFJJU1RJTVVMVVNfRDUwWzJdKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAxMTYgKiBmeSAtIDE2LFxuICAgICAgICA1MDAgKiAoZnggLSBmeSksXG4gICAgICAgIDIwMCAqIChmeSAtIGZ6KVxuICAgIF07XG59O1xuY29uc3QgZnJvbV9DSUVfTEFCX3RvX0NJRV9YWVpfRDUwID0gKEwsIGEsIGIpID0+IHtcbiAgICBjb25zdCBmID0gKHQpID0+IHtcbiAgICAgICAgcmV0dXJuIHQgPiA2IC8gMjlcbiAgICAgICAgICAgID8gdCAqKiAzXG4gICAgICAgICAgICA6IDMgKiAoNiAvIDI5KSAqKiAyICogKHQgLSA0IC8gMjkpO1xuICAgIH07XG4gICAgY29uc3QgZmwgPSAoTCArIDE2KSAvIDExNjtcbiAgICBjb25zdCBmYSA9IGEgLyA1MDA7XG4gICAgY29uc3QgZmIgPSBiIC8gMjAwO1xuICAgIHJldHVybiBbXG4gICAgICAgIFRSSVNUSU1VTFVTX0Q1MFswXSAqIGYoZmwgKyBmYSksXG4gICAgICAgIFRSSVNUSU1VTFVTX0Q1MFsxXSAqIGYoZmwpLFxuICAgICAgICBUUklTVElNVUxVU19ENTBbMl0gKiBmKGZsIC0gZmIpXG4gICAgXTtcbn07XG5leHBvcnQgY29uc3QgaHNsVG9SZ2IgPSAoSCwgUywgTCkgPT4ge1xuICAgIEggLz0gNjA7XG4gICAgUyAvPSAxMDA7XG4gICAgTCAvPSAxMDA7XG4gICAgY29uc3QgdDIgPSAoTCA8PSAuNSlcbiAgICAgICAgPyBMICogKFMgKyAxKVxuICAgICAgICA6IEwgKyBTIC0gKEwgKiBTKTtcbiAgICBjb25zdCB0MSA9IEwgKiAyIC0gdDI7XG4gICAgY29uc3QgUiA9IGh1ZVRvUmdiKHQxLCB0MiwgSCArIDIpO1xuICAgIGNvbnN0IEcgPSBodWVUb1JnYih0MSwgdDIsIEgpO1xuICAgIGNvbnN0IEIgPSBodWVUb1JnYih0MSwgdDIsIEggLSAyKTtcbiAgICByZXR1cm4geyBSLCBHLCBCIH07XG59O1xuZXhwb3J0IGNvbnN0IHJnYlRvSHNsID0gKFIsIEcsIEIsIEEgPSAxKSA9PiB7XG4gICAgUiAvPSBCQVNFXzI1NTtcbiAgICBHIC89IEJBU0VfMjU1O1xuICAgIEIgLz0gQkFTRV8yNTU7XG4gICAgQSA9IE1hdGgubWluKEEsIE1BWF9BTFBIQSk7XG4gICAgY29uc3QgTUFYID0gTWF0aC5tYXgoUiwgRywgQik7XG4gICAgY29uc3QgTUlOID0gTWF0aC5taW4oUiwgRywgQik7XG4gICAgY29uc3QgRCA9IE1BWCAtIE1JTjtcbiAgICBsZXQgSCA9IDA7XG4gICAgbGV0IFMgPSAwO1xuICAgIGNvbnN0IEwgPSAoTUFYICsgTUlOKSAvIDI7XG4gICAgaWYgKEQgIT09IDApIHtcbiAgICAgICAgc3dpdGNoIChNQVgpIHtcbiAgICAgICAgICAgIGNhc2UgUjpcbiAgICAgICAgICAgICAgICBIID0gKChHIC0gQikgLyBEKSAlIDY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEc6XG4gICAgICAgICAgICAgICAgSCA9IChCIC0gUikgLyBEICsgMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQjpcbiAgICAgICAgICAgICAgICBIID0gKFIgLSBHKSAvIEQgKyA0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIEggPSByb3VuZChIICogNjApO1xuICAgICAgICBpZiAoSCA8IDApIHtcbiAgICAgICAgICAgIEggKz0gMzYwO1xuICAgICAgICB9XG4gICAgICAgIFMgPSBEIC8gKDEgLSBNYXRoLmFicygyICogTCAtIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgSCxcbiAgICAgICAgUzogcm91bmQoUyAqIDEwMCksXG4gICAgICAgIEw6IHJvdW5kKEwgKiAxMDApLFxuICAgICAgICBBXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgcmdiVG9MYWIgPSAoUiwgRywgQikgPT4ge1xuICAgIGNvbnN0IExJTkVBUl9MSUdIVF9SR0IgPSBbXG4gICAgICAgIFIgLyBCQVNFXzI1NSxcbiAgICAgICAgRyAvIEJBU0VfMjU1LFxuICAgICAgICBCIC8gQkFTRV8yNTVcbiAgICBdLm1hcChyZ2JUb0xpbmVhckxpZ2h0UmdiKTtcbiAgICBjb25zdCBDSUVfWFlaX0Q1MCA9IG1hdHJpeFZlY3Rvck11bHRpcGxpY2F0aW9uKExJTkVBUl9MSUdIVF9SR0JbMF0sIExJTkVBUl9MSUdIVF9SR0JbMV0sIExJTkVBUl9MSUdIVF9SR0JbMl0sIE1BVFJJWF9MUkdCX1hZWl9ENTApO1xuICAgIGNvbnN0IENJRV9MQUIgPSBmcm9tX0NJRV9YWVpfRDUwX3RvX0NJRV9MQUIoQ0lFX1hZWl9ENTBbMF0sIENJRV9YWVpfRDUwWzFdLCBDSUVfWFlaX0Q1MFsyXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgTDogQ0lFX0xBQlswXSxcbiAgICAgICAgYTogQ0lFX0xBQlsxXSxcbiAgICAgICAgYjogQ0lFX0xBQlsyXVxuICAgIH07XG59O1xuZXhwb3J0IGNvbnN0IGxhYlRvUmdiID0gKEwsIGEsIGIpID0+IHtcbiAgICBjb25zdCBDSUVfWFlaX0Q1MCA9IGZyb21fQ0lFX0xBQl90b19DSUVfWFlaX0Q1MChMLCBhLCBiKTtcbiAgICBjb25zdCBMSU5FQVJfTElHSFRfUkdCID0gbWF0cml4VmVjdG9yTXVsdGlwbGljYXRpb24oQ0lFX1hZWl9ENTBbMF0sIENJRV9YWVpfRDUwWzFdLCBDSUVfWFlaX0Q1MFsyXSwgTUFUUklYX1hZWl9ENTBfTFJHQik7XG4gICAgY29uc3QgcmdiID0gTElORUFSX0xJR0hUX1JHQi5tYXAobGluZWFyTGlnaHRSZ2JUb1JnYik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgUjogbWlubWF4KHJnYlswXSAqIEJBU0VfMjU1LCAwLCBCQVNFXzI1NSksXG4gICAgICAgIEc6IG1pbm1heChyZ2JbMV0gKiBCQVNFXzI1NSwgMCwgQkFTRV8yNTUpLFxuICAgICAgICBCOiBtaW5tYXgocmdiWzJdICogQkFTRV8yNTUsIDAsIEJBU0VfMjU1KVxuICAgIH07XG59O1xuZXhwb3J0IGNvbnN0IGxhYlRvTGNoID0gKEwsIGEsIGIpID0+IHtcbiAgICBjb25zdCBDID0gTWF0aC5zcXJ0KGEgKiogMiArIGIgKiogMik7XG4gICAgY29uc3QgSCA9IGRlZ3JlZXMoTWF0aC5hdGFuMihiLCBhKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgTCxcbiAgICAgICAgQyxcbiAgICAgICAgSDogbm9ybWFsaXplSHVlKEgpXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgbGNoVG9MYWIgPSAoTCwgQywgSCkgPT4ge1xuICAgIGNvbnN0IHJhZEggPSByYWRpYW5zKEgpO1xuICAgIGNvbnN0IGEgPSBDICogTWF0aC5jb3MocmFkSCk7XG4gICAgY29uc3QgYiA9IEMgKiBNYXRoLnNpbihyYWRIKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBMLFxuICAgICAgICBhLFxuICAgICAgICBiXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgcmdiVG9MY2ggPSAoUiwgRywgQikgPT4ge1xuICAgIGNvbnN0IGxhYiA9IHJnYlRvTGFiKFIsIEcsIEIpO1xuICAgIHJldHVybiBsYWJUb0xjaChsYWIuTCwgbGFiLmEsIGxhYi5iKTtcbn07XG5leHBvcnQgY29uc3QgbGNoVG9SZ2IgPSAoTCwgQywgSCkgPT4ge1xuICAgIGNvbnN0IGxhYiA9IGxjaFRvTGFiKEwsIEMsIEgpO1xuICAgIHJldHVybiBsYWJUb1JnYihsYWIuTCwgbGFiLmEsIGxhYi5iKTtcbn07XG5leHBvcnQgY29uc3QgcmdiVG9Id2IgPSAoUiwgRywgQiwgQSA9IDEpID0+IHtcbiAgICBjb25zdCBoc2wgPSByZ2JUb0hzbChSLCBHLCBCLCBBKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBIOiBoc2wuSCxcbiAgICAgICAgVzogcm91bmQoTWF0aC5taW4oUiwgRywgQikgLyBCQVNFXzI1NSAqIDEwMCksXG4gICAgICAgIEI6IHJvdW5kKCgxIC0gTWF0aC5tYXgoUiwgRywgQikgLyBCQVNFXzI1NSkgKiAxMDApLFxuICAgICAgICBBXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgaHdiVG9SZ2IgPSAoSCwgVywgQikgPT4ge1xuICAgIFcgLz0gMTAwO1xuICAgIEIgLz0gMTAwO1xuICAgIGNvbnN0IHYgPSAxIC0gQjtcbiAgICBjb25zdCBjID0gdiAtIFc7XG4gICAgY29uc3QgeCA9IGMgKiAoMSAtIE1hdGguYWJzKChIIC8gNjApICUgMiAtIDEpKTtcbiAgICBsZXQgcmdiUjtcbiAgICBsZXQgcmdiRztcbiAgICBsZXQgcmdiQjtcbiAgICBpZiAoSCA8IDYwKSB7XG4gICAgICAgIHJnYlIgPSBjO1xuICAgICAgICByZ2JHID0geDtcbiAgICAgICAgcmdiQiA9IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKEggPj0gNjAgJiYgSCA8IDEyMCkge1xuICAgICAgICByZ2JSID0geDtcbiAgICAgICAgcmdiRyA9IGM7XG4gICAgICAgIHJnYkIgPSAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChIID49IDEyMCAmJiBIIDwgMTgwKSB7XG4gICAgICAgIHJnYlIgPSAwO1xuICAgICAgICByZ2JHID0gYztcbiAgICAgICAgcmdiQiA9IHg7XG4gICAgfVxuICAgIGVsc2UgaWYgKEggPj0gMTgwICYmIEggPCAyNDApIHtcbiAgICAgICAgcmdiUiA9IDA7XG4gICAgICAgIHJnYkcgPSB4O1xuICAgICAgICByZ2JCID0gYztcbiAgICB9XG4gICAgZWxzZSBpZiAoSCA+PSAyNDAgJiYgSCA8IDMwMCkge1xuICAgICAgICByZ2JSID0geDtcbiAgICAgICAgcmdiRyA9IDA7XG4gICAgICAgIHJnYkIgPSBjO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmdiUiA9IGM7XG4gICAgICAgIHJnYkcgPSAwO1xuICAgICAgICByZ2JCID0geDtcbiAgICB9XG4gICAgcmdiUiArPSBXO1xuICAgIHJnYkcgKz0gVztcbiAgICByZ2JCICs9IFc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgUjogbWlubWF4KHJnYlIgKiBCQVNFXzI1NSwgMCwgQkFTRV8yNTUpLFxuICAgICAgICBHOiBtaW5tYXgocmdiRyAqIEJBU0VfMjU1LCAwLCBCQVNFXzI1NSksXG4gICAgICAgIEI6IG1pbm1heChyZ2JCICogQkFTRV8yNTUsIDAsIEJBU0VfMjU1KVxuICAgIH07XG59O1xuZXhwb3J0IGNvbnN0IGNteWtUb1JnYiA9IChDLCBNLCBZLCBLKSA9PiB7XG4gICAgSyA9IDEgLSBLO1xuICAgIHJldHVybiB7XG4gICAgICAgIFI6IG1pbm1heChyb3VuZChCQVNFXzI1NSAqICgxIC0gQykgKiBLKSwgMCwgQkFTRV8yNTUpLFxuICAgICAgICBHOiBtaW5tYXgocm91bmQoQkFTRV8yNTUgKiAoMSAtIE0pICogSyksIDAsIEJBU0VfMjU1KSxcbiAgICAgICAgQjogbWlubWF4KHJvdW5kKEJBU0VfMjU1ICogKDEgLSBZKSAqIEspLCAwLCBCQVNFXzI1NSlcbiAgICB9O1xufTtcbmV4cG9ydCBjb25zdCByZ2JUb0NteWsgPSAoUiwgRywgQikgPT4ge1xuICAgIFIgLz0gQkFTRV8yNTU7XG4gICAgRyAvPSBCQVNFXzI1NTtcbiAgICBCIC89IEJBU0VfMjU1O1xuICAgIGNvbnN0IEsgPSAxIC0gTWF0aC5tYXgoUiwgRywgQik7XG4gICAgY29uc3QgSzEgPSAxIC0gSztcbiAgICBjb25zdCBDID0gSzEgJiYgKEsxIC0gUikgLyBLMTtcbiAgICBjb25zdCBNID0gSzEgJiYgKEsxIC0gRykgLyBLMTtcbiAgICBjb25zdCBZID0gSzEgJiYgKEsxIC0gQikgLyBLMTtcbiAgICByZXR1cm4ge1xuICAgICAgICBDOiByb3VuZChDICogMTAwKSxcbiAgICAgICAgTTogcm91bmQoTSAqIDEwMCksXG4gICAgICAgIFk6IHJvdW5kKFkgKiAxMDApLFxuICAgICAgICBLOiByb3VuZChLICogMTAwKVxuICAgIH07XG59O1xuZXhwb3J0IGNvbnN0IHJnYlRvUnliID0gKFIsIEcsIEIpID0+IHtcbiAgICBjb25zdCBJdyA9IE1hdGgubWluKFIsIEcsIEIpO1xuICAgIGNvbnN0IEliID0gTWF0aC5taW4oQkFTRV8yNTUgLSBSLCBCQVNFXzI1NSAtIEcsIEJBU0VfMjU1IC0gQik7XG4gICAgY29uc3QgclJnYiA9IFIgLSBJdztcbiAgICBjb25zdCBnUmdiID0gRyAtIEl3O1xuICAgIGNvbnN0IGJSZ2IgPSBCIC0gSXc7XG4gICAgY29uc3QgbWluUmcgPSBNYXRoLm1pbihyUmdiLCBnUmdiKTtcbiAgICBjb25zdCByUnliID0gclJnYiAtIG1pblJnO1xuICAgIGNvbnN0IHlSeWIgPSAoZ1JnYiArIG1pblJnKSAvIDI7XG4gICAgY29uc3QgYlJ5YiA9IChiUmdiICsgZ1JnYiAtIG1pblJnKSAvIDI7XG4gICAgY29uc3QgbiA9IE1hdGgubWF4KHJSeWIsIHlSeWIsIGJSeWIpIC8gTWF0aC5tYXgoclJnYiwgZ1JnYiwgYlJnYik7XG4gICAgY29uc3QgTiA9IGlzTmFOKG4pIHx8IG4gPT09IEluZmluaXR5IHx8IG4gPD0gMCA/IDEgOiBuO1xuICAgIHJldHVybiB7XG4gICAgICAgIFI6IHJSeWIgLyBOICsgSWIsXG4gICAgICAgIFk6IHlSeWIgLyBOICsgSWIsXG4gICAgICAgIEI6IGJSeWIgLyBOICsgSWJcbiAgICB9O1xufTtcbmV4cG9ydCBjb25zdCByeWJUb1JnYiA9IChSLCBZLCBCKSA9PiB7XG4gICAgY29uc3QgSXcgPSBNYXRoLm1pbihSLCBZLCBCKTtcbiAgICBjb25zdCBJYiA9IE1hdGgubWluKEJBU0VfMjU1IC0gUiwgQkFTRV8yNTUgLSBZLCBCQVNFXzI1NSAtIEIpO1xuICAgIGNvbnN0IHJSeWIgPSBSIC0gSXc7XG4gICAgY29uc3QgeVJ5YiA9IFkgLSBJdztcbiAgICBjb25zdCBiUnliID0gQiAtIEl3O1xuICAgIGNvbnN0IG1pblliID0gTWF0aC5taW4oeVJ5YiwgYlJ5Yik7XG4gICAgY29uc3QgclJnYiA9IHJSeWIgKyB5UnliIC0gbWluWWI7XG4gICAgY29uc3QgZ1JnYiA9IHlSeWIgKyBtaW5ZYjtcbiAgICBjb25zdCBiUmdiID0gMiAqIChiUnliIC0gbWluWWIpO1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heChyUmdiLCBnUmdiLCBiUmdiKSAvIE1hdGgubWF4KHJSeWIsIHlSeWIsIGJSeWIpO1xuICAgIGNvbnN0IE4gPSBpc05hTihuKSB8fCBuID09PSBJbmZpbml0eSB8fCBuIDw9IDAgPyAxIDogbjtcbiAgICByZXR1cm4ge1xuICAgICAgICBSOiByUmdiIC8gTiArIEliLFxuICAgICAgICBHOiBnUmdiIC8gTiArIEliLFxuICAgICAgICBCOiBiUmdiIC8gTiArIEliXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgaHVlUnliID0gKGh1ZSwgdG9SeWIpID0+IHtcbiAgICBpZiAoaHVlIDwgMClcbiAgICAgICAgaHVlICs9IDM2MDtcbiAgICBpZiAoaHVlID4gMzYwKVxuICAgICAgICBodWUgLT0gMzYwO1xuICAgIGlmIChodWUgPT09IDM2MCB8fCBodWUgPT09IDApXG4gICAgICAgIHJldHVybiBodWU7XG4gICAgY29uc3QgbWFwMSA9IFtcbiAgICAgICAgWzAsIDEyMF0sXG4gICAgICAgIFsxMjAsIDE4MF0sXG4gICAgICAgIFsxODAsIDI0MF0sXG4gICAgICAgIFsyNDAsIDM2MF1cbiAgICBdO1xuICAgIGNvbnN0IG1hcDIgPSBbXG4gICAgICAgIFswLCA2MF0sXG4gICAgICAgIFs2MCwgMTIwXSxcbiAgICAgICAgWzEyMCwgMjQwXSxcbiAgICAgICAgWzI0MCwgMzYwXVxuICAgIF07XG4gICAgY29uc3QgZnJvbSA9IHRvUnliID8gbWFwMSA6IG1hcDI7XG4gICAgY29uc3QgdG8gPSB0b1J5YiA/IG1hcDIgOiBtYXAxO1xuICAgIGxldCBBID0gMDtcbiAgICBsZXQgQiA9IDA7XG4gICAgbGV0IEMgPSAwO1xuICAgIGxldCBEID0gMDtcbiAgICBmcm9tLmZpbmQoKGFyciwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGh1ZSA+PSBhcnJbMF0gJiYgaHVlIDwgYXJyWzFdKSB7XG4gICAgICAgICAgICBBID0gYXJyWzBdO1xuICAgICAgICAgICAgQiA9IGFyclsxXTtcbiAgICAgICAgICAgIEMgPSB0b1tpbmRleF1bMF07XG4gICAgICAgICAgICBEID0gdG9baW5kZXhdWzFdO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHJldHVybiBDICsgKGh1ZSAtIEEpICogKChEIC0gQykgLyAoQiAtIEEpKTtcbn07XG4iLCJpbXBvcnQgeyBERUZBVUxUX09QVElPTlMsIEVSUk9SUyB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzVW5kZWZpbmVkIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5leHBvcnQgY2xhc3MgQ29sb3JQYXJzZXJDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXJzKSB7XG4gICAgICAgIHRoaXMuX3BhcnNlcnMgPSBwYXJzZXJzO1xuICAgIH1cbiAgICBnZXRQYXJzZXIoaW5wdXQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXJzZXIgb2YgdGhpcy5fcGFyc2Vycy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHBhcnNlci5zdXBwb3J0cyhpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUlMuTk9UX0FDQ0VQVEVEX0lOUFVUKTtcbiAgICB9XG4gICAgcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5nZXRQYXJzZXIoaW5wdXQpO1xuICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGlucHV0LCB0aGlzKTtcbiAgICB9XG4gICAgY29udmVydChpbnB1dCwgbW9kZWwsIGRlY2ltYWxzID0gREVGQVVMVF9PUFRJT05TLmRlY2ltYWxzLCB3aXRoQWxwaGEgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMucGFyc2UoaW5wdXQpO1xuICAgICAgICBjb25zdCBwYXJzZXIgPSB0aGlzLl9wYXJzZXJzLmdldChtb2RlbCk7XG4gICAgICAgIHJldHVybiBwYXJzZXIuY29udmVydChjb2xvciwgZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgfVxuICAgIGNvbnZlcnRDU1MoaW5wdXQsIG1vZGVsLCBvcHRpb25zID0ge30sIHdpdGhBbHBoYSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5wYXJzZShpbnB1dCk7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMuX3BhcnNlcnMuZ2V0KG1vZGVsKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlci5jb252ZXJ0Q1NTKGNvbG9yLCBvcHRpb25zLCB3aXRoQWxwaGEpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb2xvclBhcnNlciB7XG4gICAgaGFzQWxwaGEoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q1NTT3B0aW9ucyhpbnB1dCkuaGFzQWxwaGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFpc1VuZGVmaW5lZChpbnB1dC5BKTtcbiAgICB9XG4gICAgO1xufVxuIiwiaW1wb3J0IHsgY215a1RvUmdiLCBoc2xUb1JnYiwgaHdiVG9SZ2IsIGxhYlRvUmdiLCBsY2hUb1JnYiB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBpc0NJRUxhYk9iamVjdCwgaXNDTVlLT2JqZWN0LCBpc0hTTE9iamVjdCwgaXNIV0JPYmplY3QsIGlzTENIT2JqZWN0LCBpc1VuZGVmaW5lZCB9IGZyb20gJyN1dGlsaXRpZXMnO1xuZXhwb3J0IGNvbnN0IGdldFJHQiA9IChjb2xvcikgPT4ge1xuICAgIGNvbnN0IGFscGhhID0gaXNVbmRlZmluZWQoY29sb3IuQSlcbiAgICAgICAgPyB7fVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIEE6ICtjb2xvci5BXG4gICAgICAgIH07XG4gICAgaWYgKGlzSFNMT2JqZWN0KGNvbG9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaHNsVG9SZ2IoY29sb3IuSCwgY29sb3IuUywgY29sb3IuTCksXG4gICAgICAgICAgICAuLi5hbHBoYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoaXNIV0JPYmplY3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5od2JUb1JnYihjb2xvci5ILCBjb2xvci5XLCBjb2xvci5CKSxcbiAgICAgICAgICAgIC4uLmFscGhhXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0NJRUxhYk9iamVjdChjb2xvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmxhYlRvUmdiKGNvbG9yLkwsIGNvbG9yLmEsIGNvbG9yLmIpLFxuICAgICAgICAgICAgLi4uYWxwaGFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGlzTENIT2JqZWN0KGNvbG9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ubGNoVG9SZ2IoY29sb3IuTCwgY29sb3IuQywgY29sb3IuSCksXG4gICAgICAgICAgICAuLi5hbHBoYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoaXNDTVlLT2JqZWN0KGNvbG9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY215a1RvUmdiKGNvbG9yLkMsIGNvbG9yLk0sIGNvbG9yLlksIGNvbG9yLkspLFxuICAgICAgICAgICAgLi4uYWxwaGFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yO1xufTtcbiIsImltcG9ydCB7IEFuZ2xlc1VuaXRFbnVtLCBDT0xPUl9QUk9QUywgQ09NTUEsIENvbG9yVW5pdEVudW0sIFRFTVBMQVRFX1ZBUiwgVkFMSURfQ09MT1JfT0JKRUNUUyB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0T3JkZXJlZEFycmF5U3RyaW5nLCBpc1VuZGVmaW5lZCwgcm91bmQsIHRyYW5zbGF0ZURlZ3JlZXMgfSBmcm9tICcjdXRpbGl0aWVzJztcbmV4cG9ydCBjb25zdCBnZXRDU1NDb21tYSA9ICh3aXRoU3BhY2UpID0+IHdpdGhTcGFjZVxuICAgID8gYCR7Q09NTUF9IGBcbiAgICA6IENPTU1BO1xuZXhwb3J0IGNvbnN0IHByZXBhcmVDb2xvckZvckNzcyA9IChjb2xvciwgdHJhbnNmb3JtZXIpID0+IHtcbiAgICBjb25zdCBwcm9wcyA9IGdldE9yZGVyZWRBcnJheVN0cmluZyhPYmplY3Qua2V5cyhjb2xvcikpO1xuICAgIGNvbnN0IG1vZGVsID0gVkFMSURfQ09MT1JfT0JKRUNUU1twcm9wc107XG4gICAgY29uc3Qga2V5cyA9IENPTE9SX1BST1BTW21vZGVsXTtcbiAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKHJlc3VsdCwga2V5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbG9yW2tleV07XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0cmFuc2Zvcm1lcih2YWx1ZSwgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIFtdKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlID0gKHRlbXBsYXRlLCB2YXJzKSA9PiB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoVEVNUExBVEVfVkFSLCAoX19tYXRjaCwgaW5kZXhTdHIpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAraW5kZXhTdHIgLSAxO1xuICAgICAgICByZXR1cm4gYCR7dmFyc1tpbmRleF19YDtcbiAgICB9KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Q1NTQWxwaGEgPSAodmFsdWUsIG9wdGlvbnMsIGlnbm9yZUxlZ2FjeSA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBhbHBoYVVuaXQsIGxlZ2FjeUNTUywgZGVjaW1hbHMgfSA9IG9wdGlvbnM7XG4gICAgaWYgKGFscGhhVW5pdCA9PT0gQ29sb3JVbml0RW51bS5QRVJDRU5UICYmXG4gICAgICAgICghbGVnYWN5Q1NTIHx8XG4gICAgICAgICAgICBpZ25vcmVMZWdhY3kpKSB7XG4gICAgICAgIHJldHVybiBgJHtyb3VuZCh2YWx1ZSAqIDEwMCwgZGVjaW1hbHMpfSVgO1xuICAgIH1cbiAgICByZXR1cm4gcm91bmQodmFsdWUsIGRlY2ltYWxzKTtcbn07XG5leHBvcnQgY29uc3QgYnVpbGRDU1NIdWVUcmFuc2Zvcm1lciA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBhbmdsZXNVbml0LCBkZWNpbWFscyB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4gKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoaW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgIGFuZ2xlc1VuaXQgIT09IEFuZ2xlc1VuaXRFbnVtLk5PTkUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSByb3VuZCh0cmFuc2xhdGVEZWdyZWVzKHZhbHVlLCBhbmdsZXNVbml0KSwgZGVjaW1hbHMpO1xuICAgICAgICAgICAgcmV0dXJuIGAke3RyYW5zbGF0ZWR9JHthbmdsZXNVbml0fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4ID09PSAzXG4gICAgICAgICAgICA/IGdldENTU0FscGhhKHZhbHVlLCBvcHRpb25zKVxuICAgICAgICAgICAgOiByb3VuZCh2YWx1ZSwgZGVjaW1hbHMpO1xuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgQkFTRV8yNTUsIENvbG9yS2V5d29yZHMsIENvbG9yTW9kZWwsIENPTE9SUkVHUywgSEVYIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRSR0IgfSBmcm9tICcjY29sb3IvcmdiJztcbmltcG9ydCB7IGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSwgcHJlcGFyZUNvbG9yRm9yQ3NzIH0gZnJvbSAnI2Nzcyc7XG5pbXBvcnQgeyBnZXRERUMsIGdldEhFWCwgZ2V0QmFzZTI1NU51bWJlciwgaXNDb2xvcktleXdvcmQsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgaXNSR0JPYmplY3QsIHJvdW5kLCB0b0hFWCB9IGZyb20gJyN1dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29sb3JQYXJzZXIgfSBmcm9tICcuL0NvbG9yUGFyc2VyQ29udGV4dCc7XG5leHBvcnQgY2xhc3MgSEVYUGFyc2VyIGV4dGVuZHMgQ29sb3JQYXJzZXIge1xuICAgIF9leHRyYWN0KGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGNvbG9yU3RyID0gaXNDb2xvcktleXdvcmQoaW5wdXQpXG4gICAgICAgICAgICA/IENvbG9yS2V5d29yZHNbaW5wdXRdXG4gICAgICAgICAgICA6IGlucHV0O1xuICAgICAgICBjb25zdCBtYXRjaCA9IGNvbG9yU3RyLm1hdGNoKENPTE9SUkVHUy5IRVgpO1xuICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXBzO1xuICAgIH1cbiAgICBzdXBwb3J0cyhpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gKENPTE9SUkVHUy5IRVgudGVzdChpbnB1dCkgfHxcbiAgICAgICAgICAgICAgICBpc0NvbG9yS2V5d29yZChpbnB1dCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhc0ludmFsaWRIZXggPSBPYmplY3QuZW50cmllcyhpbnB1dCkuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFIRVgudGVzdChgJHtpdGVtWzFdfWApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGlzUkdCT2JqZWN0KGlucHV0KSAmJiAhaGFzSW52YWxpZEhleDtcbiAgICB9XG4gICAgcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCByID0gZ3JvdXBzLnIgPz8gZ3JvdXBzLnJyO1xuICAgICAgICAgICAgY29uc3QgZyA9IGdyb3Vwcy5nID8/IGdyb3Vwcy5nZztcbiAgICAgICAgICAgIGNvbnN0IGIgPSBncm91cHMuYiA/PyBncm91cHMuYmI7XG4gICAgICAgICAgICBjb25zdCBhID0gZ3JvdXBzLmEgPz8gZ3JvdXBzLmFhO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBSOiBnZXRERUMociksXG4gICAgICAgICAgICAgICAgRzogZ2V0REVDKGcpLFxuICAgICAgICAgICAgICAgIEI6IGdldERFQyhiKSxcbiAgICAgICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoYSlcbiAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEE6IGdldERFQyhhKSAvIEJBU0VfMjU1XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBSOiBnZXRCYXNlMjU1TnVtYmVyKGAke2lucHV0LlJ9YCksXG4gICAgICAgICAgICBHOiBnZXRCYXNlMjU1TnVtYmVyKGAke2lucHV0Lkd9YCksXG4gICAgICAgICAgICBCOiBnZXRCYXNlMjU1TnVtYmVyKGAke2lucHV0LkJ9YCksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IE1hdGgubWluKGdldEJhc2UyNTVOdW1iZXIoYCR7aW5wdXQuQX1gLCB0cnVlKSwgMSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb252ZXJ0KGNvbG9yLCBfX2RlY2ltYWxzLCB3aXRoQWxwaGEpIHtcbiAgICAgICAgY29uc3QgcmdiID0gaXNSR0JPYmplY3QoY29sb3IpXG4gICAgICAgICAgICA/IGNvbG9yXG4gICAgICAgICAgICA6IGdldFJHQihjb2xvcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBSOiBnZXRIRVgocmdiLlIpLFxuICAgICAgICAgICAgRzogZ2V0SEVYKHJnYi5HKSxcbiAgICAgICAgICAgIEI6IGdldEhFWChyZ2IuQiksXG4gICAgICAgICAgICAuLi4od2l0aEFscGhhXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIEE6IGlzVW5kZWZpbmVkKHJnYi5BKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnMHhGRidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0SEVYKHJnYi5BICogQkFTRV8yNTUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnZlcnRDU1MoY29sb3IsIG9wdGlvbnMsIHdpdGhBbHBoYSkge1xuICAgICAgICBjb25zdCByZ2IgPSB0aGlzLmNvbnZlcnQoY29sb3IsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gKHZhbHVlKSA9PiB0b0hFWChyb3VuZCh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MocmdiLCB0cmFuc2Zvcm1lcik7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgPyAnI3sxfXsyfXszfXs0fSdcbiAgICAgICAgICAgIDogJyN7MX17Mn17M30nO1xuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlKHRlbXBsYXRlLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBnZXRDU1NPcHRpb25zKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFzQWxwaGE6ICFpc1VuZGVmaW5lZChncm91cHMuYSA/PyBncm91cHMuYWEpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yTW9kZWwuSEVYO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENBTEMsIEVSUk9SUyB9IGZyb20gJyNjb25zdGFudHMnO1xuY29uc3QgTUFYX1NUQUNLID0gMTAwO1xuZXhwb3J0IGNsYXNzIENhbGNQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbG9ySW5kZXgsIGNhbGMsIHZhcnMpIHtcbiAgICAgICAgdGhpcy5fb3BlcmF0aW9ucyA9IG5ldyBNYXAoW1xuICAgICAgICAgICAgW0NBTEMuRElWSVNJT04sIHRoaXMuX2RpdmlzaW9uXSxcbiAgICAgICAgICAgIFtDQUxDLk1VTFRJUExJQ0FUSU9OLCB0aGlzLl9tdWx0aXBsaWNhdGlvbl0sXG4gICAgICAgICAgICBbQ0FMQy5TVU0sIHRoaXMuX3N1bV0sXG4gICAgICAgICAgICBbQ0FMQy5SRVNULCB0aGlzLl9yZXN0XVxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5fY29sb3JJbmRleCA9IGNvbG9ySW5kZXg7XG4gICAgICAgIGxldCBjYWxjU3RyaW5nID0gY2FsYztcbiAgICAgICAgbGV0IHN0YWNrID0gMDtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oK2NhbGMpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHQgPSArY2FsYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjYWxjIGluIHZhcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdCA9IHZhcnNbY2FsY107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ0FMQy5SRUdFWFAudGVzdChjYWxjU3RyaW5nKSkge1xuICAgICAgICAgICAgQ0FMQy5SRUdFWFAubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdCA9IHRoaXMuX2dldENhbGNWYWx1ZShjYWxjU3RyaW5nLCB2YXJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlIChDQUxDLlNDT1BFRC50ZXN0KGNhbGNTdHJpbmcpICYmIHN0YWNrIDwgTUFYX1NUQUNLKSB7XG4gICAgICAgICAgICAgICAgQ0FMQy5TQ09QRUQubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjYWxjU3RyaW5nID0gY2FsY1N0cmluZy5yZXBsYWNlKENBTEMuU0NPUEVELCAoX19tYXRjaCwgb3BlcmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUob3BlcmF0aW9uLCB2YXJzKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChDQUxDLlJFR0VYUC50ZXN0KGNhbGNTdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIENBTEMuUkVHRVhQLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFjaysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVzdWx0ID0gdGhpcy5fZ2V0Q2FsY1ZhbHVlKGNhbGNTdHJpbmcsIHZhcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9kaXZpc2lvbihsZWZ0LCByaWdodCkge1xuICAgICAgICByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgIH1cbiAgICBfbXVsdGlwbGljYXRpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGxlZnQgKiByaWdodDtcbiAgICB9XG4gICAgX3N1bShsZWZ0LCByaWdodCkge1xuICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0O1xuICAgIH1cbiAgICBfcmVzdChsZWZ0LCByaWdodCkge1xuICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0O1xuICAgIH1cbiAgICBfZ2V0Q2FsY1ZhbHVlKGNhbGMsIHZhcnMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBjYWxjLm1hdGNoKENBTEMuUkVHRVhQKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gbWF0Y2guZ3JvdXBzLm9wZXJhdGlvbjtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9jYWxjdWxhdGUob3BlcmF0aW9uLCB2YXJzKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBmb3IgJHt0aGlzLl9jb2xvckluZGV4fS4gJHtvcGVyYXRpb259ICR7RVJST1JTLk5PVF9BX1ZBTElEX1JFTEFUSVZFX0NPTE9SfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgX2NhbGN1bGF0ZShvcGVyYXRpb24sIHZhcnMpIHtcbiAgICAgICAgdGhpcy5fb3BlcmF0aW9ucy5mb3JFYWNoKChtZXRob2QsIHJlZ0V4cCkgPT4ge1xuICAgICAgICAgICAgbGV0IHN0YWNrID0gMDtcbiAgICAgICAgICAgIHdoaWxlIChyZWdFeHAudGVzdChvcGVyYXRpb24pICYmIHN0YWNrIDwgTUFYX1NUQUNLKSB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gb3BlcmF0aW9uLnJlcGxhY2UocmVnRXhwLCAoX19tYXRjaCwgbGVmdCwgcmlnaHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCh2YXJzW2xlZnRdID8/ICtsZWZ0LCB2YXJzW3JpZ2h0XSA/PyArcmlnaHQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhY2srKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiArb3BlcmF0aW9uO1xuICAgIH1cbiAgICBnZXQgcmVzdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJBU0VfMjU1LCBDT0xPUlJFR1MsIENvbG9yTW9kZWwsIENvbG9yVW5pdEVudW0sIEhFWCwgUENFTlQgfSBmcm9tICcjY29uc3RhbnRzJztcbmltcG9ydCB7IGZyb20yNTVOdW1iZXJUb1BlcmNlbnQsIGdldEJhc2UyNTVOdW1iZXIsIGlzU3RyaW5nLCBpc1JHQk9iamVjdCwgaXNVbmRlZmluZWQsIG5vcm1hbGl6ZUFscGhhLCByb3VuZCB9IGZyb20gJyN1dGlsaXRpZXMnO1xuaW1wb3J0IHsgZ2V0Q1NTQWxwaGEsIGdldENTU0NvbW1hLCBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUsIHByZXBhcmVDb2xvckZvckNzcyB9IGZyb20gJyNjc3MnO1xuaW1wb3J0IHsgZ2V0UkdCIH0gZnJvbSAnI2NvbG9yL3JnYic7XG5pbXBvcnQgeyBDYWxjUGFyc2VyIH0gZnJvbSAnLi9DYWxjUGFyc2VyJztcbmltcG9ydCB7IENvbG9yUGFyc2VyIH0gZnJvbSAnLi9Db2xvclBhcnNlckNvbnRleHQnO1xuZXhwb3J0IGNsYXNzIFJHQlBhcnNlciBleHRlbmRzIENvbG9yUGFyc2VyIHtcbiAgICBfZXh0cmFjdChpbnB1dCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKENPTE9SUkVHUy5SR0IpO1xuICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXBzO1xuICAgIH1cbiAgICBzdXBwb3J0cyhpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ09MT1JSRUdTLlJHQi50ZXN0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoYXNJbnZhbGlkUmVnYiA9IE9iamVjdC5lbnRyaWVzKGlucHV0KS5zb21lKChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIShQQ0VOVC50ZXN0KGAke2l0ZW1bMV19YCkgfHxcbiAgICAgICAgICAgICAgICAoIUhFWC50ZXN0KGAke2l0ZW1bMV19YCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWlzTmFOKCtpdGVtWzFdKSAmJlxuICAgICAgICAgICAgICAgICAgICAraXRlbVsxXSA8PSBCQVNFXzI1NSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGlzUkdCT2JqZWN0KGlucHV0KSAmJiAhaGFzSW52YWxpZFJlZ2I7XG4gICAgfVxuICAgIHBhcnNlKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgeyByX2xlZ2FjeSwgZ19sZWdhY3ksIGJfbGVnYWN5LCBhX2xlZ2FjeSwgciwgZywgYiwgYSwgZnJvbSwgcmVsYXRpdmVfciwgcmVsYXRpdmVfZywgcmVsYXRpdmVfYiwgcmVsYXRpdmVfYSB9ID0gZ3JvdXBzO1xuICAgICAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQ29sb3IgPSBjb250ZXh0LnBhcnNlKGZyb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21SR0IgPSBnZXRSR0IoZnJvbUNvbG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tUkdCVmFycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcjogZnJvbVJHQi5SLFxuICAgICAgICAgICAgICAgICAgICBnOiBmcm9tUkdCLkcsXG4gICAgICAgICAgICAgICAgICAgIGI6IGZyb21SR0IuQixcbiAgICAgICAgICAgICAgICAgICAgYWxwaGE6IGZyb21SR0IuQSA/PyAxXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBSID0gbmV3IENhbGNQYXJzZXIoJ3InLCByZWxhdGl2ZV9yLCBmcm9tUkdCVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IEcgPSBuZXcgQ2FsY1BhcnNlcignZycsIHJlbGF0aXZlX2csIGZyb21SR0JWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgQiA9IG5ldyBDYWxjUGFyc2VyKCdiJywgcmVsYXRpdmVfYiwgZnJvbVJHQlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSB7XG4gICAgICAgICAgICAgICAgICAgIFI6IE1hdGgubWluKFIsIEJBU0VfMjU1KSxcbiAgICAgICAgICAgICAgICAgICAgRzogTWF0aC5taW4oRywgQkFTRV8yNTUpLFxuICAgICAgICAgICAgICAgICAgICBCOiBNYXRoLm1pbihCLCBCQVNFXzI1NSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZV9hKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IEEgPSBuZXcgQ2FsY1BhcnNlcignYWxwaGEnLCByZWxhdGl2ZV9hLCBmcm9tUkdCVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICByZ2IuQSA9IE1hdGgubWluKEEsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmdiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgUiA9IHJfbGVnYWN5ID8/IHI7XG4gICAgICAgICAgICAgICAgY29uc3QgRyA9IGdfbGVnYWN5ID8/IGc7XG4gICAgICAgICAgICAgICAgY29uc3QgQiA9IGJfbGVnYWN5ID8/IGI7XG4gICAgICAgICAgICAgICAgY29uc3QgQSA9IGFfbGVnYWN5ID8/IGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgUjogTWF0aC5taW4oZ2V0QmFzZTI1NU51bWJlcihSKSwgQkFTRV8yNTUpLFxuICAgICAgICAgICAgICAgICAgICBHOiBNYXRoLm1pbihnZXRCYXNlMjU1TnVtYmVyKEcpLCBCQVNFXzI1NSksXG4gICAgICAgICAgICAgICAgICAgIEI6IE1hdGgubWluKGdldEJhc2UyNTVOdW1iZXIoQiksIEJBU0VfMjU1KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKEEpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOiBub3JtYWxpemVBbHBoYShBKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBSOiBnZXRCYXNlMjU1TnVtYmVyKGAke2lucHV0LlJ9YCksXG4gICAgICAgICAgICBHOiBnZXRCYXNlMjU1TnVtYmVyKGAke2lucHV0Lkd9YCksXG4gICAgICAgICAgICBCOiBnZXRCYXNlMjU1TnVtYmVyKGAke2lucHV0LkJ9YCksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IE1hdGgubWluKGdldEJhc2UyNTVOdW1iZXIoYCR7aW5wdXQuQX1gLCB0cnVlKSwgMSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb252ZXJ0KGNvbG9yLCBkZWNpbWFscywgd2l0aEFscGhhKSB7XG4gICAgICAgIGNvbnN0IHJnYiA9IGlzUkdCT2JqZWN0KGNvbG9yKVxuICAgICAgICAgICAgPyBjb2xvclxuICAgICAgICAgICAgOiBnZXRSR0IoY29sb3IpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRSR0JPYmplY3Qoe1xuICAgICAgICAgICAgUjogcmdiLlIsXG4gICAgICAgICAgICBHOiByZ2IuRyxcbiAgICAgICAgICAgIEI6IHJnYi5CLFxuICAgICAgICAgICAgLi4uKHdpdGhBbHBoYVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBBOiByZ2IuQSA/PyAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pXG4gICAgICAgIH0sIGRlY2ltYWxzKTtcbiAgICB9XG4gICAgY29udmVydENTUyhjb2xvciwgb3B0aW9ucywgd2l0aEFscGhhKSB7XG4gICAgICAgIGNvbnN0IHsgZGVjaW1hbHMsIGxlZ2FjeUNTUywgc3BhY2VzQWZ0ZXJDb21tYXMsIHJnYlVuaXQgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHJnYiA9IHRoaXMuY29udmVydChjb2xvciwgb3B0aW9ucy5kZWNpbWFscywgd2l0aEFscGhhKTtcbiAgICAgICAgY29uc3QgY29tbWEgPSBnZXRDU1NDb21tYShzcGFjZXNBZnRlckNvbW1hcyk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJnYlVuaXQgPT09IENvbG9yVW5pdEVudW0uUEVSQ0VOVCAmJiBpbmRleCA8IDNcbiAgICAgICAgICAgICAgICA/IGAke2Zyb20yNTVOdW1iZXJUb1BlcmNlbnQodmFsdWUsIGRlY2ltYWxzKX0lYFxuICAgICAgICAgICAgICAgIDogKGluZGV4ID09PSAzXG4gICAgICAgICAgICAgICAgICAgID8gZ2V0Q1NTQWxwaGEodmFsdWUsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIDogcm91bmQodmFsdWUsIGRlY2ltYWxzKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHByZXBhcmVDb2xvckZvckNzcyhyZ2IsIHRyYW5zZm9ybWVyKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBsZWdhY3lDU1NcbiAgICAgICAgICAgID8gKHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgICAgICA/IGByZ2JhKHsxfSR7Y29tbWF9ezJ9JHtjb21tYX17M30ke2NvbW1hfXs0fSlgXG4gICAgICAgICAgICAgICAgOiBgcmdiKHsxfSR7Y29tbWF9ezJ9JHtjb21tYX17M30pYClcbiAgICAgICAgICAgIDogKHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgICAgICA/IGByZ2IoezF9IHsyfSB7M30gLyB7NH0pYFxuICAgICAgICAgICAgICAgIDogYHJnYih7MX0gezJ9IHszfSlgKTtcbiAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWVzKTtcbiAgICB9XG4gICAgX3JvdW5kUkdCT2JqZWN0KGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICBjb25zdCBSID0gcm91bmQoY29sb3IuUiwgZGVjaW1hbHMpO1xuICAgICAgICBjb25zdCBHID0gcm91bmQoY29sb3IuRywgZGVjaW1hbHMpO1xuICAgICAgICBjb25zdCBCID0gcm91bmQoY29sb3IuQiwgZGVjaW1hbHMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgUixcbiAgICAgICAgICAgIEcsXG4gICAgICAgICAgICBCLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGNvbG9yLkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiByb3VuZChjb2xvci5BLCBkZWNpbWFscylcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRDU1NPcHRpb25zKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICBjb25zdCB7IHJfbGVnYWN5LCBnX2xlZ2FjeSwgYl9sZWdhY3ksIGFfbGVnYWN5LCByLCBnLCBiLCBhIH0gPSBncm91cHM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlVmFsdWVzOiAoUENFTlQudGVzdChyX2xlZ2FjeSA/PyByKSAmJlxuICAgICAgICAgICAgICAgIFBDRU5ULnRlc3QoZ19sZWdhY3kgPz8gZykgJiZcbiAgICAgICAgICAgICAgICBQQ0VOVC50ZXN0KGJfbGVnYWN5ID8/IGIpKSxcbiAgICAgICAgICAgIGhhc1BlcmNlbnRhZ2VBbHBoYTogUENFTlQudGVzdChhX2xlZ2FjeSA/PyBhKSxcbiAgICAgICAgICAgIGhhc0FscGhhOiAhaXNVbmRlZmluZWQoYV9sZWdhY3kgPz8gYSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gQ29sb3JNb2RlbC5SR0I7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ09MT1JSRUdTLCBDb2xvck1vZGVsLCBNQVhfQUxQSEEsIFBDRU5UIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRBbmdsZVVuaXQsIGlzSFNMT2JqZWN0LCBpc1N0cmluZywgaXNVbmRlZmluZWQsIG1pbm1heCwgbm9ybWFsaXplQWxwaGEsIG5vcm1hbGl6ZUh1ZSwgcGVyY2VudCwgcm91bmQgfSBmcm9tICcjdXRpbGl0aWVzJztcbmltcG9ydCB7IGJ1aWxkQ1NTSHVlVHJhbnNmb3JtZXIsIGdldENTU0NvbW1hLCBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUsIHByZXBhcmVDb2xvckZvckNzcyB9IGZyb20gJyNjc3MnO1xuaW1wb3J0IHsgZ2V0UkdCIH0gZnJvbSAnI2NvbG9yL3JnYic7XG5pbXBvcnQgeyByZ2JUb0hzbCB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBDYWxjUGFyc2VyIH0gZnJvbSAnLi9DYWxjUGFyc2VyJztcbmltcG9ydCB7IENvbG9yUGFyc2VyIH0gZnJvbSAnLi9Db2xvclBhcnNlckNvbnRleHQnO1xuZXhwb3J0IGNsYXNzIEhTTFBhcnNlciBleHRlbmRzIENvbG9yUGFyc2VyIHtcbiAgICBfZXh0cmFjdChpbnB1dCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKENPTE9SUkVHUy5IU0wpO1xuICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXBzO1xuICAgIH1cbiAgICBzdXBwb3J0cyhpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ09MT1JSRUdTLkhTTC50ZXN0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNIU0xPYmplY3QoaW5wdXQpO1xuICAgIH1cbiAgICBwYXJzZShpbnB1dCwgY29udGV4dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLl9leHRyYWN0KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IHsgaF9sZWdhY3ksIHNfbGVnYWN5LCBsX2xlZ2FjeSwgYV9sZWdhY3ksIGgsIHMsIGwsIGEsIGZyb20sIHJlbGF0aXZlX2gsIHJlbGF0aXZlX3MsIHJlbGF0aXZlX2wsIHJlbGF0aXZlX2EgfSA9IGdyb3VwcztcbiAgICAgICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUNvbG9yID0gY29udGV4dC5wYXJzZShmcm9tKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tUkdCID0gZ2V0UkdCKGZyb21Db2xvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUhTTCA9IHJnYlRvSHNsKGZyb21SR0IuUiwgZnJvbVJHQi5HLCBmcm9tUkdCLkIsIGZyb21SR0IuQSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUhTTFZhcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGg6IGZyb21IU0wuSCxcbiAgICAgICAgICAgICAgICAgICAgczogZnJvbUhTTC5TLFxuICAgICAgICAgICAgICAgICAgICBsOiBmcm9tSFNMLkwsXG4gICAgICAgICAgICAgICAgICAgIGFscGhhOiBmcm9tSFNMLkFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IEggPSBuZXcgQ2FsY1BhcnNlcignaCcsIHJlbGF0aXZlX2gsIGZyb21IU0xWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgUyA9IG5ldyBDYWxjUGFyc2VyKCdzJywgcmVsYXRpdmVfcywgZnJvbUhTTFZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBMID0gbmV3IENhbGNQYXJzZXIoJ2wnLCByZWxhdGl2ZV9sLCBmcm9tSFNMVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGhzbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgSDogbm9ybWFsaXplSHVlKEgpLFxuICAgICAgICAgICAgICAgICAgICBTOiBwZXJjZW50KFMpLFxuICAgICAgICAgICAgICAgICAgICBMOiBwZXJjZW50KEwpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmVfYSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBBID0gbmV3IENhbGNQYXJzZXIoJ2FscGhhJywgcmVsYXRpdmVfYSwgZnJvbUhTTFZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaHNsLkEgPSBtaW5tYXgoQSwgMCwgTUFYX0FMUEhBKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhzbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IEggPSBoX2xlZ2FjeSA/PyBoO1xuICAgICAgICAgICAgICAgIGNvbnN0IFMgPSBzX2xlZ2FjeSA/PyBzO1xuICAgICAgICAgICAgICAgIGNvbnN0IEwgPSBsX2xlZ2FjeSA/PyBsO1xuICAgICAgICAgICAgICAgIGNvbnN0IEEgPSBhX2xlZ2FjeSA/PyBhO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIEg6IG5vcm1hbGl6ZUh1ZShIKSxcbiAgICAgICAgICAgICAgICAgICAgUzogcGVyY2VudChTKSxcbiAgICAgICAgICAgICAgICAgICAgTDogcGVyY2VudChMKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKEEpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOiBub3JtYWxpemVBbHBoYShBKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBIOiBub3JtYWxpemVIdWUoaW5wdXQuSCksXG4gICAgICAgICAgICBTOiBwZXJjZW50KGAke2lucHV0LlN9YCksXG4gICAgICAgICAgICBMOiBwZXJjZW50KGAke2lucHV0Lkx9YCksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IG1pbm1heCgraW5wdXQuQSwgMCwgTUFYX0FMUEhBKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnZlcnQoY29sb3IsIGRlY2ltYWxzLCB3aXRoQWxwaGEpIHtcbiAgICAgICAgbGV0IGhzbDtcbiAgICAgICAgaWYgKGlzSFNMT2JqZWN0KGNvbG9yKSkge1xuICAgICAgICAgICAgaHNsID0gY29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZ2IgPSBnZXRSR0IoY29sb3IpO1xuICAgICAgICAgICAgaHNsID0gcmdiVG9Ic2wocmdiLlIsIHJnYi5HLCByZ2IuQiwgcmdiLkEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3VuZEhTTE9iamVjdCh7XG4gICAgICAgICAgICBIOiBoc2wuSCxcbiAgICAgICAgICAgIFM6IGhzbC5TLFxuICAgICAgICAgICAgTDogaHNsLkwsXG4gICAgICAgICAgICAuLi4od2l0aEFscGhhXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIEE6IGhzbC5BID8/IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSlcbiAgICAgICAgfSwgZGVjaW1hbHMpO1xuICAgIH1cbiAgICBjb252ZXJ0Q1NTKGNvbG9yLCBvcHRpb25zLCB3aXRoQWxwaGEpIHtcbiAgICAgICAgY29uc3QgeyBsZWdhY3lDU1MsIHNwYWNlc0FmdGVyQ29tbWFzIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBjb21tYSA9IGdldENTU0NvbW1hKHNwYWNlc0FmdGVyQ29tbWFzKTtcbiAgICAgICAgY29uc3QgaHNsID0gdGhpcy5jb252ZXJ0KGNvbG9yLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IGJ1aWxkQ1NTSHVlVHJhbnNmb3JtZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHByZXBhcmVDb2xvckZvckNzcyhoc2wsIHRyYW5zZm9ybWVyKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBsZWdhY3lDU1NcbiAgICAgICAgICAgID8gKHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgICAgICA/IGBoc2xhKHsxfSR7Y29tbWF9ezJ9JSR7Y29tbWF9ezN9JSR7Y29tbWF9ezR9KWBcbiAgICAgICAgICAgICAgICA6IGBoc2woezF9JHtjb21tYX17Mn0lJHtjb21tYX17M30lKWApXG4gICAgICAgICAgICA6ICh2YWx1ZXMubGVuZ3RoID09PSA0XG4gICAgICAgICAgICAgICAgPyBgaHNsKHsxfSB7Mn0lIHszfSUgLyB7NH0pYFxuICAgICAgICAgICAgICAgIDogYGhzbCh7MX0gezJ9JSB7M30lKWApO1xuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlKHRlbXBsYXRlLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBfcm91bmRIU0xPYmplY3QoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBIOiByb3VuZChub3JtYWxpemVIdWUoY29sb3IuSCksIGRlY2ltYWxzKSxcbiAgICAgICAgICAgIFM6IHJvdW5kKGNvbG9yLlMsIGRlY2ltYWxzKSxcbiAgICAgICAgICAgIEw6IHJvdW5kKGNvbG9yLkwsIGRlY2ltYWxzKSxcbiAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChjb2xvci5BKVxuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgQTogcm91bmQoY29sb3IuQSwgZGVjaW1hbHMpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0Q1NTT3B0aW9ucyhpbnB1dCkge1xuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLl9leHRyYWN0KGlucHV0KTtcbiAgICAgICAgY29uc3QgeyBoX2xlZ2FjeSwgaCwgYV9sZWdhY3ksIGEgfSA9IGdyb3VwcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFuZ2xlVW5pdDogZ2V0QW5nbGVVbml0KGhfbGVnYWN5ID8/IGgpLFxuICAgICAgICAgICAgaGFzUGVyY2VudGFnZUFscGhhOiBQQ0VOVC50ZXN0KGFfbGVnYWN5ID8/IGEpLFxuICAgICAgICAgICAgaGFzQWxwaGE6ICFpc1VuZGVmaW5lZChhX2xlZ2FjeSA/PyBhKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1vZGVsLkhTTDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDT0xPUlJFR1MsIENvbG9yTW9kZWwsIE1BWF9BTFBIQSwgTUFYX0hVRSwgTUFYX1BDRU5ULCBQQ0VOVCB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0QW5nbGVVbml0LCBpc0hXQk9iamVjdCwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLCBtaW5tYXgsIG5vcm1hbGl6ZUFscGhhLCBub3JtYWxpemVIdWUsIHBlcmNlbnQsIHJvdW5kIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5pbXBvcnQgeyBidWlsZENTU0h1ZVRyYW5zZm9ybWVyLCBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUsIHByZXBhcmVDb2xvckZvckNzcyB9IGZyb20gJyNjc3MnO1xuaW1wb3J0IHsgZ2V0UkdCIH0gZnJvbSAnI2NvbG9yL3JnYic7XG5pbXBvcnQgeyByZ2JUb0h3YiB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBDYWxjUGFyc2VyIH0gZnJvbSAnLi9DYWxjUGFyc2VyJztcbmltcG9ydCB7IENvbG9yUGFyc2VyIH0gZnJvbSAnLi9Db2xvclBhcnNlckNvbnRleHQnO1xuZXhwb3J0IGNsYXNzIEhXQlBhcnNlciBleHRlbmRzIENvbG9yUGFyc2VyIHtcbiAgICBfZXh0cmFjdChpbnB1dCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKENPTE9SUkVHUy5IV0IpO1xuICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXBzO1xuICAgIH1cbiAgICBzdXBwb3J0cyhpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ09MT1JSRUdTLkhXQi50ZXN0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNIV0JPYmplY3QoaW5wdXQpO1xuICAgIH1cbiAgICBwYXJzZShpbnB1dCwgY29udGV4dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLl9leHRyYWN0KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IHsgaCwgdywgYiwgYSwgZnJvbSwgcmVsYXRpdmVfaCwgcmVsYXRpdmVfdywgcmVsYXRpdmVfYiwgcmVsYXRpdmVfYSB9ID0gZ3JvdXBzO1xuICAgICAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQ29sb3IgPSBjb250ZXh0LnBhcnNlKGZyb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21SR0IgPSBnZXRSR0IoZnJvbUNvbG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tSFdCID0gcmdiVG9Id2IoZnJvbVJHQi5SLCBmcm9tUkdCLkcsIGZyb21SR0IuQiwgZnJvbVJHQi5BKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tSFdCVmFycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaDogZnJvbUhXQi5ILFxuICAgICAgICAgICAgICAgICAgICB3OiBmcm9tSFdCLlcsXG4gICAgICAgICAgICAgICAgICAgIGI6IGZyb21IV0IuQixcbiAgICAgICAgICAgICAgICAgICAgYWxwaGE6IGZyb21IV0IuQVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgSCA9IG5ldyBDYWxjUGFyc2VyKCdoJywgcmVsYXRpdmVfaCwgZnJvbUhXQlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBXID0gbmV3IENhbGNQYXJzZXIoJ3cnLCByZWxhdGl2ZV93LCBmcm9tSFdCVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IEIgPSBuZXcgQ2FsY1BhcnNlcignYicsIHJlbGF0aXZlX2IsIGZyb21IV0JWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaHdiID0ge1xuICAgICAgICAgICAgICAgICAgICBIOiBtaW5tYXgoSCwgMCwgTUFYX0hVRSksXG4gICAgICAgICAgICAgICAgICAgIFc6IG1pbm1heChXLCAwLCBNQVhfUENFTlQpLFxuICAgICAgICAgICAgICAgICAgICBCOiBtaW5tYXgoQiwgMCwgTUFYX1BDRU5UKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgQSA9IG5ldyBDYWxjUGFyc2VyKCdhbHBoYScsIHJlbGF0aXZlX2EsIGZyb21IV0JWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGh3Yi5BID0gbWlubWF4KEEsIDAsIE1BWF9BTFBIQSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBod2I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBIOiBub3JtYWxpemVIdWUoaCksXG4gICAgICAgICAgICAgICAgICAgIFc6IHBlcmNlbnQodyksXG4gICAgICAgICAgICAgICAgICAgIEI6IHBlcmNlbnQoYiksXG4gICAgICAgICAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChhKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTogbm9ybWFsaXplQWxwaGEoYSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgSDogbm9ybWFsaXplSHVlKGlucHV0LkgpLFxuICAgICAgICAgICAgVzogcGVyY2VudChpbnB1dC5XKSxcbiAgICAgICAgICAgIEI6IHBlcmNlbnQoaW5wdXQuQiksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IG5vcm1hbGl6ZUFscGhhKGlucHV0LkEpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29udmVydChjb2xvciwgZGVjaW1hbHMsIHdpdGhBbHBoYSkge1xuICAgICAgICBsZXQgaHdiO1xuICAgICAgICBpZiAoaXNIV0JPYmplY3QoY29sb3IpKSB7XG4gICAgICAgICAgICBod2IgPSBjb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IGdldFJHQihjb2xvcik7XG4gICAgICAgICAgICBod2IgPSByZ2JUb0h3YihyZ2IuUiwgcmdiLkcsIHJnYi5CLCByZ2IuQSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdW5kSFdCT2JqZWN0KHtcbiAgICAgICAgICAgIEg6IGh3Yi5ILFxuICAgICAgICAgICAgVzogaHdiLlcsXG4gICAgICAgICAgICBCOiBod2IuQixcbiAgICAgICAgICAgIC4uLih3aXRoQWxwaGFcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgQTogaHdiLkEgPz8gMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KVxuICAgICAgICB9LCBkZWNpbWFscyk7XG4gICAgfVxuICAgIGNvbnZlcnRDU1MoY29sb3IsIG9wdGlvbnMsIHdpdGhBbHBoYSkge1xuICAgICAgICBjb25zdCBod2IgPSB0aGlzLmNvbnZlcnQoY29sb3IsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gYnVpbGRDU1NIdWVUcmFuc2Zvcm1lcihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcHJlcGFyZUNvbG9yRm9yQ3NzKGh3YiwgdHJhbnNmb3JtZXIpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgID8gYGh3Yih7MX0gezJ9JSB7M30lIC8gezR9KWBcbiAgICAgICAgICAgIDogYGh3Yih7MX0gezJ9JSB7M30lKWA7XG4gICAgICAgIHJldHVybiBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUodGVtcGxhdGUsIHZhbHVlcyk7XG4gICAgfVxuICAgIF9yb3VuZEhXQk9iamVjdChjb2xvciwgZGVjaW1hbHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEg6IHJvdW5kKG5vcm1hbGl6ZUh1ZShjb2xvci5IKSwgZGVjaW1hbHMpLFxuICAgICAgICAgICAgVzogcm91bmQoY29sb3IuVywgZGVjaW1hbHMpLFxuICAgICAgICAgICAgQjogcm91bmQoY29sb3IuQiwgZGVjaW1hbHMpLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGNvbG9yLkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiByb3VuZChjb2xvci5BLCBkZWNpbWFscylcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRDU1NPcHRpb25zKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYW5nbGVVbml0OiBnZXRBbmdsZVVuaXQoZ3JvdXBzLmgpLFxuICAgICAgICAgICAgaGFzUGVyY2VudGFnZUFscGhhOiBQQ0VOVC50ZXN0KGdyb3Vwcy5hKSxcbiAgICAgICAgICAgIGhhc0FscGhhOiAhaXNVbmRlZmluZWQoZ3JvdXBzLmEpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yTW9kZWwuSFdCO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENvbG9yTW9kZWwsIENPTE9SUkVHUywgQ29sb3JVbml0RW51bSwgTUFYX0FMUEhBLCBNQVhfTEFCLCBNQVhfUENFTlQsIFBDRU5UIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBmcm9tMTI1TnVtYmVyVG9QZXJjZW50LCBnZXRCYXNlMTI1TnVtYmVyLCBpc0NJRUxhYk9iamVjdCwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLCBtaW5tYXgsIG5vcm1hbGl6ZUFscGhhLCBwZXJjZW50LCByb3VuZCB9IGZyb20gJyN1dGlsaXRpZXMnO1xuaW1wb3J0IHsgZ2V0Q1NTQWxwaGEsIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSwgcHJlcGFyZUNvbG9yRm9yQ3NzIH0gZnJvbSAnI2Nzcyc7XG5pbXBvcnQgeyBnZXRSR0IgfSBmcm9tICcjY29sb3IvcmdiJztcbmltcG9ydCB7IHJnYlRvTGFiIH0gZnJvbSAnI2NvbG9yL3RyYW5zbGF0b3JzJztcbmltcG9ydCB7IENhbGNQYXJzZXIgfSBmcm9tICcuL0NhbGNQYXJzZXInO1xuaW1wb3J0IHsgQ29sb3JQYXJzZXIgfSBmcm9tICcuL0NvbG9yUGFyc2VyQ29udGV4dCc7XG5leHBvcnQgY2xhc3MgQ0lFTGFiUGFyc2VyIGV4dGVuZHMgQ29sb3JQYXJzZXIge1xuICAgIF9leHRyYWN0KGlucHV0KSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goQ09MT1JSRUdTLkNJRUxhYik7XG4gICAgICAgIHJldHVybiBtYXRjaC5ncm91cHM7XG4gICAgfVxuICAgIHN1cHBvcnRzKGlucHV0KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBDT0xPUlJFR1MuQ0lFTGFiLnRlc3QoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0NJRUxhYk9iamVjdChpbnB1dCk7XG4gICAgfVxuICAgIHBhcnNlKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgeyBMLCBhLCBiLCBBLCBmcm9tLCByZWxhdGl2ZV9MLCByZWxhdGl2ZV9hLCByZWxhdGl2ZV9iLCByZWxhdGl2ZV9BIH0gPSBncm91cHM7XG4gICAgICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Db2xvciA9IGNvbnRleHQucGFyc2UoZnJvbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVJHQiA9IGdldFJHQihmcm9tQ29sb3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21DSUVMYWIgPSByZ2JUb0xhYihmcm9tUkdCLlIsIGZyb21SR0IuRywgZnJvbVJHQi5CKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQ0lFTGFiVmFycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbDogZnJvbUNJRUxhYi5MLFxuICAgICAgICAgICAgICAgICAgICBhOiBmcm9tQ0lFTGFiLmEsXG4gICAgICAgICAgICAgICAgICAgIGI6IGZyb21DSUVMYWIuYixcbiAgICAgICAgICAgICAgICAgICAgYWxwaGE6IGZyb21SR0IuQSA/PyAxXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBMID0gbmV3IENhbGNQYXJzZXIoJ2wnLCByZWxhdGl2ZV9MLCBmcm9tQ0lFTGFiVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBuZXcgQ2FsY1BhcnNlcignYScsIHJlbGF0aXZlX2EsIGZyb21DSUVMYWJWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYiA9IG5ldyBDYWxjUGFyc2VyKCdiJywgcmVsYXRpdmVfYiwgZnJvbUNJRUxhYlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBDSUVMYWIgPSB7XG4gICAgICAgICAgICAgICAgICAgIEw6IG1pbm1heChMLCAwLCBNQVhfUENFTlQpLFxuICAgICAgICAgICAgICAgICAgICBhOiBtaW5tYXgoYSwgLU1BWF9MQUIsIE1BWF9MQUIpLFxuICAgICAgICAgICAgICAgICAgICBiOiBtaW5tYXgoYiwgLU1BWF9MQUIsIE1BWF9MQUIpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmVfQSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBBID0gbmV3IENhbGNQYXJzZXIoJ2FscGhhJywgcmVsYXRpdmVfQSwgZnJvbUNJRUxhYlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgQ0lFTGFiLkEgPSBtaW5tYXgoQSwgMCwgTUFYX0FMUEhBKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIENJRUxhYjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIEw6IHBlcmNlbnQoTCksXG4gICAgICAgICAgICAgICAgICAgIGE6IGdldEJhc2UxMjVOdW1iZXIoYSksXG4gICAgICAgICAgICAgICAgICAgIGI6IGdldEJhc2UxMjVOdW1iZXIoYiksXG4gICAgICAgICAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChBKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTogbm9ybWFsaXplQWxwaGEoQSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgTDogcGVyY2VudChpbnB1dC5MKSxcbiAgICAgICAgICAgIGE6IGdldEJhc2UxMjVOdW1iZXIoYCR7aW5wdXQuYX1gKSxcbiAgICAgICAgICAgIGI6IGdldEJhc2UxMjVOdW1iZXIoYCR7aW5wdXQuYn1gKSxcbiAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChpbnB1dC5BKVxuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgQTogbm9ybWFsaXplQWxwaGEoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb252ZXJ0KGNvbG9yLCBkZWNpbWFscywgd2l0aEFscGhhKSB7XG4gICAgICAgIGxldCBsYWI7XG4gICAgICAgIGlmIChpc0NJRUxhYk9iamVjdChjb2xvcikpIHtcbiAgICAgICAgICAgIGxhYiA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmdiID0gZ2V0UkdCKGNvbG9yKTtcbiAgICAgICAgICAgIGxhYiA9IHJnYlRvTGFiKHJnYi5SLCByZ2IuRywgcmdiLkIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3VuZENJRUxhYk9iamVjdCh7XG4gICAgICAgICAgICBMOiBsYWIuTCxcbiAgICAgICAgICAgIGE6IGxhYi5hLFxuICAgICAgICAgICAgYjogbGFiLmIsXG4gICAgICAgICAgICAuLi4od2l0aEFscGhhXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIEE6ICsoY29sb3IuQSA/PyAxKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KVxuICAgICAgICB9LCBkZWNpbWFscyk7XG4gICAgfVxuICAgIGNvbnZlcnRDU1MoY29sb3IsIG9wdGlvbnMsIHdpdGhBbHBoYSkge1xuICAgICAgICBjb25zdCB7IGRlY2ltYWxzLCBsYWJVbml0IH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBsYWIgPSB0aGlzLmNvbnZlcnQoY29sb3IsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgTCA9IHJvdW5kKHBlcmNlbnQodmFsdWUpLCBkZWNpbWFscyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhYlVuaXQgPT09IENvbG9yVW5pdEVudW0uUEVSQ0VOVFxuICAgICAgICAgICAgICAgICAgICA/IGAke0x9JWBcbiAgICAgICAgICAgICAgICAgICAgOiBgJHtMfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggPCAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhYlVuaXQgPT09IENvbG9yVW5pdEVudW0uUEVSQ0VOVFxuICAgICAgICAgICAgICAgICAgICA/IGAke2Zyb20xMjVOdW1iZXJUb1BlcmNlbnQodmFsdWUsIGRlY2ltYWxzKX0lYFxuICAgICAgICAgICAgICAgICAgICA6IHJvdW5kKHZhbHVlLCBkZWNpbWFscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q1NTQWxwaGEodmFsdWUsIG9wdGlvbnMsIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MobGFiLCB0cmFuc2Zvcm1lcik7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgPyBgbGFiKHsxfSB7Mn0gezN9IC8gezR9KWBcbiAgICAgICAgICAgIDogYGxhYih7MX0gezJ9IHszfSlgO1xuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlKHRlbXBsYXRlLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBfcm91bmRDSUVMYWJPYmplY3QoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBMOiByb3VuZChjb2xvci5MLCBkZWNpbWFscyksXG4gICAgICAgICAgICBhOiByb3VuZChjb2xvci5hLCBkZWNpbWFscyksXG4gICAgICAgICAgICBiOiByb3VuZChjb2xvci5iLCBkZWNpbWFscyksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoY29sb3IuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IHJvdW5kKGNvbG9yLkEsIGRlY2ltYWxzKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldENTU09wdGlvbnMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgTCwgYSwgYiwgQSB9ID0gZ3JvdXBzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFzUGVyY2VudGFnZVZhbHVlczogKFBDRU5ULnRlc3QoTCkgJiZcbiAgICAgICAgICAgICAgICBQQ0VOVC50ZXN0KGEpICYmXG4gICAgICAgICAgICAgICAgUENFTlQudGVzdChiKSksXG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlQWxwaGE6IFBDRU5ULnRlc3QoQSksXG4gICAgICAgICAgICBoYXNBbHBoYTogIWlzVW5kZWZpbmVkKEEpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yTW9kZWwuQ0lFTGFiO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFuZ2xlc1VuaXRFbnVtLCBDT0xPUlJFR1MsIENvbG9yTW9kZWwsIENvbG9yVW5pdEVudW0sIE1BWF9BTFBIQSwgTUFYX0xDSF9DLCBNQVhfUENFTlQsIFBDRU5UIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBmcm9tMTUwTnVtYmVyVG9QZXJjZW50LCBnZXRBbmdsZVVuaXQsIGdldEJhc2UxNTBOdW1iZXIsIGlzTENIT2JqZWN0LCBpc1N0cmluZywgaXNVbmRlZmluZWQsIG1pbm1heCwgbm9ybWFsaXplQWxwaGEsIG5vcm1hbGl6ZUh1ZSwgcGVyY2VudCwgcm91bmQsIHRyYW5zbGF0ZURlZ3JlZXMgfSBmcm9tICcjdXRpbGl0aWVzJztcbmltcG9ydCB7IGdldENTU0FscGhhLCBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUsIHByZXBhcmVDb2xvckZvckNzcyB9IGZyb20gJyNjc3MnO1xuaW1wb3J0IHsgZ2V0UkdCIH0gZnJvbSAnI2NvbG9yL3JnYic7XG5pbXBvcnQgeyByZ2JUb0xjaCB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBDYWxjUGFyc2VyIH0gZnJvbSAnLi9DYWxjUGFyc2VyJztcbmltcG9ydCB7IENvbG9yUGFyc2VyIH0gZnJvbSAnLi9Db2xvclBhcnNlckNvbnRleHQnO1xuZXhwb3J0IGNsYXNzIExDSFBhcnNlciBleHRlbmRzIENvbG9yUGFyc2VyIHtcbiAgICBfZXh0cmFjdChpbnB1dCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKENPTE9SUkVHUy5MQ0gpO1xuICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXBzO1xuICAgIH1cbiAgICBzdXBwb3J0cyhpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ09MT1JSRUdTLkxDSC50ZXN0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNMQ0hPYmplY3QoaW5wdXQpO1xuICAgIH1cbiAgICBwYXJzZShpbnB1dCwgY29udGV4dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLl9leHRyYWN0KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IHsgbCwgYywgaCwgYSwgZnJvbSwgcmVsYXRpdmVfbCwgcmVsYXRpdmVfYywgcmVsYXRpdmVfaCwgcmVsYXRpdmVfYSB9ID0gZ3JvdXBzO1xuICAgICAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQ29sb3IgPSBjb250ZXh0LnBhcnNlKGZyb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21SR0IgPSBnZXRSR0IoZnJvbUNvbG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tTENIID0gcmdiVG9MY2goZnJvbVJHQi5SLCBmcm9tUkdCLkcsIGZyb21SR0IuQik7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUxDSFZhcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGw6IGZyb21MQ0guTCxcbiAgICAgICAgICAgICAgICAgICAgYzogZnJvbUxDSC5DLFxuICAgICAgICAgICAgICAgICAgICBoOiBmcm9tTENILkgsXG4gICAgICAgICAgICAgICAgICAgIGFscGhhOiBmcm9tUkdCLkEgPz8gMVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgTCA9IG5ldyBDYWxjUGFyc2VyKCdsJywgcmVsYXRpdmVfbCwgZnJvbUxDSFZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBDID0gbmV3IENhbGNQYXJzZXIoJ2MnLCByZWxhdGl2ZV9jLCBmcm9tTENIVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IEggPSBuZXcgQ2FsY1BhcnNlcignaCcsIHJlbGF0aXZlX2gsIGZyb21MQ0hWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbGNoID0ge1xuICAgICAgICAgICAgICAgICAgICBMOiBtaW5tYXgoTCwgMCwgTUFYX1BDRU5UKSxcbiAgICAgICAgICAgICAgICAgICAgQzogbWlubWF4KEMsIC1NQVhfTENIX0MsIE1BWF9MQ0hfQyksXG4gICAgICAgICAgICAgICAgICAgIEg6IG5vcm1hbGl6ZUh1ZShIKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgQSA9IG5ldyBDYWxjUGFyc2VyKCdhbHBoYScsIHJlbGF0aXZlX2EsIGZyb21MQ0hWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGxjaC5BID0gbWlubWF4KEEsIDAsIE1BWF9BTFBIQSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBMOiBwZXJjZW50KGwpLFxuICAgICAgICAgICAgICAgICAgICBDOiBnZXRCYXNlMTUwTnVtYmVyKGMpLFxuICAgICAgICAgICAgICAgICAgICBIOiBub3JtYWxpemVIdWUoaCksXG4gICAgICAgICAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChhKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTogbm9ybWFsaXplQWxwaGEoYSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgTDogcGVyY2VudChpbnB1dC5MKSxcbiAgICAgICAgICAgIEM6IGdldEJhc2UxNTBOdW1iZXIoYCR7aW5wdXQuQ31gKSxcbiAgICAgICAgICAgIEg6IG5vcm1hbGl6ZUh1ZShpbnB1dC5IKSxcbiAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChpbnB1dC5BKVxuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgQTogbm9ybWFsaXplQWxwaGEoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb252ZXJ0KGNvbG9yLCBkZWNpbWFscywgd2l0aEFscGhhKSB7XG4gICAgICAgIGxldCBsY2g7XG4gICAgICAgIGlmIChpc0xDSE9iamVjdChjb2xvcikpIHtcbiAgICAgICAgICAgIGxjaCA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmdiID0gZ2V0UkdCKGNvbG9yKTtcbiAgICAgICAgICAgIGxjaCA9IHJnYlRvTGNoKHJnYi5SLCByZ2IuRywgcmdiLkIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3VuZExDSE9iamVjdCh7XG4gICAgICAgICAgICBMOiBsY2guTCxcbiAgICAgICAgICAgIEM6IGxjaC5DLFxuICAgICAgICAgICAgSDogbGNoLkgsXG4gICAgICAgICAgICAuLi4od2l0aEFscGhhXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIEE6ICsoY29sb3IuQSA/PyAxKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KVxuICAgICAgICB9LCBkZWNpbWFscyk7XG4gICAgfVxuICAgIGNvbnZlcnRDU1MoY29sb3IsIG9wdGlvbnMsIHdpdGhBbHBoYSkge1xuICAgICAgICBjb25zdCB7IGRlY2ltYWxzLCBsY2hVbml0LCBhbmdsZXNVbml0IH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBsY2ggPSB0aGlzLmNvbnZlcnQoY29sb3IsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgTCA9IHJvdW5kKHBlcmNlbnQodmFsdWUpLCBkZWNpbWFscyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxjaFVuaXQgPT09IENvbG9yVW5pdEVudW0uUEVSQ0VOVFxuICAgICAgICAgICAgICAgICAgICA/IGAke0x9JWBcbiAgICAgICAgICAgICAgICAgICAgOiBgJHtMfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGNoVW5pdCA9PT0gQ29sb3JVbml0RW51bS5QRVJDRU5UXG4gICAgICAgICAgICAgICAgICAgID8gYCR7ZnJvbTE1ME51bWJlclRvUGVyY2VudCh2YWx1ZSwgZGVjaW1hbHMpfSVgXG4gICAgICAgICAgICAgICAgICAgIDogcm91bmQodmFsdWUsIGRlY2ltYWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMikge1xuICAgICAgICAgICAgICAgIGlmIChhbmdsZXNVbml0ICE9PSBBbmdsZXNVbml0RW51bS5OT05FKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSByb3VuZCh0cmFuc2xhdGVEZWdyZWVzKHZhbHVlLCBhbmdsZXNVbml0KSwgZGVjaW1hbHMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dHJhbnNsYXRlZH0ke2FuZ2xlc1VuaXR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHZhbHVlLCBkZWNpbWFscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q1NTQWxwaGEodmFsdWUsIG9wdGlvbnMsIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MobGNoLCB0cmFuc2Zvcm1lcik7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgPyBgbGNoKHsxfSB7Mn0gezN9IC8gezR9KWBcbiAgICAgICAgICAgIDogYGxjaCh7MX0gezJ9IHszfSlgO1xuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlKHRlbXBsYXRlLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBfcm91bmRMQ0hPYmplY3QoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBMOiByb3VuZChjb2xvci5MLCBkZWNpbWFscyksXG4gICAgICAgICAgICBDOiByb3VuZChjb2xvci5DLCBkZWNpbWFscyksXG4gICAgICAgICAgICBIOiByb3VuZChub3JtYWxpemVIdWUoY29sb3IuSCksIGRlY2ltYWxzKSxcbiAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChjb2xvci5BKVxuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgQTogcm91bmQoY29sb3IuQSwgZGVjaW1hbHMpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0Q1NTT3B0aW9ucyhpbnB1dCkge1xuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLl9leHRyYWN0KGlucHV0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFuZ2xlVW5pdDogZ2V0QW5nbGVVbml0KGdyb3Vwcy5oKSxcbiAgICAgICAgICAgIGhhc1BlcmNlbnRhZ2VWYWx1ZXM6IChQQ0VOVC50ZXN0KGdyb3Vwcy5sKSAmJlxuICAgICAgICAgICAgICAgIFBDRU5ULnRlc3QoZ3JvdXBzLmMpKSxcbiAgICAgICAgICAgIGhhc1BlcmNlbnRhZ2VBbHBoYTogUENFTlQudGVzdChncm91cHMuYSksXG4gICAgICAgICAgICBoYXNBbHBoYTogIWlzVW5kZWZpbmVkKGdyb3Vwcy5hKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1vZGVsLkxDSDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb2xvck1vZGVsLCBDT0xPUlJFR1MsIENvbG9yVW5pdEVudW0sIFBDRU5UIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRDTVlLTnVtYmVyLCBpc0NNWUtPYmplY3QsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgbm9ybWFsaXplQWxwaGEsIHJvdW5kIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5pbXBvcnQgeyBnZXRDU1NBbHBoYSwgZ2V0Q1NTQ29tbWEsIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSwgcHJlcGFyZUNvbG9yRm9yQ3NzIH0gZnJvbSAnI2Nzcyc7XG5pbXBvcnQgeyBnZXRSR0IgfSBmcm9tICcjY29sb3IvcmdiJztcbmltcG9ydCB7IHJnYlRvQ215ayB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBDb2xvclBhcnNlciB9IGZyb20gJy4vQ29sb3JQYXJzZXJDb250ZXh0JztcbmV4cG9ydCBjbGFzcyBDTVlLUGFyc2VyIGV4dGVuZHMgQ29sb3JQYXJzZXIge1xuICAgIF9leHRyYWN0KGlucHV0KSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goQ09MT1JSRUdTLkNNWUspO1xuICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXBzO1xuICAgIH1cbiAgICBfc2hvdWxkTXVsdGlwbHlCeTEwMCguLi5jb2xvcnMpIHtcbiAgICAgICAgcmV0dXJuICFjb2xvcnMuc29tZSgoY29sb3IpID0+ICtjb2xvciA+IDEpO1xuICAgIH1cbiAgICBzdXBwb3J0cyhpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ09MT1JSRUdTLkNNWUsudGVzdChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQ01ZS09iamVjdChpbnB1dCk7XG4gICAgfVxuICAgIHBhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgYyA9IGdyb3Vwcy5jX2xlZ2FjeSA/PyBncm91cHMuYztcbiAgICAgICAgICAgIGNvbnN0IG0gPSBncm91cHMubV9sZWdhY3kgPz8gZ3JvdXBzLm07XG4gICAgICAgICAgICBjb25zdCB5ID0gZ3JvdXBzLnlfbGVnYWN5ID8/IGdyb3Vwcy55O1xuICAgICAgICAgICAgY29uc3QgayA9IGdyb3Vwcy5rX2xlZ2FjeSA/PyBncm91cHMuaztcbiAgICAgICAgICAgIGNvbnN0IGEgPSBncm91cHMuYV9sZWdhY3kgPz8gZ3JvdXBzLmE7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRNdWx0aXBseUJ5MTAwID0gdGhpcy5fc2hvdWxkTXVsdGlwbHlCeTEwMChjLCBtLCB5LCBrKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgQzogZ2V0Q01ZS051bWJlcihjLCBzaG91bGRNdWx0aXBseUJ5MTAwKSxcbiAgICAgICAgICAgICAgICBNOiBnZXRDTVlLTnVtYmVyKG0sIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgICAgIFk6IGdldENNWUtOdW1iZXIoeSwgc2hvdWxkTXVsdGlwbHlCeTEwMCksXG4gICAgICAgICAgICAgICAgSzogZ2V0Q01ZS051bWJlcihrLCBzaG91bGRNdWx0aXBseUJ5MTAwKSxcbiAgICAgICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoYSlcbiAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEE6IG5vcm1hbGl6ZUFscGhhKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNob3VsZE11bHRpcGx5QnkxMDAgPSB0aGlzLl9zaG91bGRNdWx0aXBseUJ5MTAwKGlucHV0LkMsIGlucHV0Lk0sIGlucHV0LlksIGlucHV0LkspO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgQzogZ2V0Q01ZS051bWJlcihgJHtpbnB1dC5DfWAsIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgTTogZ2V0Q01ZS051bWJlcihgJHtpbnB1dC5NfWAsIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgWTogZ2V0Q01ZS051bWJlcihgJHtpbnB1dC5ZfWAsIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgSzogZ2V0Q01ZS051bWJlcihgJHtpbnB1dC5LfWAsIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGlucHV0LkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiBub3JtYWxpemVBbHBoYShpbnB1dC5BKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnZlcnQoY29sb3IsIGRlY2ltYWxzLCB3aXRoQWxwaGEpIHtcbiAgICAgICAgbGV0IGNteWs7XG4gICAgICAgIGlmIChpc0NNWUtPYmplY3QoY29sb3IpKSB7XG4gICAgICAgICAgICBjbXlrID0gY29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZ2IgPSBnZXRSR0IoY29sb3IpO1xuICAgICAgICAgICAgY215ayA9IHJnYlRvQ215ayhyZ2IuUiwgcmdiLkcsIHJnYi5CKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRDTVlLT2JqZWN0KHtcbiAgICAgICAgICAgIEM6IGNteWsuQyxcbiAgICAgICAgICAgIE06IGNteWsuTSxcbiAgICAgICAgICAgIFk6IGNteWsuWSxcbiAgICAgICAgICAgIEs6IGNteWsuSyxcbiAgICAgICAgICAgIC4uLih3aXRoQWxwaGFcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgQTogKyhjb2xvci5BID8/IDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pXG4gICAgICAgIH0sIGRlY2ltYWxzKTtcbiAgICB9XG4gICAgY29udmVydENTUyhjb2xvciwgb3B0aW9ucywgd2l0aEFscGhhKSB7XG4gICAgICAgIGNvbnN0IHsgZGVjaW1hbHMsIGxlZ2FjeUNTUywgc3BhY2VzQWZ0ZXJDb21tYXMsIGNteWtVbml0LCBjbXlrRnVuY3Rpb24gfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNvbW1hID0gZ2V0Q1NTQ29tbWEoc3BhY2VzQWZ0ZXJDb21tYXMpO1xuICAgICAgICBjb25zdCBjbXlrID0gdGhpcy5jb252ZXJ0KGNvbG9yLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9ICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChjbXlrVW5pdCA9PT0gQ29sb3JVbml0RW51bS5QRVJDRU5UICYmXG4gICAgICAgICAgICAgICAgaW5kZXggPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3JvdW5kKHZhbHVlLCBkZWNpbWFscyl9JWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5kZXggPT09IDRcbiAgICAgICAgICAgICAgICA/IGdldENTU0FscGhhKHZhbHVlLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIDogcm91bmQodmFsdWUgLyAxMDAsIGRlY2ltYWxzKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcHJlcGFyZUNvbG9yRm9yQ3NzKGNteWssIHRyYW5zZm9ybWVyKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBsZWdhY3lDU1NcbiAgICAgICAgICAgID8gKHZhbHVlcy5sZW5ndGggPT09IDVcbiAgICAgICAgICAgICAgICA/IGAke2NteWtGdW5jdGlvbn0oezF9JHtjb21tYX17Mn0ke2NvbW1hfXszfSR7Y29tbWF9ezR9JHtjb21tYX17NX0pYFxuICAgICAgICAgICAgICAgIDogYCR7Y215a0Z1bmN0aW9ufSh7MX0ke2NvbW1hfXsyfSR7Y29tbWF9ezN9JHtjb21tYX17NH0pYClcbiAgICAgICAgICAgIDogKHZhbHVlcy5sZW5ndGggPT09IDVcbiAgICAgICAgICAgICAgICA/IGAke2NteWtGdW5jdGlvbn0oezF9IHsyfSB7M30gezR9IC8gezV9KWBcbiAgICAgICAgICAgICAgICA6IGAke2NteWtGdW5jdGlvbn0oezF9IHsyfSB7M30gezR9KWApO1xuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlKHRlbXBsYXRlLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBfcm91bmRDTVlLT2JqZWN0KGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgQzogcm91bmQoY29sb3IuQywgZGVjaW1hbHMpLFxuICAgICAgICAgICAgTTogcm91bmQoY29sb3IuTSwgZGVjaW1hbHMpLFxuICAgICAgICAgICAgWTogcm91bmQoY29sb3IuWSwgZGVjaW1hbHMpLFxuICAgICAgICAgICAgSzogcm91bmQoY29sb3IuSywgZGVjaW1hbHMpLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGNvbG9yLkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiByb3VuZChjb2xvci5BLCBkZWNpbWFscylcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRDU1NPcHRpb25zKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICBjb25zdCB7IGNfbGVnYWN5LCBtX2xlZ2FjeSwgeV9sZWdhY3ksIGtfbGVnYWN5LCBhX2xlZ2FjeSwgYywgbSwgeSwgaywgYSB9ID0gZ3JvdXBzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFzUGVyY2VudGFnZVZhbHVlczogKFBDRU5ULnRlc3QoY19sZWdhY3kgPz8gYykgJiZcbiAgICAgICAgICAgICAgICBQQ0VOVC50ZXN0KG1fbGVnYWN5ID8/IG0pICYmXG4gICAgICAgICAgICAgICAgUENFTlQudGVzdCh5X2xlZ2FjeSA/PyB5KSAmJlxuICAgICAgICAgICAgICAgIFBDRU5ULnRlc3Qoa19sZWdhY3kgPz8gaykpLFxuICAgICAgICAgICAgaGFzUGVyY2VudGFnZUFscGhhOiBQQ0VOVC50ZXN0KGFfbGVnYWN5ID8/IGEpLFxuICAgICAgICAgICAgaGFzQWxwaGE6ICFpc1VuZGVmaW5lZChhX2xlZ2FjeSA/PyBhKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1vZGVsLkNNWUs7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQW5nbGVzVW5pdEVudW0sIENvbG9yTW9kZWwsIENvbG9yVW5pdEVudW0sIENPTU1BLCBDT01NQVNfQU5EX05FWFRfQ0hBUlMsIENNWUtGdW5jdGlvbkVudW0sIERFRkFVTFRfT1BUSU9OUywgU1BBQ0VTIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc0Jvb2xlYW4sIGlzTnVtYmVyLCBpc1N0cmluZyB9IGZyb20gJyN1dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29sb3JQYXJzZXJDb250ZXh0IH0gZnJvbSAnI2NsYXNzZXMvQ29sb3JQYXJzZXJDb250ZXh0JztcbmltcG9ydCB7IEhFWFBhcnNlciB9IGZyb20gJyNjbGFzc2VzL0hFWFBhcnNlcic7XG5pbXBvcnQgeyBSR0JQYXJzZXIgfSBmcm9tICcjY2xhc3Nlcy9SR0JQYXJzZXInO1xuaW1wb3J0IHsgSFNMUGFyc2VyIH0gZnJvbSAnI2NsYXNzZXMvSFNMUGFyc2VyJztcbmltcG9ydCB7IEhXQlBhcnNlciB9IGZyb20gJyNjbGFzc2VzL0hXQlBhcnNlcic7XG5pbXBvcnQgeyBDSUVMYWJQYXJzZXIgfSBmcm9tICcjY2xhc3Nlcy9DSUVMYWJQYXJzZXInO1xuaW1wb3J0IHsgTENIUGFyc2VyIH0gZnJvbSAnI2NsYXNzZXMvTENIUGFyc2VyJztcbmltcG9ydCB7IENNWUtQYXJzZXIgfSBmcm9tICcjY2xhc3Nlcy9DTVlLUGFyc2VyJztcbmV4cG9ydCBjb25zdCBoZXhQYXJzZXIgPSBuZXcgSEVYUGFyc2VyKCk7XG5leHBvcnQgY29uc3QgcmdiUGFyc2VyID0gbmV3IFJHQlBhcnNlcigpO1xuZXhwb3J0IGNvbnN0IGhzbFBhcnNlciA9IG5ldyBIU0xQYXJzZXIoKTtcbmV4cG9ydCBjb25zdCBod2JQYXJzZXIgPSBuZXcgSFdCUGFyc2VyKCk7XG5leHBvcnQgY29uc3QgY2llTGFiUGFyc2VyID0gbmV3IENJRUxhYlBhcnNlcigpO1xuZXhwb3J0IGNvbnN0IGxjaFBhcnNlciA9IG5ldyBMQ0hQYXJzZXIoKTtcbmV4cG9ydCBjb25zdCBjbXlrUGFyc2VyID0gbmV3IENNWUtQYXJzZXIoKTtcbmV4cG9ydCBjb25zdCBjb2xvclBhcnNlckNvbnRleHQgPSBuZXcgQ29sb3JQYXJzZXJDb250ZXh0KG5ldyBNYXAoW1xuICAgIFtDb2xvck1vZGVsLkhFWCwgaGV4UGFyc2VyXSxcbiAgICBbQ29sb3JNb2RlbC5SR0IsIHJnYlBhcnNlcl0sXG4gICAgW0NvbG9yTW9kZWwuSFNMLCBoc2xQYXJzZXJdLFxuICAgIFtDb2xvck1vZGVsLkhXQiwgaHdiUGFyc2VyXSxcbiAgICBbQ29sb3JNb2RlbC5DSUVMYWIsIGNpZUxhYlBhcnNlcl0sXG4gICAgW0NvbG9yTW9kZWwuTENILCBsY2hQYXJzZXJdLFxuICAgIFtDb2xvck1vZGVsLkNNWUssIGNteWtQYXJzZXJdXG5dKSk7XG5leHBvcnQgY29uc3QgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0ID0gKG9wdGlvbnMsIC4uLmNvbG9ycykgPT4ge1xuICAgIGNvbnN0IGNzc0NvbG9ycyA9IFtdO1xuICAgIGNvbnN0IGFuZ2xlc1VuaXRzID0gW107XG4gICAgY29uc3QgcmdiQ29sb3JzID0gW107XG4gICAgY29uc3QgbGFiQ29sb3JzID0gW107XG4gICAgY29uc3QgbGNoQ29sb3JzID0gW107XG4gICAgY29uc3QgY215a0NvbG9ycyA9IFtdO1xuICAgIGNvbnN0IGFscGhhVmFsdWVzID0gW107XG4gICAgY29uc3QgYW5nbGVzVW5pdFZhbHVlcyA9IE9iamVjdC52YWx1ZXMoQW5nbGVzVW5pdEVudW0pO1xuICAgIGNvbnN0IGNvbG9yVW5pdFZhbHVlcyA9IE9iamVjdC52YWx1ZXMoQ29sb3JVbml0RW51bSk7XG4gICAgY29uc3QgY215a0Z1bmN0aW9uVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhDTVlLRnVuY3Rpb25FbnVtKTtcbiAgICBjb25zdCBtYXRjaE9wdGlvbnMgPSB7XG4gICAgICAgIGxlZ2FjeUNTUzogMCxcbiAgICAgICAgc3BhY2VzQWZ0ZXJDb21tYXM6IDAsXG4gICAgICAgIGNteWtGdW5jdGlvbjogMFxuICAgIH07XG4gICAgZm9yIChjb25zdCBjb2xvciBvZiBjb2xvcnMpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGNvbG9yKSkge1xuICAgICAgICAgICAgY3NzQ29sb3JzLnB1c2goY29sb3IpO1xuICAgICAgICAgICAgaWYgKGNvbG9yLmluY2x1ZGVzKENPTU1BKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoT3B0aW9ucy5sZWdhY3lDU1MrKztcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYXNXaXRoTmV4dENoYXJhY3RlciA9IGNvbG9yLm1hdGNoKENPTU1BU19BTkRfTkVYVF9DSEFSUyk7XG4gICAgICAgICAgICAgICAgaWYgKG5ldyBTZXQoY29tbWFzV2l0aE5leHRDaGFyYWN0ZXIpLnNpemUgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgU1BBQ0VTLnRlc3QoY29tbWFzV2l0aE5leHRDaGFyYWN0ZXJbMF0uc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoT3B0aW9ucy5zcGFjZXNBZnRlckNvbW1hcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoc2xQYXJzZXIuc3VwcG9ydHMoY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGhzbFBhcnNlci5nZXRDU1NPcHRpb25zKGNvbG9yKTtcbiAgICAgICAgICAgICAgICBhbmdsZXNVbml0cy5wdXNoKG9wdGlvbnMuYW5nbGVVbml0KTtcbiAgICAgICAgICAgICAgICBhbHBoYVZhbHVlcy5wdXNoKG9wdGlvbnMuaGFzUGVyY2VudGFnZUFscGhhKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChod2JQYXJzZXIuc3VwcG9ydHMoY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGh3YlBhcnNlci5nZXRDU1NPcHRpb25zKGNvbG9yKTtcbiAgICAgICAgICAgICAgICBhbmdsZXNVbml0cy5wdXNoKG9wdGlvbnMuYW5nbGVVbml0KTtcbiAgICAgICAgICAgICAgICBhbHBoYVZhbHVlcy5wdXNoKG9wdGlvbnMuaGFzUGVyY2VudGFnZUFscGhhKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZ2JQYXJzZXIuc3VwcG9ydHMoY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHJnYlBhcnNlci5nZXRDU1NPcHRpb25zKGNvbG9yKTtcbiAgICAgICAgICAgICAgICByZ2JDb2xvcnMucHVzaChvcHRpb25zLmhhc1BlcmNlbnRhZ2VWYWx1ZXMpO1xuICAgICAgICAgICAgICAgIGFscGhhVmFsdWVzLnB1c2gob3B0aW9ucy5oYXNQZXJjZW50YWdlQWxwaGEpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNpZUxhYlBhcnNlci5zdXBwb3J0cyhjb2xvcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gY2llTGFiUGFyc2VyLmdldENTU09wdGlvbnMoY29sb3IpO1xuICAgICAgICAgICAgICAgIGxhYkNvbG9ycy5wdXNoKG9wdGlvbnMuaGFzUGVyY2VudGFnZVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgYWxwaGFWYWx1ZXMucHVzaChvcHRpb25zLmhhc1BlcmNlbnRhZ2VBbHBoYSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGNoUGFyc2VyLnN1cHBvcnRzKGNvbG9yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBsY2hQYXJzZXIuZ2V0Q1NTT3B0aW9ucyhjb2xvcik7XG4gICAgICAgICAgICAgICAgYW5nbGVzVW5pdHMucHVzaChvcHRpb25zLmFuZ2xlVW5pdCk7XG4gICAgICAgICAgICAgICAgbGNoQ29sb3JzLnB1c2gob3B0aW9ucy5oYXNQZXJjZW50YWdlVmFsdWVzKTtcbiAgICAgICAgICAgICAgICBhbHBoYVZhbHVlcy5wdXNoKG9wdGlvbnMuaGFzUGVyY2VudGFnZUFscGhhKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjbXlrUGFyc2VyLnN1cHBvcnRzKGNvbG9yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjbXlrUGFyc2VyLmdldENTU09wdGlvbnMoY29sb3IpO1xuICAgICAgICAgICAgICAgIGNteWtDb2xvcnMucHVzaChvcHRpb25zLmhhc1BlcmNlbnRhZ2VWYWx1ZXMpO1xuICAgICAgICAgICAgICAgIGlmIChjb2xvci5zdGFydHNXaXRoKENNWUtGdW5jdGlvbkVudW0uQ01ZSykpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hPcHRpb25zLmNteWtGdW5jdGlvbisrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbHBoYVZhbHVlcy5wdXNoKG9wdGlvbnMuaGFzUGVyY2VudGFnZUFscGhhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkZWNpbWFsczogaXNOdW1iZXIob3B0aW9ucy5kZWNpbWFscylcbiAgICAgICAgICAgID8gb3B0aW9ucy5kZWNpbWFsc1xuICAgICAgICAgICAgOiBERUZBVUxUX09QVElPTlMuZGVjaW1hbHMsXG4gICAgICAgIGxlZ2FjeUNTUzogaXNCb29sZWFuKG9wdGlvbnMubGVnYWN5Q1NTKVxuICAgICAgICAgICAgPyBvcHRpb25zLmxlZ2FjeUNTU1xuICAgICAgICAgICAgOiBCb29sZWFuKGNzc0NvbG9ycy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICBtYXRjaE9wdGlvbnMubGVnYWN5Q1NTID09PSBjc3NDb2xvcnMubGVuZ3RoKSB8fCBERUZBVUxUX09QVElPTlMubGVnYWN5Q1NTLFxuICAgICAgICBzcGFjZXNBZnRlckNvbW1hczogaXNCb29sZWFuKG9wdGlvbnMuc3BhY2VzQWZ0ZXJDb21tYXMpXG4gICAgICAgICAgICA/IG9wdGlvbnMuc3BhY2VzQWZ0ZXJDb21tYXNcbiAgICAgICAgICAgIDogQm9vbGVhbihjc3NDb2xvcnMubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgbWF0Y2hPcHRpb25zLnNwYWNlc0FmdGVyQ29tbWFzID09PSBjc3NDb2xvcnMubGVuZ3RoKSB8fCBERUZBVUxUX09QVElPTlMuc3BhY2VzQWZ0ZXJDb21tYXMsXG4gICAgICAgIGFuZ2xlc1VuaXQ6IG9wdGlvbnMuYW5nbGVzVW5pdCAmJiBhbmdsZXNVbml0VmFsdWVzLmluY2x1ZGVzKG9wdGlvbnMuYW5nbGVzVW5pdClcbiAgICAgICAgICAgID8gb3B0aW9ucy5hbmdsZXNVbml0XG4gICAgICAgICAgICA6IChuZXcgU2V0KGFuZ2xlc1VuaXRzKS5zaXplID09PSAxXG4gICAgICAgICAgICAgICAgPyBhbmdsZXNVbml0c1swXVxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9PUFRJT05TLmFuZ2xlc1VuaXQpLFxuICAgICAgICByZ2JVbml0OiBvcHRpb25zLnJnYlVuaXQgJiYgY29sb3JVbml0VmFsdWVzLmluY2x1ZGVzKG9wdGlvbnMucmdiVW5pdClcbiAgICAgICAgICAgID8gb3B0aW9ucy5yZ2JVbml0XG4gICAgICAgICAgICA6IChuZXcgU2V0KHJnYkNvbG9ycykuc2l6ZSA9PT0gMSAmJiByZ2JDb2xvcnNbMF1cbiAgICAgICAgICAgICAgICA/IENvbG9yVW5pdEVudW0uUEVSQ0VOVFxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9PUFRJT05TLnJnYlVuaXQpLFxuICAgICAgICBsYWJVbml0OiBvcHRpb25zLmxhYlVuaXQgJiYgY29sb3JVbml0VmFsdWVzLmluY2x1ZGVzKG9wdGlvbnMubGFiVW5pdClcbiAgICAgICAgICAgID8gb3B0aW9ucy5sYWJVbml0XG4gICAgICAgICAgICA6IChuZXcgU2V0KGxhYkNvbG9ycykuc2l6ZSA9PT0gMSAmJiBsYWJDb2xvcnNbMF1cbiAgICAgICAgICAgICAgICA/IENvbG9yVW5pdEVudW0uUEVSQ0VOVFxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9PUFRJT05TLmxhYlVuaXQpLFxuICAgICAgICBsY2hVbml0OiBvcHRpb25zLmxjaFVuaXQgJiYgY29sb3JVbml0VmFsdWVzLmluY2x1ZGVzKG9wdGlvbnMubGNoVW5pdClcbiAgICAgICAgICAgID8gb3B0aW9ucy5sY2hVbml0XG4gICAgICAgICAgICA6IChuZXcgU2V0KGxjaENvbG9ycykuc2l6ZSA9PT0gMSAmJiBsY2hDb2xvcnNbMF1cbiAgICAgICAgICAgICAgICA/IENvbG9yVW5pdEVudW0uUEVSQ0VOVFxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9PUFRJT05TLmxjaFVuaXQpLFxuICAgICAgICBjbXlrVW5pdDogb3B0aW9ucy5jbXlrVW5pdCAmJiBjb2xvclVuaXRWYWx1ZXMuaW5jbHVkZXMob3B0aW9ucy5jbXlrVW5pdClcbiAgICAgICAgICAgID8gb3B0aW9ucy5jbXlrVW5pdFxuICAgICAgICAgICAgOiAobmV3IFNldChjbXlrQ29sb3JzKS5zaXplID09PSAxICYmICFjbXlrQ29sb3JzWzBdXG4gICAgICAgICAgICAgICAgPyBDb2xvclVuaXRFbnVtLk5PTkVcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5jbXlrVW5pdCksXG4gICAgICAgIGFscGhhVW5pdDogb3B0aW9ucy5hbHBoYVVuaXQgJiYgY29sb3JVbml0VmFsdWVzLmluY2x1ZGVzKG9wdGlvbnMuYWxwaGFVbml0KVxuICAgICAgICAgICAgPyBvcHRpb25zLmFscGhhVW5pdFxuICAgICAgICAgICAgOiAobmV3IFNldChhbHBoYVZhbHVlcykuc2l6ZSA9PT0gMSAmJiBhbHBoYVZhbHVlc1swXVxuICAgICAgICAgICAgICAgID8gQ29sb3JVbml0RW51bS5QRVJDRU5UXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX09QVElPTlMuYWxwaGFVbml0KSxcbiAgICAgICAgY215a0Z1bmN0aW9uOiBvcHRpb25zLmNteWtGdW5jdGlvbiAmJiBjbXlrRnVuY3Rpb25WYWx1ZXMuaW5jbHVkZXMob3B0aW9ucy5jbXlrRnVuY3Rpb24pXG4gICAgICAgICAgICA/IG9wdGlvbnMuY215a0Z1bmN0aW9uXG4gICAgICAgICAgICA6IChjbXlrQ29sb3JzLmxlbmd0aCAmJiBjbXlrQ29sb3JzLmxlbmd0aCA9PT0gbWF0Y2hPcHRpb25zLmNteWtGdW5jdGlvblxuICAgICAgICAgICAgICAgID8gQ01ZS0Z1bmN0aW9uRW51bS5DTVlLXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX09QVElPTlMuY215a0Z1bmN0aW9uKVxuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgQkFTRV8yNTUsIENvbG9yTW9kZWwsIERFRkFVTFRfQkxFTkRfU1RFUFMsIERFRkFVTFRfU0hBREVTX1RJTlRTX1NURVBTLCBIYXJtb255LCBNaXggfSBmcm9tICcjY29uc3RhbnRzJztcbmltcG9ydCB7IGlzSGFybW9ueSwgaXNOdW1iZXIsIGlzU3RyaW5nLCBpc01peCwgaXNVbmRlZmluZWQsIG5vcm1hbGl6ZUFscGhhLCBub3JtYWxpemVIdWUsIHJvdW5kIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5pbXBvcnQgeyBodWVSeWIsIHJnYlRvUnliLCByeWJUb1JnYiB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBnZXRSR0IgfSBmcm9tICcjY29sb3IvcmdiJztcbmltcG9ydCB7IGNvbG9yUGFyc2VyQ29udGV4dCwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0IH0gZnJvbSAnI3BhcnNlcnMnO1xuY29uc3QgYmxlbmQgPSAoZnJvbSwgdG8sIHN0ZXBzKSA9PiB7XG4gICAgY29uc3QgZGl2ID0gc3RlcHMgLSAxO1xuICAgIGNvbnN0IGRpZmZSID0gKHRvLlIgLSBmcm9tLlIpIC8gZGl2O1xuICAgIGNvbnN0IGRpZmZHID0gKHRvLkcgLSBmcm9tLkcpIC8gZGl2O1xuICAgIGNvbnN0IGRpZmZCID0gKHRvLkIgLSBmcm9tLkIpIC8gZGl2O1xuICAgIGNvbnN0IGZyb21BID0gbm9ybWFsaXplQWxwaGEoZnJvbS5BKTtcbiAgICBjb25zdCB0b0EgPSBub3JtYWxpemVBbHBoYSh0by5BKTtcbiAgICBjb25zdCBkaWZmQSA9ICh0b0EgLSBmcm9tQSkgLyBkaXY7XG4gICAgcmV0dXJuIEFycmF5KHN0ZXBzKS5maWxsKG51bGwpLm1hcCgoX19uLCBpKSA9PiB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gZGl2KSB7XG4gICAgICAgICAgICByZXR1cm4gdG87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFI6IHJvdW5kKGZyb20uUiArIGRpZmZSICogaSksXG4gICAgICAgICAgICBHOiByb3VuZChmcm9tLkcgKyBkaWZmRyAqIGkpLFxuICAgICAgICAgICAgQjogcm91bmQoZnJvbS5CICsgZGlmZkIgKiBpKSxcbiAgICAgICAgICAgIEE6IHJvdW5kKGZyb21BICsgZGlmZkEgKiBpKVxuICAgICAgICB9O1xuICAgIH0pO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgbW9kZWwsIGNzcywgd2l0aEFscGhhLCBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzdGVwcyA8IDEpXG4gICAgICAgIHN0ZXBzID0gREVGQVVMVF9CTEVORF9TVEVQUztcbiAgICBjb25zdCBmcm9tUGFyc2VkID0gY29sb3JQYXJzZXJDb250ZXh0LnBhcnNlKGZyb20pO1xuICAgIGNvbnN0IHRvUGFyc2VkID0gY29sb3JQYXJzZXJDb250ZXh0LnBhcnNlKHRvKTtcbiAgICBjb25zdCBmcm9tUkdCT2JqZWN0ID0gZ2V0UkdCKGZyb21QYXJzZWQpO1xuICAgIGNvbnN0IHRvUkdCT2JqZWN0ID0gZ2V0UkdCKHRvUGFyc2VkKTtcbiAgICBjb25zdCBibGVuZEFycmF5ID0gYmxlbmQoZnJvbVJHQk9iamVjdCwgdG9SR0JPYmplY3QsIHN0ZXBzKTtcbiAgICByZXR1cm4gYmxlbmRBcnJheS5tYXAoKGNvbG9yKSA9PiB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyhjb2xvciwgbW9kZWwsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBmcm9tLCB0byksIHdpdGhBbHBoYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KGNvbG9yLCBtb2RlbCwgb3B0aW9ucy5kZWNpbWFscywgd2l0aEFscGhhKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBnZXRCbGVuZFJldHVyblBhcmFtcyA9ICh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiB7XG4gICAgY29uc3Qgc3RlcHNQYXJhbWV0ZXIgPSBpc051bWJlcih0aGlyZFBhcmFtZXRlcilcbiAgICAgICAgPyB0aGlyZFBhcmFtZXRlclxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvcHRpb25zUGFyYW1ldGVyID0gaXNOdW1iZXIodGhpcmRQYXJhbWV0ZXIpXG4gICAgICAgID8gZm91cnRoUGFyYW1ldGVyXG4gICAgICAgIDogdGhpcmRQYXJhbWV0ZXI7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3RlcHNQYXJhbWV0ZXIsXG4gICAgICAgIG9wdGlvbnNQYXJhbWV0ZXJcbiAgICBdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRNaXhSZXR1cm4oY29sb3JzLCBtb2RlbCwgY3NzLCB3aXRoQWxwaGEsIG1vZGUgPSBNaXguQURESVRJVkUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHJnYk1hcCA9IGNvbG9ycy5tYXAoKGNvbG9yKSA9PiB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5SR0IsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgfSk7XG4gICAgY29uc3QgcnliTWFwID0gbW9kZSA9PT0gTWl4LlNVQlRSQUNUSVZFXG4gICAgICAgID8gcmdiTWFwLm1hcCgoY29sb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFJZQiA9IHJnYlRvUnliKGNvbG9yLlIsIGNvbG9yLkcsIGNvbG9yLkIpO1xuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChjb2xvci5BKSkge1xuICAgICAgICAgICAgICAgIFJZQi5BID0gY29sb3IuQTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSWUI7XG4gICAgICAgIH0pXG4gICAgICAgIDogbnVsbDtcbiAgICBmdW5jdGlvbiBjcmVhdGVNaXgoaXRlbXMpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IG1vZGUgPT09IE1peC5BRERJVElWRVxuICAgICAgICAgICAgPyB7IFI6IDAsIEc6IDAsIEI6IDAsIEE6IDAgfVxuICAgICAgICAgICAgOiB7IFI6IDAsIFk6IDAsIEI6IDAsIEE6IDAgfTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgobWl4LCBjb2xvcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sb3JBID0gaXNVbmRlZmluZWQoY29sb3IuQSlcbiAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICA6IGNvbG9yLkE7XG4gICAgICAgICAgICBjb25zdCBjb21tb24gPSB7XG4gICAgICAgICAgICAgICAgUjogTWF0aC5taW4obWl4LlIgKyBjb2xvci5SICogY29sb3JBLCBCQVNFXzI1NSksXG4gICAgICAgICAgICAgICAgQjogTWF0aC5taW4obWl4LkIgKyBjb2xvci5CICogY29sb3JBLCBCQVNFXzI1NSksXG4gICAgICAgICAgICAgICAgQTogMSAtICgxIC0gY29sb3JBKSAqICgxIC0gbWl4LkEpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgbWl4R1kgPSAnRycgaW4gbWl4XG4gICAgICAgICAgICAgICAgPyBtaXguR1xuICAgICAgICAgICAgICAgIDogbWl4Llk7XG4gICAgICAgICAgICBjb25zdCBjb2xvckdZID0gJ0cnIGluIGNvbG9yXG4gICAgICAgICAgICAgICAgPyBjb2xvci5HXG4gICAgICAgICAgICAgICAgOiBjb2xvci5ZO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5jb21tb24sXG4gICAgICAgICAgICAgICAgLi4uKG1vZGUgPT09IE1peC5BRERJVElWRVxuICAgICAgICAgICAgICAgICAgICA/IHsgRzogTWF0aC5taW4obWl4R1kgKyBjb2xvckdZICogY29sb3JBLCBCQVNFXzI1NSkgfVxuICAgICAgICAgICAgICAgICAgICA6IHsgWTogTWF0aC5taW4obWl4R1kgKyBjb2xvckdZICogY29sb3JBLCBCQVNFXzI1NSkgfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sIGluaXRpYWwpO1xuICAgIH1cbiAgICBsZXQgbWl4O1xuICAgIGlmIChtb2RlID09PSBNaXguQURESVRJVkUpIHtcbiAgICAgICAgbWl4ID0gY3JlYXRlTWl4KHJnYk1hcCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBSWUIgPSBjcmVhdGVNaXgocnliTWFwKTtcbiAgICAgICAgbWl4ID0gcnliVG9SZ2IoUllCLlIsIFJZQi5ZLCBSWUIuQik7XG4gICAgICAgIG1peC5BID0gUllCLkE7XG4gICAgfVxuICAgIGlmIChjc3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKG1peCwgbW9kZWwsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCAuLi5jb2xvcnMpLCB3aXRoQWxwaGEpO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQobWl4LCBtb2RlbCwgb3B0aW9ucy5kZWNpbWFscywgd2l0aEFscGhhKTtcbn1cbjtcbmV4cG9ydCBjb25zdCBnZXRNaXhSZXR1cm5QYXJhbWV0ZXJzID0gKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IHtcbiAgICBjb25zdCBtb2RlUGFyYW0gPSBpc1N0cmluZyhzZWNvbmRQYXJhbWV0ZXIpXG4gICAgICAgID8gc2Vjb25kUGFyYW1ldGVyXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9wdGlvbnNQYXJhbSA9IGlzU3RyaW5nKHNlY29uZFBhcmFtZXRlcilcbiAgICAgICAgPyB0aGlyZFBhcmFtZXRlclxuICAgICAgICA6IHNlY29uZFBhcmFtZXRlcjtcbiAgICByZXR1cm4gW1xuICAgICAgICBtb2RlUGFyYW0sXG4gICAgICAgIG9wdGlvbnNQYXJhbVxuICAgIF07XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNoYWRlc09yVGludHNSZXR1cm4oc2hhZGVzLCBjb2xvciwgc3RlcHMgPSBERUZBVUxUX1NIQURFU19USU5UU19TVEVQUywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaXNDU1MgPSBpc1N0cmluZyhjb2xvcik7XG4gICAgY29uc3QgcGFyc2VyID0gY29sb3JQYXJzZXJDb250ZXh0LmdldFBhcnNlcihjb2xvcik7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZXIubW9kZWw7XG4gICAgY29uc3Qgd2l0aEFscGhhID0gcGFyc2VyLmhhc0FscGhhKGNvbG9yKTtcbiAgICBjb25zdCBoc2wgPSBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IU0wsIHVuZGVmaW5lZCwgd2l0aEFscGhhKTtcbiAgICBjb25zdCBpbmNyZW1lbnQgPSBzaGFkZXNcbiAgICAgICAgPyBoc2wuTCAvIChzdGVwcyArIDEpXG4gICAgICAgIDogKDEwMCAtIGhzbC5MKSAvIChzdGVwcyArIDEpO1xuICAgIGNvbnN0IGhzbE1hcCA9IEFycmF5LmZyb20oQXJyYXkoc3RlcHMpKS5tYXAoKF9fbiwgaSkgPT4gKHtcbiAgICAgICAgLi4uaHNsLFxuICAgICAgICBMOiBoc2wuTCArIGluY3JlbWVudCAqIChpICsgMSkgKiAoMSAtICtzaGFkZXMgKiAyKVxuICAgIH0pKTtcbiAgICBpZiAoaXNDU1MpIHtcbiAgICAgICAgcmV0dXJuIGhzbE1hcC5tYXAoKGhzbENvbG9yKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoaHNsQ29sb3IsIG1vZGVsLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpLCB3aXRoQWxwaGEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhzbE1hcC5tYXAoKGhzbENvbG9yKSA9PiB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChoc2xDb2xvciwgbW9kZWwsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgZ2V0U2hhZGVzT3JUaW50c1JldHVyblBhcmFtZXRlcnMgPSAoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4ge1xuICAgIGNvbnN0IHN0ZXBzUGFyYW0gPSBpc051bWJlcihzZWNvbmRQYXJhbWV0ZXIpXG4gICAgICAgID8gc2Vjb25kUGFyYW1ldGVyXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9wdGlvbnNQYXJhbSA9IGlzTnVtYmVyKHNlY29uZFBhcmFtZXRlcilcbiAgICAgICAgPyB0aGlyZFBhcmFtZXRlclxuICAgICAgICA6IHNlY29uZFBhcmFtZXRlcjtcbiAgICByZXR1cm4gW1xuICAgICAgICBzdGVwc1BhcmFtLFxuICAgICAgICBvcHRpb25zUGFyYW1cbiAgICBdO1xufTtcbmNvbnN0IGhhcm1vbnkgPSAoY29sb3IsIGFuZ2xlcywgbW9kZSkgPT4gYW5nbGVzLnJlZHVjZSgoYXJyLCBudW0pID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5hcnIsXG4gICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbG9yLFxuICAgICAgICAgICAgSDogbW9kZSA9PT0gTWl4LkFERElUSVZFXG4gICAgICAgICAgICAgICAgPyBub3JtYWxpemVIdWUoY29sb3IuSCArIG51bSlcbiAgICAgICAgICAgICAgICA6IG5vcm1hbGl6ZUh1ZShodWVSeWIoaHVlUnliKGNvbG9yLkgsIGZhbHNlKSArIG51bSwgdHJ1ZSkpXG4gICAgICAgIH1cbiAgICBdO1xufSwgW3sgLi4uY29sb3IgfV0pO1xuY29uc3QgSEFSTU9OSUVTID0gbmV3IE1hcChbXG4gICAgW1xuICAgICAgICBIYXJtb255LkFOQUxPR09VUyxcbiAgICAgICAgKGNvbG9yLCBtb2RlKSA9PiBoYXJtb255KGNvbG9yLCBbMzAsIC0zMF0sIG1vZGUpXG4gICAgXSxcbiAgICBbXG4gICAgICAgIEhhcm1vbnkuQ09NUExFTUVOVEFSWSxcbiAgICAgICAgKGNvbG9yLCBtb2RlKSA9PiBoYXJtb255KGNvbG9yLCBbMTgwXSwgbW9kZSlcbiAgICBdLFxuICAgIFtcbiAgICAgICAgSGFybW9ueS5TUExJVF9DT01QTEVNRU5UQVJZLFxuICAgICAgICAoY29sb3IsIG1vZGUpID0+IGhhcm1vbnkoY29sb3IsIFsxNTAsIC0xNTBdLCBtb2RlKVxuICAgIF0sXG4gICAgW1xuICAgICAgICBIYXJtb255LlRSSUFESUMsXG4gICAgICAgIChjb2xvciwgbW9kZSkgPT4gaGFybW9ueShjb2xvciwgWzEyMCwgLTEyMF0sIG1vZGUpXG4gICAgXSxcbiAgICBbXG4gICAgICAgIEhhcm1vbnkuVEVUUkFESUMsXG4gICAgICAgIChjb2xvciwgbW9kZSkgPT4gaGFybW9ueShjb2xvciwgWzYwLCAtMTIwLCAxODBdLCBtb2RlKVxuICAgIF0sXG4gICAgW1xuICAgICAgICBIYXJtb255LlNRVUFSRSxcbiAgICAgICAgKGNvbG9yLCBtb2RlKSA9PiBoYXJtb255KGNvbG9yLCBbOTAsIC05MCwgMTgwXSwgbW9kZSlcbiAgICBdXG5dKTtcbmV4cG9ydCBjb25zdCBnZXRIYXJtb255UmV0dXJuID0gKGNvbG9yLCBoYXJtb255LCBtb2RlLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCBoYXJtb255RnVuY3Rpb24gPSBIQVJNT05JRVMuZ2V0KGhhcm1vbnkpO1xuICAgIGNvbnN0IGlzQ1NTID0gaXNTdHJpbmcoY29sb3IpO1xuICAgIGNvbnN0IHBhcnNlciA9IGNvbG9yUGFyc2VyQ29udGV4dC5nZXRQYXJzZXIoY29sb3IpO1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VyLm1vZGVsO1xuICAgIGNvbnN0IHdpdGhBbHBoYSA9IHBhcnNlci5oYXNBbHBoYShjb2xvcik7XG4gICAgY29uc3QgaHNsID0gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoY29sb3IsIENvbG9yTW9kZWwuSFNMKTtcbiAgICBjb25zdCBhcnJheSA9IGhhcm1vbnlGdW5jdGlvbihoc2wsIG1vZGUpO1xuICAgIGlmIChpc0NTUykge1xuICAgICAgICByZXR1cm4gYXJyYXkubWFwKChoYXJtb255Q29sb3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyhoYXJtb255Q29sb3IsIG1vZGVsLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpLCB3aXRoQWxwaGEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5Lm1hcCgoaGFybW9ueUNvbG9yKSA9PiB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChoYXJtb255Q29sb3IsIG1vZGVsLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCBnZXRIYXJtb255UmV0dXJuUGFyYW1ldGVycyA9IChzZWNvbmRQYXJhbSwgdGhpcmRQYXJhbSwgZm91cnRoUGFyYW0pID0+IHtcbiAgICBpZiAoaXNIYXJtb255KHNlY29uZFBhcmFtKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc2Vjb25kUGFyYW0sXG4gICAgICAgICAgICBpc01peCh0aGlyZFBhcmFtKVxuICAgICAgICAgICAgICAgID8gdGhpcmRQYXJhbVxuICAgICAgICAgICAgICAgIDogTWl4LkFERElUSVZFLFxuICAgICAgICAgICAgaXNNaXgodGhpcmRQYXJhbSlcbiAgICAgICAgICAgICAgICA/IGZvdXJ0aFBhcmFtXG4gICAgICAgICAgICAgICAgOiB0aGlyZFBhcmFtXG4gICAgICAgIF07XG4gICAgfVxuICAgIGlmIChpc01peChzZWNvbmRQYXJhbSkpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIEhhcm1vbnkuQ09NUExFTUVOVEFSWSxcbiAgICAgICAgICAgIHNlY29uZFBhcmFtLFxuICAgICAgICAgICAgdGhpcmRQYXJhbVxuICAgICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBIYXJtb255LkNPTVBMRU1FTlRBUlksXG4gICAgICAgIE1peC5BRERJVElWRSxcbiAgICAgICAgc2Vjb25kUGFyYW1cbiAgICBdO1xufTtcbiIsImltcG9ydCB7IEJBU0VfMjU1LCBDb2xvck1vZGVsLCBNQVhfQUxQSEEsIE1BWF9MQUIsIE1BWF9MQ0hfQywgTUFYX1BDRU5ULCBNaXggfSBmcm9tICcjY29uc3RhbnRzJztcbmltcG9ydCB7IGNteWtUb1JnYiwgaHNsVG9SZ2IsIGh3YlRvUmdiLCBsYWJUb0xjaCwgbGFiVG9SZ2IsIGxjaFRvTGFiLCBsY2hUb1JnYiwgcmdiVG9DbXlrLCByZ2JUb0hzbCwgcmdiVG9Id2IsIHJnYlRvTGFiLCByZ2JUb0xjaCB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBnZXRDb2xvck1vZGVsLCBtaW5tYXgsIG5vcm1hbGl6ZUh1ZSwgcm91bmQgfSBmcm9tICcjdXRpbGl0aWVzJztcbmltcG9ydCB7IGNvbG9yUGFyc2VyQ29udGV4dCwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0IH0gZnJvbSAnI3BhcnNlcnMnO1xuaW1wb3J0IHsgZ2V0QmxlbmRSZXR1cm4sIGdldEJsZW5kUmV0dXJuUGFyYW1zLCBnZXRNaXhSZXR1cm4sIGdldE1peFJldHVyblBhcmFtZXRlcnMsIGdldFNoYWRlc09yVGludHNSZXR1cm4sIGdldFNoYWRlc09yVGludHNSZXR1cm5QYXJhbWV0ZXJzLCBnZXRIYXJtb255UmV0dXJuLCBnZXRIYXJtb255UmV0dXJuUGFyYW1ldGVycyB9IGZyb20gJyNyZXR1cm5zJztcbmV4cG9ydCBjbGFzcyBDb2xvclRyYW5zbGF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcik7XG4gICAgICAgIGNvbnN0IHBhcnNlZENvbG9yID0gY29sb3JQYXJzZXJDb250ZXh0LnBhcnNlKGNvbG9yKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBnZXRDb2xvck1vZGVsKHBhcnNlZENvbG9yKTtcbiAgICAgICAgc3dpdGNoIChtb2RlbCkge1xuICAgICAgICAgICAgY2FzZSBDb2xvck1vZGVsLkhTTDpcbiAgICAgICAgICAgICAgICB0aGlzLmhzbCA9IHBhcnNlZENvbG9yO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCdoc2wnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sb3JNb2RlbC5IV0I6XG4gICAgICAgICAgICAgICAgdGhpcy5od2IgPSBwYXJzZWRDb2xvcjtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21IV0IoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgnaHdiJywgJ3JnYicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb2xvck1vZGVsLkNJRUxhYjpcbiAgICAgICAgICAgICAgICB0aGlzLmxhYiA9IHBhcnNlZENvbG9yO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUxBQigpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCdsYWInLCAncmdiJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbG9yTW9kZWwuTENIOlxuICAgICAgICAgICAgICAgIHRoaXMubGNoID0gcGFyc2VkQ29sb3I7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSR0JGcm9tTENIKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoJ2xjaCcsICdyZ2InKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sb3JNb2RlbC5DTVlLOlxuICAgICAgICAgICAgICAgIHRoaXMuY215ayA9IHBhcnNlZENvbG9yO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUNNWUsoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgnY215aycsICdyZ2InKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5yZ2IgPSBwYXJzZWRDb2xvcjtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgncmdiJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlKC4uLmV4Y2x1ZGUpIHtcbiAgICAgICAgaWYgKCFleGNsdWRlLmluY2x1ZGVzKCdyZ2InKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVSR0IoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4Y2x1ZGUuaW5jbHVkZXMoJ2hzbCcpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhTTCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhjbHVkZS5pbmNsdWRlcygnaHdiJykpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSFdCKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFleGNsdWRlLmluY2x1ZGVzKCdsYWInKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMQUIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4Y2x1ZGUuaW5jbHVkZXMoJ2xjaCcpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxDSCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhjbHVkZS5pbmNsdWRlcygnY215aycpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNNWUsoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVSR0IoKSB7XG4gICAgICAgIHRoaXMucmdiID0ge1xuICAgICAgICAgICAgLi4uaHNsVG9SZ2IodGhpcy5oc2wuSCwgdGhpcy5oc2wuUywgdGhpcy5oc2wuTCksXG4gICAgICAgICAgICBBOiB0aGlzLmhzbC5BID8/IDFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlSFNMKCkge1xuICAgICAgICB0aGlzLmhzbCA9IHJnYlRvSHNsKHRoaXMucmdiLlIsIHRoaXMucmdiLkcsIHRoaXMucmdiLkIsIHRoaXMucmdiLkEpO1xuICAgIH1cbiAgICB1cGRhdGVIV0IoKSB7XG4gICAgICAgIHRoaXMuaHdiID0gcmdiVG9Id2IodGhpcy5yZ2IuUiwgdGhpcy5yZ2IuRywgdGhpcy5yZ2IuQiwgdGhpcy5yZ2IuQSk7XG4gICAgfVxuICAgIHVwZGF0ZUxBQigpIHtcbiAgICAgICAgdGhpcy5sYWIgPSB7XG4gICAgICAgICAgICAuLi5yZ2JUb0xhYih0aGlzLnJnYi5SLCB0aGlzLnJnYi5HLCB0aGlzLnJnYi5CKSxcbiAgICAgICAgICAgIEE6IHRoaXMucmdiLkEgPz8gMVxuICAgICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGVMQ0goKSB7XG4gICAgICAgIHRoaXMubGNoID0ge1xuICAgICAgICAgICAgLi4ucmdiVG9MY2godGhpcy5yZ2IuUiwgdGhpcy5yZ2IuRywgdGhpcy5yZ2IuQiksXG4gICAgICAgICAgICBBOiB0aGlzLnJnYi5BID8/IDFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlQ01ZSygpIHtcbiAgICAgICAgdGhpcy5jbXlrID0ge1xuICAgICAgICAgICAgLi4ucmdiVG9DbXlrKHRoaXMucmdiLlIsIHRoaXMucmdiLkcsIHRoaXMucmdiLkIpLFxuICAgICAgICAgICAgQTogdGhpcy5yZ2IuQSA/PyAxXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZVJHQkZyb21IV0IoKSB7XG4gICAgICAgIHRoaXMucmdiID0ge1xuICAgICAgICAgICAgLi4uaHdiVG9SZ2IodGhpcy5od2IuSCwgdGhpcy5od2IuVywgdGhpcy5od2IuQiksXG4gICAgICAgICAgICBBOiB0aGlzLmh3Yj8uQSA/PyAxXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZVJHQkZyb21MQ0goKSB7XG4gICAgICAgIHRoaXMucmdiID0ge1xuICAgICAgICAgICAgLi4ubGNoVG9SZ2IodGhpcy5sY2guTCwgdGhpcy5sY2guQywgdGhpcy5sY2guSCksXG4gICAgICAgICAgICBBOiB0aGlzLmxjaC5BID8/IDFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlUkdCRnJvbUNNWUsoKSB7XG4gICAgICAgIHRoaXMucmdiID0ge1xuICAgICAgICAgICAgLi4uY215a1RvUmdiKHRoaXMuY215ay5DLCB0aGlzLmNteWsuTSwgdGhpcy5jbXlrLlksIHRoaXMuY215ay5LKSxcbiAgICAgICAgICAgIEE6IHRoaXMuY215ay5BID8/IDFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlUkdCRnJvbUxBQigpIHtcbiAgICAgICAgdGhpcy5yZ2IgPSB7XG4gICAgICAgICAgICAuLi5sYWJUb1JnYih0aGlzLmxhYi5MLCB0aGlzLmxhYi5hLCB0aGlzLmxhYi5iKSxcbiAgICAgICAgICAgIEE6IHRoaXMubGFiLkEgPz8gMVxuICAgICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGVMQ0hGcm9tTEFCKCkge1xuICAgICAgICB0aGlzLmxjaCA9IHtcbiAgICAgICAgICAgIC4uLmxhYlRvTGNoKHRoaXMubGFiLkwsIHRoaXMubGFiLmEsIHRoaXMubGFiLmIpLFxuICAgICAgICAgICAgQTogdGhpcy5sYWIuQVxuICAgICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGVMQUJyb21MQ0goKSB7XG4gICAgICAgIHRoaXMubGFiID0ge1xuICAgICAgICAgICAgLi4ubGNoVG9MYWIodGhpcy5sY2guTCwgdGhpcy5sY2guQywgdGhpcy5sY2guSCksXG4gICAgICAgICAgICBBOiB0aGlzLmxjaC5BXG4gICAgICAgIH07XG4gICAgfVxuICAgIHNldE9wdGlvbnMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLl9vcHRpb25zLFxuICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0UihSKSB7XG4gICAgICAgIHRoaXMucmdiLlIgPSBtaW5tYXgoUiwgMCwgQkFTRV8yNTUpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgncmdiJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0RyhHKSB7XG4gICAgICAgIHRoaXMucmdiLkcgPSBtaW5tYXgoRywgMCwgQkFTRV8yNTUpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgncmdiJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRCKEIpIHtcbiAgICAgICAgdGhpcy5yZ2IuQiA9IG1pbm1heChCLCAwLCBCQVNFXzI1NSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCdyZ2InKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNldEgoSCkge1xuICAgICAgICB0aGlzLmhzbC5IID0gbm9ybWFsaXplSHVlKEgpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgnaHNsJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRTKFMpIHtcbiAgICAgICAgdGhpcy5oc2wuUyA9IG1pbm1heChTLCAwLCBNQVhfUENFTlQpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgnaHNsJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRMKEwpIHtcbiAgICAgICAgdGhpcy5oc2wuTCA9IG1pbm1heChMLCAwLCBNQVhfUENFTlQpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgnaHNsJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRXaGl0ZW5lc3MoVykge1xuICAgICAgICB0aGlzLmh3Yi5XID0gbWlubWF4KFcsIDAsIE1BWF9QQ0VOVCk7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUhXQigpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgncmdiJywgJ2h3YicpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0QmxhY2tuZXNzKEIpIHtcbiAgICAgICAgdGhpcy5od2IuQiA9IG1pbm1heChCLCAwLCBNQVhfUENFTlQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21IV0IoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdod2InKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNldENJRUwoTCkge1xuICAgICAgICB0aGlzLmxhYi5MID0gbWlubWF4KEwsIDAsIE1BWF9QQ0VOVCk7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUxBQigpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxDSEZyb21MQUIoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRDSUVhKGEpIHtcbiAgICAgICAgdGhpcy5sYWIuYSA9IG1pbm1heChhLCAtTUFYX0xBQiwgTUFYX0xBQik7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUxBQigpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxDSEZyb21MQUIoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRDSUViKGIpIHtcbiAgICAgICAgdGhpcy5sYWIuYiA9IG1pbm1heChiLCAtTUFYX0xBQiwgTUFYX0xBQik7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUxBQigpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxDSEZyb21MQUIoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRMQ0hMKGwpIHtcbiAgICAgICAgdGhpcy5sY2guTCA9IG1pbm1heChsLCAwLCBNQVhfUENFTlQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21MQ0goKTtcbiAgICAgICAgdGhpcy51cGRhdGVMQUJyb21MQ0goKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRMQ0hDKGMpIHtcbiAgICAgICAgdGhpcy5sY2guQyA9IG1pbm1heChjLCAwLCBNQVhfTENIX0MpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21MQ0goKTtcbiAgICAgICAgdGhpcy51cGRhdGVMQUJyb21MQ0goKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRMQ0hIKGgpIHtcbiAgICAgICAgdGhpcy5sY2guSCA9IG5vcm1hbGl6ZUh1ZShoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSR0JGcm9tTENIKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTEFCcm9tTENIKCk7XG4gICAgICAgIHRoaXMudXBkYXRlKCdyZ2InLCAnbGFiJywgJ2xjaCcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0QShBKSB7XG4gICAgICAgIGNvbnN0IGFscGhhID0gbWlubWF4KEEsIDAsIE1BWF9BTFBIQSk7XG4gICAgICAgIHRoaXMucmdiLkEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5oc2wuQSA9IGFscGhhO1xuICAgICAgICB0aGlzLmh3Yi5BID0gYWxwaGE7XG4gICAgICAgIHRoaXMubGFiLkEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5sY2guQSA9IGFscGhhO1xuICAgICAgICB0aGlzLmNteWsuQSA9IGFscGhhO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0QyhDKSB7XG4gICAgICAgIHRoaXMuY215ay5DID0gbWlubWF4KEMsIDAsIDEwMCk7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUNNWUsoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ2NteWsnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNldE0oTSkge1xuICAgICAgICB0aGlzLmNteWsuTSA9IG1pbm1heChNLCAwLCAxMDApO1xuICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21DTVlLKCk7XG4gICAgICAgIHRoaXMudXBkYXRlKCdjbXlrJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRZKFkpIHtcbiAgICAgICAgdGhpcy5jbXlrLlkgPSBtaW5tYXgoWSwgMCwgMTAwKTtcbiAgICAgICAgdGhpcy51cGRhdGVSR0JGcm9tQ01ZSygpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgnY215aycpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0SyhLKSB7XG4gICAgICAgIHRoaXMuY215ay5LID0gbWlubWF4KEssIDAsIDEwMCk7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUNNWUsoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ2NteWsnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IFIoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLnJnYi5SLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgRygpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMucmdiLkcsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBCKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5yZ2IuQiwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IEgoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmhzbC5ILCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgUygpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHNsLlMsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBMKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5oc2wuTCwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IFdoaXRlbmVzcygpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHdiLlcsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBCbGFja25lc3MoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmh3Yi5CLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgQ0lFTCgpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMubGFiLkwsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBDSUVhKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5sYWIuYSwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IENJRWIoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmxhYi5iLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgTENITCgpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMubGNoLkwsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBMQ0hDKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5sY2guQywgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IExDSEgoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmxjaC5ILCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgQSgpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHNsLkEsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBDKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLkMsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBNKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLk0sIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBZKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLlksIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBLKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLkssIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBIRVhPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLnJnYiwgQ29sb3JNb2RlbC5IRVgpO1xuICAgIH1cbiAgICBnZXQgSEVYQU9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KHRoaXMucmdiLCBDb2xvck1vZGVsLkhFWCwgMCwgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBSR0JPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLnJnYiwgQ29sb3JNb2RlbC5SR0IsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBSR0JBT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5yZ2IsIENvbG9yTW9kZWwuUkdCLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBnZXQgSFNMT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5oc2wsIENvbG9yTW9kZWwuSFNMLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgSFNMQU9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KHRoaXMuaHNsLCBDb2xvck1vZGVsLkhTTCwgdGhpcy5vcHRpb25zLmRlY2ltYWxzLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0IEhXQk9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KHRoaXMuaHdiLCBDb2xvck1vZGVsLkhXQiwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IEhXQkFPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLmh3YiwgQ29sb3JNb2RlbC5IV0IsIHRoaXMub3B0aW9ucy5kZWNpbWFscywgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBDSUVMYWJPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLmxhYiwgQ29sb3JNb2RlbC5DSUVMYWIsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBDSUVMYWJBT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5sYWIsIENvbG9yTW9kZWwuQ0lFTGFiLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBnZXQgTENIT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5sY2gsIENvbG9yTW9kZWwuTENILCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgTENIQU9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KHRoaXMubGNoLCBDb2xvck1vZGVsLkxDSCwgdGhpcy5vcHRpb25zLmRlY2ltYWxzLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0IENNWUtPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLmNteWssIENvbG9yTW9kZWwuQ01ZSywgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IENNWUtBT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5jbXlrLCBDb2xvck1vZGVsLkNNWUssIHRoaXMub3B0aW9ucy5kZWNpbWFscywgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBIRVgoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyh0aGlzLnJnYiwgQ29sb3JNb2RlbC5IRVgpO1xuICAgIH1cbiAgICBnZXQgSEVYQSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMucmdiLCBDb2xvck1vZGVsLkhFWCwge30sIHRydWUpO1xuICAgIH1cbiAgICBnZXQgUkdCKCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1ModGhpcy5yZ2IsIENvbG9yTW9kZWwuUkdCLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgUkdCQSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMucmdiLCBDb2xvck1vZGVsLlJHQiwgdGhpcy5vcHRpb25zLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0IEhTTCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMuaHNsLCBDb2xvck1vZGVsLkhTTCwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0IEhTTEEoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyh0aGlzLmhzbCwgQ29sb3JNb2RlbC5IU0wsIHRoaXMub3B0aW9ucywgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBIV0IoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyh0aGlzLmh3YiwgQ29sb3JNb2RlbC5IV0IsIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIGdldCBIV0JBKCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1ModGhpcy5od2IsIENvbG9yTW9kZWwuSFdCLCB0aGlzLm9wdGlvbnMsIHRydWUpO1xuICAgIH1cbiAgICBnZXQgQ0lFTGFiKCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1ModGhpcy5sYWIsIENvbG9yTW9kZWwuQ0lFTGFiLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgQ0lFTGFiQSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMubGFiLCBDb2xvck1vZGVsLkNJRUxhYiwgdGhpcy5vcHRpb25zLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0IExDSCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMubGNoLCBDb2xvck1vZGVsLkxDSCwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0IExDSEEoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyh0aGlzLmxjaCwgQ29sb3JNb2RlbC5MQ0gsIHRoaXMub3B0aW9ucywgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBDTVlLKCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1ModGhpcy5jbXlrLCBDb2xvck1vZGVsLkNNWUssIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIGdldCBDTVlLQSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMuY215aywgQ29sb3JNb2RlbC5DTVlLLCB0aGlzLm9wdGlvbnMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IRVhPYmplY3QoY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KGNvbG9yLCBDb2xvck1vZGVsLkhFWCk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0hFWChjb2xvcikge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuSEVYKTtcbiAgICB9XG4gICAgc3RhdGljIHRvSEVYQU9iamVjdChjb2xvcikge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoY29sb3IsIENvbG9yTW9kZWwuSEVYLCB1bmRlZmluZWQsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IRVhBKGNvbG9yKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyhjb2xvciwgQ29sb3JNb2RlbC5IRVgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b1JHQk9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5SR0IsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9SR0IoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuUkdCLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvUkdCQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5SR0IsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9SR0JBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLlJHQiwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0hTTE9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IU0wsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IU0woY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuSFNMLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvSFNMQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IU0wsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IU0xBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLkhTTCwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0hXQk9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IV0IsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IV0IoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuSFdCLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvSFdCQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IV0IsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IV0JBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLkhXQiwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0NJRUxhYk9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5DSUVMYWIsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9DSUVMYWIoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuQ0lFTGFiLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvQ0lFTGFiQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5DSUVMYWIsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9DSUVMYWJBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLkNJRUxhYiwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0xDSE9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5MQ0gsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9MQ0goY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuTENILCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvTENIQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5MQ0gsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9MQ0hBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLkxDSCwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0NNWUtPYmplY3QoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoY29sb3IsIENvbG9yTW9kZWwuQ01ZSywgb3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0NNWUsoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuQ01ZSywgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0NNWUtBT2JqZWN0KGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KGNvbG9yLCBDb2xvck1vZGVsLkNNWUssIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9DTVlLQShjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyhjb2xvciwgQ29sb3JNb2RlbC5DTVlLLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpLCB0cnVlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kSEVYT2JqZWN0KGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSEVYLCBmYWxzZSwgZmFsc2UsIHN0ZXBzKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kSEVYKGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSEVYLCB0cnVlLCBmYWxzZSwgc3RlcHMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0QmxlbmRIRVhBT2JqZWN0KGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSEVYLCBmYWxzZSwgdHJ1ZSwgc3RlcHMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0QmxlbmRIRVhBKGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSEVYLCB0cnVlLCB0cnVlLCBzdGVwcyk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZFJHQk9iamVjdChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuUkdCLCBmYWxzZSwgZmFsc2UsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kUkdCKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5SR0IsIHRydWUsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZFJHQkFPYmplY3QoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLlJHQiwgZmFsc2UsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kUkdCQShmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuUkdCLCB0cnVlLCB0cnVlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZEhTTE9iamVjdChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSFNMLCBmYWxzZSwgZmFsc2UsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kSFNMKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5IU0wsIHRydWUsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZEhTTEFPYmplY3QoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLkhTTCwgZmFsc2UsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kSFNMQShmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSFNMLCB0cnVlLCB0cnVlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZEhXQk9iamVjdChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSFdCLCBmYWxzZSwgZmFsc2UsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kSFdCKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5IV0IsIHRydWUsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZEhXQkFPYmplY3QoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLkhXQiwgZmFsc2UsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kSFdCQShmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSFdCLCB0cnVlLCB0cnVlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZENJRUxhYk9iamVjdChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuQ0lFTGFiLCBmYWxzZSwgZmFsc2UsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kQ0lFTGFiKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5DSUVMYWIsIHRydWUsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZENJRUxhYkFPYmplY3QoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLkNJRUxhYiwgZmFsc2UsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kQ0lFTGFiQShmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuQ0lFTGFiLCB0cnVlLCB0cnVlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZExDSE9iamVjdChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuTENILCBmYWxzZSwgZmFsc2UsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kTENIKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5MQ0gsIHRydWUsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRCbGVuZExDSEFPYmplY3QoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLkxDSCwgZmFsc2UsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kTENIQShmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuTENILCB0cnVlLCB0cnVlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhIRVhPYmplY3QoY29sb3JzLCBtb2RlKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhFWCwgZmFsc2UsIGZhbHNlLCBtb2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peEhFWChjb2xvcnMsIG1vZGUgPSBNaXguQURESVRJVkUpIHtcbiAgICAgICAgcmV0dXJuIGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuSEVYLCB0cnVlLCBmYWxzZSwgbW9kZSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhIRVhBT2JqZWN0KGNvbG9ycywgbW9kZSA9IE1peC5BRERJVElWRSkge1xuICAgICAgICByZXR1cm4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5IRVgsIGZhbHNlLCB0cnVlLCBtb2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peEhFWEEoY29sb3JzLCBtb2RlID0gTWl4LkFERElUSVZFKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhFWCwgdHJ1ZSwgdHJ1ZSwgbW9kZSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhSR0JPYmplY3QoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLlJHQiwgZmFsc2UsIGZhbHNlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peFJHQihjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuUkdCLCB0cnVlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhSR0JBT2JqZWN0KGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5SR0IsIGZhbHNlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peFJHQkEoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLlJHQiwgdHJ1ZSwgdHJ1ZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhIU0xPYmplY3QoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhTTCwgZmFsc2UsIGZhbHNlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peEhTTChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuSFNMLCB0cnVlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhIU0xBT2JqZWN0KGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5IU0wsIGZhbHNlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peEhTTEEoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhTTCwgdHJ1ZSwgdHJ1ZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhIV0JPYmplY3QoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhXQiwgZmFsc2UsIGZhbHNlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peEhXQihjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuSFdCLCB0cnVlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhIV0JBT2JqZWN0KGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5IV0IsIGZhbHNlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peEhXQkEoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhXQiwgdHJ1ZSwgdHJ1ZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhDSUVMYWJPYmplY3QoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkNJRUxhYiwgZmFsc2UsIGZhbHNlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peENJRUxhYihjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuQ0lFTGFiLCB0cnVlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhDSUVMYWJBT2JqZWN0KGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5DSUVMYWIsIGZhbHNlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peENJRUxhYkEoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkNJRUxhYiwgdHJ1ZSwgdHJ1ZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhMQ0hPYmplY3QoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkxDSCwgZmFsc2UsIGZhbHNlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peExDSChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuTENILCB0cnVlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRNaXhMQ0hBT2JqZWN0KGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikge1xuICAgICAgICByZXR1cm4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5MQ0gsIGZhbHNlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE1peExDSEEoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkxDSCwgdHJ1ZSwgdHJ1ZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaGFkZXMoY29sb3IsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldFNoYWRlc09yVGludHNSZXR1cm4odHJ1ZSwgY29sb3IsIC4uLmdldFNoYWRlc09yVGludHNSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFRpbnRzKGNvbG9yLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRTaGFkZXNPclRpbnRzUmV0dXJuKGZhbHNlLCBjb2xvciwgLi4uZ2V0U2hhZGVzT3JUaW50c1JldHVyblBhcmFtZXRlcnMoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SGFybW9ueShjb2xvciwgc2Vjb25kUGFyYW0sIHRoaXJkUGFyYW0sIGZvdXJ0aFBhcmFtKSB7XG4gICAgICAgIHJldHVybiBnZXRIYXJtb255UmV0dXJuKGNvbG9yLCAuLi5nZXRIYXJtb255UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbSwgdGhpcmRQYXJhbSwgZm91cnRoUGFyYW0pKTtcbiAgICB9XG59XG4iLCJleHBvcnQgeyBIYXJtb255LCBNaXggfSBmcm9tICcjY29uc3RhbnRzJztcbmV4cG9ydCB7IENvbG9yVHJhbnNsYXRvciB9IGZyb20gJyNjbGFzc2VzL0NvbG9yVHJhbnNsYXRvcic7XG4iLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBjb2xvciA9IG5ldyBDb2xvclRyYW5zbGF0b3IoJ2hzbCgxODAgMTAwJSA1MCUpJywgeyBkZWNpbWFsczogMCB9KTtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IDEwOyByb3crKykge1xuXG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDEwOyBjb2wrKykge1xuXG4gICAgICAgICAgICBjb2xvclxuICAgICAgICAgICAgICAgIC5zZXRTKHJvdyAqIDEwKVxuICAgICAgICAgICAgICAgIC5zZXRMKGNvbCAqIDUgKyAzMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBib3guY2xhc3NMaXN0LmFkZCgnYm94Jyk7XG4gICAgICAgICAgICBib3guc3R5bGUuYmFja2dyb3VuZCA9IGNvbG9yLkhFWDtcblxuICAgICAgICAgICAgYm94LmlubmVyVGV4dCA9XG4gICAgICAgICAgICAgICAgYFI6JHtjb2xvci5SfVxuICAgICAgICAgICAgICAgICBHOiR7Y29sb3IuR31cbiAgICAgICAgICAgICAgICAgQjoke2NvbG9yLkJ9YDtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGNvbG9yID0gbmV3IENvbG9yVHJhbnNsYXRvcih7IFI6IDI1NSwgRzogMCwgQjogMCB9KTtcbiAgICBjb25zdCBodWUgPSBbMCwgMzAsIDYwLCAxMjAsIDI0MCwgMjgwLCAzMjAsIDBdO1xuICAgIGxldCByYWluYm93O1xuXG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBodWUubGVuZ3RoOyByKyspIHtcblxuICAgICAgICBjb2xvci5zZXRIKGh1ZVtyXSk7XG5cbiAgICAgICAgY29uc3QgYm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgYm93LmNsYXNzTGlzdC5hZGQoJ3JhaW5ib3cnKTtcbiAgICAgICAgYm93LnN0eWxlLmJhY2tncm91bmQgPSBjb2xvci5IRVg7XG5cbiAgICAgICAgaWYgKHJhaW5ib3cpIHtcbiAgICAgICAgICAgIHJhaW5ib3cuYXBwZW5kQ2hpbGQoYm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmFpbmJvdyA9IGJvdztcbiAgICB9XG5cbiAgICByYWluYm93LnN0eWxlLmJhY2tncm91bmQgPSAnIzMzMyc7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGhzbCA9IHsgSDogMCwgUzogJzkwJScsIEw6ICc1MCUnIH07XG4gICAgY29uc3QgaHVlID0gW3VuZGVmaW5lZCwgNTUsIDMwLCAwLCAyOTAsIDIyMCwgMTMwXTtcbiAgICBjb25zdCB0b3RhbCA9IGh1ZS5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0b3RhbDsgcm93KyspIHtcblxuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB0b3RhbDsgY29sKyspIHtcblxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdG90YWwgLSByb3cgKyBjb2w7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gdG90YWwpIHtcbiAgICAgICAgICAgICAgICBpbmRleCAtPSB0b3RhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhzbC5IID0gaHVlW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IGh1ZVtpbmRleF0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gJyNGRkYnXG4gICAgICAgICAgICAgICAgOiBDb2xvclRyYW5zbGF0b3IudG9IRVgoaHNsKTtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBib3guY2xhc3NMaXN0LmFkZCgnZmxhZycpO1xuICAgICAgICAgICAgYm94LnN0eWxlLmJhY2tncm91bmQgPSByZ2I7XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGhleENvbG9ycyA9IFtcbiAgICAgICAgJyNGRTI3MTInLCAnI0ZFNTQwOScsICcjRkI5OTAyJyxcbiAgICAgICAgJyNGQUJEMDMnLCAnI0ZGRkUzMicsICcjRDFFQTJDJyxcbiAgICAgICAgJyM2NkIxMzInLCAnIzAzOTJDRScsICcjMDI0N0ZFJyxcbiAgICAgICAgJyMzRDAwQTUnLCAnIzg2MDFCMCcsICcjQTcxOTRCJ1xuICAgIF07XG5cbiAgICBoZXhDb2xvcnMuZm9yRWFjaCgoY29sb3IpID0+IHtcblxuICAgICAgICBjb25zdCByZ2IgPSBDb2xvclRyYW5zbGF0b3IudG9SR0IoY29sb3IpO1xuICAgICAgICBjb25zdCBoc2wgPSBDb2xvclRyYW5zbGF0b3IudG9IU0woY29sb3IsIHsgZGVjaW1hbHM6IDAgfSk7XG4gICAgICAgIGNvbnN0IGh3YiA9IENvbG9yVHJhbnNsYXRvci50b0hXQihjb2xvciwgeyBkZWNpbWFsczogMCB9KTtcbiAgICAgICAgY29uc3QgbGFiID0gQ29sb3JUcmFuc2xhdG9yLnRvQ0lFTGFiKGNvbG9yLCB7IGRlY2ltYWxzOiAwIH0pO1xuICAgICAgICBjb25zdCBsY2ggPSBDb2xvclRyYW5zbGF0b3IudG9MQ0goY29sb3IsIHsgZGVjaW1hbHM6IDAgfSk7XG5cbiAgICAgICAgY29uc3QgcmdiRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnN0IGhzbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBjb25zdCBod2JEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3QgbGFiRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnN0IGxjaERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIHJnYkRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSByZ2I7XG4gICAgICAgIHJnYkRpdi50ZXh0Q29udGVudCA9IHJnYjtcblxuICAgICAgICBoc2xEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gaHNsO1xuICAgICAgICBoc2xEaXYudGV4dENvbnRlbnQgPSBoc2w7XG5cbiAgICAgICAgaHdiRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGh3YjtcbiAgICAgICAgaHdiRGl2LnRleHRDb250ZW50ID0gaHdiO1xuXG4gICAgICAgIGxhYkRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBsYWI7XG4gICAgICAgIGxhYkRpdi50ZXh0Q29udGVudCA9IGxhYjtcblxuICAgICAgICBsY2hEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gbGNoO1xuICAgICAgICBsY2hEaXYudGV4dENvbnRlbnQgPSBsY2g7XG5cbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHJnYkRpdik7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChoc2xEaXYpO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaHdiRGl2KTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxhYkRpdik7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsY2hEaXYpO1xuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGNvbG9ycyA9IFtcbiAgICAgICAgJ3JlZCcsXG4gICAgICAgICdsaW1lJyxcbiAgICAgICAgJ2JsdWUnLFxuICAgICAgICAnYXF1YScsXG4gICAgICAgICd5ZWxsb3cnLFxuICAgICAgICAnZnVjaHNpYSdcbiAgICBdO1xuICAgIGNvbnN0IHRvdGFsID0gY29sb3JzLmxlbmd0aDtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRvdGFsOyByb3crKykge1xuXG4gICAgICAgIGNvbnN0IGhzbCA9IENvbG9yVHJhbnNsYXRvci50b0hTTE9iamVjdChjb2xvcnNbcm93XSk7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBoc2wuUyAvICh0b3RhbCAtIDEpO1xuXG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHRvdGFsOyBjb2wrKykge1xuXG4gICAgICAgICAgICBjb25zdCByZ2IgPSBDb2xvclRyYW5zbGF0b3IudG9IRVgoaHNsKTtcbiAgICAgICAgICAgIGNvbnN0IGNteWsgPSBDb2xvclRyYW5zbGF0b3IudG9DTVlLT2JqZWN0KGhzbCwgeyBkZWNpbWFsczogMCB9KTtcblxuICAgICAgICAgICAgY29uc3QgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBib3guY2xhc3NMaXN0LmFkZCgnYm94Jyk7XG4gICAgICAgICAgICBib3guc3R5bGUuYmFja2dyb3VuZCA9IHJnYjtcbiAgICAgICAgICAgIGJveC5pbm5lclRleHQgPSBgQzoke2NteWsuQ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTToke2NteWsuTX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWToke2NteWsuWX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzoke2NteWsuS31gO1xuXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYm94KTtcblxuICAgICAgICAgICAgaHNsLlMgLT0gc3RlcDtcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCByb3dzID0gMTE7XG4gICAgY29uc3QgbXVsdCA9IDM7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3M7IGkrKykge1xuXG4gICAgICAgIGNvbnN0IGJsZW5kcyA9IENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhFWCgnI0YwMCcsICcjRkYwJywgbXVsdCArIGkgKiBtdWx0KTtcblxuICAgICAgICBibGVuZHMuZm9yRWFjaCgoYmxlbmQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCdib3gnLCBgZmlsZSR7aX1gKTtcbiAgICAgICAgICAgIGJveC5zdHlsZS5iYWNrZ3JvdW5kID0gYmxlbmQ7XG4gICAgICAgICAgICBib3guaW5uZXJUZXh0ID0gaW5kZXggKyAxO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJveCk7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGNvbnN0IGNvbG9ycyA9IFsnI0YwMCcsICcjRkY4MDAwJywgJyNGRjAnLCAnIzBGMCcsICcjMDBGJywgJyNBMEYnLCAnI0YwQSddO1xuXG4gICAgY29uc3QgY3JlYXRlQm94ID0gKGNvbG9yLCB0eXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBib3guY2xhc3NMaXN0LmFkZCgnYm94Jyk7XG4gICAgICAgIGJveC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgICAgICAgaWYgKHR5cGUpIGJveC5kYXRhc2V0LnR5cGUgPSB0eXBlO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYm94KTtcbiAgICB9O1xuXG4gICAgY29sb3JzLmZvckVhY2goKGNvbG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYWRlcyA9IENvbG9yVHJhbnNsYXRvci5nZXRTaGFkZXMoY29sb3IsIDMpLnJldmVyc2UoKTtcbiAgICAgICAgY29uc3QgdGludHMgPSBDb2xvclRyYW5zbGF0b3IuZ2V0VGludHMoY29sb3IsIDMpO1xuICAgICAgICBzaGFkZXMuZm9yRWFjaCgoc2hhZGUpID0+IGNyZWF0ZUJveChzaGFkZSwgJ3NoYWRlJykpO1xuICAgICAgICBjcmVhdGVCb3goY29sb3IpO1xuICAgICAgICB0aW50cy5mb3JFYWNoKCh0aW50KSA9PiBjcmVhdGVCb3godGludCwgJ3RpbnQnKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvcikgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb25zdCBtaXhlcyA9IFtcbiAgICAgICAgJyNGMDAnLFxuICAgICAgICAnIzBGMCcsXG4gICAgICAgICcjMDBGJyxcbiAgICAgICAgWzEsIDNdLFxuICAgICAgICBbMSwgMl0sXG4gICAgICAgIFsyLCAzXSxcbiAgICAgICAgWzEsIDIsIDNdXG4gICAgXTtcblxuICAgIGNvbnN0IGZpbGxQbGFuZXMgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYW5lcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcjcGxhbmVzIHBhdGgnKTtcbiAgICAgICAgcGxhbmVzLmZvckVhY2goKHBsYW5lLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbG9yID0gJyNDQ0MnO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtaXhlc1tpbmRleF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IgPSBtaXhlc1tpbmRleF07XG4gICAgICAgICAgICB9IGVsc2UgaWYobWl4ZXNbaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3JzID0gbWl4ZXNbaW5kZXhdLm1hcCgoaSkgPT4gbWl4ZXNbaSAtIDFdKTtcbiAgICAgICAgICAgICAgICBjb2xvciA9IG1peGVzW2luZGV4XSA9IENvbG9yVHJhbnNsYXRvci5nZXRNaXhIRVgoY29sb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBsYW5lLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGNvbG9yKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZldGNoKCdpbWFnZXMvY29sb3ItbWl4ZXMuc3ZnJylcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC50ZXh0KCkpXG4gICAgICAgIC50aGVuKChzdmdDb2RlKSA9PiB7XG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gc3ZnQ29kZTtcbiAgICAgICAgICAgIGZpbGxQbGFuZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IsIHsgTWl4IH0pID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgY29uc3QgbWl4ZXMgPSBbXG4gICAgICAgICcjRjAwJyxcbiAgICAgICAgJyNGRjAnLFxuICAgICAgICAnIzAwRicsXG4gICAgICAgIFsxLCAzXSxcbiAgICAgICAgWzEsIDJdLFxuICAgICAgICBbMiwgM10sXG4gICAgICAgIFsxLCAyLCAzXVxuICAgIF07XG5cbiAgICBjb25zdCBmaWxsUGxhbmVzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBwbGFuZXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnI3BsYW5lcyBwYXRoJyk7XG4gICAgICAgIHBsYW5lcy5mb3JFYWNoKChwbGFuZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBjb2xvciA9ICcjQ0NDJztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWl4ZXNbaW5kZXhdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gbWl4ZXNbaW5kZXhdO1xuICAgICAgICAgICAgfSBlbHNlIGlmKG1peGVzW2luZGV4XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9ycyA9IG1peGVzW2luZGV4XS5tYXAoKGkpID0+IG1peGVzW2kgLSAxXSk7XG4gICAgICAgICAgICAgICAgY29sb3IgPSBtaXhlc1tpbmRleF0gPSBDb2xvclRyYW5zbGF0b3IuZ2V0TWl4SEVYKGNvbG9ycywgTWl4LlNVQlRSQUNUSVZFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBsYW5lLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGNvbG9yKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZldGNoKCdpbWFnZXMvY29sb3ItbWl4ZXMuc3ZnJylcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC50ZXh0KCkpXG4gICAgICAgIC50aGVuKChzdmdDb2RlKSA9PiB7XG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gc3ZnQ29kZTtcbiAgICAgICAgICAgIGZpbGxQbGFuZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IsIHsgSGFybW9ueSB9KSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGNvbnN0IGhhcm1vbmllcyA9IFtcbiAgICAgICAgeyBsYWJlbDogJ0NvbXBsZW1lbnRhcnknLCAgICAgICB2YWx1ZTogSGFybW9ueS5DT01QTEVNRU5UQVJZIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTcGxpdCBDb21wbGVtZW50YXJ5JywgdmFsdWU6IEhhcm1vbnkuU1BMSVRfQ09NUExFTUVOVEFSWSB9LFxuICAgICAgICB7IGxhYmVsOiAnQW5hbG9nb3VzJywgICAgICAgICAgIHZhbHVlOiBIYXJtb255LkFOQUxPR09VUyB9LFxuICAgICAgICB7IGxhYmVsOiAnVHJpYWRpYycsICAgICAgICAgICAgIHZhbHVlOiBIYXJtb255LlRSSUFESUMgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RldHJhZGljJywgICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5URVRSQURJQyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3F1YXJlJywgICAgICAgICAgICAgIHZhbHVlOiBIYXJtb255LlNRVUFSRSB9XG4gICAgXTtcblxuICAgIGNvbnN0IGJhc2VDb2xvciA9ICcjRjAwJztcblxuICAgIGNvbnN0IGNyZWF0ZUVsZW1lbnQgPSAoY2xhc3NOYW1lLCBwYXJlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICByZXR1cm4gZGl2O1xuICAgIH07XG5cbiAgICBjb25zdCBjcmVhdGVIYXJtb255ID0gKGl0ZW0pID0+IHtcblxuICAgICAgICBjb25zdCB3cmFwcGVyID0gY3JlYXRlRWxlbWVudCgnd3JhcHBlcicsIGNvbnRhaW5lcik7XG4gICAgICAgIGNvbnN0IHdoZWVsID0gY3JlYXRlRWxlbWVudCgnd2hlZWwnLCB3cmFwcGVyKTtcbiAgICAgICAgY29uc3QgaGFybW9ueSA9IGNyZWF0ZUVsZW1lbnQoJ2hhcm1vbnknLCB3cmFwcGVyKTtcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnbGFiZWwnLCB3cmFwcGVyKS5pbm5lclRleHQgPSBpdGVtLmxhYmVsO1xuXG4gICAgICAgIGZldGNoKCdpbWFnZXMvd2hlZWwtYWRkaXRpdmUuc3ZnJylcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiByZXN1bHQudGV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKHN2Z0NvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXJtb255Q29sb3JzID0gQ29sb3JUcmFuc2xhdG9yLmdldEhhcm1vbnkoYmFzZUNvbG9yLCBpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9ICdwYXRoJyArIGhhcm1vbnlDb2xvcnMubWFwKChjb2xvcikgPT4gYDpub3QoW2ZpbGw9XCIke2NvbG9yfVwiXSlgKS5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICB3aGVlbC5pbm5lckhUTUwgPSBzdmdDb2RlO1xuICAgICAgICAgICAgICAgIGhhcm1vbnlDb2xvcnMuZm9yRWFjaCgoaGV4KSA9PiBjcmVhdGVFbGVtZW50KCdib3gnLCBoYXJtb255KS5zdHlsZS5iYWNrZ3JvdW5kID0gaGV4KTtcbiAgICAgICAgICAgICAgICB3aGVlbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKS5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbC1vcGFjaXR5JywgJzAuMjUnKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBoYXJtb25pZXMuZm9yRWFjaCgoaXRlbSkgPT4gY3JlYXRlSGFybW9ueShpdGVtKSk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IsIHsgSGFybW9ueSwgTWl4IH0pID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgY29uc3QgaGFybW9uaWVzID0gW1xuICAgICAgICB7IGxhYmVsOiAnQ29tcGxlbWVudGFyeScsICAgICAgIHZhbHVlOiBIYXJtb255LkNPTVBMRU1FTlRBUlkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NwbGl0IENvbXBsZW1lbnRhcnknLCB2YWx1ZTogSGFybW9ueS5TUExJVF9DT01QTEVNRU5UQVJZIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBbmFsb2dvdXMnLCAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuQU5BTE9HT1VTIH0sXG4gICAgICAgIHsgbGFiZWw6ICdUcmlhZGljJywgICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuVFJJQURJQyB9LFxuICAgICAgICB7IGxhYmVsOiAnVGV0cmFkaWMnLCAgICAgICAgICAgIHZhbHVlOiBIYXJtb255LlRFVFJBRElDIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTcXVhcmUnLCAgICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuU1FVQVJFIH1cbiAgICBdO1xuXG4gICAgY29uc3QgYmFzZUNvbG9yID0gJyNGMDAnO1xuXG4gICAgY29uc3QgY3JlYXRlRWxlbWVudCA9IChjbGFzc05hbWUsIHBhcmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIHJldHVybiBkaXY7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWF0ZUhhcm1vbnkgPSAoaXRlbSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBjcmVhdGVFbGVtZW50KCd3cmFwcGVyJywgY29udGFpbmVyKTtcbiAgICAgICAgY29uc3Qgd2hlZWwgPSBjcmVhdGVFbGVtZW50KCd3aGVlbCcsIHdyYXBwZXIpO1xuICAgICAgICBjb25zdCBoYXJtb255ID0gY3JlYXRlRWxlbWVudCgnaGFybW9ueScsIHdyYXBwZXIpO1xuICAgICAgICBjcmVhdGVFbGVtZW50KCdsYWJlbCcsIHdyYXBwZXIpLmlubmVyVGV4dCA9IGl0ZW0ubGFiZWw7XG5cbiAgICAgICAgZmV0Y2goJ2ltYWdlcy93aGVlbC1zdWJ0cmFjdGl2ZS5zdmcnKVxuICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC50ZXh0KCkpXG4gICAgICAgICAgICAudGhlbigoc3ZnQ29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhcm1vbnlDb2xvcnMgPSBDb2xvclRyYW5zbGF0b3IuZ2V0SGFybW9ueShiYXNlQ29sb3IsIGl0ZW0udmFsdWUsIE1peC5TVUJUUkFDVElWRSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAncGF0aCcgKyBoYXJtb255Q29sb3JzLm1hcCgoY29sb3IpID0+IGA6bm90KFtmaWxsPVwiJHtjb2xvcn1cIl0pYCkuam9pbignJyk7XG4gICAgICAgICAgICAgICAgd2hlZWwuaW5uZXJIVE1MID0gc3ZnQ29kZTtcbiAgICAgICAgICAgICAgICBoYXJtb255Q29sb3JzLmZvckVhY2goKGhleCkgPT4gY3JlYXRlRWxlbWVudCgnYm94JywgaGFybW9ueSkuc3R5bGUuYmFja2dyb3VuZCA9IGhleCk7XG4gICAgICAgICAgICAgICAgd2hlZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjI1JykpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgaGFybW9uaWVzLmZvckVhY2goKGl0ZW0pID0+IGNyZWF0ZUhhcm1vbnkoaXRlbSkpO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4uLy4uL25vZGVfbW9kdWxlcy9nb29nbGUtY29kZS1wcmV0dGlmeS9iaW4vcnVuX3ByZXR0aWZ5Lm1pbic7XG5pbXBvcnQgJy4uLy4uL25vZGVfbW9kdWxlcy9nb29nbGUtY29kZS1wcmV0dGlmeS9iaW4vcHJldHRpZnkubWluLmNzcyc7XG5pbXBvcnQgJy4uLy4uL25vZGVfbW9kdWxlcy9nb29nbGUtY29kZS1wcmV0dGlmeS9zdHlsZXMvZGVzZXJ0LmNzcyc7XG5pbXBvcnQgJ3doYXR3Zy1mZXRjaCc7XG5pbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuaW1wb3J0IHsgQ29sb3JUcmFuc2xhdG9yLCBIYXJtb255LCBNaXggfSBmcm9tICcuLi8nO1xuaW1wb3J0IGRlbW8xIGZyb20gJy4vZGVtbzEnO1xuaW1wb3J0IGRlbW8yIGZyb20gJy4vZGVtbzInO1xuaW1wb3J0IGRlbW8zIGZyb20gJy4vZGVtbzMnO1xuaW1wb3J0IGRlbW80IGZyb20gJy4vZGVtbzQnO1xuaW1wb3J0IGRlbW81IGZyb20gJy4vZGVtbzUnO1xuaW1wb3J0IGRlbW82IGZyb20gJy4vZGVtbzYnO1xuaW1wb3J0IGRlbW83IGZyb20gJy4vZGVtbzcnO1xuaW1wb3J0IGRlbW84IGZyb20gJy4vZGVtbzgnO1xuaW1wb3J0IGRlbW85IGZyb20gJy4vZGVtbzknO1xuaW1wb3J0IGRlbW8xMCBmcm9tICcuL2RlbW8xMCc7XG5pbXBvcnQgZGVtbzExIGZyb20gJy4vZGVtbzExJztcblxuY29uc3QgZnVuY3Rpb1RvU3RyaW5nID0gKGZuKSA9PiB7XG4gICAgY29uc3QgYXJ0aWNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FydGljbGUnKTtcbiAgICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICBhcnRpY2xlLmNsYXNzTGlzdC5hZGQoJ2Z1bmN0aW9uLWNvbnRhaW5lcicpO1xuICAgIHByZS5jbGFzc0xpc3QuYWRkKCdwcmV0dHlwcmludCcpO1xuICAgIGFydGljbGUuYXBwZW5kQ2hpbGQocHJlKTtcbiAgICBwcmUuaW5uZXJIVE1MID0gZm4udG9TdHJpbmcoKS5yZXBsYWNlKCcoQ29sb3JUcmFuc2xhdG9yKScsICcoKScpO1xuICAgIHJldHVybiBhcnRpY2xlO1xufTtcblxuY29uc3QgZGVtb3MgPSBuZXcgTWFwKFtcbiAgICBbJ2RlbW8xJywgZGVtbzFdLFxuICAgIFsnZGVtbzInLCBkZW1vMl0sXG4gICAgWydkZW1vMycsIGRlbW8zXSxcbiAgICBbJ2RlbW80JywgZGVtbzRdLFxuICAgIFsnZGVtbzUnLCBkZW1vNV0sXG4gICAgWydkZW1vNicsIGRlbW82XSxcbiAgICBbJ2RlbW83JywgZGVtbzddLFxuICAgIFsnZGVtbzgnLCBkZW1vOF0sXG4gICAgWydkZW1vOScsIGRlbW85XSxcbiAgICBbJ2RlbW8xMCcsIGRlbW8xMF0sXG4gICAgWydkZW1vMTEnLCBkZW1vMTFdXG5dKTtcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICBkZW1vcy5mb3JFYWNoKChtb2R1bGUsIGRpdikgPT4ge1xuICAgICAgICBjb25zdCBkZW1vID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGl2KTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGVtby1jb250YWluZXInKTtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdkZW1vLXdyYXBwZXInKTtcblxuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKG1vZHVsZShDb2xvclRyYW5zbGF0b3IsIHsgSGFybW9ueSwgTWl4IH0pKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgICAgICBkZW1vLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgICAgIGRlbW8uYXBwZW5kQ2hpbGQoZnVuY3Rpb1RvU3RyaW5nKG1vZHVsZSkpO1xuICAgIH0pO1xufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///514\n\n}")}},__webpack_module_cache__={};function __webpack_require__(I){var g=__webpack_module_cache__[I];if(void 0!==g)return g.exports;var C=__webpack_module_cache__[I]={exports:{}};return __webpack_modules__[I](C,C.exports,__webpack_require__),C.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(I){if("object"==typeof window)return window}}();var __webpack_exports__=__webpack_require__(514),__webpack_export_target__=window;for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__]=__webpack_exports__[__webpack_i__];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})(); \ No newline at end of file +(()=>{var __webpack_modules__={966(module,exports){eval('{var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(){var r=null;\n(function(){function X(e){function j(){try{J.doScroll("left")}catch(e){P(j,50);return}w("poll")}function w(j){if(!(j.type=="readystatechange"&&x.readyState!="complete")&&((j.type=="load"?n:x)[z](i+j.type,w,!1),!m&&(m=!0)))e.call(n,j.type||j)}var Y=x.addEventListener,m=!1,C=!0,t=Y?"addEventListener":"attachEvent",z=Y?"removeEventListener":"detachEvent",i=Y?"":"on";if(x.readyState=="complete")e.call(n,"lazy");else{if(x.createEventObject&&J.doScroll){try{C=!n.frameElement}catch(A){}C&&j()}x[t](i+"DOMContentLoaded",\nw,!1);x[t](i+"readystatechange",w,!1);n[t](i+"load",w,!1)}}function Q(){S&&X(function(){var e=K.length;$(e?function(){for(var j=0;j=0;){var M=A[m],T=M.src.match(/^[^#?]*\\/run_prettify\\.js(\\?[^#]*)?(?:#.*)?$/);if(T){z=T[1]||"";M.parentNode.removeChild(M);break}}var S=!0,D=\n[],N=[],K=[];z.replace(/[&?]([^&=]+)=([^&]+)/g,function(e,j,w){w=decodeURIComponent(w);j=decodeURIComponent(j);j=="autorun"?S=!/^[0fn]/i.test(w):j=="lang"?D.push(w):j=="skin"?N.push(w):j=="callback"&&K.push(w)});m=0;for(z=D.length;m122||(o<65||k>90||f.push([Math.max(65,k)|32,Math.min(o,90)|32]),o<97||k>122||f.push([Math.max(97,k)&-33,Math.min(o,122)&-33]))}}f.sort(function(f,a){return f[0]-\na[0]||a[1]-f[1]});b=[];g=[];for(a=0;ak[0]&&(k[1]+1>k[0]&&c.push("-"),c.push(h(k[1])));c.push("]");return c.join("")}function e(f){for(var a=f.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),c=a.length,d=[],g=0,k=0;g=2&&f==="["?a[g]=b(o):f!=="\\\\"&&(a[g]=o.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var j=0,F=!1,l=!1,I=0,c=a.length;I=5&&"lang-"===y.substring(0,5))&&!(u&&typeof u[1]==="string"))g=!1,y="src";g||(m[B]=y)}k=c;c+=B.length;if(g){g=u[1];var o=B.indexOf(g),H=o+g.length;u[2]&&(H=B.length-u[2].length,o=H-g.length);y=y.substring(5);n(l+k,B.substring(0,o),h,j);n(l+k+o,g,A(y,\ng),j);n(l+k+H,B.substring(H),h,j)}else j.push(l+k,y)}a.g=j}var b={},e;(function(){for(var h=a.concat(d),l=[],i={},c=0,p=h.length;c=0;)b[q.charAt(f)]=m;m=m[1];q=""+m;i.hasOwnProperty(q)||(l.push(m),i[q]=r)}l.push(/[\\S\\s]/);e=j(l)})();var i=d.length;return h}function t(a){var d=[],h=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\\\]|\\\\[\\S\\s]|\'\'?(?=[^\']))*(?:\'\'\'|$)|"""(?:[^"\\\\]|\\\\[\\S\\s]|""?(?=[^"]))*(?:"""|$)|\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$))/,\nr,"\'\\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,r,"\'\\"`"]):d.push(["str",/^(?:\'(?:[^\\n\\r\'\\\\]|\\\\.)*(?:\'|$)|"(?:[^\\n\\r"\\\\]|\\\\.)*(?:"|$))/,r,"\\"\'"]);a.verbatimStrings&&h.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,r]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,r,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,\nr,"#"]),h.push(["str",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,r])):d.push(["com",/^#[^\\n\\r]*/,r,"#"]));a.cStyleComments&&(h.push(["com",/^\\/\\/[^\\n\\r]*/,r]),h.push(["com",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,r]));if(b=a.regexLiterals){var e=(b=b>1?"":"\\n\\r")?".":"[\\\\S\\\\s]";h.push(["lang-regex",RegExp("^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*("+\n("/(?=[^/*"+b+"])(?:[^/\\\\x5B\\\\x5C"+b+"]|\\\\x5C"+e+"|\\\\x5B(?:[^\\\\x5C\\\\x5D"+b+"]|\\\\x5C"+e+")*(?:\\\\x5D|$))+/")+")")])}(b=a.types)&&h.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&h.push(["kwd",RegExp("^(?:"+b.replace(/[\\s,]+/g,"|")+")\\\\b"),r]);d.push(["pln",/^\\s+/,r," \\r\\n\\t\\u00a0"]);b="^.[^\\\\s\\\\w.$@\'\\"`/\\\\\\\\]*";a.regexLiterals&&(b+="(?!s*/)");h.push(["lit",/^@[$_a-z][\\w$@]*/i,r],["typ",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,r],["pln",/^[$_a-z][\\w$@]*/i,r],["lit",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,\nr,"0123456789"],["pln",/^\\\\[\\S\\s]?/,r],["pun",RegExp(b),r]);return C(d,h)}function z(a,d,h){function b(a){var c=a.nodeType;if(c==1&&!j.test(a.className))if("br"===a.nodeName)e(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&h){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),e(a),c||a.parentNode.removeChild(a)}}\nfunction e(a){function b(a,c){var d=c?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),h=a.nextSibling;f.appendChild(d);for(var e=h;e;e=h)h=e.nextSibling,f.appendChild(e)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var j=/(?:^|\\s)nocode(?:\\s|$)/,m=/\\r\\n?|\\n/,l=a.ownerDocument,i=l.createElement("li");a.firstChild;)i.appendChild(a.firstChild);for(var c=[i],p=0;p=0;){var b=d[h];U.hasOwnProperty(b)?V.console&&console.warn("cannot override language handler %s",b):U[b]=a}}function A(a,d){if(!a||!U.hasOwnProperty(a))a=/^\\s*=o&&(b+=2);h>=H&&(t+=2)}}finally{if(g)g.style.display=k}}catch(v){V.console&&console.log(v&&v.stack||v)}}var V=window,G=["break,continue,do,else,for,if,return,while"],O=[[G,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],\n"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],J=[O,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],K=[O,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],\nL=[K,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],O=[O,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],M=[G,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],\nN=[G,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],R=[G,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],G=[G,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],Q=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,\nS=/\\S/,T=t({keywords:[J,L,O,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",M,N,G],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),U={};i(T,["default-code"]);i(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],["lang-",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],["lang-",/^<%([\\S\\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",\n/^]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],["lang-js",/^]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],["lang-css",/^]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],["lang-in.tag",/^(<\\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);i(C([["pln",/^\\s+/,r," \\t\\r\\n"],["atv",/^(?:"[^"]*"?|\'[^\']*\'?)/,r,"\\"\'"]],[["tag",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],["atn",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],["lang-uq.val",/^=\\s*([^\\s"\'>]*(?:[^\\s"\'/>]|\\/(?=\\s)))/],["pun",/^[/<->]+/],\n["lang-js",/^on\\w+\\s*=\\s*"([^"]+)"/i],["lang-js",/^on\\w+\\s*=\\s*\'([^\']+)\'/i],["lang-js",/^on\\w+\\s*=\\s*([^\\s"\'>]+)/i],["lang-css",/^style\\s*=\\s*"([^"]+)"/i],["lang-css",/^style\\s*=\\s*\'([^\']+)\'/i],["lang-css",/^style\\s*=\\s*([^\\s"\'>]+)/i]]),["in.tag"]);i(C([],[["atv",/^[\\S\\s]+/]]),["uq.val"]);i(t({keywords:J,hashComments:!0,cStyleComments:!0,types:Q}),["c","cc","cpp","cxx","cyc","m"]);i(t({keywords:"null,true,false"}),["json"]);i(t({keywords:L,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:Q}),\n["cs"]);i(t({keywords:K,cStyleComments:!0}),["java"]);i(t({keywords:G,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);i(t({keywords:M,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);i(t({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);i(t({keywords:N,\nhashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);i(t({keywords:O,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);i(t({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);i(t({keywords:R,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);\ni(C([],[["str",/^[\\S\\s]+/]]),["regex"]);var X=V.PR={createSimpleLexer:C,registerLangHandler:i,sourceDecorator:t,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:function(a,d,e){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;e&&z(b,e,!0);D({h:d,j:e,c:b,i:1});return b.innerHTML},\nprettyPrint:e=e=function(a,d){function e(){for(var b=V.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nfunction Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type)\n var encoding = match ? match[1] : 'utf-8'\n reader.readAsText(blob, encoding)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._noBody = true;\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nfunction Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime())\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n try {\n headers.append(key, value)\n } catch (error) {\n console.warn('Response ' + error.message)\n }\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nfunction Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 200, statusText: ''})\n response.ok = false\n response.status = 0\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nvar DOMException = g.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nfunction fetch_fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob'\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer'\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name))\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value)\n }\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch_fetch.polyfill = true\n\nif (!g.fetch) {\n g.fetch = fetch_fetch\n g.Headers = Headers\n g.Request = Request\n g.Response = Response\n}\n\n;// ./src/constants/enums.ts\nvar ColorModel;\n(function (ColorModel) {\n ColorModel[\"HEX\"] = \"HEX\";\n ColorModel[\"RGB\"] = \"RGB\";\n ColorModel[\"HWB\"] = \"HWB\";\n ColorModel[\"HSL\"] = \"HSL\";\n ColorModel[\"CIELab\"] = \"CIELab\";\n ColorModel[\"LCH\"] = \"LCH\";\n ColorModel[\"CMYK\"] = \"CMYK\";\n})(ColorModel || (ColorModel = {}));\nvar Harmony;\n(function (Harmony) {\n Harmony[\"ANALOGOUS\"] = \"ANALOGOUS\";\n Harmony[\"COMPLEMENTARY\"] = \"COMPLEMENTARY\";\n Harmony[\"SPLIT_COMPLEMENTARY\"] = \"SPLIT_COMPLEMENTARY\";\n Harmony[\"TRIADIC\"] = \"TRIADIC\";\n Harmony[\"TETRADIC\"] = \"TETRADIC\";\n Harmony[\"SQUARE\"] = \"SQUARE\";\n})(Harmony || (Harmony = {}));\nvar Mix;\n(function (Mix) {\n Mix[\"ADDITIVE\"] = \"ADDITIVE\";\n Mix[\"SUBTRACTIVE\"] = \"SUBTRACTIVE\";\n})(Mix || (Mix = {}));\nvar AnglesUnitEnum;\n(function (AnglesUnitEnum) {\n AnglesUnitEnum[\"NONE\"] = \"none\";\n AnglesUnitEnum[\"DEGREES\"] = \"deg\";\n AnglesUnitEnum[\"GRADIANS\"] = \"grad\";\n AnglesUnitEnum[\"RADIANS\"] = \"rad\";\n AnglesUnitEnum[\"TURNS\"] = \"turn\";\n})(AnglesUnitEnum || (AnglesUnitEnum = {}));\nvar ColorUnitEnum;\n(function (ColorUnitEnum) {\n ColorUnitEnum[\"NONE\"] = \"none\";\n ColorUnitEnum[\"PERCENT\"] = \"percent\";\n})(ColorUnitEnum || (ColorUnitEnum = {}));\nvar CMYKFunctionEnum;\n(function (CMYKFunctionEnum) {\n CMYKFunctionEnum[\"DEVICE_CMYK\"] = \"device-cmyk\";\n CMYKFunctionEnum[\"CMYK\"] = \"cmyk\";\n})(CMYKFunctionEnum || (CMYKFunctionEnum = {}));\nvar ColorKeywords;\n(function (ColorKeywords) {\n ColorKeywords[\"black\"] = \"#000000\";\n ColorKeywords[\"silver\"] = \"#C0C0C0\";\n ColorKeywords[\"gray\"] = \"#808080\";\n ColorKeywords[\"white\"] = \"#FFFFFF\";\n ColorKeywords[\"maroon\"] = \"#800000\";\n ColorKeywords[\"red\"] = \"#FF0000\";\n ColorKeywords[\"purple\"] = \"#800080\";\n ColorKeywords[\"fuchsia\"] = \"#FF00FF\";\n ColorKeywords[\"green\"] = \"#008000\";\n ColorKeywords[\"lime\"] = \"#00FF00\";\n ColorKeywords[\"olive\"] = \"#808000\";\n ColorKeywords[\"yellow\"] = \"#FFFF00\";\n ColorKeywords[\"navy\"] = \"#000080\";\n ColorKeywords[\"blue\"] = \"#0000FF\";\n ColorKeywords[\"teal\"] = \"#008080\";\n ColorKeywords[\"aqua\"] = \"#00FFFF\";\n ColorKeywords[\"orange\"] = \"#FFA500\";\n ColorKeywords[\"aliceblue\"] = \"#F0F8FF\";\n ColorKeywords[\"antiquewhite\"] = \"#FAEBD7\";\n ColorKeywords[\"aquamarine\"] = \"#7FFFD4\";\n ColorKeywords[\"azure\"] = \"#F0FFFF\";\n ColorKeywords[\"beige\"] = \"#F5F5DC\";\n ColorKeywords[\"bisque\"] = \"#FFE4C4\";\n ColorKeywords[\"blanchedalmond\"] = \"#FFEBCD\";\n ColorKeywords[\"blueviolet\"] = \"#8A2BE2\";\n ColorKeywords[\"brown\"] = \"#A52A2A\";\n ColorKeywords[\"burlywood\"] = \"#DEB887\";\n ColorKeywords[\"cadetblue\"] = \"#5F9EA0\";\n ColorKeywords[\"chartreuse\"] = \"#7FFF00\";\n ColorKeywords[\"chocolate\"] = \"#D2691E\";\n ColorKeywords[\"coral\"] = \"#FF7F50\";\n ColorKeywords[\"cornflowerblue\"] = \"#6495ED\";\n ColorKeywords[\"cornsilk\"] = \"#FFF8DC\";\n ColorKeywords[\"crimson\"] = \"#DC143C\";\n ColorKeywords[\"cyan\"] = \"#00FFFF\";\n ColorKeywords[\"darkblue\"] = \"#00008B\";\n ColorKeywords[\"darkcyan\"] = \"#008B8B\";\n ColorKeywords[\"darkgoldenrod\"] = \"#B8860B\";\n ColorKeywords[\"darkgray\"] = \"#A9A9A9\";\n ColorKeywords[\"darkgreen\"] = \"#006400\";\n ColorKeywords[\"darkgrey\"] = \"#A9A9A9\";\n ColorKeywords[\"darkkhaki\"] = \"#BDB76B\";\n ColorKeywords[\"darkmagenta\"] = \"#8B008B\";\n ColorKeywords[\"darkolivegreen\"] = \"#556B2F\";\n ColorKeywords[\"darkorange\"] = \"#FF8C00\";\n ColorKeywords[\"darkorchid\"] = \"#9932CC\";\n ColorKeywords[\"darkred\"] = \"#8B0000\";\n ColorKeywords[\"darksalmon\"] = \"#E9967A\";\n ColorKeywords[\"darkseagreen\"] = \"#8FBC8F\";\n ColorKeywords[\"darkslateblue\"] = \"#483D8B\";\n ColorKeywords[\"darkslategray\"] = \"#2F4F4F\";\n ColorKeywords[\"darkslategrey\"] = \"#2F4F4F\";\n ColorKeywords[\"darkturquoise\"] = \"#00CED1\";\n ColorKeywords[\"darkviolet\"] = \"#9400D3\";\n ColorKeywords[\"deeppink\"] = \"#FF1493\";\n ColorKeywords[\"deepskyblue\"] = \"#00BFFF\";\n ColorKeywords[\"dimgray\"] = \"#696969\";\n ColorKeywords[\"dimgrey\"] = \"#696969\";\n ColorKeywords[\"dodgerblue\"] = \"#1E90FF\";\n ColorKeywords[\"firebrick\"] = \"#B22222\";\n ColorKeywords[\"floralwhite\"] = \"#FFFAF0\";\n ColorKeywords[\"forestgreen\"] = \"#228B22\";\n ColorKeywords[\"gainsboro\"] = \"#DCDCDC\";\n ColorKeywords[\"ghostwhite\"] = \"#F8F8FF\";\n ColorKeywords[\"gold\"] = \"#FFD700\";\n ColorKeywords[\"goldenrod\"] = \"#DAA520\";\n ColorKeywords[\"greenyellow\"] = \"#ADFF2F\";\n ColorKeywords[\"grey\"] = \"#808080\";\n ColorKeywords[\"honeydew\"] = \"#F0FFF0\";\n ColorKeywords[\"hotpink\"] = \"#FF69B4\";\n ColorKeywords[\"indianred\"] = \"#CD5C5C\";\n ColorKeywords[\"indigo\"] = \"#4B0082\";\n ColorKeywords[\"ivory\"] = \"#FFFFF0\";\n ColorKeywords[\"khaki\"] = \"#F0E68C\";\n ColorKeywords[\"lavender\"] = \"#E6E6FA\";\n ColorKeywords[\"lavenderblush\"] = \"#FFF0F5\";\n ColorKeywords[\"lawngreen\"] = \"#7CFC00\";\n ColorKeywords[\"lemonchiffon\"] = \"#FFFACD\";\n ColorKeywords[\"lightblue\"] = \"#ADD8E6\";\n ColorKeywords[\"lightcoral\"] = \"#F08080\";\n ColorKeywords[\"lightcyan\"] = \"#E0FFFF\";\n ColorKeywords[\"lightgoldenrodyellow\"] = \"#FAFAD2\";\n ColorKeywords[\"lightgray\"] = \"#D3D3D3\";\n ColorKeywords[\"lightgreen\"] = \"#90EE90\";\n ColorKeywords[\"lightgrey\"] = \"#D3D3D3\";\n ColorKeywords[\"lightpink\"] = \"#FFB6C1\";\n ColorKeywords[\"lightsalmon\"] = \"#FFA07A\";\n ColorKeywords[\"lightseagreen\"] = \"#20B2AA\";\n ColorKeywords[\"lightskyblue\"] = \"#87CEFA\";\n ColorKeywords[\"lightslategray\"] = \"#778899\";\n ColorKeywords[\"lightslategrey\"] = \"#778899\";\n ColorKeywords[\"lightsteelblue\"] = \"#B0C4DE\";\n ColorKeywords[\"lightyellow\"] = \"#FFFFE0\";\n ColorKeywords[\"limegreen\"] = \"#32CD32\";\n ColorKeywords[\"linen\"] = \"#FAF0E6\";\n ColorKeywords[\"magenta\"] = \"#FF00FF\";\n ColorKeywords[\"mediumaquamarine\"] = \"#66CDAA\";\n ColorKeywords[\"mediumblue\"] = \"#0000CD\";\n ColorKeywords[\"mediumorchid\"] = \"#BA55D3\";\n ColorKeywords[\"mediumpurple\"] = \"#9370DB\";\n ColorKeywords[\"mediumseagreen\"] = \"#3CB371\";\n ColorKeywords[\"mediumslateblue\"] = \"#7B68EE\";\n ColorKeywords[\"mediumspringgreen\"] = \"#00FA9A\";\n ColorKeywords[\"mediumturquoise\"] = \"#48D1CC\";\n ColorKeywords[\"mediumvioletred\"] = \"#C71585\";\n ColorKeywords[\"midnightblue\"] = \"#191970\";\n ColorKeywords[\"mintcream\"] = \"#F5FFFA\";\n ColorKeywords[\"mistyrose\"] = \"#FFE4E1\";\n ColorKeywords[\"moccasin\"] = \"#FFE4B5\";\n ColorKeywords[\"navajowhite\"] = \"#FFDEAD\";\n ColorKeywords[\"oldlace\"] = \"#FDF5E6\";\n ColorKeywords[\"olivedrab\"] = \"#6B8E23\";\n ColorKeywords[\"orangered\"] = \"#FF4500\";\n ColorKeywords[\"orchid\"] = \"#DA70D6\";\n ColorKeywords[\"palegoldenrod\"] = \"#EEE8AA\";\n ColorKeywords[\"palegreen\"] = \"#98FB98\";\n ColorKeywords[\"paleturquoise\"] = \"#AFEEEE\";\n ColorKeywords[\"palevioletred\"] = \"#DB7093\";\n ColorKeywords[\"papayawhip\"] = \"#FFEFD5\";\n ColorKeywords[\"peachpuff\"] = \"#FFDAB9\";\n ColorKeywords[\"peru\"] = \"#CD853F\";\n ColorKeywords[\"pink\"] = \"#FFC0CB\";\n ColorKeywords[\"plum\"] = \"#DDA0DD\";\n ColorKeywords[\"powderblue\"] = \"#B0E0E6\";\n ColorKeywords[\"rosybrown\"] = \"#BC8F8F\";\n ColorKeywords[\"royalblue\"] = \"#4169E1\";\n ColorKeywords[\"saddlebrown\"] = \"#8B4513\";\n ColorKeywords[\"salmon\"] = \"#FA8072\";\n ColorKeywords[\"sandybrown\"] = \"#F4A460\";\n ColorKeywords[\"seagreen\"] = \"#2E8B57\";\n ColorKeywords[\"seashell\"] = \"#FFF5EE\";\n ColorKeywords[\"sienna\"] = \"#A0522D\";\n ColorKeywords[\"skyblue\"] = \"#87CEEB\";\n ColorKeywords[\"slateblue\"] = \"#6A5ACD\";\n ColorKeywords[\"slategray\"] = \"#708090\";\n ColorKeywords[\"slategrey\"] = \"#708090\";\n ColorKeywords[\"snow\"] = \"#FFFAFA\";\n ColorKeywords[\"springgreen\"] = \"#00FF7F\";\n ColorKeywords[\"steelblue\"] = \"#4682B4\";\n ColorKeywords[\"tan\"] = \"#D2B48C\";\n ColorKeywords[\"thistle\"] = \"#D8BFD8\";\n ColorKeywords[\"tomato\"] = \"#FF6347\";\n ColorKeywords[\"turquoise\"] = \"#40E0D0\";\n ColorKeywords[\"violet\"] = \"#EE82EE\";\n ColorKeywords[\"wheat\"] = \"#F5DEB3\";\n ColorKeywords[\"whitesmoke\"] = \"#F5F5F5\";\n ColorKeywords[\"yellowgreen\"] = \"#9ACD32\";\n ColorKeywords[\"rebeccapurple\"] = \"#663399\";\n})(ColorKeywords || (ColorKeywords = {}));\n\n;// ./src/constants/regexps.ts\n\nconst COLORREGS = {\n [ColorModel.HEX]: /^#(?:(?[a-f\\d])(?[a-f\\d])(?[a-f\\d])(?
[a-f\\d])?|(?[a-f\\d]{2})(?[a-f\\d]{2})(?[a-f\\d]{2})(?[a-f\\d]{2})?)$/i,\n [ColorModel.RGB]: /^rgba?\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)(?:\\s*,\\s*(?(?:\\d*\\.)?\\d+))?|(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[rgb]|(?:\\d*\\.)?\\d+|calc\\([rgb()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[rgb]|(?:\\d*\\.)?\\d+|calc\\([rgb()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[rgb]|(?:\\d*\\.)?\\d+|calc\\([rgb()/*\\-+\\d.\\s]+\\)))(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.HWB]: /^hwb\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s+(?(?:\\d*\\.)?\\d+)%\\s+(?(?:\\d*\\.)?\\d+)%(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[hwb]|(?:\\d*\\.)?\\d+|calc\\([hwb()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[hwb]|(?:\\d*\\.)?\\d+|calc\\([hwb()/*\\-+\\d.\\s]+\\)))%?\\s+(?(?:[hwb]|(?:\\d*\\.)?\\d+|calc\\([hwb()/*\\-+\\d.\\s]+\\)))%?(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.HSL]: /^hsla?\\s*\\(\\s*(?:(?-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s*,\\s*(?(?:\\d*\\.)?\\d+)%\\s*,\\s*(?(?:\\d*\\.)?\\d+)%(?:\\s*,\\s*(?(?:\\d*\\.)?\\d+))?|(?-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s+(?(?:\\d*\\.)?\\d+)%?\\s+(?(?:\\d*\\.)?\\d+)%?(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[hsl]|(?:\\d*\\.)?\\d+|calc\\([hsl()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[hsl]|(?:\\d*\\.)?\\d+|calc\\([hsl()/*\\-+\\d.\\s]+\\)))%?\\s+(?(?:[hsl]|(?:\\d*\\.)?\\d+|calc\\([hsl()/*\\-+\\d.\\s]+\\)))%?(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.CIELab]: /^lab\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+%?)\\s+(?-?(?:\\d*\\.)?\\d+%?)\\s+(?-?(?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[lab]|(?:\\d*\\.)?\\d+|calc\\([lab()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[lab]|(?:\\d*\\.)?\\d+|calc\\([lab()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[lab]|(?:\\d*\\.)?\\d+|calc\\([lab()/*\\-+\\d.\\s]+\\)))(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.LCH]: /^lch\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+%?)\\s+(?-?(?:\\d*\\.)?\\d+%?)\\s+(?-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?|from\\s+(?(?:\\w+|\\w+\\(\\s*[^())]+\\s*\\)|\\w+\\(from\\s+\\w+\\(.*\\)\\s*\\)|#[a-fA-F\\d]+))\\s+(?(?:[lch]|(?:\\d*\\.)?\\d+|calc\\([lch()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[lch]|(?:\\d*\\.)?\\d+|calc\\([lch()/*\\-+\\d.\\s]+\\)))\\s+(?(?:[lch]|(?:\\d*\\.)?\\d+|calc\\([lch()/*\\-+\\d.\\s]+\\)))(?:\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+%?|calc\\([()/*\\-+\\d.\\s\\w]*(?:alpha)?[()/*\\-+\\d.\\s\\w]*\\)|alpha)))?)\\s*\\)$/,\n [ColorModel.CMYK]: /^(?:device-cmyk|cmyk)\\s*\\(\\s*(?:(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)\\s*,\\s*(?(?:\\d*\\.)?\\d+%?)(?:\\s*,\\s*(?(?:\\d*\\.)?\\d+))?|(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)\\s+(?(?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*(?(?:\\d*\\.)?\\d+%?))?)\\s*\\)$/\n};\nconst CALC = {\n REGEXP: /^calc\\(\\s*(?[\\d./*+-\\w\\s]+)\\s*\\)$/,\n SCOPED: /\\(\\s*([^()]+)\\s*\\)/g,\n DIVISION: /\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*\\/\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*/,\n MULTIPLICATION: /\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*\\*\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*/,\n SUM: /\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*\\+\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*/,\n REST: /\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*-\\s*(?(?:(?:\\d*\\.)?\\d+|\\w+))\\s*/\n};\nconst HSL_HUE = /^(?-?(?:\\d*\\.)?\\d+)(?(?:deg|grad|rad|turn)?)$/;\nconst PCENT = /^(-?\\d+(?:\\.\\d+)?|-?\\.\\d+)%$/;\nconst HEX = /^0x([a-f\\d]{1,2})$/i;\nconst TEMPLATE_VAR = /\\{(\\d+)\\}/g;\nconst COMMAS_AND_NEXT_CHARS = /,( +|\\d+)/g;\nconst SPACES = / +/;\n\n;// ./src/constants/index.ts\n\nconst MAX_DECIMALS = 6;\nconst DEFAULT_BLEND_STEPS = 5;\nconst DEFAULT_SHADES_TINTS_STEPS = 5;\nconst BASE_255 = 255;\nconst MAX_HUE = 360;\nconst MAX_PCENT = 100;\nconst MAX_ALPHA = 1;\nconst MAX_LAB = 125;\nconst MAX_LCH_C = 150;\nconst GRADIANS = 10 / 9;\nconst COLOR_PROPS = Object.freeze({\n HEX: ['R', 'G', 'B', 'A'],\n RGB: ['R', 'G', 'B', 'A'],\n HSL: ['H', 'S', 'L', 'A'],\n HWB: ['H', 'W', 'B', 'A'],\n CIELab: ['L', 'a', 'b', 'A'],\n LCH: ['L', 'C', 'H', 'A'],\n CMYK: ['C', 'M', 'Y', 'K', 'A']\n});\nconst COMMA = ',';\nconst VALID_COLOR_OBJECTS = Object.freeze({\n ABGR: ColorModel.RGB,\n ABHW: ColorModel.HWB,\n ACHL: ColorModel.LCH,\n ACKMY: ColorModel.CMYK,\n AHLS: ColorModel.HSL,\n ALAB: ColorModel.CIELab,\n BGR: ColorModel.RGB,\n BHW: ColorModel.HWB,\n CHL: ColorModel.LCH,\n CKMY: ColorModel.CMYK,\n HLS: ColorModel.HSL,\n LAB: ColorModel.CIELab\n});\nconst DEFAULT_OPTIONS = Object.freeze({\n decimals: MAX_DECIMALS,\n legacyCSS: false,\n spacesAfterCommas: false,\n anglesUnit: AnglesUnitEnum.NONE,\n rgbUnit: ColorUnitEnum.NONE,\n labUnit: ColorUnitEnum.NONE,\n lchUnit: ColorUnitEnum.NONE,\n cmykUnit: ColorUnitEnum.PERCENT,\n alphaUnit: ColorUnitEnum.NONE,\n cmykFunction: CMYKFunctionEnum.DEVICE_CMYK\n});\nconst ERRORS = Object.freeze({\n NOT_ACCEPTED_INPUT: `The provided string color doesn't have a correct format`,\n NOT_A_VALID_RELATIVE_COLOR: 'is not a valid operation for a relative color'\n});\n\n\n\n;// ./src/utilities/index.ts\n\nconst getOrderedArrayString = (keys) => [...keys].sort().join('').toUpperCase();\nconst isString = (input) => typeof input === 'string';\nconst isNumber = (input) => typeof input === 'number';\nconst isBoolean = (input) => typeof input === 'boolean';\nconst isUndefined = (input) => input === undefined;\nconst getColorModel = (color) => {\n return VALID_COLOR_OBJECTS[getOrderedArrayString(Object.keys(color))];\n};\nconst isRGBObject = (color) => getColorModel(color) === ColorModel.RGB;\nconst isHSLObject = (color) => getColorModel(color) === ColorModel.HSL;\nconst isHWBObject = (color) => getColorModel(color) === ColorModel.HWB;\nconst isCIELabObject = (color) => getColorModel(color) === ColorModel.CIELab;\nconst isLCHObject = (color) => getColorModel(color) === ColorModel.LCH;\nconst isCMYKObject = (color) => getColorModel(color) === ColorModel.CMYK;\nconst isColorKeyword = (color) => color in ColorKeywords;\nconst isHarmony = (param) => {\n return !!param && `${param}` in Harmony;\n};\nconst isMix = (param) => {\n return !!param && `${param}` in Mix;\n};\nconst percentNumber = (percent) => {\n return +`${percent}`.replace(PCENT, '$1');\n};\nconst percent = (percent) => PCENT.test(`${percent}`)\n ? percentNumber(percent)\n : Math.min(+percent, 100);\nconst getDEC = (hex) => {\n if (hex.length === 1) {\n hex += hex;\n }\n return parseInt(hex, 16);\n};\nconst getHEX = (number) => {\n const hex = round(number, 0).toString(16).toUpperCase();\n if (hex.length === 1) {\n return `0x0${hex}`;\n }\n return `0x${hex}`;\n};\nconst toHEX = (h) => {\n let hex = round(h, 0).toString(16).toUpperCase();\n if (hex.length === 1) {\n hex = `0${hex}`;\n }\n return hex;\n};\nconst from255NumberToPercent = (value, decimals) => round(value / BASE_255 * 100, decimals);\nconst from125NumberToPercent = (value, decimals) => round(value / MAX_LAB * 100, decimals);\nconst from150NumberToPercent = (value, decimals) => round(value / MAX_LCH_C * 100, decimals);\nconst getBase255Number = (color, alpha = false) => {\n if (!alpha && PCENT.test(color)) {\n return Math.min(BASE_255 * percentNumber(color) / 100, BASE_255);\n }\n if (HEX.test(color)) {\n if (color.length === 3) {\n color += color.slice(-1);\n }\n return alpha\n ? round(color) / BASE_255\n : round(color);\n }\n return Math.min(+color, alpha ? 1 : BASE_255);\n};\nconst getBase125Number = (color) => {\n if (PCENT.test(color)) {\n return minmax(MAX_LAB * percentNumber(color) / 100, -MAX_LAB, MAX_LAB);\n }\n return minmax(+color, -MAX_LAB, MAX_LAB);\n};\nconst getBase150Number = (color) => {\n if (PCENT.test(color)) {\n return minmax(MAX_LCH_C * percentNumber(color) / 100, -MAX_LCH_C, MAX_LCH_C);\n }\n return minmax(+color, -MAX_LCH_C, MAX_LCH_C);\n};\nconst getCMYKNumber = (color, base100) => {\n const value = PCENT.test(color)\n ? percentNumber(color)\n : +color;\n if (base100) {\n return Math.min(value * 100, 100);\n }\n return Math.min(value, 100);\n};\nconst round = (value, decimals = MAX_DECIMALS) => {\n const exp = Math.pow(10, decimals);\n return Math.round(+value * exp) / exp;\n};\nconst minmax = (n, min, max) => Math.max(min, Math.min(n, max));\nconst degrees = (radian) => radian * 180 / Math.PI;\nconst radians = (degrees) => degrees * Math.PI / 180;\nconst normalizeHue = (hue) => {\n if (isString(hue)) {\n const matches = hue.match(HSL_HUE);\n const groups = matches.groups;\n const value = +groups.number;\n const units = groups.units;\n switch (units) {\n case AnglesUnitEnum.RADIANS:\n hue = round(degrees(value));\n break;\n case AnglesUnitEnum.TURNS:\n hue = round(value * MAX_HUE);\n break;\n case AnglesUnitEnum.GRADIANS:\n hue = round(9 / 10 * value);\n break;\n case AnglesUnitEnum.DEGREES:\n default:\n hue = value;\n }\n }\n if (hue >= MAX_HUE || hue < 0) {\n hue -= Math.floor(hue / MAX_HUE) * MAX_HUE;\n }\n return hue;\n};\nconst normalizeAlpha = (alpha) => {\n if (isString(alpha)) {\n if (PCENT.test(alpha)) {\n alpha = percentNumber(alpha) / 100;\n }\n else {\n alpha = +alpha;\n }\n }\n const alphaNumber = Number(alpha);\n return (isNaN(alphaNumber) || alphaNumber > MAX_ALPHA) ? MAX_ALPHA : round(alphaNumber);\n};\nconst translateDegrees = (degrees, units) => {\n let hue;\n switch (units) {\n case AnglesUnitEnum.RADIANS:\n hue = round(radians(degrees));\n break;\n case AnglesUnitEnum.TURNS:\n hue = round(degrees / MAX_HUE);\n break;\n case AnglesUnitEnum.GRADIANS:\n hue = round(GRADIANS * degrees);\n break;\n case AnglesUnitEnum.DEGREES:\n case AnglesUnitEnum.NONE:\n default:\n hue = degrees;\n }\n return hue;\n};\nconst getAngleUnit = (unit) => {\n if (unit) {\n const angleUnitMatch = unit.match(HSL_HUE);\n const angleUnit = angleUnitMatch.groups.units;\n return angleUnit === ''\n ? AnglesUnitEnum.NONE\n : angleUnit;\n }\n return AnglesUnitEnum.NONE;\n};\n\n;// ./src/color/translators.ts\n\n\nconst MATRIX_LRGB_XYZ_D50 = [\n [0.4360747, 0.3850649, 0.1430804],\n [0.2225045, 0.7168786, 0.0606169],\n [0.0139322, 0.0971045, 0.7141733]\n];\nconst MATRIX_XYZ_D50_LRGB = [\n [3.1338561, -1.6168667, -0.4906146],\n [-0.9787684, 1.9161415, 0.033454],\n [0.0719453, -0.2289914, 1.4052427]\n];\nconst TRISTIMULUS_D50 = MATRIX_LRGB_XYZ_D50.map((matrix) => {\n return matrix.reduce((sum, value) => sum + value, 0);\n});\nconst hueToRgb = (t1, t2, hue) => {\n if (hue < 0) {\n hue += 6;\n }\n if (hue >= 6) {\n hue -= 6;\n }\n if (hue < 1) {\n return round(((t2 - t1) * hue + t1) * BASE_255);\n }\n else if (hue < 3) {\n return round(t2 * BASE_255);\n }\n else if (hue < 4) {\n return round(((t2 - t1) * (4 - hue) + t1) * BASE_255);\n }\n else {\n return round(t1 * BASE_255);\n }\n};\nconst rgbToLinearLightRgb = (value) => {\n return value <= 0.04045\n ? value / 12.92\n : ((value + 0.055) / 1.055) ** 2.4;\n};\nconst linearLightRgbToRgb = (value) => {\n return value <= 0.0031308\n ? 12.92 * value\n : 1.055 * (value ** (1 / 2.4)) - 0.055;\n};\nconst matrixVectorMultiplication = (v1, v2, v3, matrix) => {\n const result = [0, 0, 0];\n const linearRgb = [v1, v2, v3];\n matrix.forEach((array, index) => {\n array.forEach((value, mindex) => {\n result[index] += value * linearRgb[mindex];\n });\n });\n return result;\n};\nconst from_CIE_XYZ_D50_to_CIE_LAB = (x, y, z) => {\n const f = (t) => {\n return t > (6 / 29) ** 3\n ? Math.cbrt(t)\n : t / (3 * (6 / 29) ** 2) + (4 / 29);\n };\n const fx = f(x / TRISTIMULUS_D50[0]);\n const fy = f(y / TRISTIMULUS_D50[1]);\n const fz = f(z / TRISTIMULUS_D50[2]);\n return [\n 116 * fy - 16,\n 500 * (fx - fy),\n 200 * (fy - fz)\n ];\n};\nconst from_CIE_LAB_to_CIE_XYZ_D50 = (L, a, b) => {\n const f = (t) => {\n return t > 6 / 29\n ? t ** 3\n : 3 * (6 / 29) ** 2 * (t - 4 / 29);\n };\n const fl = (L + 16) / 116;\n const fa = a / 500;\n const fb = b / 200;\n return [\n TRISTIMULUS_D50[0] * f(fl + fa),\n TRISTIMULUS_D50[1] * f(fl),\n TRISTIMULUS_D50[2] * f(fl - fb)\n ];\n};\nconst hslToRgb = (H, S, L) => {\n H /= 60;\n S /= 100;\n L /= 100;\n const t2 = (L <= .5)\n ? L * (S + 1)\n : L + S - (L * S);\n const t1 = L * 2 - t2;\n const R = hueToRgb(t1, t2, H + 2);\n const G = hueToRgb(t1, t2, H);\n const B = hueToRgb(t1, t2, H - 2);\n return { R, G, B };\n};\nconst rgbToHsl = (R, G, B, A = 1) => {\n R /= BASE_255;\n G /= BASE_255;\n B /= BASE_255;\n A = Math.min(A, MAX_ALPHA);\n const MAX = Math.max(R, G, B);\n const MIN = Math.min(R, G, B);\n const D = MAX - MIN;\n let H = 0;\n let S = 0;\n const L = (MAX + MIN) / 2;\n if (D !== 0) {\n switch (MAX) {\n case R:\n H = ((G - B) / D) % 6;\n break;\n case G:\n H = (B - R) / D + 2;\n break;\n case B:\n H = (R - G) / D + 4;\n break;\n }\n H = round(H * 60);\n if (H < 0) {\n H += 360;\n }\n S = D / (1 - Math.abs(2 * L - 1));\n }\n return {\n H,\n S: round(S * 100),\n L: round(L * 100),\n A\n };\n};\nconst rgbToLab = (R, G, B) => {\n const LINEAR_LIGHT_RGB = [\n R / BASE_255,\n G / BASE_255,\n B / BASE_255\n ].map(rgbToLinearLightRgb);\n const CIE_XYZ_D50 = matrixVectorMultiplication(LINEAR_LIGHT_RGB[0], LINEAR_LIGHT_RGB[1], LINEAR_LIGHT_RGB[2], MATRIX_LRGB_XYZ_D50);\n const CIE_LAB = from_CIE_XYZ_D50_to_CIE_LAB(CIE_XYZ_D50[0], CIE_XYZ_D50[1], CIE_XYZ_D50[2]);\n return {\n L: CIE_LAB[0],\n a: CIE_LAB[1],\n b: CIE_LAB[2]\n };\n};\nconst labToRgb = (L, a, b) => {\n const CIE_XYZ_D50 = from_CIE_LAB_to_CIE_XYZ_D50(L, a, b);\n const LINEAR_LIGHT_RGB = matrixVectorMultiplication(CIE_XYZ_D50[0], CIE_XYZ_D50[1], CIE_XYZ_D50[2], MATRIX_XYZ_D50_LRGB);\n const rgb = LINEAR_LIGHT_RGB.map(linearLightRgbToRgb);\n return {\n R: minmax(rgb[0] * BASE_255, 0, BASE_255),\n G: minmax(rgb[1] * BASE_255, 0, BASE_255),\n B: minmax(rgb[2] * BASE_255, 0, BASE_255)\n };\n};\nconst labToLch = (L, a, b) => {\n const C = Math.sqrt(a ** 2 + b ** 2);\n const H = degrees(Math.atan2(b, a));\n return {\n L,\n C,\n H: normalizeHue(H)\n };\n};\nconst lchToLab = (L, C, H) => {\n const radH = radians(H);\n const a = C * Math.cos(radH);\n const b = C * Math.sin(radH);\n return {\n L,\n a,\n b\n };\n};\nconst rgbToLch = (R, G, B) => {\n const lab = rgbToLab(R, G, B);\n return labToLch(lab.L, lab.a, lab.b);\n};\nconst lchToRgb = (L, C, H) => {\n const lab = lchToLab(L, C, H);\n return labToRgb(lab.L, lab.a, lab.b);\n};\nconst rgbToHwb = (R, G, B, A = 1) => {\n const hsl = rgbToHsl(R, G, B, A);\n return {\n H: hsl.H,\n W: round(Math.min(R, G, B) / BASE_255 * 100),\n B: round((1 - Math.max(R, G, B) / BASE_255) * 100),\n A\n };\n};\nconst hwbToRgb = (H, W, B) => {\n W /= 100;\n B /= 100;\n const v = 1 - B;\n const c = v - W;\n const x = c * (1 - Math.abs((H / 60) % 2 - 1));\n let rgbR;\n let rgbG;\n let rgbB;\n if (H < 60) {\n rgbR = c;\n rgbG = x;\n rgbB = 0;\n }\n else if (H >= 60 && H < 120) {\n rgbR = x;\n rgbG = c;\n rgbB = 0;\n }\n else if (H >= 120 && H < 180) {\n rgbR = 0;\n rgbG = c;\n rgbB = x;\n }\n else if (H >= 180 && H < 240) {\n rgbR = 0;\n rgbG = x;\n rgbB = c;\n }\n else if (H >= 240 && H < 300) {\n rgbR = x;\n rgbG = 0;\n rgbB = c;\n }\n else {\n rgbR = c;\n rgbG = 0;\n rgbB = x;\n }\n rgbR += W;\n rgbG += W;\n rgbB += W;\n return {\n R: minmax(rgbR * BASE_255, 0, BASE_255),\n G: minmax(rgbG * BASE_255, 0, BASE_255),\n B: minmax(rgbB * BASE_255, 0, BASE_255)\n };\n};\nconst cmykToRgb = (C, M, Y, K) => {\n K = 1 - K;\n return {\n R: minmax(round(BASE_255 * (1 - C) * K), 0, BASE_255),\n G: minmax(round(BASE_255 * (1 - M) * K), 0, BASE_255),\n B: minmax(round(BASE_255 * (1 - Y) * K), 0, BASE_255)\n };\n};\nconst rgbToCmyk = (R, G, B) => {\n R /= BASE_255;\n G /= BASE_255;\n B /= BASE_255;\n const K = 1 - Math.max(R, G, B);\n const K1 = 1 - K;\n const C = K1 && (K1 - R) / K1;\n const M = K1 && (K1 - G) / K1;\n const Y = K1 && (K1 - B) / K1;\n return {\n C: round(C * 100),\n M: round(M * 100),\n Y: round(Y * 100),\n K: round(K * 100)\n };\n};\nconst rgbToRyb = (R, G, B) => {\n const Iw = Math.min(R, G, B);\n const Ib = Math.min(BASE_255 - R, BASE_255 - G, BASE_255 - B);\n const rRgb = R - Iw;\n const gRgb = G - Iw;\n const bRgb = B - Iw;\n const minRg = Math.min(rRgb, gRgb);\n const rRyb = rRgb - minRg;\n const yRyb = (gRgb + minRg) / 2;\n const bRyb = (bRgb + gRgb - minRg) / 2;\n const n = Math.max(rRyb, yRyb, bRyb) / Math.max(rRgb, gRgb, bRgb);\n const N = isNaN(n) || n === Infinity || n <= 0 ? 1 : n;\n return {\n R: rRyb / N + Ib,\n Y: yRyb / N + Ib,\n B: bRyb / N + Ib\n };\n};\nconst rybToRgb = (R, Y, B) => {\n const Iw = Math.min(R, Y, B);\n const Ib = Math.min(BASE_255 - R, BASE_255 - Y, BASE_255 - B);\n const rRyb = R - Iw;\n const yRyb = Y - Iw;\n const bRyb = B - Iw;\n const minYb = Math.min(yRyb, bRyb);\n const rRgb = rRyb + yRyb - minYb;\n const gRgb = yRyb + minYb;\n const bRgb = 2 * (bRyb - minYb);\n const n = Math.max(rRgb, gRgb, bRgb) / Math.max(rRyb, yRyb, bRyb);\n const N = isNaN(n) || n === Infinity || n <= 0 ? 1 : n;\n return {\n R: rRgb / N + Ib,\n G: gRgb / N + Ib,\n B: bRgb / N + Ib\n };\n};\nconst hueRyb = (hue, toRyb) => {\n if (hue < 0)\n hue += 360;\n if (hue > 360)\n hue -= 360;\n if (hue === 360 || hue === 0)\n return hue;\n const map1 = [\n [0, 120],\n [120, 180],\n [180, 240],\n [240, 360]\n ];\n const map2 = [\n [0, 60],\n [60, 120],\n [120, 240],\n [240, 360]\n ];\n const from = toRyb ? map1 : map2;\n const to = toRyb ? map2 : map1;\n let A = 0;\n let B = 0;\n let C = 0;\n let D = 0;\n from.find((arr, index) => {\n if (hue >= arr[0] && hue < arr[1]) {\n A = arr[0];\n B = arr[1];\n C = to[index][0];\n D = to[index][1];\n return true;\n }\n return false;\n });\n return C + (hue - A) * ((D - C) / (B - A));\n};\n\n;// ./src/classes/ColorParserContext.ts\n\n\nclass ColorParserContext {\n constructor(parsers) {\n this._parsers = parsers;\n }\n getParser(input) {\n for (const parser of this._parsers.values()) {\n if (parser.supports(input)) {\n return parser;\n }\n }\n throw new Error(ERRORS.NOT_ACCEPTED_INPUT);\n }\n parse(input) {\n const parser = this.getParser(input);\n return parser.parse(input, this);\n }\n convert(input, model, decimals = DEFAULT_OPTIONS.decimals, withAlpha = false) {\n const color = this.parse(input);\n const parser = this._parsers.get(model);\n return parser.convert(color, decimals, withAlpha);\n }\n convertCSS(input, model, options = {}, withAlpha = false) {\n const color = this.parse(input);\n const parser = this._parsers.get(model);\n return parser.convertCSS(color, options, withAlpha);\n }\n}\nclass ColorParser {\n hasAlpha(input) {\n if (isString(input)) {\n return this.getCSSOptions(input).hasAlpha;\n }\n return !isUndefined(input.A);\n }\n ;\n}\n\n;// ./src/color/rgb.ts\n\n\nconst getRGB = (color) => {\n const alpha = isUndefined(color.A)\n ? {}\n : {\n A: +color.A\n };\n if (isHSLObject(color)) {\n return {\n ...hslToRgb(color.H, color.S, color.L),\n ...alpha\n };\n }\n if (isHWBObject(color)) {\n return {\n ...hwbToRgb(color.H, color.W, color.B),\n ...alpha\n };\n }\n if (isCIELabObject(color)) {\n return {\n ...labToRgb(color.L, color.a, color.b),\n ...alpha\n };\n }\n if (isLCHObject(color)) {\n return {\n ...lchToRgb(color.L, color.C, color.H),\n ...alpha\n };\n }\n if (isCMYKObject(color)) {\n return {\n ...cmykToRgb(color.C, color.M, color.Y, color.K),\n ...alpha\n };\n }\n return color;\n};\n\n;// ./src/css/index.ts\n\n\nconst getCSSComma = (withSpace) => withSpace\n ? `${COMMA} `\n : COMMA;\nconst prepareColorForCss = (color, transformer) => {\n const props = getOrderedArrayString(Object.keys(color));\n const model = VALID_COLOR_OBJECTS[props];\n const keys = COLOR_PROPS[model];\n return keys.reduce((result, key, index) => {\n const value = color[key];\n if (!isUndefined(value)) {\n result.push(transformer(value, index));\n }\n return result;\n }, []);\n};\nconst getResultFromCSSTemplate = (template, vars) => {\n return template.replace(TEMPLATE_VAR, (__match, indexStr) => {\n const index = +indexStr - 1;\n return `${vars[index]}`;\n });\n};\nconst getCSSAlpha = (value, options, ignoreLegacy = false) => {\n const { alphaUnit, legacyCSS, decimals } = options;\n if (alphaUnit === ColorUnitEnum.PERCENT &&\n (!legacyCSS ||\n ignoreLegacy)) {\n return `${round(value * 100, decimals)}%`;\n }\n return round(value, decimals);\n};\nconst buildCSSHueTransformer = (options) => {\n const { anglesUnit, decimals } = options;\n return (value, index) => {\n if (index === 0 &&\n anglesUnit !== AnglesUnitEnum.NONE) {\n const translated = round(translateDegrees(+value, anglesUnit), decimals);\n return `${translated}${anglesUnit}`;\n }\n return index === 3\n ? getCSSAlpha(+value, options)\n : round(value, decimals);\n };\n};\n\n;// ./src/classes/HEXParser.ts\n\n\n\n\n\nclass HEXParser extends ColorParser {\n _extract(input) {\n const colorStr = isColorKeyword(input)\n ? ColorKeywords[input]\n : input;\n const match = colorStr.match(COLORREGS.HEX);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return (COLORREGS.HEX.test(input) ||\n isColorKeyword(input));\n }\n const hasInvalidHex = Object.entries(input).some((item) => {\n return !HEX.test(`${item[1]}`);\n });\n return isRGBObject(input) && !hasInvalidHex;\n }\n parse(input) {\n if (isString(input)) {\n const groups = this._extract(input);\n const r = groups.r ?? groups.rr;\n const g = groups.g ?? groups.gg;\n const b = groups.b ?? groups.bb;\n const a = groups.a ?? groups.aa;\n return {\n R: getDEC(r),\n G: getDEC(g),\n B: getDEC(b),\n ...(isUndefined(a)\n ? {}\n : {\n A: getDEC(a) / BASE_255\n })\n };\n }\n return {\n R: getBase255Number(`${input.R}`),\n G: getBase255Number(`${input.G}`),\n B: getBase255Number(`${input.B}`),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: Math.min(getBase255Number(`${input.A}`, true), 1)\n })\n };\n }\n convert(color, __decimals, withAlpha) {\n const rgb = isRGBObject(color)\n ? color\n : getRGB(color);\n return {\n R: getHEX(rgb.R),\n G: getHEX(rgb.G),\n B: getHEX(rgb.B),\n ...(withAlpha\n ? {\n A: isUndefined(rgb.A)\n ? '0xFF'\n : getHEX(rgb.A * BASE_255)\n }\n : {})\n };\n }\n convertCSS(color, options, withAlpha) {\n const rgb = this.convert(color, options.decimals, withAlpha);\n const transformer = (value) => toHEX(round(value));\n const values = prepareColorForCss(rgb, transformer);\n const template = values.length === 4\n ? '#{1}{2}{3}{4}'\n : '#{1}{2}{3}';\n return getResultFromCSSTemplate(template, values);\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n return {\n hasAlpha: !isUndefined(groups.a ?? groups.aa)\n };\n }\n get model() {\n return ColorModel.HEX;\n }\n}\n\n;// ./src/classes/CalcParser.ts\n\nconst MAX_STACK = 100;\nclass CalcParser {\n constructor(colorIndex, calc, vars) {\n this._operations = new Map([\n [CALC.DIVISION, this._division],\n [CALC.MULTIPLICATION, this._multiplication],\n [CALC.SUM, this._sum],\n [CALC.REST, this._rest]\n ]);\n this._colorIndex = colorIndex;\n let calcString = calc;\n let stack = 0;\n if (!Number.isNaN(+calc)) {\n this._result = +calc;\n }\n else if (calc in vars) {\n this._result = vars[calc];\n }\n else if (CALC.REGEXP.test(calcString)) {\n CALC.REGEXP.lastIndex = 0;\n this._result = this._getCalcValue(calcString, vars);\n }\n else {\n while (CALC.SCOPED.test(calcString) && stack < MAX_STACK) {\n CALC.SCOPED.lastIndex = 0;\n calcString = calcString.replace(CALC.SCOPED, (__match, operation) => {\n return this._calculate(operation, vars).toString();\n });\n if (CALC.REGEXP.test(calcString)) {\n CALC.REGEXP.lastIndex = 0;\n break;\n }\n stack++;\n }\n this._result = this._getCalcValue(calcString, vars);\n }\n }\n _division(left, right) {\n return left / right;\n }\n _multiplication(left, right) {\n return left * right;\n }\n _sum(left, right) {\n return left + right;\n }\n _rest(left, right) {\n return left - right;\n }\n _getCalcValue(calc, vars) {\n const match = calc.match(CALC.REGEXP);\n const operation = match.groups.operation;\n const value = this._calculate(operation, vars);\n if (Number.isNaN(value)) {\n throw new Error(`Invalid value for ${this._colorIndex}. ${operation} ${ERRORS.NOT_A_VALID_RELATIVE_COLOR}`);\n }\n return value;\n }\n _calculate(operation, vars) {\n this._operations.forEach((method, regExp) => {\n let stack = 0;\n while (regExp.test(operation) && stack < MAX_STACK) {\n operation = operation.replace(regExp, (__match, left, right) => {\n return method(vars[left] ?? +left, vars[right] ?? +right).toString();\n });\n stack++;\n }\n });\n return +operation;\n }\n get result() {\n return this._result;\n }\n}\n\n;// ./src/classes/RGBParser.ts\n\n\n\n\n\n\nclass RGBParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.RGB);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.RGB.test(input);\n }\n const hasInvalidRegb = Object.entries(input).some((item) => {\n return !(PCENT.test(`${item[1]}`) ||\n (!HEX.test(`${item[1]}`) &&\n !isNaN(+item[1]) &&\n +item[1] <= BASE_255));\n });\n return isRGBObject(input) && !hasInvalidRegb;\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { r_legacy, g_legacy, b_legacy, a_legacy, r, g, b, a, from, relative_r, relative_g, relative_b, relative_a } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromRGBVars = {\n r: fromRGB.R,\n g: fromRGB.G,\n b: fromRGB.B,\n alpha: fromRGB.A ?? 1\n };\n const R = new CalcParser('r', relative_r, fromRGBVars).result;\n const G = new CalcParser('g', relative_g, fromRGBVars).result;\n const B = new CalcParser('b', relative_b, fromRGBVars).result;\n const rgb = {\n R: Math.min(R, BASE_255),\n G: Math.min(G, BASE_255),\n B: Math.min(B, BASE_255)\n };\n if (relative_a) {\n const A = new CalcParser('alpha', relative_a, fromRGBVars).result;\n rgb.A = Math.min(A, 1);\n }\n return rgb;\n }\n else {\n const R = r_legacy ?? r;\n const G = g_legacy ?? g;\n const B = b_legacy ?? b;\n const A = a_legacy ?? a;\n return {\n R: Math.min(getBase255Number(R), BASE_255),\n G: Math.min(getBase255Number(G), BASE_255),\n B: Math.min(getBase255Number(B), BASE_255),\n ...(isUndefined(A)\n ? {}\n : {\n A: normalizeAlpha(A)\n })\n };\n }\n }\n return {\n R: getBase255Number(`${input.R}`),\n G: getBase255Number(`${input.G}`),\n B: getBase255Number(`${input.B}`),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: Math.min(getBase255Number(`${input.A}`, true), 1)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n const rgb = isRGBObject(color)\n ? color\n : getRGB(color);\n return this._roundRGBObject({\n R: rgb.R,\n G: rgb.G,\n B: rgb.B,\n ...(withAlpha\n ? {\n A: rgb.A ?? 1\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { decimals, legacyCSS, spacesAfterCommas, rgbUnit } = options;\n const rgb = this.convert(color, options.decimals, withAlpha);\n const comma = getCSSComma(spacesAfterCommas);\n const transformer = (value, index) => {\n return rgbUnit === ColorUnitEnum.PERCENT && index < 3\n ? `${from255NumberToPercent(+value, decimals)}%`\n : (index === 3\n ? getCSSAlpha(+value, options)\n : round(value, decimals));\n };\n const values = prepareColorForCss(rgb, transformer);\n const template = legacyCSS\n ? (values.length === 4\n ? `rgba({1}${comma}{2}${comma}{3}${comma}{4})`\n : `rgb({1}${comma}{2}${comma}{3})`)\n : (values.length === 4\n ? `rgb({1} {2} {3} / {4})`\n : `rgb({1} {2} {3})`);\n return getResultFromCSSTemplate(template, values);\n }\n _roundRGBObject(color, decimals) {\n const R = round(color.R, decimals);\n const G = round(color.G, decimals);\n const B = round(color.B, decimals);\n return {\n R,\n G,\n B,\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n const { r_legacy, g_legacy, b_legacy, a_legacy, r, g, b, a } = groups;\n return {\n hasPercentageValues: (PCENT.test(r_legacy ?? r) &&\n PCENT.test(g_legacy ?? g) &&\n PCENT.test(b_legacy ?? b)),\n hasPercentageAlpha: (!isUndefined(a_legacy) && PCENT.test(a_legacy) ||\n !isUndefined(a) && PCENT.test(a)),\n hasAlpha: !isUndefined(a_legacy ?? a)\n };\n }\n get model() {\n return ColorModel.RGB;\n }\n}\n\n;// ./src/classes/HSLParser.ts\n\n\n\n\n\n\n\nclass HSLParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.HSL);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.HSL.test(input);\n }\n return isHSLObject(input);\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { h_legacy, s_legacy, l_legacy, a_legacy, h, s, l, a, from, relative_h, relative_s, relative_l, relative_a } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromHSL = rgbToHsl(fromRGB.R, fromRGB.G, fromRGB.B, fromRGB.A);\n const fromHSLVars = {\n h: fromHSL.H,\n s: fromHSL.S,\n l: fromHSL.L,\n alpha: fromHSL.A\n };\n const H = new CalcParser('h', relative_h, fromHSLVars).result;\n const S = new CalcParser('s', relative_s, fromHSLVars).result;\n const L = new CalcParser('l', relative_l, fromHSLVars).result;\n const hsl = {\n H: normalizeHue(H),\n S: percent(S),\n L: percent(L)\n };\n if (relative_a) {\n const A = new CalcParser('alpha', relative_a, fromHSLVars).result;\n hsl.A = minmax(A, 0, MAX_ALPHA);\n }\n return hsl;\n }\n else {\n const H = h_legacy ?? h;\n const S = s_legacy ?? s;\n const L = l_legacy ?? l;\n const A = a_legacy ?? a;\n return {\n H: normalizeHue(H),\n S: percent(S),\n L: percent(L),\n ...(isUndefined(A)\n ? {}\n : {\n A: normalizeAlpha(A)\n })\n };\n }\n }\n return {\n H: normalizeHue(input.H),\n S: percent(`${input.S}`),\n L: percent(`${input.L}`),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: minmax(+input.A, 0, MAX_ALPHA)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let hsl;\n if (isHSLObject(color)) {\n hsl = color;\n }\n else {\n const rgb = getRGB(color);\n hsl = rgbToHsl(rgb.R, rgb.G, rgb.B, rgb.A);\n }\n return this._roundHSLObject({\n H: hsl.H,\n S: hsl.S,\n L: hsl.L,\n ...(withAlpha\n ? {\n A: hsl.A ?? 1\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { legacyCSS, spacesAfterCommas } = options;\n const comma = getCSSComma(spacesAfterCommas);\n const hsl = this.convert(color, options.decimals, withAlpha);\n const transformer = buildCSSHueTransformer(options);\n const values = prepareColorForCss(hsl, transformer);\n const template = legacyCSS\n ? (values.length === 4\n ? `hsla({1}${comma}{2}%${comma}{3}%${comma}{4})`\n : `hsl({1}${comma}{2}%${comma}{3}%)`)\n : (values.length === 4\n ? `hsl({1} {2}% {3}% / {4})`\n : `hsl({1} {2}% {3}%)`);\n return getResultFromCSSTemplate(template, values);\n }\n _roundHSLObject(color, decimals) {\n return {\n H: round(normalizeHue(color.H), decimals),\n S: round(color.S, decimals),\n L: round(color.L, decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n const { h_legacy, h, a_legacy, a } = groups;\n return {\n angleUnit: getAngleUnit(h_legacy ?? h),\n hasPercentageAlpha: (!isUndefined(a_legacy) && PCENT.test(a_legacy) ||\n !isUndefined(a) && PCENT.test(a)),\n hasAlpha: !isUndefined(a_legacy ?? a)\n };\n }\n get model() {\n return ColorModel.HSL;\n }\n}\n\n;// ./src/classes/HWBParser.ts\n\n\n\n\n\n\n\nclass HWBParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.HWB);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.HWB.test(input);\n }\n return isHWBObject(input);\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { h, w, b, a, from, relative_h, relative_w, relative_b, relative_a } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromHWB = rgbToHwb(fromRGB.R, fromRGB.G, fromRGB.B, fromRGB.A);\n const fromHWBVars = {\n h: fromHWB.H,\n w: fromHWB.W,\n b: fromHWB.B,\n alpha: fromHWB.A\n };\n const H = new CalcParser('h', relative_h, fromHWBVars).result;\n const W = new CalcParser('w', relative_w, fromHWBVars).result;\n const B = new CalcParser('b', relative_b, fromHWBVars).result;\n const hwb = {\n H: minmax(H, 0, MAX_HUE),\n W: minmax(W, 0, MAX_PCENT),\n B: minmax(B, 0, MAX_PCENT)\n };\n if (relative_a) {\n const A = new CalcParser('alpha', relative_a, fromHWBVars).result;\n hwb.A = minmax(A, 0, MAX_ALPHA);\n }\n return hwb;\n }\n else {\n return {\n H: normalizeHue(h),\n W: percent(w),\n B: percent(b),\n ...(isUndefined(a)\n ? {}\n : {\n A: normalizeAlpha(a)\n })\n };\n }\n }\n return {\n H: normalizeHue(input.H),\n W: percent(input.W),\n B: percent(input.B),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: normalizeAlpha(input.A)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let hwb;\n if (isHWBObject(color)) {\n hwb = color;\n }\n else {\n const rgb = getRGB(color);\n hwb = rgbToHwb(rgb.R, rgb.G, rgb.B, rgb.A);\n }\n return this._roundHWBObject({\n H: hwb.H,\n W: hwb.W,\n B: hwb.B,\n ...(withAlpha\n ? {\n A: hwb.A ?? 1\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const hwb = this.convert(color, options.decimals, withAlpha);\n const transformer = buildCSSHueTransformer(options);\n const values = prepareColorForCss(hwb, transformer);\n const template = values.length === 4\n ? `hwb({1} {2}% {3}% / {4})`\n : `hwb({1} {2}% {3}%)`;\n return getResultFromCSSTemplate(template, values);\n }\n _roundHWBObject(color, decimals) {\n return {\n H: round(normalizeHue(color.H), decimals),\n W: round(color.W, decimals),\n B: round(color.B, decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n return {\n angleUnit: getAngleUnit(groups.h),\n hasPercentageAlpha: !isUndefined(groups.a) && PCENT.test(groups.a),\n hasAlpha: !isUndefined(groups.a)\n };\n }\n get model() {\n return ColorModel.HWB;\n }\n}\n\n;// ./src/classes/CIELabParser.ts\n\n\n\n\n\n\n\nclass CIELabParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.CIELab);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.CIELab.test(input);\n }\n return isCIELabObject(input);\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { L, a, b, A, from, relative_L, relative_a, relative_b, relative_A } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromCIELab = rgbToLab(fromRGB.R, fromRGB.G, fromRGB.B);\n const fromCIELabVars = {\n l: fromCIELab.L,\n a: fromCIELab.a,\n b: fromCIELab.b,\n alpha: fromRGB.A ?? 1\n };\n const L = new CalcParser('l', relative_L, fromCIELabVars).result;\n const a = new CalcParser('a', relative_a, fromCIELabVars).result;\n const b = new CalcParser('b', relative_b, fromCIELabVars).result;\n const CIELab = {\n L: minmax(L, 0, MAX_PCENT),\n a: minmax(a, -MAX_LAB, MAX_LAB),\n b: minmax(b, -MAX_LAB, MAX_LAB)\n };\n if (relative_A) {\n const A = new CalcParser('alpha', relative_A, fromCIELabVars).result;\n CIELab.A = minmax(A, 0, MAX_ALPHA);\n }\n return CIELab;\n }\n else {\n return {\n L: percent(L),\n a: getBase125Number(a),\n b: getBase125Number(b),\n ...(isUndefined(A)\n ? {}\n : {\n A: normalizeAlpha(A)\n })\n };\n }\n }\n return {\n L: percent(input.L),\n a: getBase125Number(`${input.a}`),\n b: getBase125Number(`${input.b}`),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: normalizeAlpha(input.A)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let lab;\n if (isCIELabObject(color)) {\n lab = color;\n }\n else {\n const rgb = getRGB(color);\n lab = rgbToLab(rgb.R, rgb.G, rgb.B);\n }\n return this._roundCIELabObject({\n L: lab.L,\n a: lab.a,\n b: lab.b,\n ...(withAlpha\n ? {\n A: +(color.A ?? 1)\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { decimals, labUnit } = options;\n const lab = this.convert(color, options.decimals, withAlpha);\n const transformer = (value, index) => {\n if (index === 0) {\n const L = round(percent(value), decimals);\n return labUnit === ColorUnitEnum.PERCENT\n ? `${L}%`\n : `${L}`;\n }\n if (index < 3) {\n return labUnit === ColorUnitEnum.PERCENT\n ? `${from125NumberToPercent(+value, decimals)}%`\n : round(value, decimals);\n }\n return getCSSAlpha(+value, options, true);\n };\n const values = prepareColorForCss(lab, transformer);\n const template = values.length === 4\n ? `lab({1} {2} {3} / {4})`\n : `lab({1} {2} {3})`;\n return getResultFromCSSTemplate(template, values);\n }\n _roundCIELabObject(color, decimals) {\n return {\n L: round(color.L, decimals),\n a: round(color.a, decimals),\n b: round(color.b, decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n const { L, a, b, A } = groups;\n return {\n hasPercentageValues: (PCENT.test(L) &&\n PCENT.test(a) &&\n PCENT.test(b)),\n hasPercentageAlpha: !isUndefined(A) && PCENT.test(A),\n hasAlpha: !isUndefined(A)\n };\n }\n get model() {\n return ColorModel.CIELab;\n }\n}\n\n;// ./src/classes/LCHParser.ts\n\n\n\n\n\n\n\nclass LCHParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.LCH);\n return match.groups;\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.LCH.test(input);\n }\n return isLCHObject(input);\n }\n parse(input, context) {\n if (isString(input)) {\n const groups = this._extract(input);\n const { l, c, h, a, from, relative_l, relative_c, relative_h, relative_a } = groups;\n if (from) {\n const fromColor = context.parse(from);\n const fromRGB = getRGB(fromColor);\n const fromLCH = rgbToLch(fromRGB.R, fromRGB.G, fromRGB.B);\n const fromLCHVars = {\n l: fromLCH.L,\n c: fromLCH.C,\n h: fromLCH.H,\n alpha: fromRGB.A ?? 1\n };\n const L = new CalcParser('l', relative_l, fromLCHVars).result;\n const C = new CalcParser('c', relative_c, fromLCHVars).result;\n const H = new CalcParser('h', relative_h, fromLCHVars).result;\n const lch = {\n L: minmax(L, 0, MAX_PCENT),\n C: minmax(C, -MAX_LCH_C, MAX_LCH_C),\n H: normalizeHue(H)\n };\n if (relative_a) {\n const A = new CalcParser('alpha', relative_a, fromLCHVars).result;\n lch.A = minmax(A, 0, MAX_ALPHA);\n }\n return lch;\n }\n else {\n return {\n L: percent(l),\n C: getBase150Number(c),\n H: normalizeHue(h),\n ...(isUndefined(a)\n ? {}\n : {\n A: normalizeAlpha(a)\n })\n };\n }\n }\n return {\n L: percent(input.L),\n C: getBase150Number(`${input.C}`),\n H: normalizeHue(input.H),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: normalizeAlpha(input.A)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let lch;\n if (isLCHObject(color)) {\n lch = color;\n }\n else {\n const rgb = getRGB(color);\n lch = rgbToLch(rgb.R, rgb.G, rgb.B);\n }\n return this._roundLCHObject({\n L: lch.L,\n C: lch.C,\n H: lch.H,\n ...(withAlpha\n ? {\n A: +(color.A ?? 1)\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { decimals, lchUnit, anglesUnit } = options;\n const lch = this.convert(color, options.decimals, withAlpha);\n const transformer = (value, index) => {\n if (index === 0) {\n const L = round(percent(value), decimals);\n return lchUnit === ColorUnitEnum.PERCENT\n ? `${L}%`\n : `${L}`;\n }\n if (index === 1) {\n return lchUnit === ColorUnitEnum.PERCENT\n ? `${from150NumberToPercent(+value, decimals)}%`\n : round(value, decimals);\n }\n if (index === 2) {\n if (anglesUnit !== AnglesUnitEnum.NONE) {\n const translated = round(translateDegrees(+value, anglesUnit), decimals);\n return `${translated}${anglesUnit}`;\n }\n return round(value, decimals);\n }\n return getCSSAlpha(+value, options, true);\n };\n const values = prepareColorForCss(lch, transformer);\n const template = values.length === 4\n ? `lch({1} {2} {3} / {4})`\n : `lch({1} {2} {3})`;\n return getResultFromCSSTemplate(template, values);\n }\n _roundLCHObject(color, decimals) {\n return {\n L: round(color.L, decimals),\n C: round(color.C, decimals),\n H: round(normalizeHue(color.H), decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n return {\n angleUnit: getAngleUnit(groups.h),\n hasPercentageValues: (PCENT.test(groups.l) &&\n PCENT.test(groups.c)),\n hasPercentageAlpha: !isUndefined(groups.a) && PCENT.test(groups.a),\n hasAlpha: !isUndefined(groups.a)\n };\n }\n get model() {\n return ColorModel.LCH;\n }\n}\n\n;// ./src/classes/CMYKParser.ts\n\n\n\n\n\n\nclass CMYKParser extends ColorParser {\n _extract(input) {\n const match = input.match(COLORREGS.CMYK);\n return match.groups;\n }\n _shouldMultiplyBy100(...colors) {\n return !colors.some((color) => +color > 1);\n }\n supports(input) {\n if (isString(input)) {\n return COLORREGS.CMYK.test(input);\n }\n return isCMYKObject(input);\n }\n parse(input) {\n if (isString(input)) {\n const groups = this._extract(input);\n const c = groups.c_legacy ?? groups.c;\n const m = groups.m_legacy ?? groups.m;\n const y = groups.y_legacy ?? groups.y;\n const k = groups.k_legacy ?? groups.k;\n const a = groups.a_legacy ?? groups.a;\n const shouldMultiplyBy100 = this._shouldMultiplyBy100(c, m, y, k);\n return {\n C: getCMYKNumber(c, shouldMultiplyBy100),\n M: getCMYKNumber(m, shouldMultiplyBy100),\n Y: getCMYKNumber(y, shouldMultiplyBy100),\n K: getCMYKNumber(k, shouldMultiplyBy100),\n ...(isUndefined(a)\n ? {}\n : {\n A: normalizeAlpha(a)\n })\n };\n }\n const shouldMultiplyBy100 = this._shouldMultiplyBy100(input.C, input.M, input.Y, input.K);\n return {\n C: getCMYKNumber(`${input.C}`, shouldMultiplyBy100),\n M: getCMYKNumber(`${input.M}`, shouldMultiplyBy100),\n Y: getCMYKNumber(`${input.Y}`, shouldMultiplyBy100),\n K: getCMYKNumber(`${input.K}`, shouldMultiplyBy100),\n ...(isUndefined(input.A)\n ? {}\n : {\n A: normalizeAlpha(input.A)\n })\n };\n }\n convert(color, decimals, withAlpha) {\n let cmyk;\n if (isCMYKObject(color)) {\n cmyk = color;\n }\n else {\n const rgb = getRGB(color);\n cmyk = rgbToCmyk(rgb.R, rgb.G, rgb.B);\n }\n return this._roundCMYKObject({\n C: cmyk.C,\n M: cmyk.M,\n Y: cmyk.Y,\n K: cmyk.K,\n ...(withAlpha\n ? {\n A: +(color.A ?? 1)\n }\n : {})\n }, decimals);\n }\n convertCSS(color, options, withAlpha) {\n const { decimals, legacyCSS, spacesAfterCommas, cmykUnit, cmykFunction } = options;\n const comma = getCSSComma(spacesAfterCommas);\n const cmyk = this.convert(color, options.decimals, withAlpha);\n const transformer = (value, index) => {\n if (cmykUnit === ColorUnitEnum.PERCENT &&\n index < 4) {\n return `${round(value, decimals)}%`;\n }\n return index === 4\n ? getCSSAlpha(+value, options)\n : round(+value / 100, decimals);\n };\n const values = prepareColorForCss(cmyk, transformer);\n const template = legacyCSS\n ? (values.length === 5\n ? `${cmykFunction}({1}${comma}{2}${comma}{3}${comma}{4}${comma}{5})`\n : `${cmykFunction}({1}${comma}{2}${comma}{3}${comma}{4})`)\n : (values.length === 5\n ? `${cmykFunction}({1} {2} {3} {4} / {5})`\n : `${cmykFunction}({1} {2} {3} {4})`);\n return getResultFromCSSTemplate(template, values);\n }\n _roundCMYKObject(color, decimals) {\n return {\n C: round(color.C, decimals),\n M: round(color.M, decimals),\n Y: round(color.Y, decimals),\n K: round(color.K, decimals),\n ...(isUndefined(color.A)\n ? {}\n : {\n A: round(color.A, decimals)\n })\n };\n }\n getCSSOptions(input) {\n const groups = this._extract(input);\n const { c_legacy, m_legacy, y_legacy, k_legacy, a_legacy, c, m, y, k, a } = groups;\n return {\n hasPercentageValues: (PCENT.test(c_legacy ?? c) &&\n PCENT.test(m_legacy ?? m) &&\n PCENT.test(y_legacy ?? y) &&\n PCENT.test(k_legacy ?? k)),\n hasPercentageAlpha: ((!isUndefined(a_legacy) && PCENT.test(a_legacy)) ||\n (!isUndefined(a) && PCENT.test(a))),\n hasAlpha: !isUndefined(a_legacy ?? a)\n };\n }\n get model() {\n return ColorModel.CMYK;\n }\n}\n\n;// ./src/parsers/index.ts\n\n\n\n\n\n\n\n\n\n\nconst hexParser = new HEXParser();\nconst rgbParser = new RGBParser();\nconst hslParser = new HSLParser();\nconst hwbParser = new HWBParser();\nconst cieLabParser = new CIELabParser();\nconst lchParser = new LCHParser();\nconst cmykParser = new CMYKParser();\nconst colorParserContext = new ColorParserContext(new Map([\n [ColorModel.HEX, hexParser],\n [ColorModel.RGB, rgbParser],\n [ColorModel.HSL, hslParser],\n [ColorModel.HWB, hwbParser],\n [ColorModel.CIELab, cieLabParser],\n [ColorModel.LCH, lchParser],\n [ColorModel.CMYK, cmykParser]\n]));\nconst getOptionsFromColorInput = (options, ...colors) => {\n const cssColors = [];\n const anglesUnits = [];\n const rgbColors = [];\n const labColors = [];\n const lchColors = [];\n const cmykColors = [];\n const alphaValues = [];\n const anglesUnitValues = Object.values(AnglesUnitEnum);\n const colorUnitValues = Object.values(ColorUnitEnum);\n const cmykFunctionValues = Object.values(CMYKFunctionEnum);\n const matchOptions = {\n legacyCSS: 0,\n spacesAfterCommas: 0,\n cmykFunction: 0\n };\n for (const color of colors) {\n if (isString(color)) {\n cssColors.push(color);\n if (color.includes(COMMA)) {\n matchOptions.legacyCSS++;\n const commasWithNextCharacter = color.match(COMMAS_AND_NEXT_CHARS);\n if (new Set(commasWithNextCharacter).size === 1 &&\n SPACES.test(commasWithNextCharacter[0].slice(1))) {\n matchOptions.spacesAfterCommas++;\n }\n }\n if (hslParser.supports(color)) {\n const options = hslParser.getCSSOptions(color);\n anglesUnits.push(options.angleUnit);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (hwbParser.supports(color)) {\n const options = hwbParser.getCSSOptions(color);\n anglesUnits.push(options.angleUnit);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (rgbParser.supports(color)) {\n const options = rgbParser.getCSSOptions(color);\n rgbColors.push(options.hasPercentageValues);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (cieLabParser.supports(color)) {\n const options = cieLabParser.getCSSOptions(color);\n labColors.push(options.hasPercentageValues);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (lchParser.supports(color)) {\n const options = lchParser.getCSSOptions(color);\n anglesUnits.push(options.angleUnit);\n lchColors.push(options.hasPercentageValues);\n alphaValues.push(options.hasPercentageAlpha);\n continue;\n }\n if (cmykParser.supports(color)) {\n const options = cmykParser.getCSSOptions(color);\n cmykColors.push(options.hasPercentageValues);\n if (color.startsWith(CMYKFunctionEnum.CMYK)) {\n matchOptions.cmykFunction++;\n }\n alphaValues.push(options.hasPercentageAlpha);\n }\n }\n }\n return {\n decimals: isNumber(options.decimals)\n ? options.decimals\n : DEFAULT_OPTIONS.decimals,\n legacyCSS: isBoolean(options.legacyCSS)\n ? options.legacyCSS\n : Boolean(cssColors.length &&\n matchOptions.legacyCSS === cssColors.length) || DEFAULT_OPTIONS.legacyCSS,\n spacesAfterCommas: isBoolean(options.spacesAfterCommas)\n ? options.spacesAfterCommas\n : Boolean(cssColors.length &&\n matchOptions.spacesAfterCommas === cssColors.length) || DEFAULT_OPTIONS.spacesAfterCommas,\n anglesUnit: options.anglesUnit && anglesUnitValues.includes(options.anglesUnit)\n ? options.anglesUnit\n : (new Set(anglesUnits).size === 1\n ? anglesUnits[0]\n : DEFAULT_OPTIONS.anglesUnit),\n rgbUnit: options.rgbUnit && colorUnitValues.includes(options.rgbUnit)\n ? options.rgbUnit\n : (new Set(rgbColors).size === 1 && rgbColors[0]\n ? ColorUnitEnum.PERCENT\n : DEFAULT_OPTIONS.rgbUnit),\n labUnit: options.labUnit && colorUnitValues.includes(options.labUnit)\n ? options.labUnit\n : (new Set(labColors).size === 1 && labColors[0]\n ? ColorUnitEnum.PERCENT\n : DEFAULT_OPTIONS.labUnit),\n lchUnit: options.lchUnit && colorUnitValues.includes(options.lchUnit)\n ? options.lchUnit\n : (new Set(lchColors).size === 1 && lchColors[0]\n ? ColorUnitEnum.PERCENT\n : DEFAULT_OPTIONS.lchUnit),\n cmykUnit: options.cmykUnit && colorUnitValues.includes(options.cmykUnit)\n ? options.cmykUnit\n : (new Set(cmykColors).size === 1 && !cmykColors[0]\n ? ColorUnitEnum.NONE\n : DEFAULT_OPTIONS.cmykUnit),\n alphaUnit: options.alphaUnit && colorUnitValues.includes(options.alphaUnit)\n ? options.alphaUnit\n : (new Set(alphaValues).size === 1 && alphaValues[0]\n ? ColorUnitEnum.PERCENT\n : DEFAULT_OPTIONS.alphaUnit),\n cmykFunction: options.cmykFunction && cmykFunctionValues.includes(options.cmykFunction)\n ? options.cmykFunction\n : (cmykColors.length && cmykColors.length === matchOptions.cmykFunction\n ? CMYKFunctionEnum.CMYK\n : DEFAULT_OPTIONS.cmykFunction)\n };\n};\n\n;// ./src/returns/index.ts\n\n\n\n\n\nconst blend = (from, to, steps) => {\n const div = steps - 1;\n const diffR = (to.R - from.R) / div;\n const diffG = (to.G - from.G) / div;\n const diffB = (to.B - from.B) / div;\n const fromA = normalizeAlpha(from.A);\n const toA = normalizeAlpha(to.A);\n const diffA = (toA - fromA) / div;\n return Array(steps).fill(null).map((__n, i) => {\n if (i === 0) {\n return from;\n }\n if (i === div) {\n return to;\n }\n return {\n R: round(from.R + diffR * i),\n G: round(from.G + diffG * i),\n B: round(from.B + diffB * i),\n A: round(fromA + diffA * i)\n };\n });\n};\nfunction getBlendReturn(from, to, model, css, withAlpha, steps = DEFAULT_BLEND_STEPS, options = {}) {\n if (steps < 1)\n steps = DEFAULT_BLEND_STEPS;\n const fromParsed = colorParserContext.parse(from);\n const toParsed = colorParserContext.parse(to);\n const fromRGBObject = getRGB(fromParsed);\n const toRGBObject = getRGB(toParsed);\n const blendArray = blend(fromRGBObject, toRGBObject, steps);\n return blendArray.map((color) => {\n if (css) {\n return colorParserContext.convertCSS(color, model, getOptionsFromColorInput(options, from, to), withAlpha);\n }\n return colorParserContext.convert(color, model, options.decimals, withAlpha);\n });\n}\nconst getBlendReturnParams = (thirdParameter, fourthParameter) => {\n const stepsParameter = isNumber(thirdParameter)\n ? thirdParameter\n : undefined;\n const optionsParameter = isNumber(thirdParameter)\n ? fourthParameter\n : thirdParameter;\n return [\n stepsParameter,\n optionsParameter\n ];\n};\nfunction getMixReturn(colors, model, css, withAlpha, mode = Mix.ADDITIVE, options = {}) {\n const rgbMap = colors.map((color) => {\n return colorParserContext.convert(color, ColorModel.RGB, options.decimals, withAlpha);\n });\n const rybMap = mode === Mix.SUBTRACTIVE\n ? rgbMap.map((color) => {\n const RYB = rgbToRyb(color.R, color.G, color.B);\n if (!isUndefined(color.A)) {\n RYB.A = color.A;\n }\n return RYB;\n })\n : null;\n function createMix(items) {\n const initial = mode === Mix.ADDITIVE\n ? { R: 0, G: 0, B: 0, A: 0 }\n : { R: 0, Y: 0, B: 0, A: 0 };\n return items.reduce((mix, color) => {\n const colorA = isUndefined(color.A)\n ? 1\n : color.A;\n const common = {\n R: Math.min(mix.R + color.R * colorA, BASE_255),\n B: Math.min(mix.B + color.B * colorA, BASE_255),\n A: 1 - (1 - colorA) * (1 - mix.A)\n };\n const mixGY = 'G' in mix\n ? mix.G\n : mix.Y;\n const colorGY = 'G' in color\n ? color.G\n : color.Y;\n return {\n ...common,\n ...(mode === Mix.ADDITIVE\n ? { G: Math.min(mixGY + colorGY * colorA, BASE_255) }\n : { Y: Math.min(mixGY + colorGY * colorA, BASE_255) })\n };\n }, initial);\n }\n let mix;\n if (mode === Mix.ADDITIVE) {\n mix = createMix(rgbMap);\n }\n else {\n const RYB = createMix(rybMap);\n mix = rybToRgb(RYB.R, RYB.Y, RYB.B);\n mix.A = RYB.A;\n }\n if (css) {\n return colorParserContext.convertCSS(mix, model, getOptionsFromColorInput(options, ...colors), withAlpha);\n }\n return colorParserContext.convert(mix, model, options.decimals, withAlpha);\n}\n;\nconst getMixReturnParameters = (secondParameter, thirdParameter) => {\n const modeParam = isString(secondParameter)\n ? secondParameter\n : undefined;\n const optionsParam = isString(secondParameter)\n ? thirdParameter\n : secondParameter;\n return [\n modeParam,\n optionsParam\n ];\n};\nfunction getShadesOrTintsReturn(shades, color, steps = DEFAULT_SHADES_TINTS_STEPS, options = {}) {\n const isCSS = isString(color);\n const parser = colorParserContext.getParser(color);\n const model = parser.model;\n const withAlpha = parser.hasAlpha(color);\n const hsl = colorParserContext.convert(color, ColorModel.HSL, undefined, withAlpha);\n const increment = shades\n ? hsl.L / (steps + 1)\n : (100 - hsl.L) / (steps + 1);\n const hslMap = Array.from(Array(steps)).map((__n, i) => ({\n ...hsl,\n L: hsl.L + increment * (i + 1) * (1 - +shades * 2)\n }));\n if (isCSS) {\n return hslMap.map((hslColor) => {\n return colorParserContext.convertCSS(hslColor, model, getOptionsFromColorInput(options, color), withAlpha);\n });\n }\n return hslMap.map((hslColor) => {\n return colorParserContext.convert(hslColor, model, options.decimals, withAlpha);\n });\n}\nconst getShadesOrTintsReturnParameters = (secondParameter, thirdParameter) => {\n const stepsParam = isNumber(secondParameter)\n ? secondParameter\n : undefined;\n const optionsParam = isNumber(secondParameter)\n ? thirdParameter\n : secondParameter;\n return [\n stepsParam,\n optionsParam\n ];\n};\nconst harmony = (color, angles, mode) => angles.reduce((arr, num) => {\n return [\n ...arr,\n {\n ...color,\n H: mode === Mix.ADDITIVE\n ? normalizeHue(color.H + num)\n : normalizeHue(hueRyb(hueRyb(color.H, false) + num, true))\n }\n ];\n}, [{ ...color }]);\nconst HARMONIES = new Map([\n [\n Harmony.ANALOGOUS,\n (color, mode) => harmony(color, [30, -30], mode)\n ],\n [\n Harmony.COMPLEMENTARY,\n (color, mode) => harmony(color, [180], mode)\n ],\n [\n Harmony.SPLIT_COMPLEMENTARY,\n (color, mode) => harmony(color, [150, -150], mode)\n ],\n [\n Harmony.TRIADIC,\n (color, mode) => harmony(color, [120, -120], mode)\n ],\n [\n Harmony.TETRADIC,\n (color, mode) => harmony(color, [60, -120, 180], mode)\n ],\n [\n Harmony.SQUARE,\n (color, mode) => harmony(color, [90, -90, 180], mode)\n ]\n]);\nconst getHarmonyReturn = (color, harmony, mode, options = {}) => {\n const harmonyFunction = HARMONIES.get(harmony);\n const isCSS = isString(color);\n const parser = colorParserContext.getParser(color);\n const model = parser.model;\n const withAlpha = parser.hasAlpha(color);\n const hsl = colorParserContext.convert(color, ColorModel.HSL);\n const array = harmonyFunction(hsl, mode);\n if (isCSS) {\n return array.map((harmonyColor) => {\n return colorParserContext.convertCSS(harmonyColor, model, getOptionsFromColorInput(options, color), withAlpha);\n });\n }\n return array.map((harmonyColor) => {\n return colorParserContext.convert(harmonyColor, model, options.decimals, withAlpha);\n });\n};\nconst getHarmonyReturnParameters = (secondParam, thirdParam, fourthParam) => {\n if (isHarmony(secondParam)) {\n return [\n secondParam,\n isMix(thirdParam)\n ? thirdParam\n : Mix.ADDITIVE,\n isMix(thirdParam)\n ? fourthParam\n : thirdParam\n ];\n }\n if (isMix(secondParam)) {\n return [\n Harmony.COMPLEMENTARY,\n secondParam,\n thirdParam\n ];\n }\n return [\n Harmony.COMPLEMENTARY,\n Mix.ADDITIVE,\n secondParam\n ];\n};\n\n;// ./src/classes/ColorTranslator.ts\n\n\n\n\n\nclass ColorTranslator {\n constructor(color, options = {}) {\n this._options = getOptionsFromColorInput(options, color);\n const parsedColor = colorParserContext.parse(color);\n const model = getColorModel(parsedColor);\n switch (model) {\n case ColorModel.HSL:\n this.hsl = parsedColor;\n this.update('hsl');\n break;\n case ColorModel.HWB:\n this.hwb = parsedColor;\n this.updateRGBFromHWB();\n this.update('hwb', 'rgb');\n break;\n case ColorModel.CIELab:\n this.lab = parsedColor;\n this.updateRGBFromLAB();\n this.update('lab', 'rgb');\n break;\n case ColorModel.LCH:\n this.lch = parsedColor;\n this.updateRGBFromLCH();\n this.update('lch', 'rgb');\n break;\n case ColorModel.CMYK:\n this.cmyk = parsedColor;\n this.updateRGBFromCMYK();\n this.update('cmyk', 'rgb');\n break;\n default:\n this.rgb = parsedColor;\n this.update('rgb');\n }\n }\n update(...exclude) {\n if (!exclude.includes('rgb')) {\n this.updateRGB();\n }\n if (!exclude.includes('hsl')) {\n this.updateHSL();\n }\n if (!exclude.includes('hwb')) {\n this.updateHWB();\n }\n if (!exclude.includes('lab')) {\n this.updateLAB();\n }\n if (!exclude.includes('lch')) {\n this.updateLCH();\n }\n if (!exclude.includes('cmyk')) {\n this.updateCMYK();\n }\n }\n updateRGB() {\n this.rgb = {\n ...hslToRgb(this.hsl.H, this.hsl.S, this.hsl.L),\n A: this.hsl.A ?? 1\n };\n }\n updateHSL() {\n this.hsl = rgbToHsl(this.rgb.R, this.rgb.G, this.rgb.B, this.rgb.A);\n }\n updateHWB() {\n this.hwb = rgbToHwb(this.rgb.R, this.rgb.G, this.rgb.B, this.rgb.A);\n }\n updateLAB() {\n this.lab = {\n ...rgbToLab(this.rgb.R, this.rgb.G, this.rgb.B),\n A: this.rgb.A ?? 1\n };\n }\n updateLCH() {\n this.lch = {\n ...rgbToLch(this.rgb.R, this.rgb.G, this.rgb.B),\n A: this.rgb.A ?? 1\n };\n }\n updateCMYK() {\n this.cmyk = {\n ...rgbToCmyk(this.rgb.R, this.rgb.G, this.rgb.B),\n A: this.rgb.A ?? 1\n };\n }\n updateRGBFromHWB() {\n this.rgb = {\n ...hwbToRgb(this.hwb.H, this.hwb.W, this.hwb.B),\n A: this.hwb?.A ?? 1\n };\n }\n updateRGBFromLCH() {\n this.rgb = {\n ...lchToRgb(this.lch.L, this.lch.C, this.lch.H),\n A: this.lch.A ?? 1\n };\n }\n updateRGBFromCMYK() {\n this.rgb = {\n ...cmykToRgb(this.cmyk.C, this.cmyk.M, this.cmyk.Y, this.cmyk.K),\n A: this.cmyk.A ?? 1\n };\n }\n updateRGBFromLAB() {\n this.rgb = {\n ...labToRgb(this.lab.L, this.lab.a, this.lab.b),\n A: this.lab.A ?? 1\n };\n }\n updateLCHFromLAB() {\n this.lch = {\n ...labToLch(this.lab.L, this.lab.a, this.lab.b),\n A: this.lab.A\n };\n }\n updateLABromLCH() {\n this.lab = {\n ...lchToLab(this.lch.L, this.lch.C, this.lch.H),\n A: this.lch.A\n };\n }\n setOptions(options = {}) {\n this._options = {\n ...this._options,\n ...options\n };\n return this;\n }\n setR(R) {\n this.rgb.R = minmax(R, 0, BASE_255);\n this.update('rgb');\n return this;\n }\n setG(G) {\n this.rgb.G = minmax(G, 0, BASE_255);\n this.update('rgb');\n return this;\n }\n setB(B) {\n this.rgb.B = minmax(B, 0, BASE_255);\n this.update('rgb');\n return this;\n }\n setH(H) {\n this.hsl.H = normalizeHue(H);\n this.update('hsl');\n return this;\n }\n setS(S) {\n this.hsl.S = minmax(S, 0, MAX_PCENT);\n this.update('hsl');\n return this;\n }\n setL(L) {\n this.hsl.L = minmax(L, 0, MAX_PCENT);\n this.update('hsl');\n return this;\n }\n setWhiteness(W) {\n this.hwb.W = minmax(W, 0, MAX_PCENT);\n this.updateRGBFromHWB();\n this.update('rgb', 'hwb');\n return this;\n }\n setBlackness(B) {\n this.hwb.B = minmax(B, 0, MAX_PCENT);\n this.updateRGBFromHWB();\n this.update('rgb', 'hwb');\n return this;\n }\n setCIEL(L) {\n this.lab.L = minmax(L, 0, MAX_PCENT);\n this.updateRGBFromLAB();\n this.updateLCHFromLAB();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setCIEa(a) {\n this.lab.a = minmax(a, -MAX_LAB, MAX_LAB);\n this.updateRGBFromLAB();\n this.updateLCHFromLAB();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setCIEb(b) {\n this.lab.b = minmax(b, -MAX_LAB, MAX_LAB);\n this.updateRGBFromLAB();\n this.updateLCHFromLAB();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setLCHL(l) {\n this.lch.L = minmax(l, 0, MAX_PCENT);\n this.updateRGBFromLCH();\n this.updateLABromLCH();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setLCHC(c) {\n this.lch.C = minmax(c, 0, MAX_LCH_C);\n this.updateRGBFromLCH();\n this.updateLABromLCH();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setLCHH(h) {\n this.lch.H = normalizeHue(h);\n this.updateRGBFromLCH();\n this.updateLABromLCH();\n this.update('rgb', 'lab', 'lch');\n return this;\n }\n setA(A) {\n const alpha = minmax(A, 0, MAX_ALPHA);\n this.rgb.A = alpha;\n this.hsl.A = alpha;\n this.hwb.A = alpha;\n this.lab.A = alpha;\n this.lch.A = alpha;\n this.cmyk.A = alpha;\n return this;\n }\n setC(C) {\n this.cmyk.C = minmax(C, 0, 100);\n this.updateRGBFromCMYK();\n this.update('cmyk');\n return this;\n }\n setM(M) {\n this.cmyk.M = minmax(M, 0, 100);\n this.updateRGBFromCMYK();\n this.update('cmyk');\n return this;\n }\n setY(Y) {\n this.cmyk.Y = minmax(Y, 0, 100);\n this.updateRGBFromCMYK();\n this.update('cmyk');\n return this;\n }\n setK(K) {\n this.cmyk.K = minmax(K, 0, 100);\n this.updateRGBFromCMYK();\n this.update('cmyk');\n return this;\n }\n get options() {\n return this._options;\n }\n get R() {\n return round(this.rgb.R, this.options.decimals);\n }\n get G() {\n return round(this.rgb.G, this.options.decimals);\n }\n get B() {\n return round(this.rgb.B, this.options.decimals);\n }\n get H() {\n return round(this.hsl.H, this.options.decimals);\n }\n get S() {\n return round(this.hsl.S, this.options.decimals);\n }\n get L() {\n return round(this.hsl.L, this.options.decimals);\n }\n get Whiteness() {\n return round(this.hwb.W, this.options.decimals);\n }\n get Blackness() {\n return round(this.hwb.B, this.options.decimals);\n }\n get CIEL() {\n return round(this.lab.L, this.options.decimals);\n }\n get CIEa() {\n return round(this.lab.a, this.options.decimals);\n }\n get CIEb() {\n return round(this.lab.b, this.options.decimals);\n }\n get LCHL() {\n return round(this.lch.L, this.options.decimals);\n }\n get LCHC() {\n return round(this.lch.C, this.options.decimals);\n }\n get LCHH() {\n return round(this.lch.H, this.options.decimals);\n }\n get A() {\n return round(this.hsl.A, this.options.decimals);\n }\n get C() {\n return round(this.cmyk.C, this.options.decimals);\n }\n get M() {\n return round(this.cmyk.M, this.options.decimals);\n }\n get Y() {\n return round(this.cmyk.Y, this.options.decimals);\n }\n get K() {\n return round(this.cmyk.K, this.options.decimals);\n }\n get HEXObject() {\n return colorParserContext.convert(this.rgb, ColorModel.HEX);\n }\n get HEXAObject() {\n return colorParserContext.convert(this.rgb, ColorModel.HEX, 0, true);\n }\n get RGBObject() {\n return colorParserContext.convert(this.rgb, ColorModel.RGB, this.options.decimals);\n }\n get RGBAObject() {\n return colorParserContext.convert(this.rgb, ColorModel.RGB, this.options.decimals, true);\n }\n get HSLObject() {\n return colorParserContext.convert(this.hsl, ColorModel.HSL, this.options.decimals);\n }\n get HSLAObject() {\n return colorParserContext.convert(this.hsl, ColorModel.HSL, this.options.decimals, true);\n }\n get HWBObject() {\n return colorParserContext.convert(this.hwb, ColorModel.HWB, this.options.decimals);\n }\n get HWBAObject() {\n return colorParserContext.convert(this.hwb, ColorModel.HWB, this.options.decimals, true);\n }\n get CIELabObject() {\n return colorParserContext.convert(this.lab, ColorModel.CIELab, this.options.decimals);\n }\n get CIELabAObject() {\n return colorParserContext.convert(this.lab, ColorModel.CIELab, this.options.decimals, true);\n }\n get LCHObject() {\n return colorParserContext.convert(this.lch, ColorModel.LCH, this.options.decimals);\n }\n get LCHAObject() {\n return colorParserContext.convert(this.lch, ColorModel.LCH, this.options.decimals, true);\n }\n get CMYKObject() {\n return colorParserContext.convert(this.cmyk, ColorModel.CMYK, this.options.decimals);\n }\n get CMYKAObject() {\n return colorParserContext.convert(this.cmyk, ColorModel.CMYK, this.options.decimals, true);\n }\n get HEX() {\n return colorParserContext.convertCSS(this.rgb, ColorModel.HEX);\n }\n get HEXA() {\n return colorParserContext.convertCSS(this.rgb, ColorModel.HEX, {}, true);\n }\n get RGB() {\n return colorParserContext.convertCSS(this.rgb, ColorModel.RGB, this.options);\n }\n get RGBA() {\n return colorParserContext.convertCSS(this.rgb, ColorModel.RGB, this.options, true);\n }\n get HSL() {\n return colorParserContext.convertCSS(this.hsl, ColorModel.HSL, this.options);\n }\n get HSLA() {\n return colorParserContext.convertCSS(this.hsl, ColorModel.HSL, this.options, true);\n }\n get HWB() {\n return colorParserContext.convertCSS(this.hwb, ColorModel.HWB, this.options);\n }\n get HWBA() {\n return colorParserContext.convertCSS(this.hwb, ColorModel.HWB, this.options, true);\n }\n get CIELab() {\n return colorParserContext.convertCSS(this.lab, ColorModel.CIELab, this.options);\n }\n get CIELabA() {\n return colorParserContext.convertCSS(this.lab, ColorModel.CIELab, this.options, true);\n }\n get LCH() {\n return colorParserContext.convertCSS(this.lch, ColorModel.LCH, this.options);\n }\n get LCHA() {\n return colorParserContext.convertCSS(this.lch, ColorModel.LCH, this.options, true);\n }\n get CMYK() {\n return colorParserContext.convertCSS(this.cmyk, ColorModel.CMYK, this.options);\n }\n get CMYKA() {\n return colorParserContext.convertCSS(this.cmyk, ColorModel.CMYK, this.options, true);\n }\n static toHEXObject(color) {\n return colorParserContext.convert(color, ColorModel.HEX);\n }\n static toHEX(color) {\n return colorParserContext.convertCSS(color, ColorModel.HEX);\n }\n static toHEXAObject(color) {\n return colorParserContext.convert(color, ColorModel.HEX, undefined, true);\n }\n static toHEXA(color) {\n return colorParserContext.convertCSS(color, ColorModel.HEX, undefined, true);\n }\n static toRGBObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.RGB, options.decimals);\n }\n static toRGB(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.RGB, getOptionsFromColorInput(options, color));\n }\n static toRGBAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.RGB, options.decimals, true);\n }\n static toRGBA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.RGB, getOptionsFromColorInput(options, color), true);\n }\n static toHSLObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.HSL, options.decimals);\n }\n static toHSL(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.HSL, getOptionsFromColorInput(options, color));\n }\n static toHSLAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.HSL, options.decimals, true);\n }\n static toHSLA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.HSL, getOptionsFromColorInput(options, color), true);\n }\n static toHWBObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.HWB, options.decimals);\n }\n static toHWB(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.HWB, getOptionsFromColorInput(options, color));\n }\n static toHWBAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.HWB, options.decimals, true);\n }\n static toHWBA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.HWB, getOptionsFromColorInput(options, color), true);\n }\n static toCIELabObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.CIELab, options.decimals);\n }\n static toCIELab(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.CIELab, getOptionsFromColorInput(options, color));\n }\n static toCIELabAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.CIELab, options.decimals, true);\n }\n static toCIELabA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.CIELab, getOptionsFromColorInput(options, color), true);\n }\n static toLCHObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.LCH, options.decimals);\n }\n static toLCH(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.LCH, getOptionsFromColorInput(options, color));\n }\n static toLCHAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.LCH, options.decimals, true);\n }\n static toLCHA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.LCH, getOptionsFromColorInput(options, color), true);\n }\n static toCMYKObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.CMYK, options.decimals);\n }\n static toCMYK(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.CMYK, getOptionsFromColorInput(options, color));\n }\n static toCMYKAObject(color, options = {}) {\n return colorParserContext.convert(color, ColorModel.CMYK, options.decimals, true);\n }\n static toCMYKA(color, options = {}) {\n return colorParserContext.convertCSS(color, ColorModel.CMYK, getOptionsFromColorInput(options, color), true);\n }\n static getBlendHEXObject(from, to, steps) {\n return getBlendReturn(from, to, ColorModel.HEX, false, false, steps);\n }\n static getBlendHEX(from, to, steps) {\n return getBlendReturn(from, to, ColorModel.HEX, true, false, steps);\n }\n static getBlendHEXAObject(from, to, steps) {\n return getBlendReturn(from, to, ColorModel.HEX, false, true, steps);\n }\n static getBlendHEXA(from, to, steps) {\n return getBlendReturn(from, to, ColorModel.HEX, true, true, steps);\n }\n static getShades(color, secondParameter, thirdParameter) {\n return getShadesOrTintsReturn(true, color, ...getShadesOrTintsReturnParameters(secondParameter, thirdParameter));\n }\n static getTints(color, secondParameter, thirdParameter) {\n return getShadesOrTintsReturn(false, color, ...getShadesOrTintsReturnParameters(secondParameter, thirdParameter));\n }\n static getHarmony(color, secondParam, thirdParam, fourthParam) {\n return getHarmonyReturn(color, ...getHarmonyReturnParameters(secondParam, thirdParam, fourthParam));\n }\n}\nColorTranslator.getBlendRGBObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.RGB, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendRGB = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.RGB, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendRGBAObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.RGB, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendRGBA = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.RGB, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendHSLObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.HSL, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendHSL = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.HSL, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendHSLAObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.HSL, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendHSLA = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.HSL, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendHWBObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.HWB, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendHWB = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.HWB, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendHWBAObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.HWB, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendHWBA = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.HWB, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendCIELabObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.CIELab, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendCIELab = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.CIELab, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendCIELabAObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.CIELab, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendCIELabA = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.CIELab, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendLCHObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.LCH, false, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendLCH = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.LCH, true, false, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendLCHAObject = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.LCH, false, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getBlendLCHA = (from, to, thirdParameter, fourthParameter) => getBlendReturn(from, to, ColorModel.LCH, true, true, ...getBlendReturnParams(thirdParameter, fourthParameter));\nColorTranslator.getMixHEXObject = (colors, mode) => getMixReturn(colors, ColorModel.HEX, false, false, mode);\nColorTranslator.getMixHEX = (colors, mode = Mix.ADDITIVE) => getMixReturn(colors, ColorModel.HEX, true, false, mode);\nColorTranslator.getMixHEXAObject = (colors, mode = Mix.ADDITIVE) => getMixReturn(colors, ColorModel.HEX, false, true, mode);\nColorTranslator.getMixHEXA = (colors, mode = Mix.ADDITIVE) => getMixReturn(colors, ColorModel.HEX, true, true, mode);\nColorTranslator.getMixRGBObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.RGB, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixRGB = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.RGB, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixRGBAObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.RGB, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixRGBA = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.RGB, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixHSLObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.HSL, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixHSL = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.HSL, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixHSLAObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.HSL, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixHSLA = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.HSL, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixHWBObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.HWB, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixHWB = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.HWB, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixHWBAObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.HWB, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixHWBA = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.HWB, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixCIELabObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.CIELab, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixCIELab = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.CIELab, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixCIELabAObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.CIELab, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixCIELabA = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.CIELab, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixLCHObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.LCH, false, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixLCH = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.LCH, true, false, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixLCHAObject = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.LCH, false, true, ...getMixReturnParameters(secondParameter, thirdParameter));\nColorTranslator.getMixLCHA = (colors, secondParameter, thirdParameter) => getMixReturn(colors, ColorModel.LCH, true, true, ...getMixReturnParameters(secondParameter, thirdParameter));\n\n;// ./src/index.ts\n\n\n\n;// ./src/@demo/demo1/index.js\n\n\n/* harmony default export */ const demo1 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const color = new ColorTranslator('hsl(180 100% 50%)', { decimals: 0 });\n\n for (let row = 0; row < 10; row++) {\n\n for (let col = 0; col < 10; col++) {\n\n color\n .setS(row * 10)\n .setL(col * 5 + 30);\n\n const box = document.createElement('div');\n\n box.classList.add('box');\n box.style.background = color.HEX;\n\n box.innerText =\n `R:${color.R}\n G:${color.G}\n B:${color.B}`;\n container.appendChild(box);\n\n }\n }\n\n return container;\n\n});\n;// ./src/@demo/demo2/index.js\n\n\n/* harmony default export */ const demo2 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const color = new ColorTranslator({ R: 255, G: 0, B: 0 });\n const hue = [0, 30, 60, 120, 240, 280, 320, 0];\n let rainbow;\n\n for (let r = 0; r < hue.length; r++) {\n\n color.setH(hue[r]);\n\n const bow = document.createElement('div');\n\n bow.classList.add('rainbow');\n bow.style.background = color.HEX;\n\n if (rainbow) {\n rainbow.appendChild(bow);\n } else {\n container.appendChild(bow);\n }\n\n rainbow = bow;\n }\n\n rainbow.style.background = '#333';\n\n return container;\n\n});\n;// ./src/@demo/demo3/index.js\n\n\n/* harmony default export */ const demo3 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const hsl = { H: 0, S: '90%', L: '50%' };\n const hue = [undefined, 55, 30, 0, 290, 220, 130];\n const total = hue.length;\n\n for (let row = 0; row < total; row++) {\n\n for (let col = 0; col < total; col++) {\n\n let index = total - row + col;\n if (index >= total) {\n index -= total;\n }\n hsl.H = hue[index];\n const rgb = hue[index] === undefined\n ? '#FFF'\n : ColorTranslator.toHEX(hsl);\n const box = document.createElement('div');\n\n box.classList.add('flag');\n box.style.background = rgb;\n\n container.appendChild(box);\n\n }\n }\n\n return container;\n\n});\n;// ./src/@demo/demo4/index.js\n\n\n/* harmony default export */ const demo4 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const hexColors = [\n '#FE2712', '#FE5409', '#FB9902',\n '#FABD03', '#FFFE32', '#D1EA2C',\n '#66B132', '#0392CE', '#0247FE',\n '#3D00A5', '#8601B0', '#A7194B'\n ];\n\n hexColors.forEach((color) => {\n\n const rgb = ColorTranslator.toRGB(color);\n const hsl = ColorTranslator.toHSL(color, { decimals: 0 });\n const hwb = ColorTranslator.toHWB(color, { decimals: 0 });\n const lab = ColorTranslator.toCIELab(color, { decimals: 0 });\n const lch = ColorTranslator.toLCH(color, { decimals: 0 });\n\n const rgbDiv = document.createElement('div');\n const hslDiv = document.createElement('div');\n const hwbDiv = document.createElement('div');\n const labDiv = document.createElement('div');\n const lchDiv = document.createElement('div');\n\n rgbDiv.style.backgroundColor = rgb;\n rgbDiv.textContent = rgb;\n\n hslDiv.style.backgroundColor = hsl;\n hslDiv.textContent = hsl;\n\n hwbDiv.style.backgroundColor = hwb;\n hwbDiv.textContent = hwb;\n\n labDiv.style.backgroundColor = lab;\n labDiv.textContent = lab;\n\n lchDiv.style.backgroundColor = lch;\n lchDiv.textContent = lch;\n\n container.appendChild(rgbDiv);\n container.appendChild(hslDiv);\n container.appendChild(hwbDiv);\n container.appendChild(labDiv);\n container.appendChild(lchDiv);\n\n });\n\n return container;\n\n});\n;// ./src/@demo/demo5/index.js\n\n\n/* harmony default export */ const demo5 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const colors = [\n 'red',\n 'lime',\n 'blue',\n 'aqua',\n 'yellow',\n 'fuchsia'\n ];\n const total = colors.length;\n\n for (let row = 0; row < total; row++) {\n\n const hsl = ColorTranslator.toHSLObject(colors[row]);\n const step = hsl.S / (total - 1);\n\n for (let col = 0; col < total; col++) {\n\n const rgb = ColorTranslator.toHEX(hsl);\n const cmyk = ColorTranslator.toCMYKObject(hsl, { decimals: 0 });\n\n const box = document.createElement('div');\n box.classList.add('box');\n box.style.background = rgb;\n box.innerText = `C:${cmyk.C}\n M:${cmyk.M}\n Y:${cmyk.Y}\n K:${cmyk.K}`;\n\n container.appendChild(box);\n\n hsl.S -= step;\n\n }\n }\n\n return container;\n\n});\n;// ./src/@demo/demo6/index.js\n\n\n/* harmony default export */ const demo6 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n const rows = 11;\n const mult = 3;\n\n for (let i = 0; i < rows; i++) {\n\n const blends = ColorTranslator.getBlendHEX('#F00', '#FF0', mult + i * mult);\n\n blends.forEach((blend, index) => {\n const box = document.createElement('div');\n box.classList.add('box', `file${i}`);\n box.style.background = blend;\n box.innerText = index + 1;\n container.appendChild(box);\n });\n\n }\n\n return container;\n\n});\n;// ./src/@demo/demo7/index.js\n\n\n/* harmony default export */ const demo7 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n\n const colors = ['#F00', '#FF8000', '#FF0', '#0F0', '#00F', '#A0F', '#F0A'];\n\n const createBox = (color, type) => {\n const box = document.createElement('div');\n box.classList.add('box');\n box.style.backgroundColor = color;\n if (type) box.dataset.type = type;\n container.appendChild(box);\n };\n\n colors.forEach((color) => {\n const shades = ColorTranslator.getShades(color, 3).reverse();\n const tints = ColorTranslator.getTints(color, 3);\n shades.forEach((shade) => createBox(shade, 'shade'));\n createBox(color);\n tints.forEach((tint) => createBox(tint, 'tint'));\n });\n\n return container;\n\n});\n;// ./src/@demo/demo8/index.js\n\n\n\n/* harmony default export */ const demo8 = ((ColorTranslator) => {\n\n const container = document.createElement('div');\n\n const mixes = [\n '#F00',\n '#0F0',\n '#00F',\n [1, 3],\n [1, 2],\n [2, 3],\n [1, 2, 3]\n ];\n\n const fillPlanes = () => {\n const planes = container.querySelectorAll('#planes path');\n planes.forEach((plane, index) => {\n let color = '#CCC';\n if (typeof mixes[index] === 'string') {\n color = mixes[index];\n } else if(mixes[index]) {\n const colors = mixes[index].map((i) => mixes[i - 1]);\n color = mixes[index] = ColorTranslator.getMixHEX(colors);\n }\n plane.setAttribute('fill', color);\n });\n };\n\n fetch('images/color-mixes.svg')\n .then(result => result.text())\n .then((svgCode) => {\n container.innerHTML = svgCode;\n fillPlanes();\n });\n\n return container;\n\n});\n;// ./src/@demo/demo9/index.js\n\n\n/* harmony default export */ const demo9 = ((ColorTranslator, { Mix }) => {\n\n const container = document.createElement('div');\n\n const mixes = [\n '#F00',\n '#FF0',\n '#00F',\n [1, 3],\n [1, 2],\n [2, 3],\n [1, 2, 3]\n ];\n\n const fillPlanes = () => {\n const planes = container.querySelectorAll('#planes path');\n planes.forEach((plane, index) => {\n let color = '#CCC';\n if (typeof mixes[index] === 'string') {\n color = mixes[index];\n } else if(mixes[index]) {\n const colors = mixes[index].map((i) => mixes[i - 1]);\n color = mixes[index] = ColorTranslator.getMixHEX(colors, Mix.SUBTRACTIVE);\n }\n plane.setAttribute('fill', color);\n });\n };\n\n fetch('images/color-mixes.svg')\n .then(result => result.text())\n .then((svgCode) => {\n container.innerHTML = svgCode;\n fillPlanes();\n });\n\n return container;\n\n});\n;// ./src/@demo/demo10/index.js\n\n\n/* harmony default export */ const demo10 = ((ColorTranslator, { Harmony }) => {\n\n const container = document.createElement('div');\n\n const harmonies = [\n { label: 'Complementary', value: Harmony.COMPLEMENTARY },\n { label: 'Split Complementary', value: Harmony.SPLIT_COMPLEMENTARY },\n { label: 'Analogous', value: Harmony.ANALOGOUS },\n { label: 'Triadic', value: Harmony.TRIADIC },\n { label: 'Tetradic', value: Harmony.TETRADIC },\n { label: 'Square', value: Harmony.SQUARE }\n ];\n\n const baseColor = '#F00';\n\n const createElement = (className, parent) => {\n const div = document.createElement('div');\n div.classList.add(className);\n parent.appendChild(div);\n return div;\n };\n\n const createHarmony = (item) => {\n\n const wrapper = createElement('wrapper', container);\n const wheel = createElement('wheel', wrapper);\n const harmony = createElement('harmony', wrapper);\n createElement('label', wrapper).innerText = item.label;\n\n fetch('images/wheel-additive.svg')\n .then(result => result.text())\n .then((svgCode) => {\n const harmonyColors = ColorTranslator.getHarmony(baseColor, item.value);\n const selector = 'path' + harmonyColors.map((color) => `:not([fill=\"${color}\"])`).join('');\n wheel.innerHTML = svgCode;\n harmonyColors.forEach((hex) => createElement('box', harmony).style.background = hex);\n wheel.querySelectorAll(selector).forEach((path) => path.setAttribute('fill-opacity', '0.25'));\n });\n\n };\n\n harmonies.forEach((item) => createHarmony(item));\n\n return container;\n\n});\n;// ./src/@demo/demo11/index.js\n\n\n/* harmony default export */ const demo11 = ((ColorTranslator, { Harmony, Mix }) => {\n\n const container = document.createElement('div');\n\n const harmonies = [\n { label: 'Complementary', value: Harmony.COMPLEMENTARY },\n { label: 'Split Complementary', value: Harmony.SPLIT_COMPLEMENTARY },\n { label: 'Analogous', value: Harmony.ANALOGOUS },\n { label: 'Triadic', value: Harmony.TRIADIC },\n { label: 'Tetradic', value: Harmony.TETRADIC },\n { label: 'Square', value: Harmony.SQUARE }\n ];\n\n const baseColor = '#F00';\n\n const createElement = (className, parent) => {\n const div = document.createElement('div');\n div.classList.add(className);\n parent.appendChild(div);\n return div;\n };\n\n const createHarmony = (item) => {\n\n const wrapper = createElement('wrapper', container);\n const wheel = createElement('wheel', wrapper);\n const harmony = createElement('harmony', wrapper);\n createElement('label', wrapper).innerText = item.label;\n\n fetch('images/wheel-subtractive.svg')\n .then(result => result.text())\n .then((svgCode) => {\n const harmonyColors = ColorTranslator.getHarmony(baseColor, item.value, Mix.SUBTRACTIVE);\n const selector = 'path' + harmonyColors.map((color) => `:not([fill=\"${color}\"])`).join('');\n wheel.innerHTML = svgCode;\n harmonyColors.forEach((hex) => createElement('box', harmony).style.background = hex);\n wheel.querySelectorAll(selector).forEach((path) => path.setAttribute('fill-opacity', '0.25'));\n });\n\n };\n\n harmonies.forEach((item) => createHarmony(item));\n\n return container;\n\n});\n;// ./src/@demo/demo.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst functioToString = (fn) => {\n const article = document.createElement('article');\n const pre = document.createElement('pre');\n article.classList.add('function-container');\n pre.classList.add('prettyprint');\n article.appendChild(pre);\n pre.innerHTML = fn.toString().replace('(ColorTranslator)', '()');\n return article;\n};\n\nconst demos = new Map([\n ['demo1', demo1],\n ['demo2', demo2],\n ['demo3', demo3],\n ['demo4', demo4],\n ['demo5', demo5],\n ['demo6', demo6],\n ['demo7', demo7],\n ['demo8', demo8],\n ['demo9', demo9],\n ['demo10', demo10],\n ['demo11', demo11]\n]);\n\ndocument.addEventListener('DOMContentLoaded', () => {\n demos.forEach((module, div) => {\n const demo = document.getElementById(div);\n const container = document.createElement('div');\n const wrapper = document.createElement('div');\n\n container.classList.add('demo-container');\n wrapper.classList.add('demo-wrapper');\n\n wrapper.appendChild(module(ColorTranslator, { Harmony: Harmony, Mix: Mix }));\n container.appendChild(wrapper);\n demo.appendChild(container);\n demo.appendChild(functioToString(module));\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkwLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBTSxvQkFBb0IscUJBQU07QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUiw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7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Q2hDO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0Q0FBNEM7QUFDdEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzQ0FBc0M7OztBQ2hNRjtBQUM5QjtBQUNQLEtBQUssVUFBVSxpRkFBaUYsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRTtBQUNySixLQUFLLFVBQVU7QUFDZixLQUFL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QUFDNUY7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjs7QUFFQTs7QUFFQTs7QUFFQSxDQUFDLEU7O0FDL0NxRTtBQUNBO0FBQ0g7QUFDN0M7QUFDQztBQUM2QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRTtBQUNBOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixlQUFlLE1BQU07QUFDckIsZUFBZSxNQUFNO0FBQ3JCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQ0FBbUMsZUFBZSxJQUFJLE9BQU8sY0FBSyxPQUFFO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vbm9kZV9tb2R1bGVzLy5wbnBtL3doYXR3Zy1mZXRjaEAzLjYuMjAvbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcz9kNGNiIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb25zdGFudHMvZW51bXMudHM/ZGI1MSIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY29uc3RhbnRzL3JlZ2V4cHMudHM/ZDc3ZiIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY29uc3RhbnRzL2luZGV4LnRzPzhmMzkiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL3V0aWxpdGllcy9pbmRleC50cz85MjQyIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb2xvci90cmFuc2xhdG9ycy50cz81NzA2Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jbGFzc2VzL0NvbG9yUGFyc2VyQ29udGV4dC50cz9mMDhmIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb2xvci9yZ2IudHM/NmY1NCIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY3NzL2luZGV4LnRzP2M3MmEiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvSEVYUGFyc2VyLnRzPzE2NzciLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvQ2FsY1BhcnNlci50cz9hNzhhIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jbGFzc2VzL1JHQlBhcnNlci50cz9jYmM3Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jbGFzc2VzL0hTTFBhcnNlci50cz9kMDU5Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jbGFzc2VzL0hXQlBhcnNlci50cz82ZmNjIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jbGFzc2VzL0NJRUxhYlBhcnNlci50cz9kZGQ0Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jbGFzc2VzL0xDSFBhcnNlci50cz8yY2U4Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jbGFzc2VzL0NNWUtQYXJzZXIudHM/MzFjMSIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvcGFyc2Vycy9pbmRleC50cz9iYTVlIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9yZXR1cm5zL2luZGV4LnRzPzE4YTEiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NsYXNzZXMvQ29sb3JUcmFuc2xhdG9yLnRzP2ZjNzkiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2luZGV4LnRzP2YxMjciLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8xL2luZGV4LmpzPzM5NjUiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8yL2luZGV4LmpzP2Q4ZGMiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8zL2luZGV4LmpzP2QzODYiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW80L2luZGV4LmpzPzYxOWYiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW81L2luZGV4LmpzP2Q4Y2MiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW82L2luZGV4LmpzPzNhMzIiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW83L2luZGV4LmpzPzgzNDMiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW84L2luZGV4LmpzPzc3MjUiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW85L2luZGV4LmpzPzg1MzIiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8xMC9pbmRleC5qcz80ZjY3Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vMTEvaW5kZXguanM/ZGJlNiIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtby5qcz85YjdkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xudmFyIGcgPVxuICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHx8XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZikgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpIHx8XG4gIHt9XG5cbnZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIGcsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBnICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBnICYmXG4gICAgJ0Jsb2InIGluIGcgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGcsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIGdcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH4hXS9pLnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gIH1cbiAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICB0aGlzLm1hcCA9IHt9XG5cbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICBpZiAoaGVhZGVyLmxlbmd0aCAhPSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlcnMgY29uc3RydWN0b3I6IGV4cGVjdGVkIG5hbWUvdmFsdWUgcGFpciB0byBiZSBsZW5ndGggMiwgZm91bmQnICsgaGVhZGVyLmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5Ll9ub0JvZHkpIHJldHVyblxuICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgfVxuICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgfVxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHZhciBtYXRjaCA9IC9jaGFyc2V0PShbQS1aYS16MC05Xy1dKykvLmV4ZWMoYmxvYi50eXBlKVxuICB2YXIgZW5jb2RpbmcgPSBtYXRjaCA/IG1hdGNoWzFdIDogJ3V0Zi04J1xuICByZWFkZXIucmVhZEFzVGV4dChibG9iLCBlbmNvZGluZylcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgLypcbiAgICAgIGZldGNoLW1vY2sgd3JhcHMgdGhlIFJlc3BvbnNlIG9iamVjdCBpbiBhbiBFUzYgUHJveHkgdG9cbiAgICAgIHByb3ZpZGUgdXNlZnVsIHRlc3QgaGFybmVzcyBmZWF0dXJlcyBzdWNoIGFzIGZsdXNoLiBIb3dldmVyLCBvblxuICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgIHRoZSBwcm94eS1wb2xseWZpbGwgaXMgdW5hYmxlIHRvIHByb3h5IGFuIGF0dHJpYnV0ZSB1bmxlc3MgaXQgZXhpc3RzXG4gICAgICBvbiB0aGUgb2JqZWN0IGJlZm9yZSB0aGUgUHJveHkgaXMgY3JlYXRlZC4gVGhpcyBjaGFuZ2UgZW5zdXJlc1xuICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICBzZW1hbnRpYyBvZiBzZXR0aW5nIFJlcXVlc3QuYm9keVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGJlZm9yZVxuICAgICAgX2luaXRCb2R5IGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIHRoaXMuYm9keVVzZWQgPSB0aGlzLmJvZHlVc2VkXG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ub0JvZHkgPSB0cnVlO1xuICAgICAgdGhpcy5fYm9keVRleHQgPSAnJ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChpc0NvbnN1bWVkKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQgKyB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBhcyBBcnJheUJ1ZmZlcicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0NPTk5FQ1QnLCAnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUEFUQ0gnLCAnUE9TVCcsICdQVVQnLCAnVFJBQ0UnXVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgfVxuICAgIHRoaXMudXJsID0gaW5wdXQudXJsXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpXG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZVxuICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsXG4gICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gIH1cblxuICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbidcbiAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB9XG4gIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKVxuICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbCB8fCAoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnQWJvcnRDb250cm9sbGVyJyBpbiBnKSB7XG4gICAgICB2YXIgY3RybCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjdHJsLnNpZ25hbDtcbiAgICB9XG4gIH0oKSk7XG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxuXG4gIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgYSAnXycgcGFyYW1ldGVyIGluIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIHZhciByZVBhcmFtU2VhcmNoID0gLyhbPyZdKV89W14mXSovXG4gICAgICBpZiAocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShyZVBhcmFtU2VhcmNoLCAnJDFfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgJ18nIHBhcmFtZXRlciB0byB0aGUgZW5kIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vXG4gICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZmV0Y2gvaXNzdWVzLzc0OFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNzUxXG4gIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAuc3BsaXQoJ1xccicpXG4gICAgLm1hcChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlICcgKyBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICBpZiAodGhpcy5zdGF0dXMgPCAyMDAgfHwgdGhpcy5zdGF0dXMgPiA1OTkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Jlc3BvbnNlJzogVGhlIHN0YXR1cyBwcm92aWRlZCAoMCkgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzIwMCwgNTk5XS5cIilcbiAgfVxuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiAnJyArIG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAyMDAsIHN0YXR1c1RleHQ6ICcnfSlcbiAgcmVzcG9uc2Uub2sgPSBmYWxzZVxuICByZXNwb25zZS5zdGF0dXMgPSAwXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZy5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY2hlY2sgaWYgc3BlY2lmaWNhbGx5IGZvciB3aGVuIGEgdXNlciBmZXRjaGVzIGEgZmlsZSBsb2NhbGx5IGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gICAgICAvLyBPbmx5IGlmIHRoZSBzdGF0dXMgaXMgb3V0IG9mIGEgbm9ybWFsIHJhbmdlXG4gICAgICBpZiAocmVxdWVzdC51cmwuaW5kZXhPZignZmlsZTovLycpID09PSAwICYmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPiA1OTkpKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0gMjAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCB0aW1lZCBvdXQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZy5sb2NhdGlvbi5ocmVmID8gZy5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlclxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzIHx8IChnLkhlYWRlcnMgJiYgaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgZy5IZWFkZXJzKSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgbmFtZXMucHVzaChub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWcuZmV0Y2gpIHtcbiAgZy5mZXRjaCA9IGZldGNoXG4gIGcuSGVhZGVycyA9IEhlYWRlcnNcbiAgZy5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsImV4cG9ydCB2YXIgQ29sb3JNb2RlbDtcbihmdW5jdGlvbiAoQ29sb3JNb2RlbCkge1xuICAgIENvbG9yTW9kZWxbXCJIRVhcIl0gPSBcIkhFWFwiO1xuICAgIENvbG9yTW9kZWxbXCJSR0JcIl0gPSBcIlJHQlwiO1xuICAgIENvbG9yTW9kZWxbXCJIV0JcIl0gPSBcIkhXQlwiO1xuICAgIENvbG9yTW9kZWxbXCJIU0xcIl0gPSBcIkhTTFwiO1xuICAgIENvbG9yTW9kZWxbXCJDSUVMYWJcIl0gPSBcIkNJRUxhYlwiO1xuICAgIENvbG9yTW9kZWxbXCJMQ0hcIl0gPSBcIkxDSFwiO1xuICAgIENvbG9yTW9kZWxbXCJDTVlLXCJdID0gXCJDTVlLXCI7XG59KShDb2xvck1vZGVsIHx8IChDb2xvck1vZGVsID0ge30pKTtcbmV4cG9ydCB2YXIgSGFybW9ueTtcbihmdW5jdGlvbiAoSGFybW9ueSkge1xuICAgIEhhcm1vbnlbXCJBTkFMT0dPVVNcIl0gPSBcIkFOQUxPR09VU1wiO1xuICAgIEhhcm1vbnlbXCJDT01QTEVNRU5UQVJZXCJdID0gXCJDT01QTEVNRU5UQVJZXCI7XG4gICAgSGFybW9ueVtcIlNQTElUX0NPTVBMRU1FTlRBUllcIl0gPSBcIlNQTElUX0NPTVBMRU1FTlRBUllcIjtcbiAgICBIYXJtb255W1wiVFJJQURJQ1wiXSA9IFwiVFJJQURJQ1wiO1xuICAgIEhhcm1vbnlbXCJURVRSQURJQ1wiXSA9IFwiVEVUUkFESUNcIjtcbiAgICBIYXJtb255W1wiU1FVQVJFXCJdID0gXCJTUVVBUkVcIjtcbn0pKEhhcm1vbnkgfHwgKEhhcm1vbnkgPSB7fSkpO1xuZXhwb3J0IHZhciBNaXg7XG4oZnVuY3Rpb24gKE1peCkge1xuICAgIE1peFtcIkFERElUSVZFXCJdID0gXCJBRERJVElWRVwiO1xuICAgIE1peFtcIlNVQlRSQUNUSVZFXCJdID0gXCJTVUJUUkFDVElWRVwiO1xufSkoTWl4IHx8IChNaXggPSB7fSkpO1xuZXhwb3J0IHZhciBBbmdsZXNVbml0RW51bTtcbihmdW5jdGlvbiAoQW5nbGVzVW5pdEVudW0pIHtcbiAgICBBbmdsZXNVbml0RW51bVtcIk5PTkVcIl0gPSBcIm5vbmVcIjtcbiAgICBBbmdsZXNVbml0RW51bVtcIkRFR1JFRVNcIl0gPSBcImRlZ1wiO1xuICAgIEFuZ2xlc1VuaXRFbnVtW1wiR1JBRElBTlNcIl0gPSBcImdyYWRcIjtcbiAgICBBbmdsZXNVbml0RW51bVtcIlJBRElBTlNcIl0gPSBcInJhZFwiO1xuICAgIEFuZ2xlc1VuaXRFbnVtW1wiVFVSTlNcIl0gPSBcInR1cm5cIjtcbn0pKEFuZ2xlc1VuaXRFbnVtIHx8IChBbmdsZXNVbml0RW51bSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbG9yVW5pdEVudW07XG4oZnVuY3Rpb24gKENvbG9yVW5pdEVudW0pIHtcbiAgICBDb2xvclVuaXRFbnVtW1wiTk9ORVwiXSA9IFwibm9uZVwiO1xuICAgIENvbG9yVW5pdEVudW1bXCJQRVJDRU5UXCJdID0gXCJwZXJjZW50XCI7XG59KShDb2xvclVuaXRFbnVtIHx8IChDb2xvclVuaXRFbnVtID0ge30pKTtcbmV4cG9ydCB2YXIgQ01ZS0Z1bmN0aW9uRW51bTtcbihmdW5jdGlvbiAoQ01ZS0Z1bmN0aW9uRW51bSkge1xuICAgIENNWUtGdW5jdGlvbkVudW1bXCJERVZJQ0VfQ01ZS1wiXSA9IFwiZGV2aWNlLWNteWtcIjtcbiAgICBDTVlLRnVuY3Rpb25FbnVtW1wiQ01ZS1wiXSA9IFwiY215a1wiO1xufSkoQ01ZS0Z1bmN0aW9uRW51bSB8fCAoQ01ZS0Z1bmN0aW9uRW51bSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbG9yS2V5d29yZHM7XG4oZnVuY3Rpb24gKENvbG9yS2V5d29yZHMpIHtcbiAgICBDb2xvcktleXdvcmRzW1wiYmxhY2tcIl0gPSBcIiMwMDAwMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2lsdmVyXCJdID0gXCIjQzBDMEMwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImdyYXlcIl0gPSBcIiM4MDgwODBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wid2hpdGVcIl0gPSBcIiNGRkZGRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWFyb29uXCJdID0gXCIjODAwMDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInJlZFwiXSA9IFwiI0ZGMDAwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwdXJwbGVcIl0gPSBcIiM4MDAwODBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZnVjaHNpYVwiXSA9IFwiI0ZGMDBGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJncmVlblwiXSA9IFwiIzAwODAwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaW1lXCJdID0gXCIjMDBGRjAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9saXZlXCJdID0gXCIjODA4MDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInllbGxvd1wiXSA9IFwiI0ZGRkYwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJuYXZ5XCJdID0gXCIjMDAwMDgwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImJsdWVcIl0gPSBcIiMwMDAwRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1widGVhbFwiXSA9IFwiIzAwODA4MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJhcXVhXCJdID0gXCIjMDBGRkZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9yYW5nZVwiXSA9IFwiI0ZGQTUwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJhbGljZWJsdWVcIl0gPSBcIiNGMEY4RkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYW50aXF1ZXdoaXRlXCJdID0gXCIjRkFFQkQ3XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImFxdWFtYXJpbmVcIl0gPSBcIiM3RkZGRDRcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYXp1cmVcIl0gPSBcIiNGMEZGRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmVpZ2VcIl0gPSBcIiNGNUY1RENcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmlzcXVlXCJdID0gXCIjRkZFNEM0XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImJsYW5jaGVkYWxtb25kXCJdID0gXCIjRkZFQkNEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImJsdWV2aW9sZXRcIl0gPSBcIiM4QTJCRTJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYnJvd25cIl0gPSBcIiNBNTJBMkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYnVybHl3b29kXCJdID0gXCIjREVCODg3XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNhZGV0Ymx1ZVwiXSA9IFwiIzVGOUVBMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjaGFydHJldXNlXCJdID0gXCIjN0ZGRjAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNob2NvbGF0ZVwiXSA9IFwiI0QyNjkxRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjb3JhbFwiXSA9IFwiI0ZGN0Y1MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjb3JuZmxvd2VyYmx1ZVwiXSA9IFwiIzY0OTVFRFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjb3Juc2lsa1wiXSA9IFwiI0ZGRjhEQ1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjcmltc29uXCJdID0gXCIjREMxNDNDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImN5YW5cIl0gPSBcIiMwMEZGRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2JsdWVcIl0gPSBcIiMwMDAwOEJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2N5YW5cIl0gPSBcIiMwMDhCOEJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2dvbGRlbnJvZFwiXSA9IFwiI0I4ODYwQlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrZ3JheVwiXSA9IFwiI0E5QTlBOVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrZ3JlZW5cIl0gPSBcIiMwMDY0MDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2dyZXlcIl0gPSBcIiNBOUE5QTlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2toYWtpXCJdID0gXCIjQkRCNzZCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmttYWdlbnRhXCJdID0gXCIjOEIwMDhCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtvbGl2ZWdyZWVuXCJdID0gXCIjNTU2QjJGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtvcmFuZ2VcIl0gPSBcIiNGRjhDMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya29yY2hpZFwiXSA9IFwiIzk5MzJDQ1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrcmVkXCJdID0gXCIjOEIwMDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtzYWxtb25cIl0gPSBcIiNFOTk2N0FcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3NlYWdyZWVuXCJdID0gXCIjOEZCQzhGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtzbGF0ZWJsdWVcIl0gPSBcIiM0ODNEOEJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3NsYXRlZ3JheVwiXSA9IFwiIzJGNEY0RlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrc2xhdGVncmV5XCJdID0gXCIjMkY0RjRGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmt0dXJxdW9pc2VcIl0gPSBcIiMwMENFRDFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3Zpb2xldFwiXSA9IFwiIzk0MDBEM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkZWVwcGlua1wiXSA9IFwiI0ZGMTQ5M1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkZWVwc2t5Ymx1ZVwiXSA9IFwiIzAwQkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkaW1ncmF5XCJdID0gXCIjNjk2OTY5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRpbWdyZXlcIl0gPSBcIiM2OTY5NjlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZG9kZ2VyYmx1ZVwiXSA9IFwiIzFFOTBGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJmaXJlYnJpY2tcIl0gPSBcIiNCMjIyMjJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZmxvcmFsd2hpdGVcIl0gPSBcIiNGRkZBRjBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZm9yZXN0Z3JlZW5cIl0gPSBcIiMyMjhCMjJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ2FpbnNib3JvXCJdID0gXCIjRENEQ0RDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImdob3N0d2hpdGVcIl0gPSBcIiNGOEY4RkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ29sZFwiXSA9IFwiI0ZGRDcwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJnb2xkZW5yb2RcIl0gPSBcIiNEQUE1MjBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ3JlZW55ZWxsb3dcIl0gPSBcIiNBREZGMkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ3JleVwiXSA9IFwiIzgwODA4MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJob25leWRld1wiXSA9IFwiI0YwRkZGMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJob3RwaW5rXCJdID0gXCIjRkY2OUI0XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImluZGlhbnJlZFwiXSA9IFwiI0NENUM1Q1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJpbmRpZ29cIl0gPSBcIiM0QjAwODJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiaXZvcnlcIl0gPSBcIiNGRkZGRjBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wia2hha2lcIl0gPSBcIiNGMEU2OENcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGF2ZW5kZXJcIl0gPSBcIiNFNkU2RkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGF2ZW5kZXJibHVzaFwiXSA9IFwiI0ZGRjBGNVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsYXduZ3JlZW5cIl0gPSBcIiM3Q0ZDMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGVtb25jaGlmZm9uXCJdID0gXCIjRkZGQUNEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Ymx1ZVwiXSA9IFwiI0FERDhFNlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGNvcmFsXCJdID0gXCIjRjA4MDgwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Y3lhblwiXSA9IFwiI0UwRkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiXSA9IFwiI0ZBRkFEMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGdyYXlcIl0gPSBcIiNEM0QzRDNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRncmVlblwiXSA9IFwiIzkwRUU5MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGdyZXlcIl0gPSBcIiNEM0QzRDNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRwaW5rXCJdID0gXCIjRkZCNkMxXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c2FsbW9uXCJdID0gXCIjRkZBMDdBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c2VhZ3JlZW5cIl0gPSBcIiMyMEIyQUFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRza3libHVlXCJdID0gXCIjODdDRUZBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c2xhdGVncmF5XCJdID0gXCIjNzc4ODk5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c2xhdGVncmV5XCJdID0gXCIjNzc4ODk5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c3RlZWxibHVlXCJdID0gXCIjQjBDNERFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0eWVsbG93XCJdID0gXCIjRkZGRkUwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpbWVncmVlblwiXSA9IFwiIzMyQ0QzMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaW5lblwiXSA9IFwiI0ZBRjBFNlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtYWdlbnRhXCJdID0gXCIjRkYwMEZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bWFxdWFtYXJpbmVcIl0gPSBcIiM2NkNEQUFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtYmx1ZVwiXSA9IFwiIzAwMDBDRFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW1vcmNoaWRcIl0gPSBcIiNCQTU1RDNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtcHVycGxlXCJdID0gXCIjOTM3MERCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bXNlYWdyZWVuXCJdID0gXCIjM0NCMzcxXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bXNsYXRlYmx1ZVwiXSA9IFwiIzdCNjhFRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW1zcHJpbmdncmVlblwiXSA9IFwiIzAwRkE5QVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW10dXJxdW9pc2VcIl0gPSBcIiM0OEQxQ0NcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtdmlvbGV0cmVkXCJdID0gXCIjQzcxNTg1XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1pZG5pZ2h0Ymx1ZVwiXSA9IFwiIzE5MTk3MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtaW50Y3JlYW1cIl0gPSBcIiNGNUZGRkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWlzdHlyb3NlXCJdID0gXCIjRkZFNEUxXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1vY2Nhc2luXCJdID0gXCIjRkZFNEI1XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm5hdmFqb3doaXRlXCJdID0gXCIjRkZERUFEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9sZGxhY2VcIl0gPSBcIiNGREY1RTZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib2xpdmVkcmFiXCJdID0gXCIjNkI4RTIzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9yYW5nZXJlZFwiXSA9IFwiI0ZGNDUwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJvcmNoaWRcIl0gPSBcIiNEQTcwRDZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGFsZWdvbGRlbnJvZFwiXSA9IFwiI0VFRThBQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwYWxlZ3JlZW5cIl0gPSBcIiM5OEZCOThcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGFsZXR1cnF1b2lzZVwiXSA9IFwiI0FGRUVFRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwYWxldmlvbGV0cmVkXCJdID0gXCIjREI3MDkzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBhcGF5YXdoaXBcIl0gPSBcIiNGRkVGRDVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGVhY2hwdWZmXCJdID0gXCIjRkZEQUI5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBlcnVcIl0gPSBcIiNDRDg1M0ZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGlua1wiXSA9IFwiI0ZGQzBDQlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwbHVtXCJdID0gXCIjRERBMEREXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBvd2RlcmJsdWVcIl0gPSBcIiNCMEUwRTZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicm9zeWJyb3duXCJdID0gXCIjQkM4RjhGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInJveWFsYmx1ZVwiXSA9IFwiIzQxNjlFMVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzYWRkbGVicm93blwiXSA9IFwiIzhCNDUxM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzYWxtb25cIl0gPSBcIiNGQTgwNzJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2FuZHlicm93blwiXSA9IFwiI0Y0QTQ2MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzZWFncmVlblwiXSA9IFwiIzJFOEI1N1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzZWFzaGVsbFwiXSA9IFwiI0ZGRjVFRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzaWVubmFcIl0gPSBcIiNBMDUyMkRcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2t5Ymx1ZVwiXSA9IFwiIzg3Q0VFQlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzbGF0ZWJsdWVcIl0gPSBcIiM2QTVBQ0RcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2xhdGVncmF5XCJdID0gXCIjNzA4MDkwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNsYXRlZ3JleVwiXSA9IFwiIzcwODA5MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzbm93XCJdID0gXCIjRkZGQUZBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNwcmluZ2dyZWVuXCJdID0gXCIjMDBGRjdGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInN0ZWVsYmx1ZVwiXSA9IFwiIzQ2ODJCNFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0YW5cIl0gPSBcIiNEMkI0OENcIjtcbiAgICBDb2xvcktleXdvcmRzW1widGhpc3RsZVwiXSA9IFwiI0Q4QkZEOFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0b21hdG9cIl0gPSBcIiNGRjYzNDdcIjtcbiAgICBDb2xvcktleXdvcmRzW1widHVycXVvaXNlXCJdID0gXCIjNDBFMEQwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInZpb2xldFwiXSA9IFwiI0VFODJFRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ3aGVhdFwiXSA9IFwiI0Y1REVCM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ3aGl0ZXNtb2tlXCJdID0gXCIjRjVGNUY1XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInllbGxvd2dyZWVuXCJdID0gXCIjOUFDRDMyXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInJlYmVjY2FwdXJwbGVcIl0gPSBcIiM2NjMzOTlcIjtcbn0pKENvbG9yS2V5d29yZHMgfHwgKENvbG9yS2V5d29yZHMgPSB7fSkpO1xuIiwiaW1wb3J0IHsgQ29sb3JNb2RlbCB9IGZyb20gJy4vZW51bXMnO1xuZXhwb3J0IGNvbnN0IENPTE9SUkVHUyA9IHtcbiAgICBbQ29sb3JNb2RlbC5IRVhdOiAvXiMoPzooPzxyPlthLWZcXGRdKSg/PGc+W2EtZlxcZF0pKD88Yj5bYS1mXFxkXSkoPzxhPlthLWZcXGRdKT98KD88cnI+W2EtZlxcZF17Mn0pKD88Z2c+W2EtZlxcZF17Mn0pKD88YmI+W2EtZlxcZF17Mn0pKD88YWE+W2EtZlxcZF17Mn0pPykkL2ksXG4gICAgW0NvbG9yTW9kZWwuUkdCXTogL15yZ2JhP1xccypcXChcXHMqKD86KD88cl9sZWdhY3k+KD86XFxkKlxcLik/XFxkKyU/KVxccyosXFxzKig/PGdfbGVnYWN5Pig/OlxcZCpcXC4pP1xcZCslPylcXHMqLFxccyooPzxiX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrJT8pKD86XFxzKixcXHMqKD88YV9sZWdhY3k+KD86XFxkKlxcLik/XFxkKykpP3woPzxyPig/OlxcZCpcXC4pP1xcZCslPylcXHMrKD88Zz4oPzpcXGQqXFwuKT9cXGQrJT8pXFxzKyg/PGI+KD86XFxkKlxcLik/XFxkKyU/KSg/OlxccypcXC9cXHMqKD88YT4oPzpcXGQqXFwuKT9cXGQrJT8pKT98ZnJvbVxccysoPzxmcm9tPig/Olxcdyt8XFx3K1xcKFxccypbXigpKV0rXFxzKlxcKXxcXHcrXFwoZnJvbVxccytcXHcrXFwoLipcXClcXHMqXFwpfCNbYS1mQS1GXFxkXSspKVxccysoPzxyZWxhdGl2ZV9yPig/OltyZ2JdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtyZ2IoKS8qXFwtK1xcZC5cXHNdK1xcKSkpXFxzKyg/PHJlbGF0aXZlX2c+KD86W3JnYl18KD86XFxkKlxcLik/XFxkK3xjYWxjXFwoW3JnYigpLypcXC0rXFxkLlxcc10rXFwpKSlcXHMrKD88cmVsYXRpdmVfYj4oPzpbcmdiXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbcmdiKCkvKlxcLStcXGQuXFxzXStcXCkpKSg/OlxccypcXC9cXHMqKD88cmVsYXRpdmVfYT4oPzooPzpcXGQqXFwuKT9cXGQrJT98Y2FsY1xcKFsoKS8qXFwtK1xcZC5cXHNcXHddKig/OmFscGhhKT9bKCkvKlxcLStcXGQuXFxzXFx3XSpcXCl8YWxwaGEpKSk/KVxccypcXCkkLyxcbiAgICBbQ29sb3JNb2RlbC5IV0JdOiAvXmh3YlxccypcXChcXHMqKD86KD88aD4oPzpcXGQqXFwuKT9cXGQrKD86ZGVnfGdyYWR8cmFkfHR1cm4pPylcXHMrKD88dz4oPzpcXGQqXFwuKT9cXGQrKSVcXHMrKD88Yj4oPzpcXGQqXFwuKT9cXGQrKSUoPzpcXHMqXFwvXFxzKig/PGE+KD86XFxkKlxcLik/XFxkKyU/KSk/fGZyb21cXHMrKD88ZnJvbT4oPzpcXHcrfFxcdytcXChcXHMqW14oKSldK1xccypcXCl8XFx3K1xcKGZyb21cXHMrXFx3K1xcKC4qXFwpXFxzKlxcKXwjW2EtZkEtRlxcZF0rKSlcXHMrKD88cmVsYXRpdmVfaD4oPzpbaHdiXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbaHdiKCkvKlxcLStcXGQuXFxzXStcXCkpKVxccysoPzxyZWxhdGl2ZV93Pig/Oltod2JdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtod2IoKS8qXFwtK1xcZC5cXHNdK1xcKSkpJT9cXHMrKD88cmVsYXRpdmVfYj4oPzpbaHdiXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbaHdiKCkvKlxcLStcXGQuXFxzXStcXCkpKSU/KD86XFxzKlxcL1xccyooPzxyZWxhdGl2ZV9hPig/Oig/OlxcZCpcXC4pP1xcZCslP3xjYWxjXFwoWygpLypcXC0rXFxkLlxcc1xcd10qKD86YWxwaGEpP1soKS8qXFwtK1xcZC5cXHNcXHddKlxcKXxhbHBoYSkpKT8pXFxzKlxcKSQvLFxuICAgIFtDb2xvck1vZGVsLkhTTF06IC9eaHNsYT9cXHMqXFwoXFxzKig/Oig/PGhfbGVnYWN5Pi0/KD86XFxkKlxcLik/XFxkKyg/OmRlZ3xncmFkfHJhZHx0dXJuKT8pXFxzKixcXHMqKD88c19sZWdhY3k+KD86XFxkKlxcLik/XFxkKyklXFxzKixcXHMqKD88bF9sZWdhY3k+KD86XFxkKlxcLik/XFxkKyklKD86XFxzKixcXHMqKD88YV9sZWdhY3k+KD86XFxkKlxcLik/XFxkKykpP3woPzxoPi0/KD86XFxkKlxcLik/XFxkKyg/OmRlZ3xncmFkfHJhZHx0dXJuKT8pXFxzKyg/PHM+KD86XFxkKlxcLik/XFxkKyklP1xccysoPzxsPig/OlxcZCpcXC4pP1xcZCspJT8oPzpcXHMqXFwvXFxzKig/PGE+KD86XFxkKlxcLik/XFxkKyU/KSk/fGZyb21cXHMrKD88ZnJvbT4oPzpcXHcrfFxcdytcXChcXHMqW14oKSldK1xccypcXCl8XFx3K1xcKGZyb21cXHMrXFx3K1xcKC4qXFwpXFxzKlxcKXwjW2EtZkEtRlxcZF0rKSlcXHMrKD88cmVsYXRpdmVfaD4oPzpbaHNsXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbaHNsKCkvKlxcLStcXGQuXFxzXStcXCkpKVxccysoPzxyZWxhdGl2ZV9zPig/Oltoc2xdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtoc2woKS8qXFwtK1xcZC5cXHNdK1xcKSkpJT9cXHMrKD88cmVsYXRpdmVfbD4oPzpbaHNsXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbaHNsKCkvKlxcLStcXGQuXFxzXStcXCkpKSU/KD86XFxzKlxcL1xccyooPzxyZWxhdGl2ZV9hPig/Oig/OlxcZCpcXC4pP1xcZCslP3xjYWxjXFwoWygpLypcXC0rXFxkLlxcc1xcd10qKD86YWxwaGEpP1soKS8qXFwtK1xcZC5cXHNcXHddKlxcKXxhbHBoYSkpKT8pXFxzKlxcKSQvLFxuICAgIFtDb2xvck1vZGVsLkNJRUxhYl06IC9ebGFiXFxzKlxcKFxccyooPzooPzxMPig/OlxcZCpcXC4pP1xcZCslPylcXHMrKD88YT4tPyg/OlxcZCpcXC4pP1xcZCslPylcXHMrKD88Yj4tPyg/OlxcZCpcXC4pP1xcZCslPykoPzpcXHMqXFwvXFxzKig/PEE+KD86XFxkKlxcLik/XFxkKyU/KSk/fGZyb21cXHMrKD88ZnJvbT4oPzpcXHcrfFxcdytcXChcXHMqW14oKSldK1xccypcXCl8XFx3K1xcKGZyb21cXHMrXFx3K1xcKC4qXFwpXFxzKlxcKXwjW2EtZkEtRlxcZF0rKSlcXHMrKD88cmVsYXRpdmVfTD4oPzpbbGFiXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbbGFiKCkvKlxcLStcXGQuXFxzXStcXCkpKVxccysoPzxyZWxhdGl2ZV9hPig/OltsYWJdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtsYWIoKS8qXFwtK1xcZC5cXHNdK1xcKSkpXFxzKyg/PHJlbGF0aXZlX2I+KD86W2xhYl18KD86XFxkKlxcLik/XFxkK3xjYWxjXFwoW2xhYigpLypcXC0rXFxkLlxcc10rXFwpKSkoPzpcXHMqXFwvXFxzKig/PHJlbGF0aXZlX0E+KD86KD86XFxkKlxcLik/XFxkKyU/fGNhbGNcXChbKCkvKlxcLStcXGQuXFxzXFx3XSooPzphbHBoYSk/WygpLypcXC0rXFxkLlxcc1xcd10qXFwpfGFscGhhKSkpPylcXHMqXFwpJC8sXG4gICAgW0NvbG9yTW9kZWwuTENIXTogL15sY2hcXHMqXFwoXFxzKig/Oig/PGw+KD86XFxkKlxcLik/XFxkKyU/KVxccysoPzxjPi0/KD86XFxkKlxcLik/XFxkKyU/KVxccysoPzxoPi0/KD86XFxkKlxcLik/XFxkKyg/OmRlZ3xncmFkfHJhZHx0dXJuKT8pKD86XFxzKlxcL1xccyooPzxhPig/OlxcZCpcXC4pP1xcZCslPykpP3xmcm9tXFxzKyg/PGZyb20+KD86XFx3K3xcXHcrXFwoXFxzKlteKCkpXStcXHMqXFwpfFxcdytcXChmcm9tXFxzK1xcdytcXCguKlxcKVxccypcXCl8I1thLWZBLUZcXGRdKykpXFxzKyg/PHJlbGF0aXZlX2w+KD86W2xjaF18KD86XFxkKlxcLik/XFxkK3xjYWxjXFwoW2xjaCgpLypcXC0rXFxkLlxcc10rXFwpKSlcXHMrKD88cmVsYXRpdmVfYz4oPzpbbGNoXXwoPzpcXGQqXFwuKT9cXGQrfGNhbGNcXChbbGNoKCkvKlxcLStcXGQuXFxzXStcXCkpKVxccysoPzxyZWxhdGl2ZV9oPig/OltsY2hdfCg/OlxcZCpcXC4pP1xcZCt8Y2FsY1xcKFtsY2goKS8qXFwtK1xcZC5cXHNdK1xcKSkpKD86XFxzKlxcL1xccyooPzxyZWxhdGl2ZV9hPig/Oig/OlxcZCpcXC4pP1xcZCslP3xjYWxjXFwoWygpLypcXC0rXFxkLlxcc1xcd10qKD86YWxwaGEpP1soKS8qXFwtK1xcZC5cXHNcXHddKlxcKXxhbHBoYSkpKT8pXFxzKlxcKSQvLFxuICAgIFtDb2xvck1vZGVsLkNNWUtdOiAvXig/OmRldmljZS1jbXlrfGNteWspXFxzKlxcKFxccyooPzooPzxjX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrJT8pXFxzKixcXHMqKD88bV9sZWdhY3k+KD86XFxkKlxcLik/XFxkKyU/KVxccyosXFxzKig/PHlfbGVnYWN5Pig/OlxcZCpcXC4pP1xcZCslPylcXHMqLFxccyooPzxrX2xlZ2FjeT4oPzpcXGQqXFwuKT9cXGQrJT8pKD86XFxzKixcXHMqKD88YV9sZWdhY3k+KD86XFxkKlxcLik/XFxkKykpP3woPzxjPig/OlxcZCpcXC4pP1xcZCslPylcXHMrKD88bT4oPzpcXGQqXFwuKT9cXGQrJT8pXFxzKyg/PHk+KD86XFxkKlxcLik/XFxkKyU/KVxccysoPzxrPig/OlxcZCpcXC4pP1xcZCslPykoPzpcXHMqXFwvXFxzKig/PGE+KD86XFxkKlxcLik/XFxkKyU/KSk/KVxccypcXCkkL1xufTtcbmV4cG9ydCBjb25zdCBDQUxDID0ge1xuICAgIFJFR0VYUDogL15jYWxjXFwoXFxzKig/PG9wZXJhdGlvbj5bXFxkLi8qKy1cXHdcXHNdKylcXHMqXFwpJC8sXG4gICAgU0NPUEVEOiAvXFwoXFxzKihbXigpXSspXFxzKlxcKS9nLFxuICAgIERJVklTSU9OOiAvXFxzKig/PGxlZnQ+KD86KD86XFxkKlxcLik/XFxkK3xcXHcrKSlcXHMqXFwvXFxzKig/PHJpZ2h0Pig/Oig/OlxcZCpcXC4pP1xcZCt8XFx3KykpXFxzKi8sXG4gICAgTVVMVElQTElDQVRJT046IC9cXHMqKD88bGVmdD4oPzooPzpcXGQqXFwuKT9cXGQrfFxcdyspKVxccypcXCpcXHMqKD88cmlnaHQ+KD86KD86XFxkKlxcLik/XFxkK3xcXHcrKSlcXHMqLyxcbiAgICBTVU06IC9cXHMqKD88bGVmdD4oPzooPzpcXGQqXFwuKT9cXGQrfFxcdyspKVxccypcXCtcXHMqKD88cmlnaHQ+KD86KD86XFxkKlxcLik/XFxkK3xcXHcrKSlcXHMqLyxcbiAgICBSRVNUOiAvXFxzKig/PGxlZnQ+KD86KD86XFxkKlxcLik/XFxkK3xcXHcrKSlcXHMqLVxccyooPzxyaWdodD4oPzooPzpcXGQqXFwuKT9cXGQrfFxcdyspKVxccyovXG59O1xuZXhwb3J0IGNvbnN0IEhTTF9IVUUgPSAvXig/PG51bWJlcj4tPyg/OlxcZCpcXC4pP1xcZCspKD88dW5pdHM+KD86ZGVnfGdyYWR8cmFkfHR1cm4pPykkLztcbmV4cG9ydCBjb25zdCBQQ0VOVCA9IC9eKC0/XFxkKyg/OlxcLlxcZCspP3wtP1xcLlxcZCspJSQvO1xuZXhwb3J0IGNvbnN0IEhFWCA9IC9eMHgoW2EtZlxcZF17MSwyfSkkL2k7XG5leHBvcnQgY29uc3QgVEVNUExBVEVfVkFSID0gL1xceyhcXGQrKVxcfS9nO1xuZXhwb3J0IGNvbnN0IENPTU1BU19BTkRfTkVYVF9DSEFSUyA9IC8sKCArfFxcZCspL2c7XG5leHBvcnQgY29uc3QgU1BBQ0VTID0gLyArLztcbiIsImltcG9ydCB7IEFuZ2xlc1VuaXRFbnVtLCBDb2xvck1vZGVsLCBDb2xvclVuaXRFbnVtLCBDTVlLRnVuY3Rpb25FbnVtIH0gZnJvbSAnLi9lbnVtcyc7XG5leHBvcnQgY29uc3QgTUFYX0RFQ0lNQUxTID0gNjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0JMRU5EX1NURVBTID0gNTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NIQURFU19USU5UU19TVEVQUyA9IDU7XG5leHBvcnQgY29uc3QgQkFTRV8yNTUgPSAyNTU7XG5leHBvcnQgY29uc3QgTUFYX0hVRSA9IDM2MDtcbmV4cG9ydCBjb25zdCBNQVhfUENFTlQgPSAxMDA7XG5leHBvcnQgY29uc3QgTUFYX0FMUEhBID0gMTtcbmV4cG9ydCBjb25zdCBNQVhfTEFCID0gMTI1O1xuZXhwb3J0IGNvbnN0IE1BWF9MQ0hfQyA9IDE1MDtcbmV4cG9ydCBjb25zdCBHUkFESUFOUyA9IDEwIC8gOTtcbmV4cG9ydCBjb25zdCBDT0xPUl9QUk9QUyA9IE9iamVjdC5mcmVlemUoe1xuICAgIEhFWDogWydSJywgJ0cnLCAnQicsICdBJ10sXG4gICAgUkdCOiBbJ1InLCAnRycsICdCJywgJ0EnXSxcbiAgICBIU0w6IFsnSCcsICdTJywgJ0wnLCAnQSddLFxuICAgIEhXQjogWydIJywgJ1cnLCAnQicsICdBJ10sXG4gICAgQ0lFTGFiOiBbJ0wnLCAnYScsICdiJywgJ0EnXSxcbiAgICBMQ0g6IFsnTCcsICdDJywgJ0gnLCAnQSddLFxuICAgIENNWUs6IFsnQycsICdNJywgJ1knLCAnSycsICdBJ11cbn0pO1xuZXhwb3J0IGNvbnN0IENPTU1BID0gJywnO1xuZXhwb3J0IGNvbnN0IFZBTElEX0NPTE9SX09CSkVDVFMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBBQkdSOiBDb2xvck1vZGVsLlJHQixcbiAgICBBQkhXOiBDb2xvck1vZGVsLkhXQixcbiAgICBBQ0hMOiBDb2xvck1vZGVsLkxDSCxcbiAgICBBQ0tNWTogQ29sb3JNb2RlbC5DTVlLLFxuICAgIEFITFM6IENvbG9yTW9kZWwuSFNMLFxuICAgIEFMQUI6IENvbG9yTW9kZWwuQ0lFTGFiLFxuICAgIEJHUjogQ29sb3JNb2RlbC5SR0IsXG4gICAgQkhXOiBDb2xvck1vZGVsLkhXQixcbiAgICBDSEw6IENvbG9yTW9kZWwuTENILFxuICAgIENLTVk6IENvbG9yTW9kZWwuQ01ZSyxcbiAgICBITFM6IENvbG9yTW9kZWwuSFNMLFxuICAgIExBQjogQ29sb3JNb2RlbC5DSUVMYWJcbn0pO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1BUSU9OUyA9IE9iamVjdC5mcmVlemUoe1xuICAgIGRlY2ltYWxzOiBNQVhfREVDSU1BTFMsXG4gICAgbGVnYWN5Q1NTOiBmYWxzZSxcbiAgICBzcGFjZXNBZnRlckNvbW1hczogZmFsc2UsXG4gICAgYW5nbGVzVW5pdDogQW5nbGVzVW5pdEVudW0uTk9ORSxcbiAgICByZ2JVbml0OiBDb2xvclVuaXRFbnVtLk5PTkUsXG4gICAgbGFiVW5pdDogQ29sb3JVbml0RW51bS5OT05FLFxuICAgIGxjaFVuaXQ6IENvbG9yVW5pdEVudW0uTk9ORSxcbiAgICBjbXlrVW5pdDogQ29sb3JVbml0RW51bS5QRVJDRU5ULFxuICAgIGFscGhhVW5pdDogQ29sb3JVbml0RW51bS5OT05FLFxuICAgIGNteWtGdW5jdGlvbjogQ01ZS0Z1bmN0aW9uRW51bS5ERVZJQ0VfQ01ZS1xufSk7XG5leHBvcnQgY29uc3QgRVJST1JTID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgTk9UX0FDQ0VQVEVEX0lOUFVUOiBgVGhlIHByb3ZpZGVkIHN0cmluZyBjb2xvciBkb2Vzbid0IGhhdmUgYSBjb3JyZWN0IGZvcm1hdGAsXG4gICAgTk9UX0FfVkFMSURfUkVMQVRJVkVfQ09MT1I6ICdpcyBub3QgYSB2YWxpZCBvcGVyYXRpb24gZm9yIGEgcmVsYXRpdmUgY29sb3InXG59KTtcbmV4cG9ydCAqIGZyb20gJy4vcmVnZXhwcyc7XG5leHBvcnQgKiBmcm9tICcuL2VudW1zJztcbiIsImltcG9ydCB7IEFuZ2xlc1VuaXRFbnVtLCBCQVNFXzI1NSwgQ29sb3JNb2RlbCwgQ29sb3JLZXl3b3JkcywgR1JBRElBTlMsIEhhcm1vbnksIEhFWCwgSFNMX0hVRSwgTUFYX0FMUEhBLCBNQVhfREVDSU1BTFMsIE1BWF9IVUUsIE1BWF9MQUIsIE1BWF9MQ0hfQywgTWl4LCBQQ0VOVCwgVkFMSURfQ09MT1JfT0JKRUNUUyB9IGZyb20gJyNjb25zdGFudHMnO1xuZXhwb3J0IGNvbnN0IGdldE9yZGVyZWRBcnJheVN0cmluZyA9IChrZXlzKSA9PiBbLi4ua2V5c10uc29ydCgpLmpvaW4oJycpLnRvVXBwZXJDYXNlKCk7XG5leHBvcnQgY29uc3QgaXNTdHJpbmcgPSAoaW5wdXQpID0+IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XG5leHBvcnQgY29uc3QgaXNOdW1iZXIgPSAoaW5wdXQpID0+IHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcic7XG5leHBvcnQgY29uc3QgaXNCb29sZWFuID0gKGlucHV0KSA9PiB0eXBlb2YgaW5wdXQgPT09ICdib29sZWFuJztcbmV4cG9ydCBjb25zdCBpc1VuZGVmaW5lZCA9IChpbnB1dCkgPT4gaW5wdXQgPT09IHVuZGVmaW5lZDtcbmV4cG9ydCBjb25zdCBnZXRDb2xvck1vZGVsID0gKGNvbG9yKSA9PiB7XG4gICAgcmV0dXJuIFZBTElEX0NPTE9SX09CSkVDVFNbZ2V0T3JkZXJlZEFycmF5U3RyaW5nKE9iamVjdC5rZXlzKGNvbG9yKSldO1xufTtcbmV4cG9ydCBjb25zdCBpc1JHQk9iamVjdCA9IChjb2xvcikgPT4gZ2V0Q29sb3JNb2RlbChjb2xvcikgPT09IENvbG9yTW9kZWwuUkdCO1xuZXhwb3J0IGNvbnN0IGlzSFNMT2JqZWN0ID0gKGNvbG9yKSA9PiBnZXRDb2xvck1vZGVsKGNvbG9yKSA9PT0gQ29sb3JNb2RlbC5IU0w7XG5leHBvcnQgY29uc3QgaXNIV0JPYmplY3QgPSAoY29sb3IpID0+IGdldENvbG9yTW9kZWwoY29sb3IpID09PSBDb2xvck1vZGVsLkhXQjtcbmV4cG9ydCBjb25zdCBpc0NJRUxhYk9iamVjdCA9IChjb2xvcikgPT4gZ2V0Q29sb3JNb2RlbChjb2xvcikgPT09IENvbG9yTW9kZWwuQ0lFTGFiO1xuZXhwb3J0IGNvbnN0IGlzTENIT2JqZWN0ID0gKGNvbG9yKSA9PiBnZXRDb2xvck1vZGVsKGNvbG9yKSA9PT0gQ29sb3JNb2RlbC5MQ0g7XG5leHBvcnQgY29uc3QgaXNDTVlLT2JqZWN0ID0gKGNvbG9yKSA9PiBnZXRDb2xvck1vZGVsKGNvbG9yKSA9PT0gQ29sb3JNb2RlbC5DTVlLO1xuZXhwb3J0IGNvbnN0IGlzQ29sb3JLZXl3b3JkID0gKGNvbG9yKSA9PiBjb2xvciBpbiBDb2xvcktleXdvcmRzO1xuZXhwb3J0IGNvbnN0IGlzSGFybW9ueSA9IChwYXJhbSkgPT4ge1xuICAgIHJldHVybiAhIXBhcmFtICYmIGAke3BhcmFtfWAgaW4gSGFybW9ueTtcbn07XG5leHBvcnQgY29uc3QgaXNNaXggPSAocGFyYW0pID0+IHtcbiAgICByZXR1cm4gISFwYXJhbSAmJiBgJHtwYXJhbX1gIGluIE1peDtcbn07XG5leHBvcnQgY29uc3QgcGVyY2VudE51bWJlciA9IChwZXJjZW50KSA9PiB7XG4gICAgcmV0dXJuICtgJHtwZXJjZW50fWAucmVwbGFjZShQQ0VOVCwgJyQxJyk7XG59O1xuZXhwb3J0IGNvbnN0IHBlcmNlbnQgPSAocGVyY2VudCkgPT4gUENFTlQudGVzdChgJHtwZXJjZW50fWApXG4gICAgPyBwZXJjZW50TnVtYmVyKHBlcmNlbnQpXG4gICAgOiBNYXRoLm1pbigrcGVyY2VudCwgMTAwKTtcbmV4cG9ydCBjb25zdCBnZXRERUMgPSAoaGV4KSA9PiB7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaGV4ICs9IGhleDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KGhleCwgMTYpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRIRVggPSAobnVtYmVyKSA9PiB7XG4gICAgY29uc3QgaGV4ID0gcm91bmQobnVtYmVyLCAwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYDB4MCR7aGV4fWA7XG4gICAgfVxuICAgIHJldHVybiBgMHgke2hleH1gO1xufTtcbmV4cG9ydCBjb25zdCB0b0hFWCA9IChoKSA9PiB7XG4gICAgbGV0IGhleCA9IHJvdW5kKGgsIDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGhleCA9IGAwJHtoZXh9YDtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbn07XG5leHBvcnQgY29uc3QgZnJvbTI1NU51bWJlclRvUGVyY2VudCA9ICh2YWx1ZSwgZGVjaW1hbHMpID0+IHJvdW5kKHZhbHVlIC8gQkFTRV8yNTUgKiAxMDAsIGRlY2ltYWxzKTtcbmV4cG9ydCBjb25zdCBmcm9tMTI1TnVtYmVyVG9QZXJjZW50ID0gKHZhbHVlLCBkZWNpbWFscykgPT4gcm91bmQodmFsdWUgLyBNQVhfTEFCICogMTAwLCBkZWNpbWFscyk7XG5leHBvcnQgY29uc3QgZnJvbTE1ME51bWJlclRvUGVyY2VudCA9ICh2YWx1ZSwgZGVjaW1hbHMpID0+IHJvdW5kKHZhbHVlIC8gTUFYX0xDSF9DICogMTAwLCBkZWNpbWFscyk7XG5leHBvcnQgY29uc3QgZ2V0QmFzZTI1NU51bWJlciA9IChjb2xvciwgYWxwaGEgPSBmYWxzZSkgPT4ge1xuICAgIGlmICghYWxwaGEgJiYgUENFTlQudGVzdChjb2xvcikpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKEJBU0VfMjU1ICogcGVyY2VudE51bWJlcihjb2xvcikgLyAxMDAsIEJBU0VfMjU1KTtcbiAgICB9XG4gICAgaWYgKEhFWC50ZXN0KGNvbG9yKSkge1xuICAgICAgICBpZiAoY29sb3IubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBjb2xvciArPSBjb2xvci5zbGljZSgtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFscGhhXG4gICAgICAgICAgICA/IHJvdW5kKGNvbG9yKSAvIEJBU0VfMjU1XG4gICAgICAgICAgICA6IHJvdW5kKGNvbG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKCtjb2xvciwgYWxwaGEgPyAxIDogQkFTRV8yNTUpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRCYXNlMTI1TnVtYmVyID0gKGNvbG9yKSA9PiB7XG4gICAgaWYgKFBDRU5ULnRlc3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiBtaW5tYXgoTUFYX0xBQiAqIHBlcmNlbnROdW1iZXIoY29sb3IpIC8gMTAwLCAtTUFYX0xBQiwgTUFYX0xBQik7XG4gICAgfVxuICAgIHJldHVybiBtaW5tYXgoK2NvbG9yLCAtTUFYX0xBQiwgTUFYX0xBQik7XG59O1xuZXhwb3J0IGNvbnN0IGdldEJhc2UxNTBOdW1iZXIgPSAoY29sb3IpID0+IHtcbiAgICBpZiAoUENFTlQudGVzdChjb2xvcikpIHtcbiAgICAgICAgcmV0dXJuIG1pbm1heChNQVhfTENIX0MgKiBwZXJjZW50TnVtYmVyKGNvbG9yKSAvIDEwMCwgLU1BWF9MQ0hfQywgTUFYX0xDSF9DKTtcbiAgICB9XG4gICAgcmV0dXJuIG1pbm1heCgrY29sb3IsIC1NQVhfTENIX0MsIE1BWF9MQ0hfQyk7XG59O1xuZXhwb3J0IGNvbnN0IGdldENNWUtOdW1iZXIgPSAoY29sb3IsIGJhc2UxMDApID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IFBDRU5ULnRlc3QoY29sb3IpXG4gICAgICAgID8gcGVyY2VudE51bWJlcihjb2xvcilcbiAgICAgICAgOiArY29sb3I7XG4gICAgaWYgKGJhc2UxMDApIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlICogMTAwLCAxMDApO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4odmFsdWUsIDEwMCk7XG59O1xuZXhwb3J0IGNvbnN0IHJvdW5kID0gKHZhbHVlLCBkZWNpbWFscyA9IE1BWF9ERUNJTUFMUykgPT4ge1xuICAgIGNvbnN0IGV4cCA9IE1hdGgucG93KDEwLCBkZWNpbWFscyk7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoK3ZhbHVlICogZXhwKSAvIGV4cDtcbn07XG5leHBvcnQgY29uc3QgbWlubWF4ID0gKG4sIG1pbiwgbWF4KSA9PiBNYXRoLm1heChtaW4sIE1hdGgubWluKG4sIG1heCkpO1xuZXhwb3J0IGNvbnN0IGRlZ3JlZXMgPSAocmFkaWFuKSA9PiByYWRpYW4gKiAxODAgLyBNYXRoLlBJO1xuZXhwb3J0IGNvbnN0IHJhZGlhbnMgPSAoZGVncmVlcykgPT4gZGVncmVlcyAqIE1hdGguUEkgLyAxODA7XG5leHBvcnQgY29uc3Qgbm9ybWFsaXplSHVlID0gKGh1ZSkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhodWUpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBodWUubWF0Y2goSFNMX0hVRSk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IG1hdGNoZXMuZ3JvdXBzO1xuICAgICAgICBjb25zdCB2YWx1ZSA9ICtncm91cHMubnVtYmVyO1xuICAgICAgICBjb25zdCB1bml0cyA9IGdyb3Vwcy51bml0cztcbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSBBbmdsZXNVbml0RW51bS5SQURJQU5TOlxuICAgICAgICAgICAgICAgIGh1ZSA9IHJvdW5kKGRlZ3JlZXModmFsdWUpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQW5nbGVzVW5pdEVudW0uVFVSTlM6XG4gICAgICAgICAgICAgICAgaHVlID0gcm91bmQodmFsdWUgKiBNQVhfSFVFKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQW5nbGVzVW5pdEVudW0uR1JBRElBTlM6XG4gICAgICAgICAgICAgICAgaHVlID0gcm91bmQoOSAvIDEwICogdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBbmdsZXNVbml0RW51bS5ERUdSRUVTOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBodWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHVlID49IE1BWF9IVUUgfHwgaHVlIDwgMCkge1xuICAgICAgICBodWUgLT0gTWF0aC5mbG9vcihodWUgLyBNQVhfSFVFKSAqIE1BWF9IVUU7XG4gICAgfVxuICAgIHJldHVybiBodWU7XG59O1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUFscGhhID0gKGFscGhhKSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKGFscGhhKSkge1xuICAgICAgICBpZiAoUENFTlQudGVzdChhbHBoYSkpIHtcbiAgICAgICAgICAgIGFscGhhID0gcGVyY2VudE51bWJlcihhbHBoYSkgLyAxMDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhbHBoYSA9ICthbHBoYTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhbHBoYU51bWJlciA9IE51bWJlcihhbHBoYSk7XG4gICAgcmV0dXJuIChpc05hTihhbHBoYU51bWJlcikgfHwgYWxwaGFOdW1iZXIgPiBNQVhfQUxQSEEpID8gTUFYX0FMUEhBIDogcm91bmQoYWxwaGFOdW1iZXIpO1xufTtcbmV4cG9ydCBjb25zdCB0cmFuc2xhdGVEZWdyZWVzID0gKGRlZ3JlZXMsIHVuaXRzKSA9PiB7XG4gICAgbGV0IGh1ZTtcbiAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgIGNhc2UgQW5nbGVzVW5pdEVudW0uUkFESUFOUzpcbiAgICAgICAgICAgIGh1ZSA9IHJvdW5kKHJhZGlhbnMoZGVncmVlcykpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5nbGVzVW5pdEVudW0uVFVSTlM6XG4gICAgICAgICAgICBodWUgPSByb3VuZChkZWdyZWVzIC8gTUFYX0hVRSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBbmdsZXNVbml0RW51bS5HUkFESUFOUzpcbiAgICAgICAgICAgIGh1ZSA9IHJvdW5kKEdSQURJQU5TICogZGVncmVlcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBbmdsZXNVbml0RW51bS5ERUdSRUVTOlxuICAgICAgICBjYXNlIEFuZ2xlc1VuaXRFbnVtLk5PTkU6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBodWUgPSBkZWdyZWVzO1xuICAgIH1cbiAgICByZXR1cm4gaHVlO1xufTtcbmV4cG9ydCBjb25zdCBnZXRBbmdsZVVuaXQgPSAodW5pdCkgPT4ge1xuICAgIGlmICh1bml0KSB7XG4gICAgICAgIGNvbnN0IGFuZ2xlVW5pdE1hdGNoID0gdW5pdC5tYXRjaChIU0xfSFVFKTtcbiAgICAgICAgY29uc3QgYW5nbGVVbml0ID0gYW5nbGVVbml0TWF0Y2guZ3JvdXBzLnVuaXRzO1xuICAgICAgICByZXR1cm4gYW5nbGVVbml0ID09PSAnJ1xuICAgICAgICAgICAgPyBBbmdsZXNVbml0RW51bS5OT05FXG4gICAgICAgICAgICA6IGFuZ2xlVW5pdDtcbiAgICB9XG4gICAgcmV0dXJuIEFuZ2xlc1VuaXRFbnVtLk5PTkU7XG59O1xuIiwiaW1wb3J0IHsgQkFTRV8yNTUsIE1BWF9BTFBIQSB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgZGVncmVlcywgbWlubWF4LCBub3JtYWxpemVIdWUsIHJhZGlhbnMsIHJvdW5kIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5jb25zdCBNQVRSSVhfTFJHQl9YWVpfRDUwID0gW1xuICAgIFswLjQzNjA3NDcsIDAuMzg1MDY0OSwgMC4xNDMwODA0XSxcbiAgICBbMC4yMjI1MDQ1LCAwLjcxNjg3ODYsIDAuMDYwNjE2OV0sXG4gICAgWzAuMDEzOTMyMiwgMC4wOTcxMDQ1LCAwLjcxNDE3MzNdXG5dO1xuY29uc3QgTUFUUklYX1hZWl9ENTBfTFJHQiA9IFtcbiAgICBbMy4xMzM4NTYxLCAtMS42MTY4NjY3LCAtMC40OTA2MTQ2XSxcbiAgICBbLTAuOTc4NzY4NCwgMS45MTYxNDE1LCAwLjAzMzQ1NF0sXG4gICAgWzAuMDcxOTQ1MywgLTAuMjI4OTkxNCwgMS40MDUyNDI3XVxuXTtcbmNvbnN0IFRSSVNUSU1VTFVTX0Q1MCA9IE1BVFJJWF9MUkdCX1hZWl9ENTAubWFwKChtYXRyaXgpID0+IHtcbiAgICByZXR1cm4gbWF0cml4LnJlZHVjZSgoc3VtLCB2YWx1ZSkgPT4gc3VtICsgdmFsdWUsIDApO1xufSk7XG5jb25zdCBodWVUb1JnYiA9ICh0MSwgdDIsIGh1ZSkgPT4ge1xuICAgIGlmIChodWUgPCAwKSB7XG4gICAgICAgIGh1ZSArPSA2O1xuICAgIH1cbiAgICBpZiAoaHVlID49IDYpIHtcbiAgICAgICAgaHVlIC09IDY7XG4gICAgfVxuICAgIGlmIChodWUgPCAxKSB7XG4gICAgICAgIHJldHVybiByb3VuZCgoKHQyIC0gdDEpICogaHVlICsgdDEpICogQkFTRV8yNTUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChodWUgPCAzKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0MiAqIEJBU0VfMjU1KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaHVlIDwgNCkge1xuICAgICAgICByZXR1cm4gcm91bmQoKCh0MiAtIHQxKSAqICg0IC0gaHVlKSArIHQxKSAqIEJBU0VfMjU1KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0MSAqIEJBU0VfMjU1KTtcbiAgICB9XG59O1xuY29uc3QgcmdiVG9MaW5lYXJMaWdodFJnYiA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSA8PSAwLjA0MDQ1XG4gICAgICAgID8gdmFsdWUgLyAxMi45MlxuICAgICAgICA6ICgodmFsdWUgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40O1xufTtcbmNvbnN0IGxpbmVhckxpZ2h0UmdiVG9SZ2IgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgPD0gMC4wMDMxMzA4XG4gICAgICAgID8gMTIuOTIgKiB2YWx1ZVxuICAgICAgICA6IDEuMDU1ICogKHZhbHVlICoqICgxIC8gMi40KSkgLSAwLjA1NTtcbn07XG5jb25zdCBtYXRyaXhWZWN0b3JNdWx0aXBsaWNhdGlvbiA9ICh2MSwgdjIsIHYzLCBtYXRyaXgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbMCwgMCwgMF07XG4gICAgY29uc3QgbGluZWFyUmdiID0gW3YxLCB2MiwgdjNdO1xuICAgIG1hdHJpeC5mb3JFYWNoKChhcnJheSwgaW5kZXgpID0+IHtcbiAgICAgICAgYXJyYXkuZm9yRWFjaCgodmFsdWUsIG1pbmRleCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSArPSB2YWx1ZSAqIGxpbmVhclJnYlttaW5kZXhdO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmNvbnN0IGZyb21fQ0lFX1hZWl9ENTBfdG9fQ0lFX0xBQiA9ICh4LCB5LCB6KSA9PiB7XG4gICAgY29uc3QgZiA9ICh0KSA9PiB7XG4gICAgICAgIHJldHVybiB0ID4gKDYgLyAyOSkgKiogM1xuICAgICAgICAgICAgPyBNYXRoLmNicnQodClcbiAgICAgICAgICAgIDogdCAvICgzICogKDYgLyAyOSkgKiogMikgKyAoNCAvIDI5KTtcbiAgICB9O1xuICAgIGNvbnN0IGZ4ID0gZih4IC8gVFJJU1RJTVVMVVNfRDUwWzBdKTtcbiAgICBjb25zdCBmeSA9IGYoeSAvIFRSSVNUSU1VTFVTX0Q1MFsxXSk7XG4gICAgY29uc3QgZnogPSBmKHogLyBUUklTVElNVUxVU19ENTBbMl0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIDExNiAqIGZ5IC0gMTYsXG4gICAgICAgIDUwMCAqIChmeCAtIGZ5KSxcbiAgICAgICAgMjAwICogKGZ5IC0gZnopXG4gICAgXTtcbn07XG5jb25zdCBmcm9tX0NJRV9MQUJfdG9fQ0lFX1hZWl9ENTAgPSAoTCwgYSwgYikgPT4ge1xuICAgIGNvbnN0IGYgPSAodCkgPT4ge1xuICAgICAgICByZXR1cm4gdCA+IDYgLyAyOVxuICAgICAgICAgICAgPyB0ICoqIDNcbiAgICAgICAgICAgIDogMyAqICg2IC8gMjkpICoqIDIgKiAodCAtIDQgLyAyOSk7XG4gICAgfTtcbiAgICBjb25zdCBmbCA9IChMICsgMTYpIC8gMTE2O1xuICAgIGNvbnN0IGZhID0gYSAvIDUwMDtcbiAgICBjb25zdCBmYiA9IGIgLyAyMDA7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgVFJJU1RJTVVMVVNfRDUwWzBdICogZihmbCArIGZhKSxcbiAgICAgICAgVFJJU1RJTVVMVVNfRDUwWzFdICogZihmbCksXG4gICAgICAgIFRSSVNUSU1VTFVTX0Q1MFsyXSAqIGYoZmwgLSBmYilcbiAgICBdO1xufTtcbmV4cG9ydCBjb25zdCBoc2xUb1JnYiA9IChILCBTLCBMKSA9PiB7XG4gICAgSCAvPSA2MDtcbiAgICBTIC89IDEwMDtcbiAgICBMIC89IDEwMDtcbiAgICBjb25zdCB0MiA9IChMIDw9IC41KVxuICAgICAgICA/IEwgKiAoUyArIDEpXG4gICAgICAgIDogTCArIFMgLSAoTCAqIFMpO1xuICAgIGNvbnN0IHQxID0gTCAqIDIgLSB0MjtcbiAgICBjb25zdCBSID0gaHVlVG9SZ2IodDEsIHQyLCBIICsgMik7XG4gICAgY29uc3QgRyA9IGh1ZVRvUmdiKHQxLCB0MiwgSCk7XG4gICAgY29uc3QgQiA9IGh1ZVRvUmdiKHQxLCB0MiwgSCAtIDIpO1xuICAgIHJldHVybiB7IFIsIEcsIEIgfTtcbn07XG5leHBvcnQgY29uc3QgcmdiVG9Ic2wgPSAoUiwgRywgQiwgQSA9IDEpID0+IHtcbiAgICBSIC89IEJBU0VfMjU1O1xuICAgIEcgLz0gQkFTRV8yNTU7XG4gICAgQiAvPSBCQVNFXzI1NTtcbiAgICBBID0gTWF0aC5taW4oQSwgTUFYX0FMUEhBKTtcbiAgICBjb25zdCBNQVggPSBNYXRoLm1heChSLCBHLCBCKTtcbiAgICBjb25zdCBNSU4gPSBNYXRoLm1pbihSLCBHLCBCKTtcbiAgICBjb25zdCBEID0gTUFYIC0gTUlOO1xuICAgIGxldCBIID0gMDtcbiAgICBsZXQgUyA9IDA7XG4gICAgY29uc3QgTCA9IChNQVggKyBNSU4pIC8gMjtcbiAgICBpZiAoRCAhPT0gMCkge1xuICAgICAgICBzd2l0Y2ggKE1BWCkge1xuICAgICAgICAgICAgY2FzZSBSOlxuICAgICAgICAgICAgICAgIEggPSAoKEcgLSBCKSAvIEQpICUgNjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRzpcbiAgICAgICAgICAgICAgICBIID0gKEIgLSBSKSAvIEQgKyAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBCOlxuICAgICAgICAgICAgICAgIEggPSAoUiAtIEcpIC8gRCArIDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgSCA9IHJvdW5kKEggKiA2MCk7XG4gICAgICAgIGlmIChIIDwgMCkge1xuICAgICAgICAgICAgSCArPSAzNjA7XG4gICAgICAgIH1cbiAgICAgICAgUyA9IEQgLyAoMSAtIE1hdGguYWJzKDIgKiBMIC0gMSkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBILFxuICAgICAgICBTOiByb3VuZChTICogMTAwKSxcbiAgICAgICAgTDogcm91bmQoTCAqIDEwMCksXG4gICAgICAgIEFcbiAgICB9O1xufTtcbmV4cG9ydCBjb25zdCByZ2JUb0xhYiA9IChSLCBHLCBCKSA9PiB7XG4gICAgY29uc3QgTElORUFSX0xJR0hUX1JHQiA9IFtcbiAgICAgICAgUiAvIEJBU0VfMjU1LFxuICAgICAgICBHIC8gQkFTRV8yNTUsXG4gICAgICAgIEIgLyBCQVNFXzI1NVxuICAgIF0ubWFwKHJnYlRvTGluZWFyTGlnaHRSZ2IpO1xuICAgIGNvbnN0IENJRV9YWVpfRDUwID0gbWF0cml4VmVjdG9yTXVsdGlwbGljYXRpb24oTElORUFSX0xJR0hUX1JHQlswXSwgTElORUFSX0xJR0hUX1JHQlsxXSwgTElORUFSX0xJR0hUX1JHQlsyXSwgTUFUUklYX0xSR0JfWFlaX0Q1MCk7XG4gICAgY29uc3QgQ0lFX0xBQiA9IGZyb21fQ0lFX1hZWl9ENTBfdG9fQ0lFX0xBQihDSUVfWFlaX0Q1MFswXSwgQ0lFX1hZWl9ENTBbMV0sIENJRV9YWVpfRDUwWzJdKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBMOiBDSUVfTEFCWzBdLFxuICAgICAgICBhOiBDSUVfTEFCWzFdLFxuICAgICAgICBiOiBDSUVfTEFCWzJdXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgbGFiVG9SZ2IgPSAoTCwgYSwgYikgPT4ge1xuICAgIGNvbnN0IENJRV9YWVpfRDUwID0gZnJvbV9DSUVfTEFCX3RvX0NJRV9YWVpfRDUwKEwsIGEsIGIpO1xuICAgIGNvbnN0IExJTkVBUl9MSUdIVF9SR0IgPSBtYXRyaXhWZWN0b3JNdWx0aXBsaWNhdGlvbihDSUVfWFlaX0Q1MFswXSwgQ0lFX1hZWl9ENTBbMV0sIENJRV9YWVpfRDUwWzJdLCBNQVRSSVhfWFlaX0Q1MF9MUkdCKTtcbiAgICBjb25zdCByZ2IgPSBMSU5FQVJfTElHSFRfUkdCLm1hcChsaW5lYXJMaWdodFJnYlRvUmdiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBSOiBtaW5tYXgocmdiWzBdICogQkFTRV8yNTUsIDAsIEJBU0VfMjU1KSxcbiAgICAgICAgRzogbWlubWF4KHJnYlsxXSAqIEJBU0VfMjU1LCAwLCBCQVNFXzI1NSksXG4gICAgICAgIEI6IG1pbm1heChyZ2JbMl0gKiBCQVNFXzI1NSwgMCwgQkFTRV8yNTUpXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgbGFiVG9MY2ggPSAoTCwgYSwgYikgPT4ge1xuICAgIGNvbnN0IEMgPSBNYXRoLnNxcnQoYSAqKiAyICsgYiAqKiAyKTtcbiAgICBjb25zdCBIID0gZGVncmVlcyhNYXRoLmF0YW4yKGIsIGEpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBMLFxuICAgICAgICBDLFxuICAgICAgICBIOiBub3JtYWxpemVIdWUoSClcbiAgICB9O1xufTtcbmV4cG9ydCBjb25zdCBsY2hUb0xhYiA9IChMLCBDLCBIKSA9PiB7XG4gICAgY29uc3QgcmFkSCA9IHJhZGlhbnMoSCk7XG4gICAgY29uc3QgYSA9IEMgKiBNYXRoLmNvcyhyYWRIKTtcbiAgICBjb25zdCBiID0gQyAqIE1hdGguc2luKHJhZEgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIEwsXG4gICAgICAgIGEsXG4gICAgICAgIGJcbiAgICB9O1xufTtcbmV4cG9ydCBjb25zdCByZ2JUb0xjaCA9IChSLCBHLCBCKSA9PiB7XG4gICAgY29uc3QgbGFiID0gcmdiVG9MYWIoUiwgRywgQik7XG4gICAgcmV0dXJuIGxhYlRvTGNoKGxhYi5MLCBsYWIuYSwgbGFiLmIpO1xufTtcbmV4cG9ydCBjb25zdCBsY2hUb1JnYiA9IChMLCBDLCBIKSA9PiB7XG4gICAgY29uc3QgbGFiID0gbGNoVG9MYWIoTCwgQywgSCk7XG4gICAgcmV0dXJuIGxhYlRvUmdiKGxhYi5MLCBsYWIuYSwgbGFiLmIpO1xufTtcbmV4cG9ydCBjb25zdCByZ2JUb0h3YiA9IChSLCBHLCBCLCBBID0gMSkgPT4ge1xuICAgIGNvbnN0IGhzbCA9IHJnYlRvSHNsKFIsIEcsIEIsIEEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIEg6IGhzbC5ILFxuICAgICAgICBXOiByb3VuZChNYXRoLm1pbihSLCBHLCBCKSAvIEJBU0VfMjU1ICogMTAwKSxcbiAgICAgICAgQjogcm91bmQoKDEgLSBNYXRoLm1heChSLCBHLCBCKSAvIEJBU0VfMjU1KSAqIDEwMCksXG4gICAgICAgIEFcbiAgICB9O1xufTtcbmV4cG9ydCBjb25zdCBod2JUb1JnYiA9IChILCBXLCBCKSA9PiB7XG4gICAgVyAvPSAxMDA7XG4gICAgQiAvPSAxMDA7XG4gICAgY29uc3QgdiA9IDEgLSBCO1xuICAgIGNvbnN0IGMgPSB2IC0gVztcbiAgICBjb25zdCB4ID0gYyAqICgxIC0gTWF0aC5hYnMoKEggLyA2MCkgJSAyIC0gMSkpO1xuICAgIGxldCByZ2JSO1xuICAgIGxldCByZ2JHO1xuICAgIGxldCByZ2JCO1xuICAgIGlmIChIIDwgNjApIHtcbiAgICAgICAgcmdiUiA9IGM7XG4gICAgICAgIHJnYkcgPSB4O1xuICAgICAgICByZ2JCID0gMDtcbiAgICB9XG4gICAgZWxzZSBpZiAoSCA+PSA2MCAmJiBIIDwgMTIwKSB7XG4gICAgICAgIHJnYlIgPSB4O1xuICAgICAgICByZ2JHID0gYztcbiAgICAgICAgcmdiQiA9IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKEggPj0gMTIwICYmIEggPCAxODApIHtcbiAgICAgICAgcmdiUiA9IDA7XG4gICAgICAgIHJnYkcgPSBjO1xuICAgICAgICByZ2JCID0geDtcbiAgICB9XG4gICAgZWxzZSBpZiAoSCA+PSAxODAgJiYgSCA8IDI0MCkge1xuICAgICAgICByZ2JSID0gMDtcbiAgICAgICAgcmdiRyA9IHg7XG4gICAgICAgIHJnYkIgPSBjO1xuICAgIH1cbiAgICBlbHNlIGlmIChIID49IDI0MCAmJiBIIDwgMzAwKSB7XG4gICAgICAgIHJnYlIgPSB4O1xuICAgICAgICByZ2JHID0gMDtcbiAgICAgICAgcmdiQiA9IGM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZ2JSID0gYztcbiAgICAgICAgcmdiRyA9IDA7XG4gICAgICAgIHJnYkIgPSB4O1xuICAgIH1cbiAgICByZ2JSICs9IFc7XG4gICAgcmdiRyArPSBXO1xuICAgIHJnYkIgKz0gVztcbiAgICByZXR1cm4ge1xuICAgICAgICBSOiBtaW5tYXgocmdiUiAqIEJBU0VfMjU1LCAwLCBCQVNFXzI1NSksXG4gICAgICAgIEc6IG1pbm1heChyZ2JHICogQkFTRV8yNTUsIDAsIEJBU0VfMjU1KSxcbiAgICAgICAgQjogbWlubWF4KHJnYkIgKiBCQVNFXzI1NSwgMCwgQkFTRV8yNTUpXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgY215a1RvUmdiID0gKEMsIE0sIFksIEspID0+IHtcbiAgICBLID0gMSAtIEs7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgUjogbWlubWF4KHJvdW5kKEJBU0VfMjU1ICogKDEgLSBDKSAqIEspLCAwLCBCQVNFXzI1NSksXG4gICAgICAgIEc6IG1pbm1heChyb3VuZChCQVNFXzI1NSAqICgxIC0gTSkgKiBLKSwgMCwgQkFTRV8yNTUpLFxuICAgICAgICBCOiBtaW5tYXgocm91bmQoQkFTRV8yNTUgKiAoMSAtIFkpICogSyksIDAsIEJBU0VfMjU1KVxuICAgIH07XG59O1xuZXhwb3J0IGNvbnN0IHJnYlRvQ215ayA9IChSLCBHLCBCKSA9PiB7XG4gICAgUiAvPSBCQVNFXzI1NTtcbiAgICBHIC89IEJBU0VfMjU1O1xuICAgIEIgLz0gQkFTRV8yNTU7XG4gICAgY29uc3QgSyA9IDEgLSBNYXRoLm1heChSLCBHLCBCKTtcbiAgICBjb25zdCBLMSA9IDEgLSBLO1xuICAgIGNvbnN0IEMgPSBLMSAmJiAoSzEgLSBSKSAvIEsxO1xuICAgIGNvbnN0IE0gPSBLMSAmJiAoSzEgLSBHKSAvIEsxO1xuICAgIGNvbnN0IFkgPSBLMSAmJiAoSzEgLSBCKSAvIEsxO1xuICAgIHJldHVybiB7XG4gICAgICAgIEM6IHJvdW5kKEMgKiAxMDApLFxuICAgICAgICBNOiByb3VuZChNICogMTAwKSxcbiAgICAgICAgWTogcm91bmQoWSAqIDEwMCksXG4gICAgICAgIEs6IHJvdW5kKEsgKiAxMDApXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgcmdiVG9SeWIgPSAoUiwgRywgQikgPT4ge1xuICAgIGNvbnN0IEl3ID0gTWF0aC5taW4oUiwgRywgQik7XG4gICAgY29uc3QgSWIgPSBNYXRoLm1pbihCQVNFXzI1NSAtIFIsIEJBU0VfMjU1IC0gRywgQkFTRV8yNTUgLSBCKTtcbiAgICBjb25zdCByUmdiID0gUiAtIEl3O1xuICAgIGNvbnN0IGdSZ2IgPSBHIC0gSXc7XG4gICAgY29uc3QgYlJnYiA9IEIgLSBJdztcbiAgICBjb25zdCBtaW5SZyA9IE1hdGgubWluKHJSZ2IsIGdSZ2IpO1xuICAgIGNvbnN0IHJSeWIgPSByUmdiIC0gbWluUmc7XG4gICAgY29uc3QgeVJ5YiA9IChnUmdiICsgbWluUmcpIC8gMjtcbiAgICBjb25zdCBiUnliID0gKGJSZ2IgKyBnUmdiIC0gbWluUmcpIC8gMjtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoclJ5YiwgeVJ5YiwgYlJ5YikgLyBNYXRoLm1heChyUmdiLCBnUmdiLCBiUmdiKTtcbiAgICBjb25zdCBOID0gaXNOYU4obikgfHwgbiA9PT0gSW5maW5pdHkgfHwgbiA8PSAwID8gMSA6IG47XG4gICAgcmV0dXJuIHtcbiAgICAgICAgUjogclJ5YiAvIE4gKyBJYixcbiAgICAgICAgWTogeVJ5YiAvIE4gKyBJYixcbiAgICAgICAgQjogYlJ5YiAvIE4gKyBJYlxuICAgIH07XG59O1xuZXhwb3J0IGNvbnN0IHJ5YlRvUmdiID0gKFIsIFksIEIpID0+IHtcbiAgICBjb25zdCBJdyA9IE1hdGgubWluKFIsIFksIEIpO1xuICAgIGNvbnN0IEliID0gTWF0aC5taW4oQkFTRV8yNTUgLSBSLCBCQVNFXzI1NSAtIFksIEJBU0VfMjU1IC0gQik7XG4gICAgY29uc3QgclJ5YiA9IFIgLSBJdztcbiAgICBjb25zdCB5UnliID0gWSAtIEl3O1xuICAgIGNvbnN0IGJSeWIgPSBCIC0gSXc7XG4gICAgY29uc3QgbWluWWIgPSBNYXRoLm1pbih5UnliLCBiUnliKTtcbiAgICBjb25zdCByUmdiID0gclJ5YiArIHlSeWIgLSBtaW5ZYjtcbiAgICBjb25zdCBnUmdiID0geVJ5YiArIG1pblliO1xuICAgIGNvbnN0IGJSZ2IgPSAyICogKGJSeWIgLSBtaW5ZYik7XG4gICAgY29uc3QgbiA9IE1hdGgubWF4KHJSZ2IsIGdSZ2IsIGJSZ2IpIC8gTWF0aC5tYXgoclJ5YiwgeVJ5YiwgYlJ5Yik7XG4gICAgY29uc3QgTiA9IGlzTmFOKG4pIHx8IG4gPT09IEluZmluaXR5IHx8IG4gPD0gMCA/IDEgOiBuO1xuICAgIHJldHVybiB7XG4gICAgICAgIFI6IHJSZ2IgLyBOICsgSWIsXG4gICAgICAgIEc6IGdSZ2IgLyBOICsgSWIsXG4gICAgICAgIEI6IGJSZ2IgLyBOICsgSWJcbiAgICB9O1xufTtcbmV4cG9ydCBjb25zdCBodWVSeWIgPSAoaHVlLCB0b1J5YikgPT4ge1xuICAgIGlmIChodWUgPCAwKVxuICAgICAgICBodWUgKz0gMzYwO1xuICAgIGlmIChodWUgPiAzNjApXG4gICAgICAgIGh1ZSAtPSAzNjA7XG4gICAgaWYgKGh1ZSA9PT0gMzYwIHx8IGh1ZSA9PT0gMClcbiAgICAgICAgcmV0dXJuIGh1ZTtcbiAgICBjb25zdCBtYXAxID0gW1xuICAgICAgICBbMCwgMTIwXSxcbiAgICAgICAgWzEyMCwgMTgwXSxcbiAgICAgICAgWzE4MCwgMjQwXSxcbiAgICAgICAgWzI0MCwgMzYwXVxuICAgIF07XG4gICAgY29uc3QgbWFwMiA9IFtcbiAgICAgICAgWzAsIDYwXSxcbiAgICAgICAgWzYwLCAxMjBdLFxuICAgICAgICBbMTIwLCAyNDBdLFxuICAgICAgICBbMjQwLCAzNjBdXG4gICAgXTtcbiAgICBjb25zdCBmcm9tID0gdG9SeWIgPyBtYXAxIDogbWFwMjtcbiAgICBjb25zdCB0byA9IHRvUnliID8gbWFwMiA6IG1hcDE7XG4gICAgbGV0IEEgPSAwO1xuICAgIGxldCBCID0gMDtcbiAgICBsZXQgQyA9IDA7XG4gICAgbGV0IEQgPSAwO1xuICAgIGZyb20uZmluZCgoYXJyLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoaHVlID49IGFyclswXSAmJiBodWUgPCBhcnJbMV0pIHtcbiAgICAgICAgICAgIEEgPSBhcnJbMF07XG4gICAgICAgICAgICBCID0gYXJyWzFdO1xuICAgICAgICAgICAgQyA9IHRvW2luZGV4XVswXTtcbiAgICAgICAgICAgIEQgPSB0b1tpbmRleF1bMV07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuIEMgKyAoaHVlIC0gQSkgKiAoKEQgLSBDKSAvIChCIC0gQSkpO1xufTtcbiIsImltcG9ydCB7IERFRkFVTFRfT1BUSU9OUywgRVJST1JTIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc1N0cmluZywgaXNVbmRlZmluZWQgfSBmcm9tICcjdXRpbGl0aWVzJztcbmV4cG9ydCBjbGFzcyBDb2xvclBhcnNlckNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlcnMpIHtcbiAgICAgICAgdGhpcy5fcGFyc2VycyA9IHBhcnNlcnM7XG4gICAgfVxuICAgIGdldFBhcnNlcihpbnB1dCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnNlciBvZiB0aGlzLl9wYXJzZXJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VyLnN1cHBvcnRzKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SUy5OT1RfQUNDRVBURURfSU5QVVQpO1xuICAgIH1cbiAgICBwYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSB0aGlzLmdldFBhcnNlcihpbnB1dCk7XG4gICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5wdXQsIHRoaXMpO1xuICAgIH1cbiAgICBjb252ZXJ0KGlucHV0LCBtb2RlbCwgZGVjaW1hbHMgPSBERUZBVUxUX09QVElPTlMuZGVjaW1hbHMsIHdpdGhBbHBoYSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5wYXJzZShpbnB1dCk7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMuX3BhcnNlcnMuZ2V0KG1vZGVsKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlci5jb252ZXJ0KGNvbG9yLCBkZWNpbWFscywgd2l0aEFscGhhKTtcbiAgICB9XG4gICAgY29udmVydENTUyhpbnB1dCwgbW9kZWwsIG9wdGlvbnMgPSB7fSwgd2l0aEFscGhhID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLnBhcnNlKGlucHV0KTtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5fcGFyc2Vycy5nZXQobW9kZWwpO1xuICAgICAgICByZXR1cm4gcGFyc2VyLmNvbnZlcnRDU1MoY29sb3IsIG9wdGlvbnMsIHdpdGhBbHBoYSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbG9yUGFyc2VyIHtcbiAgICBoYXNBbHBoYShpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDU1NPcHRpb25zKGlucHV0KS5oYXNBbHBoYTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWlzVW5kZWZpbmVkKGlucHV0LkEpO1xuICAgIH1cbiAgICA7XG59XG4iLCJpbXBvcnQgeyBjbXlrVG9SZ2IsIGhzbFRvUmdiLCBod2JUb1JnYiwgbGFiVG9SZ2IsIGxjaFRvUmdiIH0gZnJvbSAnI2NvbG9yL3RyYW5zbGF0b3JzJztcbmltcG9ydCB7IGlzQ0lFTGFiT2JqZWN0LCBpc0NNWUtPYmplY3QsIGlzSFNMT2JqZWN0LCBpc0hXQk9iamVjdCwgaXNMQ0hPYmplY3QsIGlzVW5kZWZpbmVkIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5leHBvcnQgY29uc3QgZ2V0UkdCID0gKGNvbG9yKSA9PiB7XG4gICAgY29uc3QgYWxwaGEgPSBpc1VuZGVmaW5lZChjb2xvci5BKVxuICAgICAgICA/IHt9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgQTogK2NvbG9yLkFcbiAgICAgICAgfTtcbiAgICBpZiAoaXNIU0xPYmplY3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5oc2xUb1JnYihjb2xvci5ILCBjb2xvci5TLCBjb2xvci5MKSxcbiAgICAgICAgICAgIC4uLmFscGhhXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0hXQk9iamVjdChjb2xvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmh3YlRvUmdiKGNvbG9yLkgsIGNvbG9yLlcsIGNvbG9yLkIpLFxuICAgICAgICAgICAgLi4uYWxwaGFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGlzQ0lFTGFiT2JqZWN0KGNvbG9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ubGFiVG9SZ2IoY29sb3IuTCwgY29sb3IuYSwgY29sb3IuYiksXG4gICAgICAgICAgICAuLi5hbHBoYVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoaXNMQ0hPYmplY3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5sY2hUb1JnYihjb2xvci5MLCBjb2xvci5DLCBjb2xvci5IKSxcbiAgICAgICAgICAgIC4uLmFscGhhXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0NNWUtPYmplY3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jbXlrVG9SZ2IoY29sb3IuQywgY29sb3IuTSwgY29sb3IuWSwgY29sb3IuSyksXG4gICAgICAgICAgICAuLi5hbHBoYVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG59O1xuIiwiaW1wb3J0IHsgQW5nbGVzVW5pdEVudW0sIENPTE9SX1BST1BTLCBDT01NQSwgQ29sb3JVbml0RW51bSwgVEVNUExBVEVfVkFSLCBWQUxJRF9DT0xPUl9PQkpFQ1RTIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRPcmRlcmVkQXJyYXlTdHJpbmcsIGlzVW5kZWZpbmVkLCByb3VuZCwgdHJhbnNsYXRlRGVncmVlcyB9IGZyb20gJyN1dGlsaXRpZXMnO1xuZXhwb3J0IGNvbnN0IGdldENTU0NvbW1hID0gKHdpdGhTcGFjZSkgPT4gd2l0aFNwYWNlXG4gICAgPyBgJHtDT01NQX0gYFxuICAgIDogQ09NTUE7XG5leHBvcnQgY29uc3QgcHJlcGFyZUNvbG9yRm9yQ3NzID0gKGNvbG9yLCB0cmFuc2Zvcm1lcikgPT4ge1xuICAgIGNvbnN0IHByb3BzID0gZ2V0T3JkZXJlZEFycmF5U3RyaW5nKE9iamVjdC5rZXlzKGNvbG9yKSk7XG4gICAgY29uc3QgbW9kZWwgPSBWQUxJRF9DT0xPUl9PQkpFQ1RTW3Byb3BzXTtcbiAgICBjb25zdCBrZXlzID0gQ09MT1JfUFJPUFNbbW9kZWxdO1xuICAgIHJldHVybiBrZXlzLnJlZHVjZSgocmVzdWx0LCBrZXksIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29sb3Jba2V5XTtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRyYW5zZm9ybWVyKHZhbHVlLCBpbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgW10pO1xufTtcbmV4cG9ydCBjb25zdCBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUgPSAodGVtcGxhdGUsIHZhcnMpID0+IHtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShURU1QTEFURV9WQVIsIChfX21hdGNoLCBpbmRleFN0cikgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9ICtpbmRleFN0ciAtIDE7XG4gICAgICAgIHJldHVybiBgJHt2YXJzW2luZGV4XX1gO1xuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCBnZXRDU1NBbHBoYSA9ICh2YWx1ZSwgb3B0aW9ucywgaWdub3JlTGVnYWN5ID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCB7IGFscGhhVW5pdCwgbGVnYWN5Q1NTLCBkZWNpbWFscyB9ID0gb3B0aW9ucztcbiAgICBpZiAoYWxwaGFVbml0ID09PSBDb2xvclVuaXRFbnVtLlBFUkNFTlQgJiZcbiAgICAgICAgKCFsZWdhY3lDU1MgfHxcbiAgICAgICAgICAgIGlnbm9yZUxlZ2FjeSkpIHtcbiAgICAgICAgcmV0dXJuIGAke3JvdW5kKHZhbHVlICogMTAwLCBkZWNpbWFscyl9JWA7XG4gICAgfVxuICAgIHJldHVybiByb3VuZCh2YWx1ZSwgZGVjaW1hbHMpO1xufTtcbmV4cG9ydCBjb25zdCBidWlsZENTU0h1ZVRyYW5zZm9ybWVyID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IGFuZ2xlc1VuaXQsIGRlY2ltYWxzIH0gPSBvcHRpb25zO1xuICAgIHJldHVybiAodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCAmJlxuICAgICAgICAgICAgYW5nbGVzVW5pdCAhPT0gQW5nbGVzVW5pdEVudW0uTk9ORSkge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHJvdW5kKHRyYW5zbGF0ZURlZ3JlZXMoK3ZhbHVlLCBhbmdsZXNVbml0KSwgZGVjaW1hbHMpO1xuICAgICAgICAgICAgcmV0dXJuIGAke3RyYW5zbGF0ZWR9JHthbmdsZXNVbml0fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4ID09PSAzXG4gICAgICAgICAgICA/IGdldENTU0FscGhhKCt2YWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgIDogcm91bmQodmFsdWUsIGRlY2ltYWxzKTtcbiAgICB9O1xufTtcbiIsImltcG9ydCB7IEJBU0VfMjU1LCBDb2xvcktleXdvcmRzLCBDb2xvck1vZGVsLCBDT0xPUlJFR1MsIEhFWCB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0UkdCIH0gZnJvbSAnI2NvbG9yL3JnYic7XG5pbXBvcnQgeyBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUsIHByZXBhcmVDb2xvckZvckNzcyB9IGZyb20gJyNjc3MnO1xuaW1wb3J0IHsgZ2V0REVDLCBnZXRIRVgsIGdldEJhc2UyNTVOdW1iZXIsIGlzQ29sb3JLZXl3b3JkLCBpc1N0cmluZywgaXNVbmRlZmluZWQsIGlzUkdCT2JqZWN0LCByb3VuZCwgdG9IRVggfSBmcm9tICcjdXRpbGl0aWVzJztcbmltcG9ydCB7IENvbG9yUGFyc2VyIH0gZnJvbSAnLi9Db2xvclBhcnNlckNvbnRleHQnO1xuZXhwb3J0IGNsYXNzIEhFWFBhcnNlciBleHRlbmRzIENvbG9yUGFyc2VyIHtcbiAgICBfZXh0cmFjdChpbnB1dCkge1xuICAgICAgICBjb25zdCBjb2xvclN0ciA9IGlzQ29sb3JLZXl3b3JkKGlucHV0KVxuICAgICAgICAgICAgPyBDb2xvcktleXdvcmRzW2lucHV0XVxuICAgICAgICAgICAgOiBpbnB1dDtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBjb2xvclN0ci5tYXRjaChDT0xPUlJFR1MuSEVYKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwcztcbiAgICB9XG4gICAgc3VwcG9ydHMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIChDT0xPUlJFR1MuSEVYLnRlc3QoaW5wdXQpIHx8XG4gICAgICAgICAgICAgICAgaXNDb2xvcktleXdvcmQoaW5wdXQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoYXNJbnZhbGlkSGV4ID0gT2JqZWN0LmVudHJpZXMoaW5wdXQpLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhSEVYLnRlc3QoYCR7aXRlbVsxXX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpc1JHQk9iamVjdChpbnB1dCkgJiYgIWhhc0ludmFsaWRIZXg7XG4gICAgfVxuICAgIHBhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgciA9IGdyb3Vwcy5yID8/IGdyb3Vwcy5ycjtcbiAgICAgICAgICAgIGNvbnN0IGcgPSBncm91cHMuZyA/PyBncm91cHMuZ2c7XG4gICAgICAgICAgICBjb25zdCBiID0gZ3JvdXBzLmIgPz8gZ3JvdXBzLmJiO1xuICAgICAgICAgICAgY29uc3QgYSA9IGdyb3Vwcy5hID8/IGdyb3Vwcy5hYTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgUjogZ2V0REVDKHIpLFxuICAgICAgICAgICAgICAgIEc6IGdldERFQyhnKSxcbiAgICAgICAgICAgICAgICBCOiBnZXRERUMoYiksXG4gICAgICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGEpXG4gICAgICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBBOiBnZXRERUMoYSkgLyBCQVNFXzI1NVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgUjogZ2V0QmFzZTI1NU51bWJlcihgJHtpbnB1dC5SfWApLFxuICAgICAgICAgICAgRzogZ2V0QmFzZTI1NU51bWJlcihgJHtpbnB1dC5HfWApLFxuICAgICAgICAgICAgQjogZ2V0QmFzZTI1NU51bWJlcihgJHtpbnB1dC5CfWApLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGlucHV0LkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiBNYXRoLm1pbihnZXRCYXNlMjU1TnVtYmVyKGAke2lucHV0LkF9YCwgdHJ1ZSksIDEpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29udmVydChjb2xvciwgX19kZWNpbWFscywgd2l0aEFscGhhKSB7XG4gICAgICAgIGNvbnN0IHJnYiA9IGlzUkdCT2JqZWN0KGNvbG9yKVxuICAgICAgICAgICAgPyBjb2xvclxuICAgICAgICAgICAgOiBnZXRSR0IoY29sb3IpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgUjogZ2V0SEVYKHJnYi5SKSxcbiAgICAgICAgICAgIEc6IGdldEhFWChyZ2IuRyksXG4gICAgICAgICAgICBCOiBnZXRIRVgocmdiLkIpLFxuICAgICAgICAgICAgLi4uKHdpdGhBbHBoYVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBBOiBpc1VuZGVmaW5lZChyZ2IuQSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJzB4RkYnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGdldEhFWChyZ2IuQSAqIEJBU0VfMjU1KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb252ZXJ0Q1NTKGNvbG9yLCBvcHRpb25zLCB3aXRoQWxwaGEpIHtcbiAgICAgICAgY29uc3QgcmdiID0gdGhpcy5jb252ZXJ0KGNvbG9yLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9ICh2YWx1ZSkgPT4gdG9IRVgocm91bmQodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcHJlcGFyZUNvbG9yRm9yQ3NzKHJnYiwgdHJhbnNmb3JtZXIpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgID8gJyN7MX17Mn17M317NH0nXG4gICAgICAgICAgICA6ICcjezF9ezJ9ezN9JztcbiAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWVzKTtcbiAgICB9XG4gICAgZ2V0Q1NTT3B0aW9ucyhpbnB1dCkge1xuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLl9leHRyYWN0KGlucHV0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhhc0FscGhhOiAhaXNVbmRlZmluZWQoZ3JvdXBzLmEgPz8gZ3JvdXBzLmFhKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1vZGVsLkhFWDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDQUxDLCBFUlJPUlMgfSBmcm9tICcjY29uc3RhbnRzJztcbmNvbnN0IE1BWF9TVEFDSyA9IDEwMDtcbmV4cG9ydCBjbGFzcyBDYWxjUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb2xvckluZGV4LCBjYWxjLCB2YXJzKSB7XG4gICAgICAgIHRoaXMuX29wZXJhdGlvbnMgPSBuZXcgTWFwKFtcbiAgICAgICAgICAgIFtDQUxDLkRJVklTSU9OLCB0aGlzLl9kaXZpc2lvbl0sXG4gICAgICAgICAgICBbQ0FMQy5NVUxUSVBMSUNBVElPTiwgdGhpcy5fbXVsdGlwbGljYXRpb25dLFxuICAgICAgICAgICAgW0NBTEMuU1VNLCB0aGlzLl9zdW1dLFxuICAgICAgICAgICAgW0NBTEMuUkVTVCwgdGhpcy5fcmVzdF1cbiAgICAgICAgXSk7XG4gICAgICAgIHRoaXMuX2NvbG9ySW5kZXggPSBjb2xvckluZGV4O1xuICAgICAgICBsZXQgY2FsY1N0cmluZyA9IGNhbGM7XG4gICAgICAgIGxldCBzdGFjayA9IDA7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKCtjYWxjKSkge1xuICAgICAgICAgICAgdGhpcy5fcmVzdWx0ID0gK2NhbGM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2FsYyBpbiB2YXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHQgPSB2YXJzW2NhbGNdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENBTEMuUkVHRVhQLnRlc3QoY2FsY1N0cmluZykpIHtcbiAgICAgICAgICAgIENBTEMuUkVHRVhQLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bHQgPSB0aGlzLl9nZXRDYWxjVmFsdWUoY2FsY1N0cmluZywgdmFycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAoQ0FMQy5TQ09QRUQudGVzdChjYWxjU3RyaW5nKSAmJiBzdGFjayA8IE1BWF9TVEFDSykge1xuICAgICAgICAgICAgICAgIENBTEMuU0NPUEVELmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgY2FsY1N0cmluZyA9IGNhbGNTdHJpbmcucmVwbGFjZShDQUxDLlNDT1BFRCwgKF9fbWF0Y2gsIG9wZXJhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlKG9wZXJhdGlvbiwgdmFycykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoQ0FMQy5SRUdFWFAudGVzdChjYWxjU3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICBDQUxDLlJFR0VYUC5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhY2srKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdCA9IHRoaXMuX2dldENhbGNWYWx1ZShjYWxjU3RyaW5nLCB2YXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZGl2aXNpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGxlZnQgLyByaWdodDtcbiAgICB9XG4gICAgX211bHRpcGxpY2F0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBsZWZ0ICogcmlnaHQ7XG4gICAgfVxuICAgIF9zdW0obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGxlZnQgKyByaWdodDtcbiAgICB9XG4gICAgX3Jlc3QobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodDtcbiAgICB9XG4gICAgX2dldENhbGNWYWx1ZShjYWxjLCB2YXJzKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gY2FsYy5tYXRjaChDQUxDLlJFR0VYUCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IG1hdGNoLmdyb3Vwcy5vcGVyYXRpb247XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fY2FsY3VsYXRlKG9wZXJhdGlvbiwgdmFycyk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgZm9yICR7dGhpcy5fY29sb3JJbmRleH0uICR7b3BlcmF0aW9ufSAke0VSUk9SUy5OT1RfQV9WQUxJRF9SRUxBVElWRV9DT0xPUn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIF9jYWxjdWxhdGUob3BlcmF0aW9uLCB2YXJzKSB7XG4gICAgICAgIHRoaXMuX29wZXJhdGlvbnMuZm9yRWFjaCgobWV0aG9kLCByZWdFeHApID0+IHtcbiAgICAgICAgICAgIGxldCBzdGFjayA9IDA7XG4gICAgICAgICAgICB3aGlsZSAocmVnRXhwLnRlc3Qob3BlcmF0aW9uKSAmJiBzdGFjayA8IE1BWF9TVEFDSykge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IG9wZXJhdGlvbi5yZXBsYWNlKHJlZ0V4cCwgKF9fbWF0Y2gsIGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QodmFyc1tsZWZ0XSA/PyArbGVmdCwgdmFyc1tyaWdodF0gPz8gK3JpZ2h0KS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YWNrKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gK29wZXJhdGlvbjtcbiAgICB9XG4gICAgZ2V0IHJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCQVNFXzI1NSwgQ09MT1JSRUdTLCBDb2xvck1vZGVsLCBDb2xvclVuaXRFbnVtLCBIRVgsIFBDRU5UIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBmcm9tMjU1TnVtYmVyVG9QZXJjZW50LCBnZXRCYXNlMjU1TnVtYmVyLCBpc1N0cmluZywgaXNSR0JPYmplY3QsIGlzVW5kZWZpbmVkLCBub3JtYWxpemVBbHBoYSwgcm91bmQgfSBmcm9tICcjdXRpbGl0aWVzJztcbmltcG9ydCB7IGdldENTU0FscGhhLCBnZXRDU1NDb21tYSwgZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlLCBwcmVwYXJlQ29sb3JGb3JDc3MgfSBmcm9tICcjY3NzJztcbmltcG9ydCB7IGdldFJHQiB9IGZyb20gJyNjb2xvci9yZ2InO1xuaW1wb3J0IHsgQ2FsY1BhcnNlciB9IGZyb20gJy4vQ2FsY1BhcnNlcic7XG5pbXBvcnQgeyBDb2xvclBhcnNlciB9IGZyb20gJy4vQ29sb3JQYXJzZXJDb250ZXh0JztcbmV4cG9ydCBjbGFzcyBSR0JQYXJzZXIgZXh0ZW5kcyBDb2xvclBhcnNlciB7XG4gICAgX2V4dHJhY3QoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaChDT0xPUlJFR1MuUkdCKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwcztcbiAgICB9XG4gICAgc3VwcG9ydHMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIENPTE9SUkVHUy5SR0IudGVzdChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzSW52YWxpZFJlZ2IgPSBPYmplY3QuZW50cmllcyhpbnB1dCkuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEoUENFTlQudGVzdChgJHtpdGVtWzFdfWApIHx8XG4gICAgICAgICAgICAgICAgKCFIRVgudGVzdChgJHtpdGVtWzFdfWApICYmXG4gICAgICAgICAgICAgICAgICAgICFpc05hTigraXRlbVsxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgK2l0ZW1bMV0gPD0gQkFTRV8yNTUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpc1JHQk9iamVjdChpbnB1dCkgJiYgIWhhc0ludmFsaWRSZWdiO1xuICAgIH1cbiAgICBwYXJzZShpbnB1dCwgY29udGV4dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLl9leHRyYWN0KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IHsgcl9sZWdhY3ksIGdfbGVnYWN5LCBiX2xlZ2FjeSwgYV9sZWdhY3ksIHIsIGcsIGIsIGEsIGZyb20sIHJlbGF0aXZlX3IsIHJlbGF0aXZlX2csIHJlbGF0aXZlX2IsIHJlbGF0aXZlX2EgfSA9IGdyb3VwcztcbiAgICAgICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUNvbG9yID0gY29udGV4dC5wYXJzZShmcm9tKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tUkdCID0gZ2V0UkdCKGZyb21Db2xvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVJHQlZhcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHI6IGZyb21SR0IuUixcbiAgICAgICAgICAgICAgICAgICAgZzogZnJvbVJHQi5HLFxuICAgICAgICAgICAgICAgICAgICBiOiBmcm9tUkdCLkIsXG4gICAgICAgICAgICAgICAgICAgIGFscGhhOiBmcm9tUkdCLkEgPz8gMVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgUiA9IG5ldyBDYWxjUGFyc2VyKCdyJywgcmVsYXRpdmVfciwgZnJvbVJHQlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBHID0gbmV3IENhbGNQYXJzZXIoJ2cnLCByZWxhdGl2ZV9nLCBmcm9tUkdCVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IEIgPSBuZXcgQ2FsY1BhcnNlcignYicsIHJlbGF0aXZlX2IsIGZyb21SR0JWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcmdiID0ge1xuICAgICAgICAgICAgICAgICAgICBSOiBNYXRoLm1pbihSLCBCQVNFXzI1NSksXG4gICAgICAgICAgICAgICAgICAgIEc6IE1hdGgubWluKEcsIEJBU0VfMjU1KSxcbiAgICAgICAgICAgICAgICAgICAgQjogTWF0aC5taW4oQiwgQkFTRV8yNTUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmVfYSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBBID0gbmV3IENhbGNQYXJzZXIoJ2FscGhhJywgcmVsYXRpdmVfYSwgZnJvbVJHQlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgcmdiLkEgPSBNYXRoLm1pbihBLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJnYjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFIgPSByX2xlZ2FjeSA/PyByO1xuICAgICAgICAgICAgICAgIGNvbnN0IEcgPSBnX2xlZ2FjeSA/PyBnO1xuICAgICAgICAgICAgICAgIGNvbnN0IEIgPSBiX2xlZ2FjeSA/PyBiO1xuICAgICAgICAgICAgICAgIGNvbnN0IEEgPSBhX2xlZ2FjeSA/PyBhO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIFI6IE1hdGgubWluKGdldEJhc2UyNTVOdW1iZXIoUiksIEJBU0VfMjU1KSxcbiAgICAgICAgICAgICAgICAgICAgRzogTWF0aC5taW4oZ2V0QmFzZTI1NU51bWJlcihHKSwgQkFTRV8yNTUpLFxuICAgICAgICAgICAgICAgICAgICBCOiBNYXRoLm1pbihnZXRCYXNlMjU1TnVtYmVyKEIpLCBCQVNFXzI1NSksXG4gICAgICAgICAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChBKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTogbm9ybWFsaXplQWxwaGEoQSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgUjogZ2V0QmFzZTI1NU51bWJlcihgJHtpbnB1dC5SfWApLFxuICAgICAgICAgICAgRzogZ2V0QmFzZTI1NU51bWJlcihgJHtpbnB1dC5HfWApLFxuICAgICAgICAgICAgQjogZ2V0QmFzZTI1NU51bWJlcihgJHtpbnB1dC5CfWApLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGlucHV0LkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiBNYXRoLm1pbihnZXRCYXNlMjU1TnVtYmVyKGAke2lucHV0LkF9YCwgdHJ1ZSksIDEpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29udmVydChjb2xvciwgZGVjaW1hbHMsIHdpdGhBbHBoYSkge1xuICAgICAgICBjb25zdCByZ2IgPSBpc1JHQk9iamVjdChjb2xvcilcbiAgICAgICAgICAgID8gY29sb3JcbiAgICAgICAgICAgIDogZ2V0UkdCKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdW5kUkdCT2JqZWN0KHtcbiAgICAgICAgICAgIFI6IHJnYi5SLFxuICAgICAgICAgICAgRzogcmdiLkcsXG4gICAgICAgICAgICBCOiByZ2IuQixcbiAgICAgICAgICAgIC4uLih3aXRoQWxwaGFcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgQTogcmdiLkEgPz8gMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KVxuICAgICAgICB9LCBkZWNpbWFscyk7XG4gICAgfVxuICAgIGNvbnZlcnRDU1MoY29sb3IsIG9wdGlvbnMsIHdpdGhBbHBoYSkge1xuICAgICAgICBjb25zdCB7IGRlY2ltYWxzLCBsZWdhY3lDU1MsIHNwYWNlc0FmdGVyQ29tbWFzLCByZ2JVbml0IH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCByZ2IgPSB0aGlzLmNvbnZlcnQoY29sb3IsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgICAgIGNvbnN0IGNvbW1hID0gZ2V0Q1NTQ29tbWEoc3BhY2VzQWZ0ZXJDb21tYXMpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9ICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZ2JVbml0ID09PSBDb2xvclVuaXRFbnVtLlBFUkNFTlQgJiYgaW5kZXggPCAzXG4gICAgICAgICAgICAgICAgPyBgJHtmcm9tMjU1TnVtYmVyVG9QZXJjZW50KCt2YWx1ZSwgZGVjaW1hbHMpfSVgXG4gICAgICAgICAgICAgICAgOiAoaW5kZXggPT09IDNcbiAgICAgICAgICAgICAgICAgICAgPyBnZXRDU1NBbHBoYSgrdmFsdWUsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIDogcm91bmQodmFsdWUsIGRlY2ltYWxzKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHByZXBhcmVDb2xvckZvckNzcyhyZ2IsIHRyYW5zZm9ybWVyKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBsZWdhY3lDU1NcbiAgICAgICAgICAgID8gKHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgICAgICA/IGByZ2JhKHsxfSR7Y29tbWF9ezJ9JHtjb21tYX17M30ke2NvbW1hfXs0fSlgXG4gICAgICAgICAgICAgICAgOiBgcmdiKHsxfSR7Y29tbWF9ezJ9JHtjb21tYX17M30pYClcbiAgICAgICAgICAgIDogKHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgICAgICA/IGByZ2IoezF9IHsyfSB7M30gLyB7NH0pYFxuICAgICAgICAgICAgICAgIDogYHJnYih7MX0gezJ9IHszfSlgKTtcbiAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWVzKTtcbiAgICB9XG4gICAgX3JvdW5kUkdCT2JqZWN0KGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICBjb25zdCBSID0gcm91bmQoY29sb3IuUiwgZGVjaW1hbHMpO1xuICAgICAgICBjb25zdCBHID0gcm91bmQoY29sb3IuRywgZGVjaW1hbHMpO1xuICAgICAgICBjb25zdCBCID0gcm91bmQoY29sb3IuQiwgZGVjaW1hbHMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgUixcbiAgICAgICAgICAgIEcsXG4gICAgICAgICAgICBCLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGNvbG9yLkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiByb3VuZChjb2xvci5BLCBkZWNpbWFscylcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRDU1NPcHRpb25zKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICBjb25zdCB7IHJfbGVnYWN5LCBnX2xlZ2FjeSwgYl9sZWdhY3ksIGFfbGVnYWN5LCByLCBnLCBiLCBhIH0gPSBncm91cHM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlVmFsdWVzOiAoUENFTlQudGVzdChyX2xlZ2FjeSA/PyByKSAmJlxuICAgICAgICAgICAgICAgIFBDRU5ULnRlc3QoZ19sZWdhY3kgPz8gZykgJiZcbiAgICAgICAgICAgICAgICBQQ0VOVC50ZXN0KGJfbGVnYWN5ID8/IGIpKSxcbiAgICAgICAgICAgIGhhc1BlcmNlbnRhZ2VBbHBoYTogKCFpc1VuZGVmaW5lZChhX2xlZ2FjeSkgJiYgUENFTlQudGVzdChhX2xlZ2FjeSkgfHxcbiAgICAgICAgICAgICAgICAhaXNVbmRlZmluZWQoYSkgJiYgUENFTlQudGVzdChhKSksXG4gICAgICAgICAgICBoYXNBbHBoYTogIWlzVW5kZWZpbmVkKGFfbGVnYWN5ID8/IGEpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yTW9kZWwuUkdCO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTE9SUkVHUywgQ29sb3JNb2RlbCwgTUFYX0FMUEhBLCBQQ0VOVCB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0QW5nbGVVbml0LCBpc0hTTE9iamVjdCwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLCBtaW5tYXgsIG5vcm1hbGl6ZUFscGhhLCBub3JtYWxpemVIdWUsIHBlcmNlbnQsIHJvdW5kIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5pbXBvcnQgeyBidWlsZENTU0h1ZVRyYW5zZm9ybWVyLCBnZXRDU1NDb21tYSwgZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlLCBwcmVwYXJlQ29sb3JGb3JDc3MgfSBmcm9tICcjY3NzJztcbmltcG9ydCB7IGdldFJHQiB9IGZyb20gJyNjb2xvci9yZ2InO1xuaW1wb3J0IHsgcmdiVG9Ic2wgfSBmcm9tICcjY29sb3IvdHJhbnNsYXRvcnMnO1xuaW1wb3J0IHsgQ2FsY1BhcnNlciB9IGZyb20gJy4vQ2FsY1BhcnNlcic7XG5pbXBvcnQgeyBDb2xvclBhcnNlciB9IGZyb20gJy4vQ29sb3JQYXJzZXJDb250ZXh0JztcbmV4cG9ydCBjbGFzcyBIU0xQYXJzZXIgZXh0ZW5kcyBDb2xvclBhcnNlciB7XG4gICAgX2V4dHJhY3QoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaChDT0xPUlJFR1MuSFNMKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwcztcbiAgICB9XG4gICAgc3VwcG9ydHMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIENPTE9SUkVHUy5IU0wudGVzdChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzSFNMT2JqZWN0KGlucHV0KTtcbiAgICB9XG4gICAgcGFyc2UoaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCB7IGhfbGVnYWN5LCBzX2xlZ2FjeSwgbF9sZWdhY3ksIGFfbGVnYWN5LCBoLCBzLCBsLCBhLCBmcm9tLCByZWxhdGl2ZV9oLCByZWxhdGl2ZV9zLCByZWxhdGl2ZV9sLCByZWxhdGl2ZV9hIH0gPSBncm91cHM7XG4gICAgICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Db2xvciA9IGNvbnRleHQucGFyc2UoZnJvbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVJHQiA9IGdldFJHQihmcm9tQ29sb3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21IU0wgPSByZ2JUb0hzbChmcm9tUkdCLlIsIGZyb21SR0IuRywgZnJvbVJHQi5CLCBmcm9tUkdCLkEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21IU0xWYXJzID0ge1xuICAgICAgICAgICAgICAgICAgICBoOiBmcm9tSFNMLkgsXG4gICAgICAgICAgICAgICAgICAgIHM6IGZyb21IU0wuUyxcbiAgICAgICAgICAgICAgICAgICAgbDogZnJvbUhTTC5MLFxuICAgICAgICAgICAgICAgICAgICBhbHBoYTogZnJvbUhTTC5BXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBIID0gbmV3IENhbGNQYXJzZXIoJ2gnLCByZWxhdGl2ZV9oLCBmcm9tSFNMVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IFMgPSBuZXcgQ2FsY1BhcnNlcigncycsIHJlbGF0aXZlX3MsIGZyb21IU0xWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgTCA9IG5ldyBDYWxjUGFyc2VyKCdsJywgcmVsYXRpdmVfbCwgZnJvbUhTTFZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBoc2wgPSB7XG4gICAgICAgICAgICAgICAgICAgIEg6IG5vcm1hbGl6ZUh1ZShIKSxcbiAgICAgICAgICAgICAgICAgICAgUzogcGVyY2VudChTKSxcbiAgICAgICAgICAgICAgICAgICAgTDogcGVyY2VudChMKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgQSA9IG5ldyBDYWxjUGFyc2VyKCdhbHBoYScsIHJlbGF0aXZlX2EsIGZyb21IU0xWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGhzbC5BID0gbWlubWF4KEEsIDAsIE1BWF9BTFBIQSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBoc2w7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBIID0gaF9sZWdhY3kgPz8gaDtcbiAgICAgICAgICAgICAgICBjb25zdCBTID0gc19sZWdhY3kgPz8gcztcbiAgICAgICAgICAgICAgICBjb25zdCBMID0gbF9sZWdhY3kgPz8gbDtcbiAgICAgICAgICAgICAgICBjb25zdCBBID0gYV9sZWdhY3kgPz8gYTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBIOiBub3JtYWxpemVIdWUoSCksXG4gICAgICAgICAgICAgICAgICAgIFM6IHBlcmNlbnQoUyksXG4gICAgICAgICAgICAgICAgICAgIEw6IHBlcmNlbnQoTCksXG4gICAgICAgICAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChBKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTogbm9ybWFsaXplQWxwaGEoQSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgSDogbm9ybWFsaXplSHVlKGlucHV0LkgpLFxuICAgICAgICAgICAgUzogcGVyY2VudChgJHtpbnB1dC5TfWApLFxuICAgICAgICAgICAgTDogcGVyY2VudChgJHtpbnB1dC5MfWApLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGlucHV0LkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiBtaW5tYXgoK2lucHV0LkEsIDAsIE1BWF9BTFBIQSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb252ZXJ0KGNvbG9yLCBkZWNpbWFscywgd2l0aEFscGhhKSB7XG4gICAgICAgIGxldCBoc2w7XG4gICAgICAgIGlmIChpc0hTTE9iamVjdChjb2xvcikpIHtcbiAgICAgICAgICAgIGhzbCA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmdiID0gZ2V0UkdCKGNvbG9yKTtcbiAgICAgICAgICAgIGhzbCA9IHJnYlRvSHNsKHJnYi5SLCByZ2IuRywgcmdiLkIsIHJnYi5BKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRIU0xPYmplY3Qoe1xuICAgICAgICAgICAgSDogaHNsLkgsXG4gICAgICAgICAgICBTOiBoc2wuUyxcbiAgICAgICAgICAgIEw6IGhzbC5MLFxuICAgICAgICAgICAgLi4uKHdpdGhBbHBoYVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBBOiBoc2wuQSA/PyAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pXG4gICAgICAgIH0sIGRlY2ltYWxzKTtcbiAgICB9XG4gICAgY29udmVydENTUyhjb2xvciwgb3B0aW9ucywgd2l0aEFscGhhKSB7XG4gICAgICAgIGNvbnN0IHsgbGVnYWN5Q1NTLCBzcGFjZXNBZnRlckNvbW1hcyB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgY29tbWEgPSBnZXRDU1NDb21tYShzcGFjZXNBZnRlckNvbW1hcyk7XG4gICAgICAgIGNvbnN0IGhzbCA9IHRoaXMuY29udmVydChjb2xvciwgb3B0aW9ucy5kZWNpbWFscywgd2l0aEFscGhhKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBidWlsZENTU0h1ZVRyYW5zZm9ybWVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MoaHNsLCB0cmFuc2Zvcm1lcik7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gbGVnYWN5Q1NTXG4gICAgICAgICAgICA/ICh2YWx1ZXMubGVuZ3RoID09PSA0XG4gICAgICAgICAgICAgICAgPyBgaHNsYSh7MX0ke2NvbW1hfXsyfSUke2NvbW1hfXszfSUke2NvbW1hfXs0fSlgXG4gICAgICAgICAgICAgICAgOiBgaHNsKHsxfSR7Y29tbWF9ezJ9JSR7Y29tbWF9ezN9JSlgKVxuICAgICAgICAgICAgOiAodmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgICAgID8gYGhzbCh7MX0gezJ9JSB7M30lIC8gezR9KWBcbiAgICAgICAgICAgICAgICA6IGBoc2woezF9IHsyfSUgezN9JSlgKTtcbiAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWVzKTtcbiAgICB9XG4gICAgX3JvdW5kSFNMT2JqZWN0KGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgSDogcm91bmQobm9ybWFsaXplSHVlKGNvbG9yLkgpLCBkZWNpbWFscyksXG4gICAgICAgICAgICBTOiByb3VuZChjb2xvci5TLCBkZWNpbWFscyksXG4gICAgICAgICAgICBMOiByb3VuZChjb2xvci5MLCBkZWNpbWFscyksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoY29sb3IuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IHJvdW5kKGNvbG9yLkEsIGRlY2ltYWxzKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldENTU09wdGlvbnMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgaF9sZWdhY3ksIGgsIGFfbGVnYWN5LCBhIH0gPSBncm91cHM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbmdsZVVuaXQ6IGdldEFuZ2xlVW5pdChoX2xlZ2FjeSA/PyBoKSxcbiAgICAgICAgICAgIGhhc1BlcmNlbnRhZ2VBbHBoYTogKCFpc1VuZGVmaW5lZChhX2xlZ2FjeSkgJiYgUENFTlQudGVzdChhX2xlZ2FjeSkgfHxcbiAgICAgICAgICAgICAgICAhaXNVbmRlZmluZWQoYSkgJiYgUENFTlQudGVzdChhKSksXG4gICAgICAgICAgICBoYXNBbHBoYTogIWlzVW5kZWZpbmVkKGFfbGVnYWN5ID8/IGEpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yTW9kZWwuSFNMO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTE9SUkVHUywgQ29sb3JNb2RlbCwgTUFYX0FMUEhBLCBNQVhfSFVFLCBNQVhfUENFTlQsIFBDRU5UIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRBbmdsZVVuaXQsIGlzSFdCT2JqZWN0LCBpc1N0cmluZywgaXNVbmRlZmluZWQsIG1pbm1heCwgbm9ybWFsaXplQWxwaGEsIG5vcm1hbGl6ZUh1ZSwgcGVyY2VudCwgcm91bmQgfSBmcm9tICcjdXRpbGl0aWVzJztcbmltcG9ydCB7IGJ1aWxkQ1NTSHVlVHJhbnNmb3JtZXIsIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSwgcHJlcGFyZUNvbG9yRm9yQ3NzIH0gZnJvbSAnI2Nzcyc7XG5pbXBvcnQgeyBnZXRSR0IgfSBmcm9tICcjY29sb3IvcmdiJztcbmltcG9ydCB7IHJnYlRvSHdiIH0gZnJvbSAnI2NvbG9yL3RyYW5zbGF0b3JzJztcbmltcG9ydCB7IENhbGNQYXJzZXIgfSBmcm9tICcuL0NhbGNQYXJzZXInO1xuaW1wb3J0IHsgQ29sb3JQYXJzZXIgfSBmcm9tICcuL0NvbG9yUGFyc2VyQ29udGV4dCc7XG5leHBvcnQgY2xhc3MgSFdCUGFyc2VyIGV4dGVuZHMgQ29sb3JQYXJzZXIge1xuICAgIF9leHRyYWN0KGlucHV0KSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goQ09MT1JSRUdTLkhXQik7XG4gICAgICAgIHJldHVybiBtYXRjaC5ncm91cHM7XG4gICAgfVxuICAgIHN1cHBvcnRzKGlucHV0KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBDT0xPUlJFR1MuSFdCLnRlc3QoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0hXQk9iamVjdChpbnB1dCk7XG4gICAgfVxuICAgIHBhcnNlKGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgeyBoLCB3LCBiLCBhLCBmcm9tLCByZWxhdGl2ZV9oLCByZWxhdGl2ZV93LCByZWxhdGl2ZV9iLCByZWxhdGl2ZV9hIH0gPSBncm91cHM7XG4gICAgICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Db2xvciA9IGNvbnRleHQucGFyc2UoZnJvbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVJHQiA9IGdldFJHQihmcm9tQ29sb3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21IV0IgPSByZ2JUb0h3Yihmcm9tUkdCLlIsIGZyb21SR0IuRywgZnJvbVJHQi5CLCBmcm9tUkdCLkEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21IV0JWYXJzID0ge1xuICAgICAgICAgICAgICAgICAgICBoOiBmcm9tSFdCLkgsXG4gICAgICAgICAgICAgICAgICAgIHc6IGZyb21IV0IuVyxcbiAgICAgICAgICAgICAgICAgICAgYjogZnJvbUhXQi5CLFxuICAgICAgICAgICAgICAgICAgICBhbHBoYTogZnJvbUhXQi5BXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBIID0gbmV3IENhbGNQYXJzZXIoJ2gnLCByZWxhdGl2ZV9oLCBmcm9tSFdCVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IFcgPSBuZXcgQ2FsY1BhcnNlcigndycsIHJlbGF0aXZlX3csIGZyb21IV0JWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgQiA9IG5ldyBDYWxjUGFyc2VyKCdiJywgcmVsYXRpdmVfYiwgZnJvbUhXQlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBod2IgPSB7XG4gICAgICAgICAgICAgICAgICAgIEg6IG1pbm1heChILCAwLCBNQVhfSFVFKSxcbiAgICAgICAgICAgICAgICAgICAgVzogbWlubWF4KFcsIDAsIE1BWF9QQ0VOVCksXG4gICAgICAgICAgICAgICAgICAgIEI6IG1pbm1heChCLCAwLCBNQVhfUENFTlQpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmVfYSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBBID0gbmV3IENhbGNQYXJzZXIoJ2FscGhhJywgcmVsYXRpdmVfYSwgZnJvbUhXQlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaHdiLkEgPSBtaW5tYXgoQSwgMCwgTUFYX0FMUEhBKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh3YjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIEg6IG5vcm1hbGl6ZUh1ZShoKSxcbiAgICAgICAgICAgICAgICAgICAgVzogcGVyY2VudCh3KSxcbiAgICAgICAgICAgICAgICAgICAgQjogcGVyY2VudChiKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGEpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOiBub3JtYWxpemVBbHBoYShhKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBIOiBub3JtYWxpemVIdWUoaW5wdXQuSCksXG4gICAgICAgICAgICBXOiBwZXJjZW50KGlucHV0LlcpLFxuICAgICAgICAgICAgQjogcGVyY2VudChpbnB1dC5CKSxcbiAgICAgICAgICAgIC4uLihpc1VuZGVmaW5lZChpbnB1dC5BKVxuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgQTogbm9ybWFsaXplQWxwaGEoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb252ZXJ0KGNvbG9yLCBkZWNpbWFscywgd2l0aEFscGhhKSB7XG4gICAgICAgIGxldCBod2I7XG4gICAgICAgIGlmIChpc0hXQk9iamVjdChjb2xvcikpIHtcbiAgICAgICAgICAgIGh3YiA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmdiID0gZ2V0UkdCKGNvbG9yKTtcbiAgICAgICAgICAgIGh3YiA9IHJnYlRvSHdiKHJnYi5SLCByZ2IuRywgcmdiLkIsIHJnYi5BKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRIV0JPYmplY3Qoe1xuICAgICAgICAgICAgSDogaHdiLkgsXG4gICAgICAgICAgICBXOiBod2IuVyxcbiAgICAgICAgICAgIEI6IGh3Yi5CLFxuICAgICAgICAgICAgLi4uKHdpdGhBbHBoYVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBBOiBod2IuQSA/PyAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pXG4gICAgICAgIH0sIGRlY2ltYWxzKTtcbiAgICB9XG4gICAgY29udmVydENTUyhjb2xvciwgb3B0aW9ucywgd2l0aEFscGhhKSB7XG4gICAgICAgIGNvbnN0IGh3YiA9IHRoaXMuY29udmVydChjb2xvciwgb3B0aW9ucy5kZWNpbWFscywgd2l0aEFscGhhKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBidWlsZENTU0h1ZVRyYW5zZm9ybWVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MoaHdiLCB0cmFuc2Zvcm1lcik7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgPyBgaHdiKHsxfSB7Mn0lIHszfSUgLyB7NH0pYFxuICAgICAgICAgICAgOiBgaHdiKHsxfSB7Mn0lIHszfSUpYDtcbiAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWVzKTtcbiAgICB9XG4gICAgX3JvdW5kSFdCT2JqZWN0KGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgSDogcm91bmQobm9ybWFsaXplSHVlKGNvbG9yLkgpLCBkZWNpbWFscyksXG4gICAgICAgICAgICBXOiByb3VuZChjb2xvci5XLCBkZWNpbWFscyksXG4gICAgICAgICAgICBCOiByb3VuZChjb2xvci5CLCBkZWNpbWFscyksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoY29sb3IuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IHJvdW5kKGNvbG9yLkEsIGRlY2ltYWxzKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldENTU09wdGlvbnMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbmdsZVVuaXQ6IGdldEFuZ2xlVW5pdChncm91cHMuaCksXG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlQWxwaGE6ICFpc1VuZGVmaW5lZChncm91cHMuYSkgJiYgUENFTlQudGVzdChncm91cHMuYSksXG4gICAgICAgICAgICBoYXNBbHBoYTogIWlzVW5kZWZpbmVkKGdyb3Vwcy5hKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1vZGVsLkhXQjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb2xvck1vZGVsLCBDT0xPUlJFR1MsIENvbG9yVW5pdEVudW0sIE1BWF9BTFBIQSwgTUFYX0xBQiwgTUFYX1BDRU5ULCBQQ0VOVCB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgZnJvbTEyNU51bWJlclRvUGVyY2VudCwgZ2V0QmFzZTEyNU51bWJlciwgaXNDSUVMYWJPYmplY3QsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgbWlubWF4LCBub3JtYWxpemVBbHBoYSwgcGVyY2VudCwgcm91bmQgfSBmcm9tICcjdXRpbGl0aWVzJztcbmltcG9ydCB7IGdldENTU0FscGhhLCBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUsIHByZXBhcmVDb2xvckZvckNzcyB9IGZyb20gJyNjc3MnO1xuaW1wb3J0IHsgZ2V0UkdCIH0gZnJvbSAnI2NvbG9yL3JnYic7XG5pbXBvcnQgeyByZ2JUb0xhYiB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBDYWxjUGFyc2VyIH0gZnJvbSAnLi9DYWxjUGFyc2VyJztcbmltcG9ydCB7IENvbG9yUGFyc2VyIH0gZnJvbSAnLi9Db2xvclBhcnNlckNvbnRleHQnO1xuZXhwb3J0IGNsYXNzIENJRUxhYlBhcnNlciBleHRlbmRzIENvbG9yUGFyc2VyIHtcbiAgICBfZXh0cmFjdChpbnB1dCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKENPTE9SUkVHUy5DSUVMYWIpO1xuICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXBzO1xuICAgIH1cbiAgICBzdXBwb3J0cyhpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ09MT1JSRUdTLkNJRUxhYi50ZXN0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNDSUVMYWJPYmplY3QoaW5wdXQpO1xuICAgIH1cbiAgICBwYXJzZShpbnB1dCwgY29udGV4dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLl9leHRyYWN0KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IHsgTCwgYSwgYiwgQSwgZnJvbSwgcmVsYXRpdmVfTCwgcmVsYXRpdmVfYSwgcmVsYXRpdmVfYiwgcmVsYXRpdmVfQSB9ID0gZ3JvdXBzO1xuICAgICAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQ29sb3IgPSBjb250ZXh0LnBhcnNlKGZyb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21SR0IgPSBnZXRSR0IoZnJvbUNvbG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQ0lFTGFiID0gcmdiVG9MYWIoZnJvbVJHQi5SLCBmcm9tUkdCLkcsIGZyb21SR0IuQik7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUNJRUxhYlZhcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGw6IGZyb21DSUVMYWIuTCxcbiAgICAgICAgICAgICAgICAgICAgYTogZnJvbUNJRUxhYi5hLFxuICAgICAgICAgICAgICAgICAgICBiOiBmcm9tQ0lFTGFiLmIsXG4gICAgICAgICAgICAgICAgICAgIGFscGhhOiBmcm9tUkdCLkEgPz8gMVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgTCA9IG5ldyBDYWxjUGFyc2VyKCdsJywgcmVsYXRpdmVfTCwgZnJvbUNJRUxhYlZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gbmV3IENhbGNQYXJzZXIoJ2EnLCByZWxhdGl2ZV9hLCBmcm9tQ0lFTGFiVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBuZXcgQ2FsY1BhcnNlcignYicsIHJlbGF0aXZlX2IsIGZyb21DSUVMYWJWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgQ0lFTGFiID0ge1xuICAgICAgICAgICAgICAgICAgICBMOiBtaW5tYXgoTCwgMCwgTUFYX1BDRU5UKSxcbiAgICAgICAgICAgICAgICAgICAgYTogbWlubWF4KGEsIC1NQVhfTEFCLCBNQVhfTEFCKSxcbiAgICAgICAgICAgICAgICAgICAgYjogbWlubWF4KGIsIC1NQVhfTEFCLCBNQVhfTEFCKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlX0EpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgQSA9IG5ldyBDYWxjUGFyc2VyKCdhbHBoYScsIHJlbGF0aXZlX0EsIGZyb21DSUVMYWJWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIENJRUxhYi5BID0gbWlubWF4KEEsIDAsIE1BWF9BTFBIQSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBDSUVMYWI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBMOiBwZXJjZW50KEwpLFxuICAgICAgICAgICAgICAgICAgICBhOiBnZXRCYXNlMTI1TnVtYmVyKGEpLFxuICAgICAgICAgICAgICAgICAgICBiOiBnZXRCYXNlMTI1TnVtYmVyKGIpLFxuICAgICAgICAgICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoQSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE6IG5vcm1hbGl6ZUFscGhhKEEpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEw6IHBlcmNlbnQoaW5wdXQuTCksXG4gICAgICAgICAgICBhOiBnZXRCYXNlMTI1TnVtYmVyKGAke2lucHV0LmF9YCksXG4gICAgICAgICAgICBiOiBnZXRCYXNlMTI1TnVtYmVyKGAke2lucHV0LmJ9YCksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IG5vcm1hbGl6ZUFscGhhKGlucHV0LkEpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29udmVydChjb2xvciwgZGVjaW1hbHMsIHdpdGhBbHBoYSkge1xuICAgICAgICBsZXQgbGFiO1xuICAgICAgICBpZiAoaXNDSUVMYWJPYmplY3QoY29sb3IpKSB7XG4gICAgICAgICAgICBsYWIgPSBjb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IGdldFJHQihjb2xvcik7XG4gICAgICAgICAgICBsYWIgPSByZ2JUb0xhYihyZ2IuUiwgcmdiLkcsIHJnYi5CKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRDSUVMYWJPYmplY3Qoe1xuICAgICAgICAgICAgTDogbGFiLkwsXG4gICAgICAgICAgICBhOiBsYWIuYSxcbiAgICAgICAgICAgIGI6IGxhYi5iLFxuICAgICAgICAgICAgLi4uKHdpdGhBbHBoYVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBBOiArKGNvbG9yLkEgPz8gMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSlcbiAgICAgICAgfSwgZGVjaW1hbHMpO1xuICAgIH1cbiAgICBjb252ZXJ0Q1NTKGNvbG9yLCBvcHRpb25zLCB3aXRoQWxwaGEpIHtcbiAgICAgICAgY29uc3QgeyBkZWNpbWFscywgbGFiVW5pdCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgbGFiID0gdGhpcy5jb252ZXJ0KGNvbG9yLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9ICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IEwgPSByb3VuZChwZXJjZW50KHZhbHVlKSwgZGVjaW1hbHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJVbml0ID09PSBDb2xvclVuaXRFbnVtLlBFUkNFTlRcbiAgICAgICAgICAgICAgICAgICAgPyBgJHtMfSVgXG4gICAgICAgICAgICAgICAgICAgIDogYCR7TH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZGV4IDwgMykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJVbml0ID09PSBDb2xvclVuaXRFbnVtLlBFUkNFTlRcbiAgICAgICAgICAgICAgICAgICAgPyBgJHtmcm9tMTI1TnVtYmVyVG9QZXJjZW50KCt2YWx1ZSwgZGVjaW1hbHMpfSVgXG4gICAgICAgICAgICAgICAgICAgIDogcm91bmQodmFsdWUsIGRlY2ltYWxzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZXRDU1NBbHBoYSgrdmFsdWUsIG9wdGlvbnMsIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MobGFiLCB0cmFuc2Zvcm1lcik7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgPyBgbGFiKHsxfSB7Mn0gezN9IC8gezR9KWBcbiAgICAgICAgICAgIDogYGxhYih7MX0gezJ9IHszfSlgO1xuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlKHRlbXBsYXRlLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBfcm91bmRDSUVMYWJPYmplY3QoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBMOiByb3VuZChjb2xvci5MLCBkZWNpbWFscyksXG4gICAgICAgICAgICBhOiByb3VuZChjb2xvci5hLCBkZWNpbWFscyksXG4gICAgICAgICAgICBiOiByb3VuZChjb2xvci5iLCBkZWNpbWFscyksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoY29sb3IuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IHJvdW5kKGNvbG9yLkEsIGRlY2ltYWxzKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldENTU09wdGlvbnMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgTCwgYSwgYiwgQSB9ID0gZ3JvdXBzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFzUGVyY2VudGFnZVZhbHVlczogKFBDRU5ULnRlc3QoTCkgJiZcbiAgICAgICAgICAgICAgICBQQ0VOVC50ZXN0KGEpICYmXG4gICAgICAgICAgICAgICAgUENFTlQudGVzdChiKSksXG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlQWxwaGE6ICFpc1VuZGVmaW5lZChBKSAmJiBQQ0VOVC50ZXN0KEEpLFxuICAgICAgICAgICAgaGFzQWxwaGE6ICFpc1VuZGVmaW5lZChBKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1vZGVsLkNJRUxhYjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBbmdsZXNVbml0RW51bSwgQ09MT1JSRUdTLCBDb2xvck1vZGVsLCBDb2xvclVuaXRFbnVtLCBNQVhfQUxQSEEsIE1BWF9MQ0hfQywgTUFYX1BDRU5ULCBQQ0VOVCB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgZnJvbTE1ME51bWJlclRvUGVyY2VudCwgZ2V0QW5nbGVVbml0LCBnZXRCYXNlMTUwTnVtYmVyLCBpc0xDSE9iamVjdCwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLCBtaW5tYXgsIG5vcm1hbGl6ZUFscGhhLCBub3JtYWxpemVIdWUsIHBlcmNlbnQsIHJvdW5kLCB0cmFuc2xhdGVEZWdyZWVzIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5pbXBvcnQgeyBnZXRDU1NBbHBoYSwgZ2V0UmVzdWx0RnJvbUNTU1RlbXBsYXRlLCBwcmVwYXJlQ29sb3JGb3JDc3MgfSBmcm9tICcjY3NzJztcbmltcG9ydCB7IGdldFJHQiB9IGZyb20gJyNjb2xvci9yZ2InO1xuaW1wb3J0IHsgcmdiVG9MY2ggfSBmcm9tICcjY29sb3IvdHJhbnNsYXRvcnMnO1xuaW1wb3J0IHsgQ2FsY1BhcnNlciB9IGZyb20gJy4vQ2FsY1BhcnNlcic7XG5pbXBvcnQgeyBDb2xvclBhcnNlciB9IGZyb20gJy4vQ29sb3JQYXJzZXJDb250ZXh0JztcbmV4cG9ydCBjbGFzcyBMQ0hQYXJzZXIgZXh0ZW5kcyBDb2xvclBhcnNlciB7XG4gICAgX2V4dHJhY3QoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaChDT0xPUlJFR1MuTENIKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwcztcbiAgICB9XG4gICAgc3VwcG9ydHMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIENPTE9SUkVHUy5MQ0gudGVzdChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTENIT2JqZWN0KGlucHV0KTtcbiAgICB9XG4gICAgcGFyc2UoaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCB7IGwsIGMsIGgsIGEsIGZyb20sIHJlbGF0aXZlX2wsIHJlbGF0aXZlX2MsIHJlbGF0aXZlX2gsIHJlbGF0aXZlX2EgfSA9IGdyb3VwcztcbiAgICAgICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUNvbG9yID0gY29udGV4dC5wYXJzZShmcm9tKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tUkdCID0gZ2V0UkdCKGZyb21Db2xvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUxDSCA9IHJnYlRvTGNoKGZyb21SR0IuUiwgZnJvbVJHQi5HLCBmcm9tUkdCLkIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21MQ0hWYXJzID0ge1xuICAgICAgICAgICAgICAgICAgICBsOiBmcm9tTENILkwsXG4gICAgICAgICAgICAgICAgICAgIGM6IGZyb21MQ0guQyxcbiAgICAgICAgICAgICAgICAgICAgaDogZnJvbUxDSC5ILFxuICAgICAgICAgICAgICAgICAgICBhbHBoYTogZnJvbVJHQi5BID8/IDFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IEwgPSBuZXcgQ2FsY1BhcnNlcignbCcsIHJlbGF0aXZlX2wsIGZyb21MQ0hWYXJzKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgQyA9IG5ldyBDYWxjUGFyc2VyKCdjJywgcmVsYXRpdmVfYywgZnJvbUxDSFZhcnMpLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBIID0gbmV3IENhbGNQYXJzZXIoJ2gnLCByZWxhdGl2ZV9oLCBmcm9tTENIVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxjaCA9IHtcbiAgICAgICAgICAgICAgICAgICAgTDogbWlubWF4KEwsIDAsIE1BWF9QQ0VOVCksXG4gICAgICAgICAgICAgICAgICAgIEM6IG1pbm1heChDLCAtTUFYX0xDSF9DLCBNQVhfTENIX0MpLFxuICAgICAgICAgICAgICAgICAgICBIOiBub3JtYWxpemVIdWUoSClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZV9hKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IEEgPSBuZXcgQ2FsY1BhcnNlcignYWxwaGEnLCByZWxhdGl2ZV9hLCBmcm9tTENIVmFycykucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBsY2guQSA9IG1pbm1heChBLCAwLCBNQVhfQUxQSEEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgTDogcGVyY2VudChsKSxcbiAgICAgICAgICAgICAgICAgICAgQzogZ2V0QmFzZTE1ME51bWJlcihjKSxcbiAgICAgICAgICAgICAgICAgICAgSDogbm9ybWFsaXplSHVlKGgpLFxuICAgICAgICAgICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoYSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE6IG5vcm1hbGl6ZUFscGhhKGEpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEw6IHBlcmNlbnQoaW5wdXQuTCksXG4gICAgICAgICAgICBDOiBnZXRCYXNlMTUwTnVtYmVyKGAke2lucHV0LkN9YCksXG4gICAgICAgICAgICBIOiBub3JtYWxpemVIdWUoaW5wdXQuSCksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoaW5wdXQuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IG5vcm1hbGl6ZUFscGhhKGlucHV0LkEpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29udmVydChjb2xvciwgZGVjaW1hbHMsIHdpdGhBbHBoYSkge1xuICAgICAgICBsZXQgbGNoO1xuICAgICAgICBpZiAoaXNMQ0hPYmplY3QoY29sb3IpKSB7XG4gICAgICAgICAgICBsY2ggPSBjb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IGdldFJHQihjb2xvcik7XG4gICAgICAgICAgICBsY2ggPSByZ2JUb0xjaChyZ2IuUiwgcmdiLkcsIHJnYi5CKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRMQ0hPYmplY3Qoe1xuICAgICAgICAgICAgTDogbGNoLkwsXG4gICAgICAgICAgICBDOiBsY2guQyxcbiAgICAgICAgICAgIEg6IGxjaC5ILFxuICAgICAgICAgICAgLi4uKHdpdGhBbHBoYVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBBOiArKGNvbG9yLkEgPz8gMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSlcbiAgICAgICAgfSwgZGVjaW1hbHMpO1xuICAgIH1cbiAgICBjb252ZXJ0Q1NTKGNvbG9yLCBvcHRpb25zLCB3aXRoQWxwaGEpIHtcbiAgICAgICAgY29uc3QgeyBkZWNpbWFscywgbGNoVW5pdCwgYW5nbGVzVW5pdCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgbGNoID0gdGhpcy5jb252ZXJ0KGNvbG9yLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9ICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IEwgPSByb3VuZChwZXJjZW50KHZhbHVlKSwgZGVjaW1hbHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBsY2hVbml0ID09PSBDb2xvclVuaXRFbnVtLlBFUkNFTlRcbiAgICAgICAgICAgICAgICAgICAgPyBgJHtMfSVgXG4gICAgICAgICAgICAgICAgICAgIDogYCR7TH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxjaFVuaXQgPT09IENvbG9yVW5pdEVudW0uUEVSQ0VOVFxuICAgICAgICAgICAgICAgICAgICA/IGAke2Zyb20xNTBOdW1iZXJUb1BlcmNlbnQoK3ZhbHVlLCBkZWNpbWFscyl9JWBcbiAgICAgICAgICAgICAgICAgICAgOiByb3VuZCh2YWx1ZSwgZGVjaW1hbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlc1VuaXQgIT09IEFuZ2xlc1VuaXRFbnVtLk5PTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHJvdW5kKHRyYW5zbGF0ZURlZ3JlZXMoK3ZhbHVlLCBhbmdsZXNVbml0KSwgZGVjaW1hbHMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dHJhbnNsYXRlZH0ke2FuZ2xlc1VuaXR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHZhbHVlLCBkZWNpbWFscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q1NTQWxwaGEoK3ZhbHVlLCBvcHRpb25zLCB0cnVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcHJlcGFyZUNvbG9yRm9yQ3NzKGxjaCwgdHJhbnNmb3JtZXIpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgID8gYGxjaCh7MX0gezJ9IHszfSAvIHs0fSlgXG4gICAgICAgICAgICA6IGBsY2goezF9IHsyfSB7M30pYDtcbiAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWVzKTtcbiAgICB9XG4gICAgX3JvdW5kTENIT2JqZWN0KGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgTDogcm91bmQoY29sb3IuTCwgZGVjaW1hbHMpLFxuICAgICAgICAgICAgQzogcm91bmQoY29sb3IuQywgZGVjaW1hbHMpLFxuICAgICAgICAgICAgSDogcm91bmQobm9ybWFsaXplSHVlKGNvbG9yLkgpLCBkZWNpbWFscyksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoY29sb3IuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IHJvdW5kKGNvbG9yLkEsIGRlY2ltYWxzKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldENTU09wdGlvbnMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbmdsZVVuaXQ6IGdldEFuZ2xlVW5pdChncm91cHMuaCksXG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlVmFsdWVzOiAoUENFTlQudGVzdChncm91cHMubCkgJiZcbiAgICAgICAgICAgICAgICBQQ0VOVC50ZXN0KGdyb3Vwcy5jKSksXG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlQWxwaGE6ICFpc1VuZGVmaW5lZChncm91cHMuYSkgJiYgUENFTlQudGVzdChncm91cHMuYSksXG4gICAgICAgICAgICBoYXNBbHBoYTogIWlzVW5kZWZpbmVkKGdyb3Vwcy5hKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1vZGVsLkxDSDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb2xvck1vZGVsLCBDT0xPUlJFR1MsIENvbG9yVW5pdEVudW0sIFBDRU5UIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRDTVlLTnVtYmVyLCBpc0NNWUtPYmplY3QsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCwgbm9ybWFsaXplQWxwaGEsIHJvdW5kIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5pbXBvcnQgeyBnZXRDU1NBbHBoYSwgZ2V0Q1NTQ29tbWEsIGdldFJlc3VsdEZyb21DU1NUZW1wbGF0ZSwgcHJlcGFyZUNvbG9yRm9yQ3NzIH0gZnJvbSAnI2Nzcyc7XG5pbXBvcnQgeyBnZXRSR0IgfSBmcm9tICcjY29sb3IvcmdiJztcbmltcG9ydCB7IHJnYlRvQ215ayB9IGZyb20gJyNjb2xvci90cmFuc2xhdG9ycyc7XG5pbXBvcnQgeyBDb2xvclBhcnNlciB9IGZyb20gJy4vQ29sb3JQYXJzZXJDb250ZXh0JztcbmV4cG9ydCBjbGFzcyBDTVlLUGFyc2VyIGV4dGVuZHMgQ29sb3JQYXJzZXIge1xuICAgIF9leHRyYWN0KGlucHV0KSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goQ09MT1JSRUdTLkNNWUspO1xuICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXBzO1xuICAgIH1cbiAgICBfc2hvdWxkTXVsdGlwbHlCeTEwMCguLi5jb2xvcnMpIHtcbiAgICAgICAgcmV0dXJuICFjb2xvcnMuc29tZSgoY29sb3IpID0+ICtjb2xvciA+IDEpO1xuICAgIH1cbiAgICBzdXBwb3J0cyhpbnB1dCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ09MT1JSRUdTLkNNWUsudGVzdChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQ01ZS09iamVjdChpbnB1dCk7XG4gICAgfVxuICAgIHBhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V4dHJhY3QoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgYyA9IGdyb3Vwcy5jX2xlZ2FjeSA/PyBncm91cHMuYztcbiAgICAgICAgICAgIGNvbnN0IG0gPSBncm91cHMubV9sZWdhY3kgPz8gZ3JvdXBzLm07XG4gICAgICAgICAgICBjb25zdCB5ID0gZ3JvdXBzLnlfbGVnYWN5ID8/IGdyb3Vwcy55O1xuICAgICAgICAgICAgY29uc3QgayA9IGdyb3Vwcy5rX2xlZ2FjeSA/PyBncm91cHMuaztcbiAgICAgICAgICAgIGNvbnN0IGEgPSBncm91cHMuYV9sZWdhY3kgPz8gZ3JvdXBzLmE7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRNdWx0aXBseUJ5MTAwID0gdGhpcy5fc2hvdWxkTXVsdGlwbHlCeTEwMChjLCBtLCB5LCBrKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgQzogZ2V0Q01ZS051bWJlcihjLCBzaG91bGRNdWx0aXBseUJ5MTAwKSxcbiAgICAgICAgICAgICAgICBNOiBnZXRDTVlLTnVtYmVyKG0sIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgICAgIFk6IGdldENNWUtOdW1iZXIoeSwgc2hvdWxkTXVsdGlwbHlCeTEwMCksXG4gICAgICAgICAgICAgICAgSzogZ2V0Q01ZS051bWJlcihrLCBzaG91bGRNdWx0aXBseUJ5MTAwKSxcbiAgICAgICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoYSlcbiAgICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEE6IG5vcm1hbGl6ZUFscGhhKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNob3VsZE11bHRpcGx5QnkxMDAgPSB0aGlzLl9zaG91bGRNdWx0aXBseUJ5MTAwKGlucHV0LkMsIGlucHV0Lk0sIGlucHV0LlksIGlucHV0LkspO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgQzogZ2V0Q01ZS051bWJlcihgJHtpbnB1dC5DfWAsIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgTTogZ2V0Q01ZS051bWJlcihgJHtpbnB1dC5NfWAsIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgWTogZ2V0Q01ZS051bWJlcihgJHtpbnB1dC5ZfWAsIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgSzogZ2V0Q01ZS051bWJlcihgJHtpbnB1dC5LfWAsIHNob3VsZE11bHRpcGx5QnkxMDApLFxuICAgICAgICAgICAgLi4uKGlzVW5kZWZpbmVkKGlucHV0LkEpXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBBOiBub3JtYWxpemVBbHBoYShpbnB1dC5BKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnZlcnQoY29sb3IsIGRlY2ltYWxzLCB3aXRoQWxwaGEpIHtcbiAgICAgICAgbGV0IGNteWs7XG4gICAgICAgIGlmIChpc0NNWUtPYmplY3QoY29sb3IpKSB7XG4gICAgICAgICAgICBjbXlrID0gY29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZ2IgPSBnZXRSR0IoY29sb3IpO1xuICAgICAgICAgICAgY215ayA9IHJnYlRvQ215ayhyZ2IuUiwgcmdiLkcsIHJnYi5CKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRDTVlLT2JqZWN0KHtcbiAgICAgICAgICAgIEM6IGNteWsuQyxcbiAgICAgICAgICAgIE06IGNteWsuTSxcbiAgICAgICAgICAgIFk6IGNteWsuWSxcbiAgICAgICAgICAgIEs6IGNteWsuSyxcbiAgICAgICAgICAgIC4uLih3aXRoQWxwaGFcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgQTogKyhjb2xvci5BID8/IDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pXG4gICAgICAgIH0sIGRlY2ltYWxzKTtcbiAgICB9XG4gICAgY29udmVydENTUyhjb2xvciwgb3B0aW9ucywgd2l0aEFscGhhKSB7XG4gICAgICAgIGNvbnN0IHsgZGVjaW1hbHMsIGxlZ2FjeUNTUywgc3BhY2VzQWZ0ZXJDb21tYXMsIGNteWtVbml0LCBjbXlrRnVuY3Rpb24gfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNvbW1hID0gZ2V0Q1NTQ29tbWEoc3BhY2VzQWZ0ZXJDb21tYXMpO1xuICAgICAgICBjb25zdCBjbXlrID0gdGhpcy5jb252ZXJ0KGNvbG9yLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9ICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChjbXlrVW5pdCA9PT0gQ29sb3JVbml0RW51bS5QRVJDRU5UICYmXG4gICAgICAgICAgICAgICAgaW5kZXggPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3JvdW5kKHZhbHVlLCBkZWNpbWFscyl9JWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5kZXggPT09IDRcbiAgICAgICAgICAgICAgICA/IGdldENTU0FscGhhKCt2YWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IHJvdW5kKCt2YWx1ZSAvIDEwMCwgZGVjaW1hbHMpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MoY215aywgdHJhbnNmb3JtZXIpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGxlZ2FjeUNTU1xuICAgICAgICAgICAgPyAodmFsdWVzLmxlbmd0aCA9PT0gNVxuICAgICAgICAgICAgICAgID8gYCR7Y215a0Z1bmN0aW9ufSh7MX0ke2NvbW1hfXsyfSR7Y29tbWF9ezN9JHtjb21tYX17NH0ke2NvbW1hfXs1fSlgXG4gICAgICAgICAgICAgICAgOiBgJHtjbXlrRnVuY3Rpb259KHsxfSR7Y29tbWF9ezJ9JHtjb21tYX17M30ke2NvbW1hfXs0fSlgKVxuICAgICAgICAgICAgOiAodmFsdWVzLmxlbmd0aCA9PT0gNVxuICAgICAgICAgICAgICAgID8gYCR7Y215a0Z1bmN0aW9ufSh7MX0gezJ9IHszfSB7NH0gLyB7NX0pYFxuICAgICAgICAgICAgICAgIDogYCR7Y215a0Z1bmN0aW9ufSh7MX0gezJ9IHszfSB7NH0pYCk7XG4gICAgICAgIHJldHVybiBnZXRSZXN1bHRGcm9tQ1NTVGVtcGxhdGUodGVtcGxhdGUsIHZhbHVlcyk7XG4gICAgfVxuICAgIF9yb3VuZENNWUtPYmplY3QoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBDOiByb3VuZChjb2xvci5DLCBkZWNpbWFscyksXG4gICAgICAgICAgICBNOiByb3VuZChjb2xvci5NLCBkZWNpbWFscyksXG4gICAgICAgICAgICBZOiByb3VuZChjb2xvci5ZLCBkZWNpbWFscyksXG4gICAgICAgICAgICBLOiByb3VuZChjb2xvci5LLCBkZWNpbWFscyksXG4gICAgICAgICAgICAuLi4oaXNVbmRlZmluZWQoY29sb3IuQSlcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIEE6IHJvdW5kKGNvbG9yLkEsIGRlY2ltYWxzKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldENTU09wdGlvbnMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXh0cmFjdChpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgY19sZWdhY3ksIG1fbGVnYWN5LCB5X2xlZ2FjeSwga19sZWdhY3ksIGFfbGVnYWN5LCBjLCBtLCB5LCBrLCBhIH0gPSBncm91cHM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlVmFsdWVzOiAoUENFTlQudGVzdChjX2xlZ2FjeSA/PyBjKSAmJlxuICAgICAgICAgICAgICAgIFBDRU5ULnRlc3QobV9sZWdhY3kgPz8gbSkgJiZcbiAgICAgICAgICAgICAgICBQQ0VOVC50ZXN0KHlfbGVnYWN5ID8/IHkpICYmXG4gICAgICAgICAgICAgICAgUENFTlQudGVzdChrX2xlZ2FjeSA/PyBrKSksXG4gICAgICAgICAgICBoYXNQZXJjZW50YWdlQWxwaGE6ICgoIWlzVW5kZWZpbmVkKGFfbGVnYWN5KSAmJiBQQ0VOVC50ZXN0KGFfbGVnYWN5KSkgfHxcbiAgICAgICAgICAgICAgICAoIWlzVW5kZWZpbmVkKGEpICYmIFBDRU5ULnRlc3QoYSkpKSxcbiAgICAgICAgICAgIGhhc0FscGhhOiAhaXNVbmRlZmluZWQoYV9sZWdhY3kgPz8gYSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gQ29sb3JNb2RlbC5DTVlLO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFuZ2xlc1VuaXRFbnVtLCBDb2xvck1vZGVsLCBDb2xvclVuaXRFbnVtLCBDT01NQSwgQ09NTUFTX0FORF9ORVhUX0NIQVJTLCBDTVlLRnVuY3Rpb25FbnVtLCBERUZBVUxUX09QVElPTlMsIFNQQUNFUyB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgaXNCb29sZWFuLCBpc051bWJlciwgaXNTdHJpbmcgfSBmcm9tICcjdXRpbGl0aWVzJztcbmltcG9ydCB7IENvbG9yUGFyc2VyQ29udGV4dCB9IGZyb20gJyNjbGFzc2VzL0NvbG9yUGFyc2VyQ29udGV4dCc7XG5pbXBvcnQgeyBIRVhQYXJzZXIgfSBmcm9tICcjY2xhc3Nlcy9IRVhQYXJzZXInO1xuaW1wb3J0IHsgUkdCUGFyc2VyIH0gZnJvbSAnI2NsYXNzZXMvUkdCUGFyc2VyJztcbmltcG9ydCB7IEhTTFBhcnNlciB9IGZyb20gJyNjbGFzc2VzL0hTTFBhcnNlcic7XG5pbXBvcnQgeyBIV0JQYXJzZXIgfSBmcm9tICcjY2xhc3Nlcy9IV0JQYXJzZXInO1xuaW1wb3J0IHsgQ0lFTGFiUGFyc2VyIH0gZnJvbSAnI2NsYXNzZXMvQ0lFTGFiUGFyc2VyJztcbmltcG9ydCB7IExDSFBhcnNlciB9IGZyb20gJyNjbGFzc2VzL0xDSFBhcnNlcic7XG5pbXBvcnQgeyBDTVlLUGFyc2VyIH0gZnJvbSAnI2NsYXNzZXMvQ01ZS1BhcnNlcic7XG5leHBvcnQgY29uc3QgaGV4UGFyc2VyID0gbmV3IEhFWFBhcnNlcigpO1xuZXhwb3J0IGNvbnN0IHJnYlBhcnNlciA9IG5ldyBSR0JQYXJzZXIoKTtcbmV4cG9ydCBjb25zdCBoc2xQYXJzZXIgPSBuZXcgSFNMUGFyc2VyKCk7XG5leHBvcnQgY29uc3QgaHdiUGFyc2VyID0gbmV3IEhXQlBhcnNlcigpO1xuZXhwb3J0IGNvbnN0IGNpZUxhYlBhcnNlciA9IG5ldyBDSUVMYWJQYXJzZXIoKTtcbmV4cG9ydCBjb25zdCBsY2hQYXJzZXIgPSBuZXcgTENIUGFyc2VyKCk7XG5leHBvcnQgY29uc3QgY215a1BhcnNlciA9IG5ldyBDTVlLUGFyc2VyKCk7XG5leHBvcnQgY29uc3QgY29sb3JQYXJzZXJDb250ZXh0ID0gbmV3IENvbG9yUGFyc2VyQ29udGV4dChuZXcgTWFwKFtcbiAgICBbQ29sb3JNb2RlbC5IRVgsIGhleFBhcnNlcl0sXG4gICAgW0NvbG9yTW9kZWwuUkdCLCByZ2JQYXJzZXJdLFxuICAgIFtDb2xvck1vZGVsLkhTTCwgaHNsUGFyc2VyXSxcbiAgICBbQ29sb3JNb2RlbC5IV0IsIGh3YlBhcnNlcl0sXG4gICAgW0NvbG9yTW9kZWwuQ0lFTGFiLCBjaWVMYWJQYXJzZXJdLFxuICAgIFtDb2xvck1vZGVsLkxDSCwgbGNoUGFyc2VyXSxcbiAgICBbQ29sb3JNb2RlbC5DTVlLLCBjbXlrUGFyc2VyXVxuXSkpO1xuZXhwb3J0IGNvbnN0IGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dCA9IChvcHRpb25zLCAuLi5jb2xvcnMpID0+IHtcbiAgICBjb25zdCBjc3NDb2xvcnMgPSBbXTtcbiAgICBjb25zdCBhbmdsZXNVbml0cyA9IFtdO1xuICAgIGNvbnN0IHJnYkNvbG9ycyA9IFtdO1xuICAgIGNvbnN0IGxhYkNvbG9ycyA9IFtdO1xuICAgIGNvbnN0IGxjaENvbG9ycyA9IFtdO1xuICAgIGNvbnN0IGNteWtDb2xvcnMgPSBbXTtcbiAgICBjb25zdCBhbHBoYVZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IGFuZ2xlc1VuaXRWYWx1ZXMgPSBPYmplY3QudmFsdWVzKEFuZ2xlc1VuaXRFbnVtKTtcbiAgICBjb25zdCBjb2xvclVuaXRWYWx1ZXMgPSBPYmplY3QudmFsdWVzKENvbG9yVW5pdEVudW0pO1xuICAgIGNvbnN0IGNteWtGdW5jdGlvblZhbHVlcyA9IE9iamVjdC52YWx1ZXMoQ01ZS0Z1bmN0aW9uRW51bSk7XG4gICAgY29uc3QgbWF0Y2hPcHRpb25zID0ge1xuICAgICAgICBsZWdhY3lDU1M6IDAsXG4gICAgICAgIHNwYWNlc0FmdGVyQ29tbWFzOiAwLFxuICAgICAgICBjbXlrRnVuY3Rpb246IDBcbiAgICB9O1xuICAgIGZvciAoY29uc3QgY29sb3Igb2YgY29sb3JzKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhjb2xvcikpIHtcbiAgICAgICAgICAgIGNzc0NvbG9ycy5wdXNoKGNvbG9yKTtcbiAgICAgICAgICAgIGlmIChjb2xvci5pbmNsdWRlcyhDT01NQSkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaE9wdGlvbnMubGVnYWN5Q1NTKys7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWFzV2l0aE5leHRDaGFyYWN0ZXIgPSBjb2xvci5tYXRjaChDT01NQVNfQU5EX05FWFRfQ0hBUlMpO1xuICAgICAgICAgICAgICAgIGlmIChuZXcgU2V0KGNvbW1hc1dpdGhOZXh0Q2hhcmFjdGVyKS5zaXplID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgIFNQQUNFUy50ZXN0KGNvbW1hc1dpdGhOZXh0Q2hhcmFjdGVyWzBdLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaE9wdGlvbnMuc3BhY2VzQWZ0ZXJDb21tYXMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaHNsUGFyc2VyLnN1cHBvcnRzKGNvbG9yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBoc2xQYXJzZXIuZ2V0Q1NTT3B0aW9ucyhjb2xvcik7XG4gICAgICAgICAgICAgICAgYW5nbGVzVW5pdHMucHVzaChvcHRpb25zLmFuZ2xlVW5pdCk7XG4gICAgICAgICAgICAgICAgYWxwaGFWYWx1ZXMucHVzaChvcHRpb25zLmhhc1BlcmNlbnRhZ2VBbHBoYSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaHdiUGFyc2VyLnN1cHBvcnRzKGNvbG9yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBod2JQYXJzZXIuZ2V0Q1NTT3B0aW9ucyhjb2xvcik7XG4gICAgICAgICAgICAgICAgYW5nbGVzVW5pdHMucHVzaChvcHRpb25zLmFuZ2xlVW5pdCk7XG4gICAgICAgICAgICAgICAgYWxwaGFWYWx1ZXMucHVzaChvcHRpb25zLmhhc1BlcmNlbnRhZ2VBbHBoYSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmdiUGFyc2VyLnN1cHBvcnRzKGNvbG9yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSByZ2JQYXJzZXIuZ2V0Q1NTT3B0aW9ucyhjb2xvcik7XG4gICAgICAgICAgICAgICAgcmdiQ29sb3JzLnB1c2gob3B0aW9ucy5oYXNQZXJjZW50YWdlVmFsdWVzKTtcbiAgICAgICAgICAgICAgICBhbHBoYVZhbHVlcy5wdXNoKG9wdGlvbnMuaGFzUGVyY2VudGFnZUFscGhhKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaWVMYWJQYXJzZXIuc3VwcG9ydHMoY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNpZUxhYlBhcnNlci5nZXRDU1NPcHRpb25zKGNvbG9yKTtcbiAgICAgICAgICAgICAgICBsYWJDb2xvcnMucHVzaChvcHRpb25zLmhhc1BlcmNlbnRhZ2VWYWx1ZXMpO1xuICAgICAgICAgICAgICAgIGFscGhhVmFsdWVzLnB1c2gob3B0aW9ucy5oYXNQZXJjZW50YWdlQWxwaGEpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxjaFBhcnNlci5zdXBwb3J0cyhjb2xvcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gbGNoUGFyc2VyLmdldENTU09wdGlvbnMoY29sb3IpO1xuICAgICAgICAgICAgICAgIGFuZ2xlc1VuaXRzLnB1c2gob3B0aW9ucy5hbmdsZVVuaXQpO1xuICAgICAgICAgICAgICAgIGxjaENvbG9ycy5wdXNoKG9wdGlvbnMuaGFzUGVyY2VudGFnZVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgYWxwaGFWYWx1ZXMucHVzaChvcHRpb25zLmhhc1BlcmNlbnRhZ2VBbHBoYSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY215a1BhcnNlci5zdXBwb3J0cyhjb2xvcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gY215a1BhcnNlci5nZXRDU1NPcHRpb25zKGNvbG9yKTtcbiAgICAgICAgICAgICAgICBjbXlrQ29sb3JzLnB1c2gob3B0aW9ucy5oYXNQZXJjZW50YWdlVmFsdWVzKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sb3Iuc3RhcnRzV2l0aChDTVlLRnVuY3Rpb25FbnVtLkNNWUspKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoT3B0aW9ucy5jbXlrRnVuY3Rpb24rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWxwaGFWYWx1ZXMucHVzaChvcHRpb25zLmhhc1BlcmNlbnRhZ2VBbHBoYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVjaW1hbHM6IGlzTnVtYmVyKG9wdGlvbnMuZGVjaW1hbHMpXG4gICAgICAgICAgICA/IG9wdGlvbnMuZGVjaW1hbHNcbiAgICAgICAgICAgIDogREVGQVVMVF9PUFRJT05TLmRlY2ltYWxzLFxuICAgICAgICBsZWdhY3lDU1M6IGlzQm9vbGVhbihvcHRpb25zLmxlZ2FjeUNTUylcbiAgICAgICAgICAgID8gb3B0aW9ucy5sZWdhY3lDU1NcbiAgICAgICAgICAgIDogQm9vbGVhbihjc3NDb2xvcnMubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgbWF0Y2hPcHRpb25zLmxlZ2FjeUNTUyA9PT0gY3NzQ29sb3JzLmxlbmd0aCkgfHwgREVGQVVMVF9PUFRJT05TLmxlZ2FjeUNTUyxcbiAgICAgICAgc3BhY2VzQWZ0ZXJDb21tYXM6IGlzQm9vbGVhbihvcHRpb25zLnNwYWNlc0FmdGVyQ29tbWFzKVxuICAgICAgICAgICAgPyBvcHRpb25zLnNwYWNlc0FmdGVyQ29tbWFzXG4gICAgICAgICAgICA6IEJvb2xlYW4oY3NzQ29sb3JzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIG1hdGNoT3B0aW9ucy5zcGFjZXNBZnRlckNvbW1hcyA9PT0gY3NzQ29sb3JzLmxlbmd0aCkgfHwgREVGQVVMVF9PUFRJT05TLnNwYWNlc0FmdGVyQ29tbWFzLFxuICAgICAgICBhbmdsZXNVbml0OiBvcHRpb25zLmFuZ2xlc1VuaXQgJiYgYW5nbGVzVW5pdFZhbHVlcy5pbmNsdWRlcyhvcHRpb25zLmFuZ2xlc1VuaXQpXG4gICAgICAgICAgICA/IG9wdGlvbnMuYW5nbGVzVW5pdFxuICAgICAgICAgICAgOiAobmV3IFNldChhbmdsZXNVbml0cykuc2l6ZSA9PT0gMVxuICAgICAgICAgICAgICAgID8gYW5nbGVzVW5pdHNbMF1cbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5hbmdsZXNVbml0KSxcbiAgICAgICAgcmdiVW5pdDogb3B0aW9ucy5yZ2JVbml0ICYmIGNvbG9yVW5pdFZhbHVlcy5pbmNsdWRlcyhvcHRpb25zLnJnYlVuaXQpXG4gICAgICAgICAgICA/IG9wdGlvbnMucmdiVW5pdFxuICAgICAgICAgICAgOiAobmV3IFNldChyZ2JDb2xvcnMpLnNpemUgPT09IDEgJiYgcmdiQ29sb3JzWzBdXG4gICAgICAgICAgICAgICAgPyBDb2xvclVuaXRFbnVtLlBFUkNFTlRcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5yZ2JVbml0KSxcbiAgICAgICAgbGFiVW5pdDogb3B0aW9ucy5sYWJVbml0ICYmIGNvbG9yVW5pdFZhbHVlcy5pbmNsdWRlcyhvcHRpb25zLmxhYlVuaXQpXG4gICAgICAgICAgICA/IG9wdGlvbnMubGFiVW5pdFxuICAgICAgICAgICAgOiAobmV3IFNldChsYWJDb2xvcnMpLnNpemUgPT09IDEgJiYgbGFiQ29sb3JzWzBdXG4gICAgICAgICAgICAgICAgPyBDb2xvclVuaXRFbnVtLlBFUkNFTlRcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5sYWJVbml0KSxcbiAgICAgICAgbGNoVW5pdDogb3B0aW9ucy5sY2hVbml0ICYmIGNvbG9yVW5pdFZhbHVlcy5pbmNsdWRlcyhvcHRpb25zLmxjaFVuaXQpXG4gICAgICAgICAgICA/IG9wdGlvbnMubGNoVW5pdFxuICAgICAgICAgICAgOiAobmV3IFNldChsY2hDb2xvcnMpLnNpemUgPT09IDEgJiYgbGNoQ29sb3JzWzBdXG4gICAgICAgICAgICAgICAgPyBDb2xvclVuaXRFbnVtLlBFUkNFTlRcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5sY2hVbml0KSxcbiAgICAgICAgY215a1VuaXQ6IG9wdGlvbnMuY215a1VuaXQgJiYgY29sb3JVbml0VmFsdWVzLmluY2x1ZGVzKG9wdGlvbnMuY215a1VuaXQpXG4gICAgICAgICAgICA/IG9wdGlvbnMuY215a1VuaXRcbiAgICAgICAgICAgIDogKG5ldyBTZXQoY215a0NvbG9ycykuc2l6ZSA9PT0gMSAmJiAhY215a0NvbG9yc1swXVxuICAgICAgICAgICAgICAgID8gQ29sb3JVbml0RW51bS5OT05FXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX09QVElPTlMuY215a1VuaXQpLFxuICAgICAgICBhbHBoYVVuaXQ6IG9wdGlvbnMuYWxwaGFVbml0ICYmIGNvbG9yVW5pdFZhbHVlcy5pbmNsdWRlcyhvcHRpb25zLmFscGhhVW5pdClcbiAgICAgICAgICAgID8gb3B0aW9ucy5hbHBoYVVuaXRcbiAgICAgICAgICAgIDogKG5ldyBTZXQoYWxwaGFWYWx1ZXMpLnNpemUgPT09IDEgJiYgYWxwaGFWYWx1ZXNbMF1cbiAgICAgICAgICAgICAgICA/IENvbG9yVW5pdEVudW0uUEVSQ0VOVFxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9PUFRJT05TLmFscGhhVW5pdCksXG4gICAgICAgIGNteWtGdW5jdGlvbjogb3B0aW9ucy5jbXlrRnVuY3Rpb24gJiYgY215a0Z1bmN0aW9uVmFsdWVzLmluY2x1ZGVzKG9wdGlvbnMuY215a0Z1bmN0aW9uKVxuICAgICAgICAgICAgPyBvcHRpb25zLmNteWtGdW5jdGlvblxuICAgICAgICAgICAgOiAoY215a0NvbG9ycy5sZW5ndGggJiYgY215a0NvbG9ycy5sZW5ndGggPT09IG1hdGNoT3B0aW9ucy5jbXlrRnVuY3Rpb25cbiAgICAgICAgICAgICAgICA/IENNWUtGdW5jdGlvbkVudW0uQ01ZS1xuICAgICAgICAgICAgICAgIDogREVGQVVMVF9PUFRJT05TLmNteWtGdW5jdGlvbilcbiAgICB9O1xufTtcbiIsImltcG9ydCB7IEJBU0VfMjU1LCBDb2xvck1vZGVsLCBERUZBVUxUX0JMRU5EX1NURVBTLCBERUZBVUxUX1NIQURFU19USU5UU19TVEVQUywgSGFybW9ueSwgTWl4IH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc0hhcm1vbnksIGlzTnVtYmVyLCBpc1N0cmluZywgaXNNaXgsIGlzVW5kZWZpbmVkLCBub3JtYWxpemVBbHBoYSwgbm9ybWFsaXplSHVlLCByb3VuZCB9IGZyb20gJyN1dGlsaXRpZXMnO1xuaW1wb3J0IHsgaHVlUnliLCByZ2JUb1J5YiwgcnliVG9SZ2IgfSBmcm9tICcjY29sb3IvdHJhbnNsYXRvcnMnO1xuaW1wb3J0IHsgZ2V0UkdCIH0gZnJvbSAnI2NvbG9yL3JnYic7XG5pbXBvcnQgeyBjb2xvclBhcnNlckNvbnRleHQsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dCB9IGZyb20gJyNwYXJzZXJzJztcbmNvbnN0IGJsZW5kID0gKGZyb20sIHRvLCBzdGVwcykgPT4ge1xuICAgIGNvbnN0IGRpdiA9IHN0ZXBzIC0gMTtcbiAgICBjb25zdCBkaWZmUiA9ICh0by5SIC0gZnJvbS5SKSAvIGRpdjtcbiAgICBjb25zdCBkaWZmRyA9ICh0by5HIC0gZnJvbS5HKSAvIGRpdjtcbiAgICBjb25zdCBkaWZmQiA9ICh0by5CIC0gZnJvbS5CKSAvIGRpdjtcbiAgICBjb25zdCBmcm9tQSA9IG5vcm1hbGl6ZUFscGhhKGZyb20uQSk7XG4gICAgY29uc3QgdG9BID0gbm9ybWFsaXplQWxwaGEodG8uQSk7XG4gICAgY29uc3QgZGlmZkEgPSAodG9BIC0gZnJvbUEpIC8gZGl2O1xuICAgIHJldHVybiBBcnJheShzdGVwcykuZmlsbChudWxsKS5tYXAoKF9fbiwgaSkgPT4ge1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IGRpdikge1xuICAgICAgICAgICAgcmV0dXJuIHRvO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBSOiByb3VuZChmcm9tLlIgKyBkaWZmUiAqIGkpLFxuICAgICAgICAgICAgRzogcm91bmQoZnJvbS5HICsgZGlmZkcgKiBpKSxcbiAgICAgICAgICAgIEI6IHJvdW5kKGZyb20uQiArIGRpZmZCICogaSksXG4gICAgICAgICAgICBBOiByb3VuZChmcm9tQSArIGRpZmZBICogaSlcbiAgICAgICAgfTtcbiAgICB9KTtcbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIG1vZGVsLCBjc3MsIHdpdGhBbHBoYSwgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoc3RlcHMgPCAxKVxuICAgICAgICBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7XG4gICAgY29uc3QgZnJvbVBhcnNlZCA9IGNvbG9yUGFyc2VyQ29udGV4dC5wYXJzZShmcm9tKTtcbiAgICBjb25zdCB0b1BhcnNlZCA9IGNvbG9yUGFyc2VyQ29udGV4dC5wYXJzZSh0byk7XG4gICAgY29uc3QgZnJvbVJHQk9iamVjdCA9IGdldFJHQihmcm9tUGFyc2VkKTtcbiAgICBjb25zdCB0b1JHQk9iamVjdCA9IGdldFJHQih0b1BhcnNlZCk7XG4gICAgY29uc3QgYmxlbmRBcnJheSA9IGJsZW5kKGZyb21SR0JPYmplY3QsIHRvUkdCT2JqZWN0LCBzdGVwcyk7XG4gICAgcmV0dXJuIGJsZW5kQXJyYXkubWFwKChjb2xvcikgPT4ge1xuICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIG1vZGVsLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgZnJvbSwgdG8pLCB3aXRoQWxwaGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgbW9kZWwsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3QgZ2V0QmxlbmRSZXR1cm5QYXJhbXMgPSAodGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikgPT4ge1xuICAgIGNvbnN0IHN0ZXBzUGFyYW1ldGVyID0gaXNOdW1iZXIodGhpcmRQYXJhbWV0ZXIpXG4gICAgICAgID8gdGhpcmRQYXJhbWV0ZXJcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3B0aW9uc1BhcmFtZXRlciA9IGlzTnVtYmVyKHRoaXJkUGFyYW1ldGVyKVxuICAgICAgICA/IGZvdXJ0aFBhcmFtZXRlclxuICAgICAgICA6IHRoaXJkUGFyYW1ldGVyO1xuICAgIHJldHVybiBbXG4gICAgICAgIHN0ZXBzUGFyYW1ldGVyLFxuICAgICAgICBvcHRpb25zUGFyYW1ldGVyXG4gICAgXTtcbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0TWl4UmV0dXJuKGNvbG9ycywgbW9kZWwsIGNzcywgd2l0aEFscGhhLCBtb2RlID0gTWl4LkFERElUSVZFLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCByZ2JNYXAgPSBjb2xvcnMubWFwKChjb2xvcikgPT4ge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoY29sb3IsIENvbG9yTW9kZWwuUkdCLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHJ5Yk1hcCA9IG1vZGUgPT09IE1peC5TVUJUUkFDVElWRVxuICAgICAgICA/IHJnYk1hcC5tYXAoKGNvbG9yKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBSWUIgPSByZ2JUb1J5Yihjb2xvci5SLCBjb2xvci5HLCBjb2xvci5CKTtcbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoY29sb3IuQSkpIHtcbiAgICAgICAgICAgICAgICBSWUIuQSA9IGNvbG9yLkE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUllCO1xuICAgICAgICB9KVxuICAgICAgICA6IG51bGw7XG4gICAgZnVuY3Rpb24gY3JlYXRlTWl4KGl0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBtb2RlID09PSBNaXguQURESVRJVkVcbiAgICAgICAgICAgID8geyBSOiAwLCBHOiAwLCBCOiAwLCBBOiAwIH1cbiAgICAgICAgICAgIDogeyBSOiAwLCBZOiAwLCBCOiAwLCBBOiAwIH07XG4gICAgICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKG1peCwgY29sb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yQSA9IGlzVW5kZWZpbmVkKGNvbG9yLkEpXG4gICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgOiBjb2xvci5BO1xuICAgICAgICAgICAgY29uc3QgY29tbW9uID0ge1xuICAgICAgICAgICAgICAgIFI6IE1hdGgubWluKG1peC5SICsgY29sb3IuUiAqIGNvbG9yQSwgQkFTRV8yNTUpLFxuICAgICAgICAgICAgICAgIEI6IE1hdGgubWluKG1peC5CICsgY29sb3IuQiAqIGNvbG9yQSwgQkFTRV8yNTUpLFxuICAgICAgICAgICAgICAgIEE6IDEgLSAoMSAtIGNvbG9yQSkgKiAoMSAtIG1peC5BKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG1peEdZID0gJ0cnIGluIG1peFxuICAgICAgICAgICAgICAgID8gbWl4LkdcbiAgICAgICAgICAgICAgICA6IG1peC5ZO1xuICAgICAgICAgICAgY29uc3QgY29sb3JHWSA9ICdHJyBpbiBjb2xvclxuICAgICAgICAgICAgICAgID8gY29sb3IuR1xuICAgICAgICAgICAgICAgIDogY29sb3IuWTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uY29tbW9uLFxuICAgICAgICAgICAgICAgIC4uLihtb2RlID09PSBNaXguQURESVRJVkVcbiAgICAgICAgICAgICAgICAgICAgPyB7IEc6IE1hdGgubWluKG1peEdZICsgY29sb3JHWSAqIGNvbG9yQSwgQkFTRV8yNTUpIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IFk6IE1hdGgubWluKG1peEdZICsgY29sb3JHWSAqIGNvbG9yQSwgQkFTRV8yNTUpIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCBpbml0aWFsKTtcbiAgICB9XG4gICAgbGV0IG1peDtcbiAgICBpZiAobW9kZSA9PT0gTWl4LkFERElUSVZFKSB7XG4gICAgICAgIG1peCA9IGNyZWF0ZU1peChyZ2JNYXApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgUllCID0gY3JlYXRlTWl4KHJ5Yk1hcCk7XG4gICAgICAgIG1peCA9IHJ5YlRvUmdiKFJZQi5SLCBSWUIuWSwgUllCLkIpO1xuICAgICAgICBtaXguQSA9IFJZQi5BO1xuICAgIH1cbiAgICBpZiAoY3NzKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyhtaXgsIG1vZGVsLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgLi4uY29sb3JzKSwgd2l0aEFscGhhKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KG1peCwgbW9kZWwsIG9wdGlvbnMuZGVjaW1hbHMsIHdpdGhBbHBoYSk7XG59XG47XG5leHBvcnQgY29uc3QgZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyA9IChzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSA9PiB7XG4gICAgY29uc3QgbW9kZVBhcmFtID0gaXNTdHJpbmcoc2Vjb25kUGFyYW1ldGVyKVxuICAgICAgICA/IHNlY29uZFBhcmFtZXRlclxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvcHRpb25zUGFyYW0gPSBpc1N0cmluZyhzZWNvbmRQYXJhbWV0ZXIpXG4gICAgICAgID8gdGhpcmRQYXJhbWV0ZXJcbiAgICAgICAgOiBzZWNvbmRQYXJhbWV0ZXI7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbW9kZVBhcmFtLFxuICAgICAgICBvcHRpb25zUGFyYW1cbiAgICBdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTaGFkZXNPclRpbnRzUmV0dXJuKHNoYWRlcywgY29sb3IsIHN0ZXBzID0gREVGQVVMVF9TSEFERVNfVElOVFNfU1RFUFMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGlzQ1NTID0gaXNTdHJpbmcoY29sb3IpO1xuICAgIGNvbnN0IHBhcnNlciA9IGNvbG9yUGFyc2VyQ29udGV4dC5nZXRQYXJzZXIoY29sb3IpO1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VyLm1vZGVsO1xuICAgIGNvbnN0IHdpdGhBbHBoYSA9IHBhcnNlci5oYXNBbHBoYShjb2xvcik7XG4gICAgY29uc3QgaHNsID0gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoY29sb3IsIENvbG9yTW9kZWwuSFNMLCB1bmRlZmluZWQsIHdpdGhBbHBoYSk7XG4gICAgY29uc3QgaW5jcmVtZW50ID0gc2hhZGVzXG4gICAgICAgID8gaHNsLkwgLyAoc3RlcHMgKyAxKVxuICAgICAgICA6ICgxMDAgLSBoc2wuTCkgLyAoc3RlcHMgKyAxKTtcbiAgICBjb25zdCBoc2xNYXAgPSBBcnJheS5mcm9tKEFycmF5KHN0ZXBzKSkubWFwKChfX24sIGkpID0+ICh7XG4gICAgICAgIC4uLmhzbCxcbiAgICAgICAgTDogaHNsLkwgKyBpbmNyZW1lbnQgKiAoaSArIDEpICogKDEgLSArc2hhZGVzICogMilcbiAgICB9KSk7XG4gICAgaWYgKGlzQ1NTKSB7XG4gICAgICAgIHJldHVybiBoc2xNYXAubWFwKChoc2xDb2xvcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGhzbENvbG9yLCBtb2RlbCwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgd2l0aEFscGhhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBoc2xNYXAubWFwKChoc2xDb2xvcikgPT4ge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoaHNsQ29sb3IsIG1vZGVsLCBvcHRpb25zLmRlY2ltYWxzLCB3aXRoQWxwaGEpO1xuICAgIH0pO1xufVxuZXhwb3J0IGNvbnN0IGdldFNoYWRlc09yVGludHNSZXR1cm5QYXJhbWV0ZXJzID0gKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IHtcbiAgICBjb25zdCBzdGVwc1BhcmFtID0gaXNOdW1iZXIoc2Vjb25kUGFyYW1ldGVyKVxuICAgICAgICA/IHNlY29uZFBhcmFtZXRlclxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvcHRpb25zUGFyYW0gPSBpc051bWJlcihzZWNvbmRQYXJhbWV0ZXIpXG4gICAgICAgID8gdGhpcmRQYXJhbWV0ZXJcbiAgICAgICAgOiBzZWNvbmRQYXJhbWV0ZXI7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3RlcHNQYXJhbSxcbiAgICAgICAgb3B0aW9uc1BhcmFtXG4gICAgXTtcbn07XG5jb25zdCBoYXJtb255ID0gKGNvbG9yLCBhbmdsZXMsIG1vZGUpID0+IGFuZ2xlcy5yZWR1Y2UoKGFyciwgbnVtKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgLi4uYXJyLFxuICAgICAgICB7XG4gICAgICAgICAgICAuLi5jb2xvcixcbiAgICAgICAgICAgIEg6IG1vZGUgPT09IE1peC5BRERJVElWRVxuICAgICAgICAgICAgICAgID8gbm9ybWFsaXplSHVlKGNvbG9yLkggKyBudW0pXG4gICAgICAgICAgICAgICAgOiBub3JtYWxpemVIdWUoaHVlUnliKGh1ZVJ5Yihjb2xvci5ILCBmYWxzZSkgKyBudW0sIHRydWUpKVxuICAgICAgICB9XG4gICAgXTtcbn0sIFt7IC4uLmNvbG9yIH1dKTtcbmNvbnN0IEhBUk1PTklFUyA9IG5ldyBNYXAoW1xuICAgIFtcbiAgICAgICAgSGFybW9ueS5BTkFMT0dPVVMsXG4gICAgICAgIChjb2xvciwgbW9kZSkgPT4gaGFybW9ueShjb2xvciwgWzMwLCAtMzBdLCBtb2RlKVxuICAgIF0sXG4gICAgW1xuICAgICAgICBIYXJtb255LkNPTVBMRU1FTlRBUlksXG4gICAgICAgIChjb2xvciwgbW9kZSkgPT4gaGFybW9ueShjb2xvciwgWzE4MF0sIG1vZGUpXG4gICAgXSxcbiAgICBbXG4gICAgICAgIEhhcm1vbnkuU1BMSVRfQ09NUExFTUVOVEFSWSxcbiAgICAgICAgKGNvbG9yLCBtb2RlKSA9PiBoYXJtb255KGNvbG9yLCBbMTUwLCAtMTUwXSwgbW9kZSlcbiAgICBdLFxuICAgIFtcbiAgICAgICAgSGFybW9ueS5UUklBRElDLFxuICAgICAgICAoY29sb3IsIG1vZGUpID0+IGhhcm1vbnkoY29sb3IsIFsxMjAsIC0xMjBdLCBtb2RlKVxuICAgIF0sXG4gICAgW1xuICAgICAgICBIYXJtb255LlRFVFJBRElDLFxuICAgICAgICAoY29sb3IsIG1vZGUpID0+IGhhcm1vbnkoY29sb3IsIFs2MCwgLTEyMCwgMTgwXSwgbW9kZSlcbiAgICBdLFxuICAgIFtcbiAgICAgICAgSGFybW9ueS5TUVVBUkUsXG4gICAgICAgIChjb2xvciwgbW9kZSkgPT4gaGFybW9ueShjb2xvciwgWzkwLCAtOTAsIDE4MF0sIG1vZGUpXG4gICAgXVxuXSk7XG5leHBvcnQgY29uc3QgZ2V0SGFybW9ueVJldHVybiA9IChjb2xvciwgaGFybW9ueSwgbW9kZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgaGFybW9ueUZ1bmN0aW9uID0gSEFSTU9OSUVTLmdldChoYXJtb255KTtcbiAgICBjb25zdCBpc0NTUyA9IGlzU3RyaW5nKGNvbG9yKTtcbiAgICBjb25zdCBwYXJzZXIgPSBjb2xvclBhcnNlckNvbnRleHQuZ2V0UGFyc2VyKGNvbG9yKTtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlci5tb2RlbDtcbiAgICBjb25zdCB3aXRoQWxwaGEgPSBwYXJzZXIuaGFzQWxwaGEoY29sb3IpO1xuICAgIGNvbnN0IGhzbCA9IGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KGNvbG9yLCBDb2xvck1vZGVsLkhTTCk7XG4gICAgY29uc3QgYXJyYXkgPSBoYXJtb255RnVuY3Rpb24oaHNsLCBtb2RlKTtcbiAgICBpZiAoaXNDU1MpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcCgoaGFybW9ueUNvbG9yKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoaGFybW9ueUNvbG9yLCBtb2RlbCwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgd2l0aEFscGhhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5tYXAoKGhhcm1vbnlDb2xvcikgPT4ge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoaGFybW9ueUNvbG9yLCBtb2RlbCwgb3B0aW9ucy5kZWNpbWFscywgd2l0aEFscGhhKTtcbiAgICB9KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0SGFybW9ueVJldHVyblBhcmFtZXRlcnMgPSAoc2Vjb25kUGFyYW0sIHRoaXJkUGFyYW0sIGZvdXJ0aFBhcmFtKSA9PiB7XG4gICAgaWYgKGlzSGFybW9ueShzZWNvbmRQYXJhbSkpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHNlY29uZFBhcmFtLFxuICAgICAgICAgICAgaXNNaXgodGhpcmRQYXJhbSlcbiAgICAgICAgICAgICAgICA/IHRoaXJkUGFyYW1cbiAgICAgICAgICAgICAgICA6IE1peC5BRERJVElWRSxcbiAgICAgICAgICAgIGlzTWl4KHRoaXJkUGFyYW0pXG4gICAgICAgICAgICAgICAgPyBmb3VydGhQYXJhbVxuICAgICAgICAgICAgICAgIDogdGhpcmRQYXJhbVxuICAgICAgICBdO1xuICAgIH1cbiAgICBpZiAoaXNNaXgoc2Vjb25kUGFyYW0pKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBIYXJtb255LkNPTVBMRU1FTlRBUlksXG4gICAgICAgICAgICBzZWNvbmRQYXJhbSxcbiAgICAgICAgICAgIHRoaXJkUGFyYW1cbiAgICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgICAgSGFybW9ueS5DT01QTEVNRU5UQVJZLFxuICAgICAgICBNaXguQURESVRJVkUsXG4gICAgICAgIHNlY29uZFBhcmFtXG4gICAgXTtcbn07XG4iLCJpbXBvcnQgeyBCQVNFXzI1NSwgQ29sb3JNb2RlbCwgTUFYX0FMUEhBLCBNQVhfTEFCLCBNQVhfTENIX0MsIE1BWF9QQ0VOVCwgTWl4IH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyBjbXlrVG9SZ2IsIGhzbFRvUmdiLCBod2JUb1JnYiwgbGFiVG9MY2gsIGxhYlRvUmdiLCBsY2hUb0xhYiwgbGNoVG9SZ2IsIHJnYlRvQ215aywgcmdiVG9Ic2wsIHJnYlRvSHdiLCByZ2JUb0xhYiwgcmdiVG9MY2ggfSBmcm9tICcjY29sb3IvdHJhbnNsYXRvcnMnO1xuaW1wb3J0IHsgZ2V0Q29sb3JNb2RlbCwgbWlubWF4LCBub3JtYWxpemVIdWUsIHJvdW5kIH0gZnJvbSAnI3V0aWxpdGllcyc7XG5pbXBvcnQgeyBjb2xvclBhcnNlckNvbnRleHQsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dCB9IGZyb20gJyNwYXJzZXJzJztcbmltcG9ydCB7IGdldEJsZW5kUmV0dXJuLCBnZXRCbGVuZFJldHVyblBhcmFtcywgZ2V0TWl4UmV0dXJuLCBnZXRNaXhSZXR1cm5QYXJhbWV0ZXJzLCBnZXRTaGFkZXNPclRpbnRzUmV0dXJuLCBnZXRTaGFkZXNPclRpbnRzUmV0dXJuUGFyYW1ldGVycywgZ2V0SGFybW9ueVJldHVybiwgZ2V0SGFybW9ueVJldHVyblBhcmFtZXRlcnMgfSBmcm9tICcjcmV0dXJucyc7XG5leHBvcnQgY2xhc3MgQ29sb3JUcmFuc2xhdG9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpO1xuICAgICAgICBjb25zdCBwYXJzZWRDb2xvciA9IGNvbG9yUGFyc2VyQ29udGV4dC5wYXJzZShjb2xvcik7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gZ2V0Q29sb3JNb2RlbChwYXJzZWRDb2xvcik7XG4gICAgICAgIHN3aXRjaCAobW9kZWwpIHtcbiAgICAgICAgICAgIGNhc2UgQ29sb3JNb2RlbC5IU0w6XG4gICAgICAgICAgICAgICAgdGhpcy5oc2wgPSBwYXJzZWRDb2xvcjtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgnaHNsJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbG9yTW9kZWwuSFdCOlxuICAgICAgICAgICAgICAgIHRoaXMuaHdiID0gcGFyc2VkQ29sb3I7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSR0JGcm9tSFdCKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoJ2h3YicsICdyZ2InKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ29sb3JNb2RlbC5DSUVMYWI6XG4gICAgICAgICAgICAgICAgdGhpcy5sYWIgPSBwYXJzZWRDb2xvcjtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21MQUIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgnbGFiJywgJ3JnYicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb2xvck1vZGVsLkxDSDpcbiAgICAgICAgICAgICAgICB0aGlzLmxjaCA9IHBhcnNlZENvbG9yO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUxDSCgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCdsY2gnLCAncmdiJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbG9yTW9kZWwuQ01ZSzpcbiAgICAgICAgICAgICAgICB0aGlzLmNteWsgPSBwYXJzZWRDb2xvcjtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21DTVlLKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoJ2NteWsnLCAncmdiJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMucmdiID0gcGFyc2VkQ29sb3I7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSguLi5leGNsdWRlKSB7XG4gICAgICAgIGlmICghZXhjbHVkZS5pbmNsdWRlcygncmdiJykpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUkdCKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFleGNsdWRlLmluY2x1ZGVzKCdoc2wnKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVIU0woKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4Y2x1ZGUuaW5jbHVkZXMoJ2h3YicpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhXQigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhjbHVkZS5pbmNsdWRlcygnbGFiJykpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTEFCKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFleGNsdWRlLmluY2x1ZGVzKCdsY2gnKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMQ0goKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4Y2x1ZGUuaW5jbHVkZXMoJ2NteWsnKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDTVlLKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlUkdCKCkge1xuICAgICAgICB0aGlzLnJnYiA9IHtcbiAgICAgICAgICAgIC4uLmhzbFRvUmdiKHRoaXMuaHNsLkgsIHRoaXMuaHNsLlMsIHRoaXMuaHNsLkwpLFxuICAgICAgICAgICAgQTogdGhpcy5oc2wuQSA/PyAxXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZUhTTCgpIHtcbiAgICAgICAgdGhpcy5oc2wgPSByZ2JUb0hzbCh0aGlzLnJnYi5SLCB0aGlzLnJnYi5HLCB0aGlzLnJnYi5CLCB0aGlzLnJnYi5BKTtcbiAgICB9XG4gICAgdXBkYXRlSFdCKCkge1xuICAgICAgICB0aGlzLmh3YiA9IHJnYlRvSHdiKHRoaXMucmdiLlIsIHRoaXMucmdiLkcsIHRoaXMucmdiLkIsIHRoaXMucmdiLkEpO1xuICAgIH1cbiAgICB1cGRhdGVMQUIoKSB7XG4gICAgICAgIHRoaXMubGFiID0ge1xuICAgICAgICAgICAgLi4ucmdiVG9MYWIodGhpcy5yZ2IuUiwgdGhpcy5yZ2IuRywgdGhpcy5yZ2IuQiksXG4gICAgICAgICAgICBBOiB0aGlzLnJnYi5BID8/IDFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlTENIKCkge1xuICAgICAgICB0aGlzLmxjaCA9IHtcbiAgICAgICAgICAgIC4uLnJnYlRvTGNoKHRoaXMucmdiLlIsIHRoaXMucmdiLkcsIHRoaXMucmdiLkIpLFxuICAgICAgICAgICAgQTogdGhpcy5yZ2IuQSA/PyAxXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZUNNWUsoKSB7XG4gICAgICAgIHRoaXMuY215ayA9IHtcbiAgICAgICAgICAgIC4uLnJnYlRvQ215ayh0aGlzLnJnYi5SLCB0aGlzLnJnYi5HLCB0aGlzLnJnYi5CKSxcbiAgICAgICAgICAgIEE6IHRoaXMucmdiLkEgPz8gMVxuICAgICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGVSR0JGcm9tSFdCKCkge1xuICAgICAgICB0aGlzLnJnYiA9IHtcbiAgICAgICAgICAgIC4uLmh3YlRvUmdiKHRoaXMuaHdiLkgsIHRoaXMuaHdiLlcsIHRoaXMuaHdiLkIpLFxuICAgICAgICAgICAgQTogdGhpcy5od2I/LkEgPz8gMVxuICAgICAgICB9O1xuICAgIH1cbiAgICB1cGRhdGVSR0JGcm9tTENIKCkge1xuICAgICAgICB0aGlzLnJnYiA9IHtcbiAgICAgICAgICAgIC4uLmxjaFRvUmdiKHRoaXMubGNoLkwsIHRoaXMubGNoLkMsIHRoaXMubGNoLkgpLFxuICAgICAgICAgICAgQTogdGhpcy5sY2guQSA/PyAxXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZVJHQkZyb21DTVlLKCkge1xuICAgICAgICB0aGlzLnJnYiA9IHtcbiAgICAgICAgICAgIC4uLmNteWtUb1JnYih0aGlzLmNteWsuQywgdGhpcy5jbXlrLk0sIHRoaXMuY215ay5ZLCB0aGlzLmNteWsuSyksXG4gICAgICAgICAgICBBOiB0aGlzLmNteWsuQSA/PyAxXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZVJHQkZyb21MQUIoKSB7XG4gICAgICAgIHRoaXMucmdiID0ge1xuICAgICAgICAgICAgLi4ubGFiVG9SZ2IodGhpcy5sYWIuTCwgdGhpcy5sYWIuYSwgdGhpcy5sYWIuYiksXG4gICAgICAgICAgICBBOiB0aGlzLmxhYi5BID8/IDFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlTENIRnJvbUxBQigpIHtcbiAgICAgICAgdGhpcy5sY2ggPSB7XG4gICAgICAgICAgICAuLi5sYWJUb0xjaCh0aGlzLmxhYi5MLCB0aGlzLmxhYi5hLCB0aGlzLmxhYi5iKSxcbiAgICAgICAgICAgIEE6IHRoaXMubGFiLkFcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlTEFCcm9tTENIKCkge1xuICAgICAgICB0aGlzLmxhYiA9IHtcbiAgICAgICAgICAgIC4uLmxjaFRvTGFiKHRoaXMubGNoLkwsIHRoaXMubGNoLkMsIHRoaXMubGNoLkgpLFxuICAgICAgICAgICAgQTogdGhpcy5sY2guQVxuICAgICAgICB9O1xuICAgIH1cbiAgICBzZXRPcHRpb25zKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fb3B0aW9ucyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNldFIoUikge1xuICAgICAgICB0aGlzLnJnYi5SID0gbWlubWF4KFIsIDAsIEJBU0VfMjU1KTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0RyhHKSB7XG4gICAgICAgIHRoaXMucmdiLkcgPSBtaW5tYXgoRywgMCwgQkFTRV8yNTUpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgncmdiJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRCKEIpIHtcbiAgICAgICAgdGhpcy5yZ2IuQiA9IG1pbm1heChCLCAwLCBCQVNFXzI1NSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCdyZ2InKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNldEgoSCkge1xuICAgICAgICB0aGlzLmhzbC5IID0gbm9ybWFsaXplSHVlKEgpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgnaHNsJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRTKFMpIHtcbiAgICAgICAgdGhpcy5oc2wuUyA9IG1pbm1heChTLCAwLCBNQVhfUENFTlQpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgnaHNsJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRMKEwpIHtcbiAgICAgICAgdGhpcy5oc2wuTCA9IG1pbm1heChMLCAwLCBNQVhfUENFTlQpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgnaHNsJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRXaGl0ZW5lc3MoVykge1xuICAgICAgICB0aGlzLmh3Yi5XID0gbWlubWF4KFcsIDAsIE1BWF9QQ0VOVCk7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUhXQigpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgncmdiJywgJ2h3YicpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0QmxhY2tuZXNzKEIpIHtcbiAgICAgICAgdGhpcy5od2IuQiA9IG1pbm1heChCLCAwLCBNQVhfUENFTlQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21IV0IoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdod2InKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNldENJRUwoTCkge1xuICAgICAgICB0aGlzLmxhYi5MID0gbWlubWF4KEwsIDAsIE1BWF9QQ0VOVCk7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUxBQigpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxDSEZyb21MQUIoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRDSUVhKGEpIHtcbiAgICAgICAgdGhpcy5sYWIuYSA9IG1pbm1heChhLCAtTUFYX0xBQiwgTUFYX0xBQik7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUxBQigpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxDSEZyb21MQUIoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRDSUViKGIpIHtcbiAgICAgICAgdGhpcy5sYWIuYiA9IG1pbm1heChiLCAtTUFYX0xBQiwgTUFYX0xBQik7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUxBQigpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxDSEZyb21MQUIoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRMQ0hMKGwpIHtcbiAgICAgICAgdGhpcy5sY2guTCA9IG1pbm1heChsLCAwLCBNQVhfUENFTlQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21MQ0goKTtcbiAgICAgICAgdGhpcy51cGRhdGVMQUJyb21MQ0goKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRMQ0hDKGMpIHtcbiAgICAgICAgdGhpcy5sY2guQyA9IG1pbm1heChjLCAwLCBNQVhfTENIX0MpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21MQ0goKTtcbiAgICAgICAgdGhpcy51cGRhdGVMQUJyb21MQ0goKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ3JnYicsICdsYWInLCAnbGNoJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRMQ0hIKGgpIHtcbiAgICAgICAgdGhpcy5sY2guSCA9IG5vcm1hbGl6ZUh1ZShoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSR0JGcm9tTENIKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTEFCcm9tTENIKCk7XG4gICAgICAgIHRoaXMudXBkYXRlKCdyZ2InLCAnbGFiJywgJ2xjaCcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0QShBKSB7XG4gICAgICAgIGNvbnN0IGFscGhhID0gbWlubWF4KEEsIDAsIE1BWF9BTFBIQSk7XG4gICAgICAgIHRoaXMucmdiLkEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5oc2wuQSA9IGFscGhhO1xuICAgICAgICB0aGlzLmh3Yi5BID0gYWxwaGE7XG4gICAgICAgIHRoaXMubGFiLkEgPSBhbHBoYTtcbiAgICAgICAgdGhpcy5sY2guQSA9IGFscGhhO1xuICAgICAgICB0aGlzLmNteWsuQSA9IGFscGhhO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0QyhDKSB7XG4gICAgICAgIHRoaXMuY215ay5DID0gbWlubWF4KEMsIDAsIDEwMCk7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUNNWUsoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ2NteWsnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNldE0oTSkge1xuICAgICAgICB0aGlzLmNteWsuTSA9IG1pbm1heChNLCAwLCAxMDApO1xuICAgICAgICB0aGlzLnVwZGF0ZVJHQkZyb21DTVlLKCk7XG4gICAgICAgIHRoaXMudXBkYXRlKCdjbXlrJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRZKFkpIHtcbiAgICAgICAgdGhpcy5jbXlrLlkgPSBtaW5tYXgoWSwgMCwgMTAwKTtcbiAgICAgICAgdGhpcy51cGRhdGVSR0JGcm9tQ01ZSygpO1xuICAgICAgICB0aGlzLnVwZGF0ZSgnY215aycpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0SyhLKSB7XG4gICAgICAgIHRoaXMuY215ay5LID0gbWlubWF4KEssIDAsIDEwMCk7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUNNWUsoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoJ2NteWsnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IFIoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLnJnYi5SLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgRygpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMucmdiLkcsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBCKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5yZ2IuQiwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IEgoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmhzbC5ILCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgUygpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHNsLlMsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBMKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5oc2wuTCwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IFdoaXRlbmVzcygpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHdiLlcsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBCbGFja25lc3MoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmh3Yi5CLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgQ0lFTCgpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMubGFiLkwsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBDSUVhKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5sYWIuYSwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IENJRWIoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmxhYi5iLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgTENITCgpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMubGNoLkwsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBMQ0hDKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5sY2guQywgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IExDSEgoKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmxjaC5ILCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgQSgpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHNsLkEsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBDKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLkMsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBNKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLk0sIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBZKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLlksIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBLKCkge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLkssIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBIRVhPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLnJnYiwgQ29sb3JNb2RlbC5IRVgpO1xuICAgIH1cbiAgICBnZXQgSEVYQU9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KHRoaXMucmdiLCBDb2xvck1vZGVsLkhFWCwgMCwgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBSR0JPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLnJnYiwgQ29sb3JNb2RlbC5SR0IsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBSR0JBT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5yZ2IsIENvbG9yTW9kZWwuUkdCLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBnZXQgSFNMT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5oc2wsIENvbG9yTW9kZWwuSFNMLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgSFNMQU9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KHRoaXMuaHNsLCBDb2xvck1vZGVsLkhTTCwgdGhpcy5vcHRpb25zLmRlY2ltYWxzLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0IEhXQk9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KHRoaXMuaHdiLCBDb2xvck1vZGVsLkhXQiwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IEhXQkFPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLmh3YiwgQ29sb3JNb2RlbC5IV0IsIHRoaXMub3B0aW9ucy5kZWNpbWFscywgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBDSUVMYWJPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLmxhYiwgQ29sb3JNb2RlbC5DSUVMYWIsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIGdldCBDSUVMYWJBT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5sYWIsIENvbG9yTW9kZWwuQ0lFTGFiLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBnZXQgTENIT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5sY2gsIENvbG9yTW9kZWwuTENILCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBnZXQgTENIQU9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KHRoaXMubGNoLCBDb2xvck1vZGVsLkxDSCwgdGhpcy5vcHRpb25zLmRlY2ltYWxzLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0IENNWUtPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydCh0aGlzLmNteWssIENvbG9yTW9kZWwuQ01ZSywgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICB9XG4gICAgZ2V0IENNWUtBT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQodGhpcy5jbXlrLCBDb2xvck1vZGVsLkNNWUssIHRoaXMub3B0aW9ucy5kZWNpbWFscywgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBIRVgoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyh0aGlzLnJnYiwgQ29sb3JNb2RlbC5IRVgpO1xuICAgIH1cbiAgICBnZXQgSEVYQSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMucmdiLCBDb2xvck1vZGVsLkhFWCwge30sIHRydWUpO1xuICAgIH1cbiAgICBnZXQgUkdCKCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1ModGhpcy5yZ2IsIENvbG9yTW9kZWwuUkdCLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgUkdCQSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMucmdiLCBDb2xvck1vZGVsLlJHQiwgdGhpcy5vcHRpb25zLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0IEhTTCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMuaHNsLCBDb2xvck1vZGVsLkhTTCwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0IEhTTEEoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyh0aGlzLmhzbCwgQ29sb3JNb2RlbC5IU0wsIHRoaXMub3B0aW9ucywgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBIV0IoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyh0aGlzLmh3YiwgQ29sb3JNb2RlbC5IV0IsIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIGdldCBIV0JBKCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1ModGhpcy5od2IsIENvbG9yTW9kZWwuSFdCLCB0aGlzLm9wdGlvbnMsIHRydWUpO1xuICAgIH1cbiAgICBnZXQgQ0lFTGFiKCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1ModGhpcy5sYWIsIENvbG9yTW9kZWwuQ0lFTGFiLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgQ0lFTGFiQSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMubGFiLCBDb2xvck1vZGVsLkNJRUxhYiwgdGhpcy5vcHRpb25zLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0IExDSCgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMubGNoLCBDb2xvck1vZGVsLkxDSCwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0IExDSEEoKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyh0aGlzLmxjaCwgQ29sb3JNb2RlbC5MQ0gsIHRoaXMub3B0aW9ucywgdHJ1ZSk7XG4gICAgfVxuICAgIGdldCBDTVlLKCkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1ModGhpcy5jbXlrLCBDb2xvck1vZGVsLkNNWUssIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIGdldCBDTVlLQSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKHRoaXMuY215aywgQ29sb3JNb2RlbC5DTVlLLCB0aGlzLm9wdGlvbnMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IRVhPYmplY3QoY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KGNvbG9yLCBDb2xvck1vZGVsLkhFWCk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0hFWChjb2xvcikge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuSEVYKTtcbiAgICB9XG4gICAgc3RhdGljIHRvSEVYQU9iamVjdChjb2xvcikge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoY29sb3IsIENvbG9yTW9kZWwuSEVYLCB1bmRlZmluZWQsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IRVhBKGNvbG9yKSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyhjb2xvciwgQ29sb3JNb2RlbC5IRVgsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b1JHQk9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5SR0IsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9SR0IoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuUkdCLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvUkdCQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5SR0IsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9SR0JBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLlJHQiwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0hTTE9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IU0wsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IU0woY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuSFNMLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvSFNMQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IU0wsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IU0xBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLkhTTCwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0hXQk9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IV0IsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IV0IoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuSFdCLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvSFdCQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5IV0IsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9IV0JBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLkhXQiwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0NJRUxhYk9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5DSUVMYWIsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9DSUVMYWIoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuQ0lFTGFiLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvQ0lFTGFiQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5DSUVMYWIsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9DSUVMYWJBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLkNJRUxhYiwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0xDSE9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5MQ0gsIG9wdGlvbnMuZGVjaW1hbHMpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9MQ0goY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuTENILCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9XG4gICAgc3RhdGljIHRvTENIQU9iamVjdChjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydChjb2xvciwgQ29sb3JNb2RlbC5MQ0gsIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9MQ0hBKGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0Q1NTKGNvbG9yLCBDb2xvck1vZGVsLkxDSCwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0NNWUtPYmplY3QoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnQoY29sb3IsIENvbG9yTW9kZWwuQ01ZSywgb3B0aW9ucy5kZWNpbWFscyk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0NNWUsoY29sb3IsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gY29sb3JQYXJzZXJDb250ZXh0LmNvbnZlcnRDU1MoY29sb3IsIENvbG9yTW9kZWwuQ01ZSywgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0NNWUtBT2JqZWN0KGNvbG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGFyc2VyQ29udGV4dC5jb252ZXJ0KGNvbG9yLCBDb2xvck1vZGVsLkNNWUssIG9wdGlvbnMuZGVjaW1hbHMsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9DTVlLQShjb2xvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBjb2xvclBhcnNlckNvbnRleHQuY29udmVydENTUyhjb2xvciwgQ29sb3JNb2RlbC5DTVlLLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpLCB0cnVlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kSEVYT2JqZWN0KGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSEVYLCBmYWxzZSwgZmFsc2UsIHN0ZXBzKTtcbiAgICB9XG4gICAgc3RhdGljIGdldEJsZW5kSEVYKGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSEVYLCB0cnVlLCBmYWxzZSwgc3RlcHMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0QmxlbmRIRVhBT2JqZWN0KGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSEVYLCBmYWxzZSwgdHJ1ZSwgc3RlcHMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0QmxlbmRIRVhBKGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSEVYLCB0cnVlLCB0cnVlLCBzdGVwcyk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaGFkZXMoY29sb3IsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGdldFNoYWRlc09yVGludHNSZXR1cm4odHJ1ZSwgY29sb3IsIC4uLmdldFNoYWRlc09yVGludHNSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFRpbnRzKGNvbG9yLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRTaGFkZXNPclRpbnRzUmV0dXJuKGZhbHNlLCBjb2xvciwgLi4uZ2V0U2hhZGVzT3JUaW50c1JldHVyblBhcmFtZXRlcnMoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SGFybW9ueShjb2xvciwgc2Vjb25kUGFyYW0sIHRoaXJkUGFyYW0sIGZvdXJ0aFBhcmFtKSB7XG4gICAgICAgIHJldHVybiBnZXRIYXJtb255UmV0dXJuKGNvbG9yLCAuLi5nZXRIYXJtb255UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbSwgdGhpcmRQYXJhbSwgZm91cnRoUGFyYW0pKTtcbiAgICB9XG59XG5Db2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRSR0JPYmplY3QgPSAoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpID0+IGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLlJHQiwgZmFsc2UsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRSR0IgPSAoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpID0+IGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLlJHQiwgdHJ1ZSwgZmFsc2UsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRCbGVuZFJHQkFPYmplY3QgPSAoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpID0+IGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLlJHQiwgZmFsc2UsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRCbGVuZFJHQkEgPSAoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpID0+IGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLlJHQiwgdHJ1ZSwgdHJ1ZSwgLi4uZ2V0QmxlbmRSZXR1cm5QYXJhbXModGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSFNMT2JqZWN0ID0gKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5IU0wsIGZhbHNlLCBmYWxzZSwgLi4uZ2V0QmxlbmRSZXR1cm5QYXJhbXModGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSFNMID0gKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5IU0wsIHRydWUsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIU0xBT2JqZWN0ID0gKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5IU0wsIGZhbHNlLCB0cnVlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIU0xBID0gKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5IU0wsIHRydWUsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhXQk9iamVjdCA9IChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikgPT4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSFdCLCBmYWxzZSwgZmFsc2UsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhXQiA9IChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikgPT4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSFdCLCB0cnVlLCBmYWxzZSwgLi4uZ2V0QmxlbmRSZXR1cm5QYXJhbXModGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSFdCQU9iamVjdCA9IChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikgPT4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSFdCLCBmYWxzZSwgdHJ1ZSwgLi4uZ2V0QmxlbmRSZXR1cm5QYXJhbXModGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSFdCQSA9IChmcm9tLCB0bywgdGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikgPT4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIENvbG9yTW9kZWwuSFdCLCB0cnVlLCB0cnVlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRDSUVMYWJPYmplY3QgPSAoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpID0+IGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLkNJRUxhYiwgZmFsc2UsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRDSUVMYWIgPSAoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpID0+IGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLkNJRUxhYiwgdHJ1ZSwgZmFsc2UsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRCbGVuZENJRUxhYkFPYmplY3QgPSAoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpID0+IGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLkNJRUxhYiwgZmFsc2UsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRCbGVuZENJRUxhYkEgPSAoZnJvbSwgdG8sIHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpID0+IGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBDb2xvck1vZGVsLkNJRUxhYiwgdHJ1ZSwgdHJ1ZSwgLi4uZ2V0QmxlbmRSZXR1cm5QYXJhbXModGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kTENIT2JqZWN0ID0gKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5MQ0gsIGZhbHNlLCBmYWxzZSwgLi4uZ2V0QmxlbmRSZXR1cm5QYXJhbXModGhpcmRQYXJhbWV0ZXIsIGZvdXJ0aFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kTENIID0gKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5MQ0gsIHRydWUsIGZhbHNlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRMQ0hBT2JqZWN0ID0gKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5MQ0gsIGZhbHNlLCB0cnVlLCAuLi5nZXRCbGVuZFJldHVyblBhcmFtcyh0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRMQ0hBID0gKGZyb20sIHRvLCB0aGlyZFBhcmFtZXRlciwgZm91cnRoUGFyYW1ldGVyKSA9PiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgQ29sb3JNb2RlbC5MQ0gsIHRydWUsIHRydWUsIC4uLmdldEJsZW5kUmV0dXJuUGFyYW1zKHRoaXJkUGFyYW1ldGVyLCBmb3VydGhQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRNaXhIRVhPYmplY3QgPSAoY29sb3JzLCBtb2RlKSA9PiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhFWCwgZmFsc2UsIGZhbHNlLCBtb2RlKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRNaXhIRVggPSAoY29sb3JzLCBtb2RlID0gTWl4LkFERElUSVZFKSA9PiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhFWCwgdHJ1ZSwgZmFsc2UsIG1vZGUpO1xuQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWEFPYmplY3QgPSAoY29sb3JzLCBtb2RlID0gTWl4LkFERElUSVZFKSA9PiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhFWCwgZmFsc2UsIHRydWUsIG1vZGUpO1xuQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWEEgPSAoY29sb3JzLCBtb2RlID0gTWl4LkFERElUSVZFKSA9PiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhFWCwgdHJ1ZSwgdHJ1ZSwgbW9kZSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0TWl4UkdCT2JqZWN0ID0gKGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5SR0IsIGZhbHNlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0TWl4UkdCID0gKGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5SR0IsIHRydWUsIGZhbHNlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRNaXhSR0JBT2JqZWN0ID0gKGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5SR0IsIGZhbHNlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRNaXhSR0JBID0gKGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5SR0IsIHRydWUsIHRydWUsIC4uLmdldE1peFJldHVyblBhcmFtZXRlcnMoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldE1peEhTTE9iamVjdCA9IChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuSFNMLCBmYWxzZSwgZmFsc2UsIC4uLmdldE1peFJldHVyblBhcmFtZXRlcnMoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldE1peEhTTCA9IChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuSFNMLCB0cnVlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0TWl4SFNMQU9iamVjdCA9IChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuSFNMLCBmYWxzZSwgdHJ1ZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0TWl4SFNMQSA9IChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuSFNMLCB0cnVlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRNaXhIV0JPYmplY3QgPSAoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSA9PiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhXQiwgZmFsc2UsIGZhbHNlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRNaXhIV0IgPSAoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSA9PiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhXQiwgdHJ1ZSwgZmFsc2UsIC4uLmdldE1peFJldHVyblBhcmFtZXRlcnMoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldE1peEhXQkFPYmplY3QgPSAoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSA9PiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhXQiwgZmFsc2UsIHRydWUsIC4uLmdldE1peFJldHVyblBhcmFtZXRlcnMoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldE1peEhXQkEgPSAoY29sb3JzLCBzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSA9PiBnZXRNaXhSZXR1cm4oY29sb3JzLCBDb2xvck1vZGVsLkhXQiwgdHJ1ZSwgdHJ1ZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0TWl4Q0lFTGFiT2JqZWN0ID0gKGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5DSUVMYWIsIGZhbHNlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0TWl4Q0lFTGFiID0gKGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5DSUVMYWIsIHRydWUsIGZhbHNlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRNaXhDSUVMYWJBT2JqZWN0ID0gKGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5DSUVMYWIsIGZhbHNlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbkNvbG9yVHJhbnNsYXRvci5nZXRNaXhDSUVMYWJBID0gKGNvbG9ycywgc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikgPT4gZ2V0TWl4UmV0dXJuKGNvbG9ycywgQ29sb3JNb2RlbC5DSUVMYWIsIHRydWUsIHRydWUsIC4uLmdldE1peFJldHVyblBhcmFtZXRlcnMoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldE1peExDSE9iamVjdCA9IChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuTENILCBmYWxzZSwgZmFsc2UsIC4uLmdldE1peFJldHVyblBhcmFtZXRlcnMoc2Vjb25kUGFyYW1ldGVyLCB0aGlyZFBhcmFtZXRlcikpO1xuQ29sb3JUcmFuc2xhdG9yLmdldE1peExDSCA9IChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuTENILCB0cnVlLCBmYWxzZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0TWl4TENIQU9iamVjdCA9IChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuTENILCBmYWxzZSwgdHJ1ZSwgLi4uZ2V0TWl4UmV0dXJuUGFyYW1ldGVycyhzZWNvbmRQYXJhbWV0ZXIsIHRoaXJkUGFyYW1ldGVyKSk7XG5Db2xvclRyYW5zbGF0b3IuZ2V0TWl4TENIQSA9IChjb2xvcnMsIHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpID0+IGdldE1peFJldHVybihjb2xvcnMsIENvbG9yTW9kZWwuTENILCB0cnVlLCB0cnVlLCAuLi5nZXRNaXhSZXR1cm5QYXJhbWV0ZXJzKHNlY29uZFBhcmFtZXRlciwgdGhpcmRQYXJhbWV0ZXIpKTtcbiIsImV4cG9ydCB7IEhhcm1vbnksIE1peCB9IGZyb20gJyNjb25zdGFudHMnO1xuZXhwb3J0IHsgQ29sb3JUcmFuc2xhdG9yIH0gZnJvbSAnI2NsYXNzZXMvQ29sb3JUcmFuc2xhdG9yJztcbiIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGNvbG9yID0gbmV3IENvbG9yVHJhbnNsYXRvcignaHNsKDE4MCAxMDAlIDUwJSknLCB7IGRlY2ltYWxzOiAwIH0pO1xuXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgMTA7IHJvdysrKSB7XG5cbiAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgMTA7IGNvbCsrKSB7XG5cbiAgICAgICAgICAgIGNvbG9yXG4gICAgICAgICAgICAgICAgLnNldFMocm93ICogMTApXG4gICAgICAgICAgICAgICAgLnNldEwoY29sICogNSArIDMwKTtcblxuICAgICAgICAgICAgY29uc3QgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCdib3gnKTtcbiAgICAgICAgICAgIGJveC5zdHlsZS5iYWNrZ3JvdW5kID0gY29sb3IuSEVYO1xuXG4gICAgICAgICAgICBib3guaW5uZXJUZXh0ID1cbiAgICAgICAgICAgICAgICBgUjoke2NvbG9yLlJ9XG4gICAgICAgICAgICAgICAgIEc6JHtjb2xvci5HfVxuICAgICAgICAgICAgICAgICBCOiR7Y29sb3IuQn1gO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJveCk7XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvcikgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgY29sb3IgPSBuZXcgQ29sb3JUcmFuc2xhdG9yKHsgUjogMjU1LCBHOiAwLCBCOiAwIH0pO1xuICAgIGNvbnN0IGh1ZSA9IFswLCAzMCwgNjAsIDEyMCwgMjQwLCAyODAsIDMyMCwgMF07XG4gICAgbGV0IHJhaW5ib3c7XG5cbiAgICBmb3IgKGxldCByID0gMDsgciA8IGh1ZS5sZW5ndGg7IHIrKykge1xuXG4gICAgICAgIGNvbG9yLnNldEgoaHVlW3JdKTtcblxuICAgICAgICBjb25zdCBib3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBib3cuY2xhc3NMaXN0LmFkZCgncmFpbmJvdycpO1xuICAgICAgICBib3cuc3R5bGUuYmFja2dyb3VuZCA9IGNvbG9yLkhFWDtcblxuICAgICAgICBpZiAocmFpbmJvdykge1xuICAgICAgICAgICAgcmFpbmJvdy5hcHBlbmRDaGlsZChib3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICByYWluYm93ID0gYm93O1xuICAgIH1cblxuICAgIHJhaW5ib3cuc3R5bGUuYmFja2dyb3VuZCA9ICcjMzMzJztcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvcikgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgaHNsID0geyBIOiAwLCBTOiAnOTAlJywgTDogJzUwJScgfTtcbiAgICBjb25zdCBodWUgPSBbdW5kZWZpbmVkLCA1NSwgMzAsIDAsIDI5MCwgMjIwLCAxMzBdO1xuICAgIGNvbnN0IHRvdGFsID0gaHVlLmxlbmd0aDtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRvdGFsOyByb3crKykge1xuXG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHRvdGFsOyBjb2wrKykge1xuXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0b3RhbCAtIHJvdyArIGNvbDtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSB0b3RhbCkge1xuICAgICAgICAgICAgICAgIGluZGV4IC09IHRvdGFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHNsLkggPSBodWVbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgcmdiID0gaHVlW2luZGV4XSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyAnI0ZGRidcbiAgICAgICAgICAgICAgICA6IENvbG9yVHJhbnNsYXRvci50b0hFWChoc2wpO1xuICAgICAgICAgICAgY29uc3QgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCdmbGFnJyk7XG4gICAgICAgICAgICBib3guc3R5bGUuYmFja2dyb3VuZCA9IHJnYjtcblxuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJveCk7XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvcikgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgaGV4Q29sb3JzID0gW1xuICAgICAgICAnI0ZFMjcxMicsICcjRkU1NDA5JywgJyNGQjk5MDInLFxuICAgICAgICAnI0ZBQkQwMycsICcjRkZGRTMyJywgJyNEMUVBMkMnLFxuICAgICAgICAnIzY2QjEzMicsICcjMDM5MkNFJywgJyMwMjQ3RkUnLFxuICAgICAgICAnIzNEMDBBNScsICcjODYwMUIwJywgJyNBNzE5NEInXG4gICAgXTtcblxuICAgIGhleENvbG9ycy5mb3JFYWNoKChjb2xvcikgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJnYiA9IENvbG9yVHJhbnNsYXRvci50b1JHQihjb2xvcik7XG4gICAgICAgIGNvbnN0IGhzbCA9IENvbG9yVHJhbnNsYXRvci50b0hTTChjb2xvciwgeyBkZWNpbWFsczogMCB9KTtcbiAgICAgICAgY29uc3QgaHdiID0gQ29sb3JUcmFuc2xhdG9yLnRvSFdCKGNvbG9yLCB7IGRlY2ltYWxzOiAwIH0pO1xuICAgICAgICBjb25zdCBsYWIgPSBDb2xvclRyYW5zbGF0b3IudG9DSUVMYWIoY29sb3IsIHsgZGVjaW1hbHM6IDAgfSk7XG4gICAgICAgIGNvbnN0IGxjaCA9IENvbG9yVHJhbnNsYXRvci50b0xDSChjb2xvciwgeyBkZWNpbWFsczogMCB9KTtcblxuICAgICAgICBjb25zdCByZ2JEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3QgaHNsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnN0IGh3YkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBjb25zdCBsYWJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3QgbGNoRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgcmdiRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHJnYjtcbiAgICAgICAgcmdiRGl2LnRleHRDb250ZW50ID0gcmdiO1xuXG4gICAgICAgIGhzbERpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBoc2w7XG4gICAgICAgIGhzbERpdi50ZXh0Q29udGVudCA9IGhzbDtcblxuICAgICAgICBod2JEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gaHdiO1xuICAgICAgICBod2JEaXYudGV4dENvbnRlbnQgPSBod2I7XG5cbiAgICAgICAgbGFiRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGxhYjtcbiAgICAgICAgbGFiRGl2LnRleHRDb250ZW50ID0gbGFiO1xuXG4gICAgICAgIGxjaERpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBsY2g7XG4gICAgICAgIGxjaERpdi50ZXh0Q29udGVudCA9IGxjaDtcblxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocmdiRGl2KTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGhzbERpdik7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChod2JEaXYpO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobGFiRGl2KTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxjaERpdik7XG5cbiAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvcikgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgY29sb3JzID0gW1xuICAgICAgICAncmVkJyxcbiAgICAgICAgJ2xpbWUnLFxuICAgICAgICAnYmx1ZScsXG4gICAgICAgICdhcXVhJyxcbiAgICAgICAgJ3llbGxvdycsXG4gICAgICAgICdmdWNoc2lhJ1xuICAgIF07XG4gICAgY29uc3QgdG90YWwgPSBjb2xvcnMubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdG90YWw7IHJvdysrKSB7XG5cbiAgICAgICAgY29uc3QgaHNsID0gQ29sb3JUcmFuc2xhdG9yLnRvSFNMT2JqZWN0KGNvbG9yc1tyb3ddKTtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGhzbC5TIC8gKHRvdGFsIC0gMSk7XG5cbiAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgdG90YWw7IGNvbCsrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IENvbG9yVHJhbnNsYXRvci50b0hFWChoc2wpO1xuICAgICAgICAgICAgY29uc3QgY215ayA9IENvbG9yVHJhbnNsYXRvci50b0NNWUtPYmplY3QoaHNsLCB7IGRlY2ltYWxzOiAwIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCdib3gnKTtcbiAgICAgICAgICAgIGJveC5zdHlsZS5iYWNrZ3JvdW5kID0gcmdiO1xuICAgICAgICAgICAgYm94LmlubmVyVGV4dCA9IGBDOiR7Y215ay5DfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNOiR7Y215ay5NfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZOiR7Y215ay5ZfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLOiR7Y215ay5LfWA7XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuXG4gICAgICAgICAgICBoc2wuUyAtPSBzdGVwO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IHJvd3MgPSAxMTtcbiAgICBjb25zdCBtdWx0ID0gMztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG5cbiAgICAgICAgY29uc3QgYmxlbmRzID0gQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSEVYKCcjRjAwJywgJyNGRjAnLCBtdWx0ICsgaSAqIG11bHQpO1xuXG4gICAgICAgIGJsZW5kcy5mb3JFYWNoKChibGVuZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ2JveCcsIGBmaWxlJHtpfWApO1xuICAgICAgICAgICAgYm94LnN0eWxlLmJhY2tncm91bmQgPSBibGVuZDtcbiAgICAgICAgICAgIGJveC5pbm5lclRleHQgPSBpbmRleCArIDE7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYm94KTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgY29uc3QgY29sb3JzID0gWycjRjAwJywgJyNGRjgwMDAnLCAnI0ZGMCcsICcjMEYwJywgJyMwMEYnLCAnI0EwRicsICcjRjBBJ107XG5cbiAgICBjb25zdCBjcmVhdGVCb3ggPSAoY29sb3IsIHR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCdib3gnKTtcbiAgICAgICAgYm94LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgICAgICBpZiAodHlwZSkgYm94LmRhdGFzZXQudHlwZSA9IHR5cGU7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuICAgIH07XG5cbiAgICBjb2xvcnMuZm9yRWFjaCgoY29sb3IpID0+IHtcbiAgICAgICAgY29uc3Qgc2hhZGVzID0gQ29sb3JUcmFuc2xhdG9yLmdldFNoYWRlcyhjb2xvciwgMykucmV2ZXJzZSgpO1xuICAgICAgICBjb25zdCB0aW50cyA9IENvbG9yVHJhbnNsYXRvci5nZXRUaW50cyhjb2xvciwgMyk7XG4gICAgICAgIHNoYWRlcy5mb3JFYWNoKChzaGFkZSkgPT4gY3JlYXRlQm94KHNoYWRlLCAnc2hhZGUnKSk7XG4gICAgICAgIGNyZWF0ZUJveChjb2xvcik7XG4gICAgICAgIHRpbnRzLmZvckVhY2goKHRpbnQpID0+IGNyZWF0ZUJveCh0aW50LCAndGludCcpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGNvbnN0IG1peGVzID0gW1xuICAgICAgICAnI0YwMCcsXG4gICAgICAgICcjMEYwJyxcbiAgICAgICAgJyMwMEYnLFxuICAgICAgICBbMSwgM10sXG4gICAgICAgIFsxLCAyXSxcbiAgICAgICAgWzIsIDNdLFxuICAgICAgICBbMSwgMiwgM11cbiAgICBdO1xuXG4gICAgY29uc3QgZmlsbFBsYW5lcyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcGxhbmVzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJyNwbGFuZXMgcGF0aCcpO1xuICAgICAgICBwbGFuZXMuZm9yRWFjaCgocGxhbmUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgY29sb3IgPSAnI0NDQyc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1peGVzW2luZGV4XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IG1peGVzW2luZGV4XTtcbiAgICAgICAgICAgIH0gZWxzZSBpZihtaXhlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xvcnMgPSBtaXhlc1tpbmRleF0ubWFwKChpKSA9PiBtaXhlc1tpIC0gMV0pO1xuICAgICAgICAgICAgICAgIGNvbG9yID0gbWl4ZXNbaW5kZXhdID0gQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWChjb2xvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGxhbmUuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZmV0Y2goJ2ltYWdlcy9jb2xvci1taXhlcy5zdmcnKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LnRleHQoKSlcbiAgICAgICAgLnRoZW4oKHN2Z0NvZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBzdmdDb2RlO1xuICAgICAgICAgICAgZmlsbFBsYW5lcygpO1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvciwgeyBNaXggfSkgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb25zdCBtaXhlcyA9IFtcbiAgICAgICAgJyNGMDAnLFxuICAgICAgICAnI0ZGMCcsXG4gICAgICAgICcjMDBGJyxcbiAgICAgICAgWzEsIDNdLFxuICAgICAgICBbMSwgMl0sXG4gICAgICAgIFsyLCAzXSxcbiAgICAgICAgWzEsIDIsIDNdXG4gICAgXTtcblxuICAgIGNvbnN0IGZpbGxQbGFuZXMgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYW5lcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcjcGxhbmVzIHBhdGgnKTtcbiAgICAgICAgcGxhbmVzLmZvckVhY2goKHBsYW5lLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbG9yID0gJyNDQ0MnO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtaXhlc1tpbmRleF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IgPSBtaXhlc1tpbmRleF07XG4gICAgICAgICAgICB9IGVsc2UgaWYobWl4ZXNbaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3JzID0gbWl4ZXNbaW5kZXhdLm1hcCgoaSkgPT4gbWl4ZXNbaSAtIDFdKTtcbiAgICAgICAgICAgICAgICBjb2xvciA9IG1peGVzW2luZGV4XSA9IENvbG9yVHJhbnNsYXRvci5nZXRNaXhIRVgoY29sb3JzLCBNaXguU1VCVFJBQ1RJVkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGxhbmUuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZmV0Y2goJ2ltYWdlcy9jb2xvci1taXhlcy5zdmcnKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LnRleHQoKSlcbiAgICAgICAgLnRoZW4oKHN2Z0NvZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBzdmdDb2RlO1xuICAgICAgICAgICAgZmlsbFBsYW5lcygpO1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvciwgeyBIYXJtb255IH0pID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgY29uc3QgaGFybW9uaWVzID0gW1xuICAgICAgICB7IGxhYmVsOiAnQ29tcGxlbWVudGFyeScsICAgICAgIHZhbHVlOiBIYXJtb255LkNPTVBMRU1FTlRBUlkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NwbGl0IENvbXBsZW1lbnRhcnknLCB2YWx1ZTogSGFybW9ueS5TUExJVF9DT01QTEVNRU5UQVJZIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBbmFsb2dvdXMnLCAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuQU5BTE9HT1VTIH0sXG4gICAgICAgIHsgbGFiZWw6ICdUcmlhZGljJywgICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuVFJJQURJQyB9LFxuICAgICAgICB7IGxhYmVsOiAnVGV0cmFkaWMnLCAgICAgICAgICAgIHZhbHVlOiBIYXJtb255LlRFVFJBRElDIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTcXVhcmUnLCAgICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuU1FVQVJFIH1cbiAgICBdO1xuXG4gICAgY29uc3QgYmFzZUNvbG9yID0gJyNGMDAnO1xuXG4gICAgY29uc3QgY3JlYXRlRWxlbWVudCA9IChjbGFzc05hbWUsIHBhcmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIHJldHVybiBkaXY7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWF0ZUhhcm1vbnkgPSAoaXRlbSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBjcmVhdGVFbGVtZW50KCd3cmFwcGVyJywgY29udGFpbmVyKTtcbiAgICAgICAgY29uc3Qgd2hlZWwgPSBjcmVhdGVFbGVtZW50KCd3aGVlbCcsIHdyYXBwZXIpO1xuICAgICAgICBjb25zdCBoYXJtb255ID0gY3JlYXRlRWxlbWVudCgnaGFybW9ueScsIHdyYXBwZXIpO1xuICAgICAgICBjcmVhdGVFbGVtZW50KCdsYWJlbCcsIHdyYXBwZXIpLmlubmVyVGV4dCA9IGl0ZW0ubGFiZWw7XG5cbiAgICAgICAgZmV0Y2goJ2ltYWdlcy93aGVlbC1hZGRpdGl2ZS5zdmcnKVxuICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC50ZXh0KCkpXG4gICAgICAgICAgICAudGhlbigoc3ZnQ29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhcm1vbnlDb2xvcnMgPSBDb2xvclRyYW5zbGF0b3IuZ2V0SGFybW9ueShiYXNlQ29sb3IsIGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gJ3BhdGgnICsgaGFybW9ueUNvbG9ycy5tYXAoKGNvbG9yKSA9PiBgOm5vdChbZmlsbD1cIiR7Y29sb3J9XCJdKWApLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIHdoZWVsLmlubmVySFRNTCA9IHN2Z0NvZGU7XG4gICAgICAgICAgICAgICAgaGFybW9ueUNvbG9ycy5mb3JFYWNoKChoZXgpID0+IGNyZWF0ZUVsZW1lbnQoJ2JveCcsIGhhcm1vbnkpLnN0eWxlLmJhY2tncm91bmQgPSBoZXgpO1xuICAgICAgICAgICAgICAgIHdoZWVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpLmZvckVhY2goKHBhdGgpID0+IHBhdGguc2V0QXR0cmlidXRlKCdmaWxsLW9wYWNpdHknLCAnMC4yNScpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIGhhcm1vbmllcy5mb3JFYWNoKChpdGVtKSA9PiBjcmVhdGVIYXJtb255KGl0ZW0pKTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvciwgeyBIYXJtb255LCBNaXggfSkgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb25zdCBoYXJtb25pZXMgPSBbXG4gICAgICAgIHsgbGFiZWw6ICdDb21wbGVtZW50YXJ5JywgICAgICAgdmFsdWU6IEhhcm1vbnkuQ09NUExFTUVOVEFSWSB9LFxuICAgICAgICB7IGxhYmVsOiAnU3BsaXQgQ29tcGxlbWVudGFyeScsIHZhbHVlOiBIYXJtb255LlNQTElUX0NPTVBMRU1FTlRBUlkgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FuYWxvZ291cycsICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5BTkFMT0dPVVMgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RyaWFkaWMnLCAgICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5UUklBRElDIH0sXG4gICAgICAgIHsgbGFiZWw6ICdUZXRyYWRpYycsICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuVEVUUkFESUMgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NxdWFyZScsICAgICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5TUVVBUkUgfVxuICAgIF07XG5cbiAgICBjb25zdCBiYXNlQ29sb3IgPSAnI0YwMCc7XG5cbiAgICBjb25zdCBjcmVhdGVFbGVtZW50ID0gKGNsYXNzTmFtZSwgcGFyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgcmV0dXJuIGRpdjtcbiAgICB9O1xuXG4gICAgY29uc3QgY3JlYXRlSGFybW9ueSA9IChpdGVtKSA9PiB7XG5cbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IGNyZWF0ZUVsZW1lbnQoJ3dyYXBwZXInLCBjb250YWluZXIpO1xuICAgICAgICBjb25zdCB3aGVlbCA9IGNyZWF0ZUVsZW1lbnQoJ3doZWVsJywgd3JhcHBlcik7XG4gICAgICAgIGNvbnN0IGhhcm1vbnkgPSBjcmVhdGVFbGVtZW50KCdoYXJtb255Jywgd3JhcHBlcik7XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2xhYmVsJywgd3JhcHBlcikuaW5uZXJUZXh0ID0gaXRlbS5sYWJlbDtcblxuICAgICAgICBmZXRjaCgnaW1hZ2VzL3doZWVsLXN1YnRyYWN0aXZlLnN2ZycpXG4gICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LnRleHQoKSlcbiAgICAgICAgICAgIC50aGVuKChzdmdDb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFybW9ueUNvbG9ycyA9IENvbG9yVHJhbnNsYXRvci5nZXRIYXJtb255KGJhc2VDb2xvciwgaXRlbS52YWx1ZSwgTWl4LlNVQlRSQUNUSVZFKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9ICdwYXRoJyArIGhhcm1vbnlDb2xvcnMubWFwKChjb2xvcikgPT4gYDpub3QoW2ZpbGw9XCIke2NvbG9yfVwiXSlgKS5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICB3aGVlbC5pbm5lckhUTUwgPSBzdmdDb2RlO1xuICAgICAgICAgICAgICAgIGhhcm1vbnlDb2xvcnMuZm9yRWFjaCgoaGV4KSA9PiBjcmVhdGVFbGVtZW50KCdib3gnLCBoYXJtb255KS5zdHlsZS5iYWNrZ3JvdW5kID0gaGV4KTtcbiAgICAgICAgICAgICAgICB3aGVlbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKS5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbC1vcGFjaXR5JywgJzAuMjUnKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBoYXJtb25pZXMuZm9yRWFjaCgoaXRlbSkgPT4gY3JlYXRlSGFybW9ueShpdGVtKSk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi4vLi4vbm9kZV9tb2R1bGVzL2dvb2dsZS1jb2RlLXByZXR0aWZ5L2Jpbi9ydW5fcHJldHRpZnkubWluJztcbmltcG9ydCAnLi4vLi4vbm9kZV9tb2R1bGVzL2dvb2dsZS1jb2RlLXByZXR0aWZ5L2Jpbi9wcmV0dGlmeS5taW4uY3NzJztcbmltcG9ydCAnLi4vLi4vbm9kZV9tb2R1bGVzL2dvb2dsZS1jb2RlLXByZXR0aWZ5L3N0eWxlcy9kZXNlcnQuY3NzJztcbmltcG9ydCAnd2hhdHdnLWZldGNoJztcbmltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5pbXBvcnQgeyBDb2xvclRyYW5zbGF0b3IsIEhhcm1vbnksIE1peCB9IGZyb20gJy4uLyc7XG5pbXBvcnQgZGVtbzEgZnJvbSAnLi9kZW1vMSc7XG5pbXBvcnQgZGVtbzIgZnJvbSAnLi9kZW1vMic7XG5pbXBvcnQgZGVtbzMgZnJvbSAnLi9kZW1vMyc7XG5pbXBvcnQgZGVtbzQgZnJvbSAnLi9kZW1vNCc7XG5pbXBvcnQgZGVtbzUgZnJvbSAnLi9kZW1vNSc7XG5pbXBvcnQgZGVtbzYgZnJvbSAnLi9kZW1vNic7XG5pbXBvcnQgZGVtbzcgZnJvbSAnLi9kZW1vNyc7XG5pbXBvcnQgZGVtbzggZnJvbSAnLi9kZW1vOCc7XG5pbXBvcnQgZGVtbzkgZnJvbSAnLi9kZW1vOSc7XG5pbXBvcnQgZGVtbzEwIGZyb20gJy4vZGVtbzEwJztcbmltcG9ydCBkZW1vMTEgZnJvbSAnLi9kZW1vMTEnO1xuXG5jb25zdCBmdW5jdGlvVG9TdHJpbmcgPSAoZm4pID0+IHtcbiAgICBjb25zdCBhcnRpY2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXJ0aWNsZScpO1xuICAgIGNvbnN0IHByZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgIGFydGljbGUuY2xhc3NMaXN0LmFkZCgnZnVuY3Rpb24tY29udGFpbmVyJyk7XG4gICAgcHJlLmNsYXNzTGlzdC5hZGQoJ3ByZXR0eXByaW50Jyk7XG4gICAgYXJ0aWNsZS5hcHBlbmRDaGlsZChwcmUpO1xuICAgIHByZS5pbm5lckhUTUwgPSBmbi50b1N0cmluZygpLnJlcGxhY2UoJyhDb2xvclRyYW5zbGF0b3IpJywgJygpJyk7XG4gICAgcmV0dXJuIGFydGljbGU7XG59O1xuXG5jb25zdCBkZW1vcyA9IG5ldyBNYXAoW1xuICAgIFsnZGVtbzEnLCBkZW1vMV0sXG4gICAgWydkZW1vMicsIGRlbW8yXSxcbiAgICBbJ2RlbW8zJywgZGVtbzNdLFxuICAgIFsnZGVtbzQnLCBkZW1vNF0sXG4gICAgWydkZW1vNScsIGRlbW81XSxcbiAgICBbJ2RlbW82JywgZGVtbzZdLFxuICAgIFsnZGVtbzcnLCBkZW1vN10sXG4gICAgWydkZW1vOCcsIGRlbW84XSxcbiAgICBbJ2RlbW85JywgZGVtbzldLFxuICAgIFsnZGVtbzEwJywgZGVtbzEwXSxcbiAgICBbJ2RlbW8xMScsIGRlbW8xMV1cbl0pO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgIGRlbW9zLmZvckVhY2goKG1vZHVsZSwgZGl2KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlbW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXYpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkZW1vLWNvbnRhaW5lcicpO1xuICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2RlbW8td3JhcHBlcicpO1xuXG4gICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQobW9kdWxlKENvbG9yVHJhbnNsYXRvciwgeyBIYXJtb255LCBNaXggfSkpO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgICAgIGRlbW8uYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgZGVtby5hcHBlbmRDaGlsZChmdW5jdGlvVG9TdHJpbmcobW9kdWxlKSk7XG4gICAgfSk7XG59KTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///590\n\n}")}},__webpack_module_cache__={};function __webpack_require__(I){var g=__webpack_module_cache__[I];if(void 0!==g)return g.exports;var C=__webpack_module_cache__[I]={exports:{}};return __webpack_modules__[I](C,C.exports,__webpack_require__),C.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(I){if("object"==typeof window)return window}}();var __webpack_exports__=__webpack_require__(590),__webpack_export_target__=window;for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__]=__webpack_exports__[__webpack_i__];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})(); \ No newline at end of file