From 8904b214fc12b4c54c8fe332deb84fe008cc7359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Pereira=20Mu=C3=B1oz?= Date: Sun, 17 May 2026 16:42:32 +0200 Subject: [PATCH] Test and build the demo from the Github workflows --- .github/workflows/demo.yaml | 52 ++++++++++++++++ .github/workflows/deploy.yaml | 2 +- .github/workflows/test.yaml | 4 +- .gitignore | 3 +- docs/favicon.png | Bin 5053 -> 0 bytes docs/images/color-mixes.svg | 20 ------ docs/images/logo.png | Bin 6167 -> 0 bytes docs/images/logo.svg | 9 --- docs/images/logo_white.svg | 9 --- docs/images/wheel-additive.svg | 14 ----- docs/images/wheel-subtractive.svg | 14 ----- docs/index.html | 1 - docs/scripts/bundle.js | 1 - docs/styles/styles.css | 49 --------------- package.json | 6 -- pnpm-lock.yaml | 99 ++++++++++++++++++++---------- pnpm-workspace.yaml | 13 ++++ 17 files changed, 138 insertions(+), 158 deletions(-) create mode 100644 .github/workflows/demo.yaml delete mode 100644 docs/favicon.png delete mode 100644 docs/images/color-mixes.svg delete mode 100644 docs/images/logo.png delete mode 100644 docs/images/logo.svg delete mode 100644 docs/images/logo_white.svg delete mode 100644 docs/images/wheel-additive.svg delete mode 100644 docs/images/wheel-subtractive.svg delete mode 100644 docs/index.html delete mode 100644 docs/scripts/bundle.js delete mode 100644 docs/styles/styles.css create mode 100644 pnpm-workspace.yaml diff --git a/.github/workflows/demo.yaml b/.github/workflows/demo.yaml new file mode 100644 index 0000000..305a0e8 --- /dev/null +++ b/.github/workflows/demo.yaml @@ -0,0 +1,52 @@ +name: Deploy Demo to GitHub Pages + +on: + push: + branches: + - master + +jobs: + build-demo: + name: Build Demo + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Install pnpm + uses: pnpm/action-setup@v6 + with: + version: 11 + run_install: false + - name: Set-up Node + uses: actions/setup-node@v6 + with: + node-version: 24 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Build Demo + run: pnpm run docs + - name: Upload Build Artifact + uses: actions/upload-pages-artifact@v5 + with: + path: docs/ + + deploy-demo: + name: Deploy Demo + needs: build-demo + + permissions: + pages: write + id-token: write + + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-22.04 + steps: + - name: Deployment + id: deployment + uses: actions/deploy-pages@v5 \ No newline at end of file diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 2ae1e4e..2985014 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -17,7 +17,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v6 with: - version: 10 + version: 11 run_install: false - name: Set-up Node uses: actions/setup-node@v6 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 72e0b78..3c58c15 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -15,7 +15,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v6 with: - version: 10 + version: 11 run_install: false - name: Set up Node.js uses: actions/setup-node@v6 @@ -26,6 +26,8 @@ jobs: run: pnpm install --ignore-scripts --prefer-offline - name: Linting files run: pnpm lint + - name: Test demo build + run: pnpm run docs - name: Unit tests run: pnpm test --coverage - name: Build coverage diff --git a/.gitignore b/.gitignore index 198fa6f..7ea5206 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ coverage/ /esm/ /web/ /index.d.ts -/index.js \ No newline at end of file +/index.js +/docs \ No newline at end of file diff --git a/docs/favicon.png b/docs/favicon.png deleted file mode 100644 index 1cd5aa1fcd500c3e540b5c404b0f1ca9eea6b9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5053 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 E1LzZi2><{9 diff --git a/docs/images/color-mixes.svg b/docs/images/color-mixes.svg deleted file mode 100644 index aa4cd36..0000000 --- a/docs/images/color-mixes.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/images/logo.png b/docs/images/logo.png deleted file mode 100644 index e8c029876170000f492136a72afb80a073211dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6167 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 WYG#;XTuGa8z)<&=PKCBp%zpuCDSs9K diff --git a/docs/images/logo.svg b/docs/images/logo.svg deleted file mode 100644 index 106516e..0000000 --- a/docs/images/logo.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/docs/images/logo_white.svg b/docs/images/logo_white.svg deleted file mode 100644 index cbff8af..0000000 --- a/docs/images/logo_white.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/docs/images/wheel-additive.svg b/docs/images/wheel-additive.svg deleted file mode 100644 index 4502783..0000000 --- a/docs/images/wheel-additive.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/docs/images/wheel-subtractive.svg b/docs/images/wheel-subtractive.svg deleted file mode 100644 index 3d9fa64..0000000 --- a/docs/images/wheel-subtractive.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index d850ace..0000000 --- a/docs/index.html +++ /dev/null @@ -1 +0,0 @@ -ColorTranslator demo

Modifing color saturation and luminance

Modifing color hue

Wiphala modifying color hue

Screen color equivalences

Desaturating primary colors and CMYK conversion

Blending between two colors

Shades and tints of a color

Mixing colors in additive mode

Mixing colors in subtractive mode

Additive Color Harmonies

Subtractive Color Harmonies

\ No newline at end of file diff --git a/docs/scripts/bundle.js b/docs/scripts/bundle.js deleted file mode 100644 index bb9b74f..0000000 --- a/docs/scripts/bundle.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{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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Q2hDO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0Q0FBNEM7QUFDdEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzQ0FBc0M7OztBQ2hNRjtBQUM5QjtBQUNQLEtBQUssVUFBVSxpRkFBaUYsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRTtBQUNySixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZixLQUFLLFVBQVU7QUFDZjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ0EseUJBQXlCLElBQUk7QUFDN0Isd0JBQXdCLE9BQU87QUFDL0I7QUFDQTs7O0FDdkIrRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ007QUFDQTtBQUNQLFVBQVUsVUFBVTtBQUNwQixVQUFVLFVBQVU7QUFDcEIsVUFBVSxVQUFVO0FBQ3BCLFdBQVcsVUFBVTtBQUNyQixVQUFVLFVBQVU7QUFDcEIsVUFBVSxVQUFVO0FBQ3BCLFNBQVMsVUFBVTtBQUNuQixTQUFTLFVBQVU7QUFDbkIsU0FBUyxVQUFVO0FBQ25CLFVBQVUsVUFBVTtBQUNwQixTQUFTLFVBQVU7QUFDbkIsU0FBUyxVQUFVO0FBQ25CLENBQUM7QUFDTTtBQUNQO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCLGFBQWEsYUFBYTtBQUMxQixhQUFhLGFBQWE7QUFDMUIsYUFBYSxhQUFhO0FBQzFCLGNBQWMsYUFBYTtBQUMzQixlQUFlLGFBQWE7QUFDNUIsa0JBQWtCLGdCQUFnQjtBQUNsQyxDQUFDO0FBQ007QUFDUDtBQUNBO0FBQ0EsQ0FBQztBQUN5QjtBQUNGOzs7QUNwRGlMO0FBQ2xNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNQLFdBQVcsbUJBQW1CO0FBQzlCO0FBQ08sd0RBQXdELFVBQVU7QUFDbEUsd0RBQXdELFVBQVU7QUFDbEUsd0RBQXdELFVBQVU7QUFDbEUsMkRBQTJELFVBQVU7QUFDckUsd0RBQXdELFVBQVU7QUFDbEUseURBQXlELFVBQVU7QUFDbkUsMkNBQTJDLGFBQWE7QUFDeEQ7QUFDUCx5QkFBeUIsTUFBTSxLQUFLLE9BQU87QUFDM0M7QUFDTztBQUNQLHlCQUF5QixNQUFNLEtBQUssR0FBRztBQUN2QztBQUNPO0FBQ1AsZUFBZSxRQUFRLFVBQVUsS0FBSztBQUN0QztBQUNPLDZCQUE2QixLQUFLLFNBQVMsUUFBUTtBQUMxRDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EscUJBQXFCLElBQUk7QUFDekI7QUFDQSxnQkFBZ0IsSUFBSTtBQUNwQjtBQUNPO0FBQ1A7QUFDQTtBQUNBLGtCQUFrQixJQUFJO0FBQ3RCO0FBQ0E7QUFDQTtBQUNPLGtFQUFrRSxRQUFRO0FBQzFFLGtFQUFrRSxPQUFPO0FBQ3pFLGtFQUFrRSxTQUFTO0FBQzNFO0FBQ1Asa0JBQWtCLEtBQUs7QUFDdkIsd0JBQXdCLFFBQVEsK0JBQStCLFFBQVE7QUFDdkU7QUFDQSxRQUFRLEdBQUc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDO0FBQ0E7QUFDQSx3Q0FBd0MsUUFBUTtBQUNoRDtBQUNPO0FBQ1AsUUFBUSxLQUFLO0FBQ2Isc0JBQXNCLE9BQU8sZ0NBQWdDLE9BQU8sRUFBRSxPQUFPO0FBQzdFO0FBQ0EsMkJBQTJCLE9BQU8sRUFBRSxPQUFPO0FBQzNDO0FBQ087QUFDUCxRQUFRLEtBQUs7QUFDYixzQkFBc0IsU0FBUyxnQ0FBZ0MsU0FBUyxFQUFFLFNBQVM7QUFDbkY7QUFDQSwyQkFBMkIsU0FBUyxFQUFFLFNBQVM7QUFDL0M7QUFDTztBQUNQLGtCQUFrQixLQUFLO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08saUNBQWlDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDUDtBQUNBLGtDQUFrQyxPQUFPO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTtBQUNBLGlCQUFpQixjQUFjO0FBQy9CLG9DQUFvQyxPQUFPO0FBQzNDO0FBQ0EsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTtBQUNBLGlCQUFpQixjQUFjO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGdDQUFnQyxPQUFPLElBQUksT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFNBQVMsSUFBSSxTQUFTO0FBQ3RFO0FBQ087QUFDUDtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0Isa0NBQWtDLE9BQU87QUFDekM7QUFDQSxhQUFhLGNBQWM7QUFDM0Isd0JBQXdCLFFBQVE7QUFDaEM7QUFDQSxhQUFhLGNBQWM7QUFDM0IsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsMENBQTBDLE9BQU87QUFDakQ7QUFDQTtBQUNBLGNBQWMsY0FBYztBQUM1QjtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCOzs7QUMvSmlEO0FBQzBCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLLDBCQUEwQixRQUFRO0FBQ3REO0FBQ0E7QUFDQSxlQUFlLEtBQUssTUFBTSxRQUFRO0FBQ2xDO0FBQ0E7QUFDQSxlQUFlLEtBQUssZ0NBQWdDLFFBQVE7QUFDNUQ7QUFDQTtBQUNBLGVBQWUsS0FBSyxNQUFNLFFBQVE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsU0FBUyxRQUFRO0FBQ2pCLFNBQVMsUUFBUTtBQUNqQixTQUFTLFFBQVE7QUFDakIsb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTSxVQUFVLFFBQVEsS0FBSyxRQUFRO0FBQ2hELFdBQVcsTUFBTSxVQUFVLFFBQVEsS0FBSyxRQUFRO0FBQ2hELFdBQVcsTUFBTSxVQUFVLFFBQVEsS0FBSyxRQUFRO0FBQ2hEO0FBQ0E7QUFDTztBQUNQO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ087QUFDUCxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLLHFCQUFxQixRQUFRO0FBQzdDLFdBQVcsS0FBSywwQkFBMEIsUUFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTSxRQUFRLFFBQVEsS0FBSyxRQUFRO0FBQzlDLFdBQVcsTUFBTSxRQUFRLFFBQVEsS0FBSyxRQUFRO0FBQzlDLFdBQVcsTUFBTSxRQUFRLFFBQVEsS0FBSyxRQUFRO0FBQzlDO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxXQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxvQkFBb0IsUUFBUTtBQUM1RCxXQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxvQkFBb0IsUUFBUTtBQUM1RCxXQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxvQkFBb0IsUUFBUTtBQUM1RDtBQUNBO0FBQ087QUFDUCxTQUFTLFFBQVE7QUFDakIsU0FBUyxRQUFRO0FBQ2pCLFNBQVMsUUFBUTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEI7QUFDQTtBQUNPO0FBQ1A7QUFDQSx3QkFBd0IsUUFBUSxNQUFNLFFBQVEsTUFBTSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx3QkFBd0IsUUFBUSxNQUFNLFFBQVEsTUFBTSxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQ2xWcUQ7QUFDRjtBQUM1QztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixNQUFNO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsZUFBZTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0EsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBOzs7QUNyQ3VGO0FBQ3VCO0FBQ3ZHO0FBQ1Asa0JBQWtCLFdBQVc7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFdBQVc7QUFDbkI7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxXQUFXO0FBQ25CO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLFFBQVEsY0FBYztBQUN0QjtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQSxRQUFRLFdBQVc7QUFDbkI7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxZQUFZO0FBQ3BCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZDa0g7QUFDekI7QUFDbEY7QUFDUCxTQUFTLEtBQUssRUFBRTtBQUNoQixNQUFNLEtBQUs7QUFDSjtBQUNQLGtCQUFrQixxQkFBcUI7QUFDdkMsa0JBQWtCLG1CQUFtQjtBQUNyQyxpQkFBaUIsV0FBVztBQUM1QjtBQUNBO0FBQ0EsYUFBYSxXQUFXO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1AsNEJBQTRCLFlBQVk7QUFDeEM7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QixLQUFLO0FBQ0w7QUFDTztBQUNQLFlBQVksaUNBQWlDO0FBQzdDLHNCQUFzQixhQUFhO0FBQ25DO0FBQ0E7QUFDQSxrQkFBa0IsS0FBSyx3QkFBd0I7QUFDL0M7QUFDQSxXQUFXLEtBQUs7QUFDaEI7QUFDTztBQUNQLFlBQVksdUJBQXVCO0FBQ25DO0FBQ0E7QUFDQSwyQkFBMkIsY0FBYztBQUN6QywrQkFBK0IsS0FBSyxDQUFDLGdCQUFnQjtBQUNyRCxzQkFBc0IsV0FBVyxFQUFFLFdBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsY0FBYyxLQUFLO0FBQ25CO0FBQ0E7OztBQzVDaUY7QUFDN0M7QUFDZ0M7QUFDNEQ7QUFDN0U7QUFDNUMsd0JBQXdCLFdBQVc7QUFDMUM7QUFDQSx5QkFBeUIsY0FBYztBQUN2QyxjQUFjLGFBQWE7QUFDM0I7QUFDQSxxQ0FBcUMsU0FBUztBQUM5QztBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsb0JBQW9CLFNBQVM7QUFDN0IsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBLG9CQUFvQixHQUFHLFNBQVMsUUFBUTtBQUN4QyxTQUFTO0FBQ1QsZUFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE1BQU07QUFDekIsbUJBQW1CLE1BQU07QUFDekIsbUJBQW1CLE1BQU07QUFDekIsb0JBQW9CLFdBQVc7QUFDL0I7QUFDQTtBQUNBLDJCQUEyQixNQUFNLE1BQU0sUUFBUTtBQUMvQyxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0IsSUFBSSxRQUFRO0FBQzNDLGVBQWUsZ0JBQWdCLElBQUksUUFBUTtBQUMzQyxlQUFlLGdCQUFnQixJQUFJLFFBQVE7QUFDM0MsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLGdDQUFnQyxnQkFBZ0IsSUFBSSxRQUFRO0FBQzVELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsV0FBVztBQUMvQjtBQUNBLGNBQWMsTUFBTTtBQUNwQjtBQUNBLGVBQWUsTUFBTTtBQUNyQixlQUFlLE1BQU07QUFDckIsZUFBZSxNQUFNO0FBQ3JCO0FBQ0E7QUFDQSx1QkFBdUIsV0FBVztBQUNsQztBQUNBLDBCQUEwQixNQUFNLFNBQVMsUUFBUTtBQUNqRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxLQUFLLENBQUMsS0FBSztBQUNsRCx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0EsaUJBQWlCLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDNUIsaUJBQWlCLEdBQUcsR0FBRyxFQUFFO0FBQ3pCLGVBQWUsd0JBQXdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQ3ZGMEM7QUFDMUM7QUFDTztBQUNQO0FBQ0E7QUFDQSxhQUFhLElBQUk7QUFDakIsYUFBYSxJQUFJO0FBQ2pCLGFBQWEsSUFBSTtBQUNqQixhQUFhLElBQUk7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsSUFBSTtBQUNyQixZQUFZLElBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLElBQUk7QUFDdkIsZ0JBQWdCLElBQUk7QUFDcEIsZ0RBQWdELElBQUk7QUFDcEQ7QUFDQSxpQkFBaUI7QUFDakIsb0JBQW9CLElBQUk7QUFDeEIsb0JBQW9CLElBQUk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxJQUFJO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQkFBaUIsSUFBSSxXQUFXLEVBQUUsTUFBTSw0QkFBNEI7QUFDckg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxRXdGO0FBQ3lDO0FBQ25DO0FBQzFEO0FBQ007QUFDUztBQUM1Qyx3QkFBd0IsV0FBVztBQUMxQztBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0EscUJBQXFCLEtBQUssU0FBUyxRQUFRO0FBQzNDLGtCQUFrQixHQUFHLFNBQVMsUUFBUTtBQUN0QztBQUNBLGdDQUFnQyxRQUFRO0FBQ3hDLFNBQVM7QUFDVCxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBLG9CQUFvQiwyR0FBMkc7QUFDL0g7QUFDQTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDO0FBQ0EsbUNBQW1DLFFBQVE7QUFDM0MsbUNBQW1DLFFBQVE7QUFDM0MsbUNBQW1DLFFBQVE7QUFDM0M7QUFDQTtBQUNBLGtDQUFrQyxVQUFVO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdCQUFnQixLQUFLLFFBQVE7QUFDN0QsZ0NBQWdDLGdCQUFnQixLQUFLLFFBQVE7QUFDN0QsZ0NBQWdDLGdCQUFnQixLQUFLLFFBQVE7QUFDN0Qsd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBLCtCQUErQixjQUFjO0FBQzdDLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCLElBQUksUUFBUTtBQUMzQyxlQUFlLGdCQUFnQixJQUFJLFFBQVE7QUFDM0MsZUFBZSxnQkFBZ0IsSUFBSSxRQUFRO0FBQzNDLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSxnQ0FBZ0MsZ0JBQWdCLElBQUksUUFBUTtBQUM1RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFdBQVc7QUFDL0I7QUFDQSxjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixTQUFTO0FBQ1Q7QUFDQTtBQUNBLGdCQUFnQixrREFBa0Q7QUFDbEU7QUFDQSxzQkFBc0IsV0FBVztBQUNqQztBQUNBLCtCQUErQixhQUFhO0FBQzVDLHFCQUFxQixzQkFBc0IsbUJBQW1CO0FBQzlEO0FBQ0Esc0JBQXNCLFdBQVc7QUFDakMsc0JBQXNCLEtBQUs7QUFDM0I7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQSx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUM1RCx3QkFBd0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUNoRDtBQUNBLHdCQUF3QixJQUFJLElBQUksR0FBRyxHQUFHLEVBQUU7QUFDeEMsd0JBQXdCLElBQUksSUFBSSxFQUFFO0FBQ2xDLGVBQWUsd0JBQXdCO0FBQ3ZDO0FBQ0E7QUFDQSxrQkFBa0IsS0FBSztBQUN2QixrQkFBa0IsS0FBSztBQUN2QixrQkFBa0IsS0FBSztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsS0FBSztBQUM1QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscURBQXFEO0FBQ3JFO0FBQ0Esa0NBQWtDLEtBQUs7QUFDdkMsZ0JBQWdCLEtBQUs7QUFDckIsZ0JBQWdCLEtBQUs7QUFDckIsa0NBQWtDLFdBQVcsY0FBYyxLQUFLO0FBQ2hFLGlCQUFpQixXQUFXLE9BQU8sS0FBSztBQUN4Qyx1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTs7O0FDaEpxRTtBQUMrRDtBQUMzQjtBQUNyRTtBQUNVO0FBQ0o7QUFDUztBQUM1Qyx3QkFBd0IsV0FBVztBQUMxQztBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixtQkFBbUIsU0FBUztBQUM1QjtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0Esb0JBQW9CLDJHQUEyRztBQUMvSDtBQUNBO0FBQ0EsZ0NBQWdDLE1BQU07QUFDdEMsZ0NBQWdDLFFBQVE7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEMsOEJBQThCLFVBQVU7QUFDeEMsOEJBQThCLFVBQVU7QUFDeEM7QUFDQSx1QkFBdUIsWUFBWTtBQUNuQyx1QkFBdUIsT0FBTztBQUM5Qix1QkFBdUIsT0FBTztBQUM5QjtBQUNBO0FBQ0Esa0NBQWtDLFVBQVU7QUFDNUMsNEJBQTRCLE1BQU0sT0FBTyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixZQUFZO0FBQ25DLHVCQUF1QixPQUFPO0FBQzlCLHVCQUF1QixPQUFPO0FBQzlCLHdCQUF3QixXQUFXO0FBQ25DO0FBQ0E7QUFDQSwrQkFBK0IsY0FBYztBQUM3Qyx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFlBQVk7QUFDM0IsZUFBZSxPQUFPLElBQUksUUFBUTtBQUNsQyxlQUFlLE9BQU8sSUFBSSxRQUFRO0FBQ2xDLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsTUFBTSxjQUFjLFNBQVM7QUFDcEQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxXQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixNQUFNO0FBQzlCLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixTQUFTO0FBQ1Q7QUFDQTtBQUNBLGdCQUFnQiwrQkFBK0I7QUFDL0Msc0JBQXNCLFdBQVc7QUFDakM7QUFDQSw0QkFBNEIsc0JBQXNCO0FBQ2xELHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFO0FBQzlELHdCQUF3QixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFO0FBQ2pEO0FBQ0Esd0JBQXdCLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQzFDLHdCQUF3QixJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQ25DLGVBQWUsd0JBQXdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSyxDQUFDLFlBQVk7QUFDakMsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0EsdUJBQXVCLEtBQUs7QUFDNUIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDJCQUEyQjtBQUMzQztBQUNBLHVCQUF1QixZQUFZO0FBQ25DLGtDQUFrQyxXQUFXLGNBQWMsS0FBSztBQUNoRSxpQkFBaUIsV0FBVyxPQUFPLEtBQUs7QUFDeEMsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQ3RJeUY7QUFDMkM7QUFDeEM7QUFDeEQ7QUFDVTtBQUNKO0FBQ1M7QUFDNUMsd0JBQXdCLFdBQVc7QUFDMUM7QUFDQSxrQ0FBa0MsU0FBUztBQUMzQztBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBLG9CQUFvQixtRUFBbUU7QUFDdkY7QUFDQTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDLGdDQUFnQyxRQUFRO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDO0FBQ0EsdUJBQXVCLE1BQU0sT0FBTyxPQUFPO0FBQzNDLHVCQUF1QixNQUFNLE9BQU8sU0FBUztBQUM3Qyx1QkFBdUIsTUFBTSxPQUFPLFNBQVM7QUFDN0M7QUFDQTtBQUNBLGtDQUFrQyxVQUFVO0FBQzVDLDRCQUE0QixNQUFNLE9BQU8sU0FBUztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkMsdUJBQXVCLE9BQU87QUFDOUIsdUJBQXVCLE9BQU87QUFDOUIsd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBLCtCQUErQixjQUFjO0FBQzdDLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsWUFBWTtBQUMzQixlQUFlLE9BQU87QUFDdEIsZUFBZSxPQUFPO0FBQ3RCLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsY0FBYztBQUNyQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFdBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE1BQU07QUFDOUIsa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsc0JBQXNCO0FBQ2xELHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQSxvQkFBb0IsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDdEMsb0JBQW9CLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDL0IsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLLENBQUMsWUFBWTtBQUNqQyxlQUFlLEtBQUs7QUFDcEIsZUFBZSxLQUFLO0FBQ3BCLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsS0FBSztBQUM1QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixZQUFZO0FBQ25DLGlDQUFpQyxXQUFXLGNBQWMsS0FBSztBQUMvRCx1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTs7O0FDMUh3RztBQUM2QztBQUNwRTtBQUM3QztBQUNVO0FBQ0o7QUFDUztBQUM1QywyQkFBMkIsV0FBVztBQUM3QztBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixtQkFBbUIsU0FBUztBQUM1QjtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0Esb0JBQW9CLG1FQUFtRTtBQUN2RjtBQUNBO0FBQ0EsZ0NBQWdDLE1BQU07QUFDdEMsbUNBQW1DLFFBQVE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEMsOEJBQThCLFVBQVU7QUFDeEMsOEJBQThCLFVBQVU7QUFDeEM7QUFDQSx1QkFBdUIsTUFBTSxPQUFPLFNBQVM7QUFDN0MsdUJBQXVCLE1BQU0sS0FBSyxPQUFPLEVBQUUsT0FBTztBQUNsRCx1QkFBdUIsTUFBTSxLQUFLLE9BQU8sRUFBRSxPQUFPO0FBQ2xEO0FBQ0E7QUFDQSxrQ0FBa0MsVUFBVTtBQUM1QywrQkFBK0IsTUFBTSxPQUFPLFNBQVM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCLHVCQUF1QixnQkFBZ0I7QUFDdkMsdUJBQXVCLGdCQUFnQjtBQUN2Qyx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0MseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsZ0JBQWdCLElBQUksUUFBUTtBQUMzQyxlQUFlLGdCQUFnQixJQUFJLFFBQVE7QUFDM0MsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLHVCQUF1QixjQUFjO0FBQ3JDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksY0FBYztBQUMxQjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsTUFBTTtBQUM5QixrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixLQUFLLENBQUMsT0FBTztBQUN2QyxtQ0FBbUMsYUFBYTtBQUNoRCx5QkFBeUIsRUFBRTtBQUMzQix5QkFBeUIsRUFBRTtBQUMzQjtBQUNBO0FBQ0EsbUNBQW1DLGFBQWE7QUFDaEQseUJBQXlCLHNCQUFzQixtQkFBbUI7QUFDbEUsc0JBQXNCLEtBQUs7QUFDM0I7QUFDQSxtQkFBbUIsV0FBVztBQUM5QjtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQSxvQkFBb0IsSUFBSSxJQUFJLEdBQUcsR0FBRyxFQUFFO0FBQ3BDLG9CQUFvQixJQUFJLElBQUksRUFBRTtBQUM5QixlQUFlLHdCQUF3QjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEIsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0EsdUJBQXVCLEtBQUs7QUFDNUIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGFBQWE7QUFDN0I7QUFDQSxrQ0FBa0MsS0FBSztBQUN2QyxnQkFBZ0IsS0FBSztBQUNyQixnQkFBZ0IsS0FBSztBQUNyQixpQ0FBaUMsV0FBVyxPQUFPLEtBQUs7QUFDeEQsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQzNJMEg7QUFDc0U7QUFDL0c7QUFDN0M7QUFDVTtBQUNKO0FBQ1M7QUFDNUMsd0JBQXdCLFdBQVc7QUFDMUM7QUFDQSxrQ0FBa0MsU0FBUztBQUMzQztBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBLG9CQUFvQixtRUFBbUU7QUFDdkY7QUFDQTtBQUNBLGdDQUFnQyxNQUFNO0FBQ3RDLGdDQUFnQyxRQUFRO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDLDhCQUE4QixVQUFVO0FBQ3hDO0FBQ0EsdUJBQXVCLE1BQU0sT0FBTyxTQUFTO0FBQzdDLHVCQUF1QixNQUFNLEtBQUssU0FBUyxFQUFFLFNBQVM7QUFDdEQsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBLGtDQUFrQyxVQUFVO0FBQzVDLDRCQUE0QixNQUFNLE9BQU8sU0FBUztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLE9BQU87QUFDOUIsdUJBQXVCLGdCQUFnQjtBQUN2Qyx1QkFBdUIsWUFBWTtBQUNuQyx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0MseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsZ0JBQWdCLElBQUksUUFBUTtBQUMzQyxlQUFlLFlBQVk7QUFDM0IsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBLHVCQUF1QixjQUFjO0FBQ3JDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksV0FBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsTUFBTTtBQUM5QixrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQkFBZ0IsZ0NBQWdDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixLQUFLLENBQUMsT0FBTztBQUN2QyxtQ0FBbUMsYUFBYTtBQUNoRCx5QkFBeUIsRUFBRTtBQUMzQix5QkFBeUIsRUFBRTtBQUMzQjtBQUNBO0FBQ0EsbUNBQW1DLGFBQWE7QUFDaEQseUJBQXlCLHNCQUFzQixtQkFBbUI7QUFDbEUsc0JBQXNCLEtBQUs7QUFDM0I7QUFDQTtBQUNBLG1DQUFtQyxjQUFjO0FBQ2pELHVDQUF1QyxLQUFLLENBQUMsZ0JBQWdCO0FBQzdELDhCQUE4QixXQUFXLEVBQUUsV0FBVztBQUN0RDtBQUNBLHVCQUF1QixLQUFLO0FBQzVCO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0Esb0JBQW9CLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNwQyxvQkFBb0IsSUFBSSxJQUFJLEVBQUU7QUFDOUIsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUssQ0FBQyxZQUFZO0FBQ2pDLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIsS0FBSztBQUM1QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixZQUFZO0FBQ25DLGtDQUFrQyxLQUFLO0FBQ3ZDLGdCQUFnQixLQUFLO0FBQ3JCLGlDQUFpQyxXQUFXLGNBQWMsS0FBSztBQUMvRCx1QkFBdUIsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTs7O0FDakp5RTtBQUM4QjtBQUNUO0FBQzFEO0FBQ1c7QUFDSTtBQUM1Qyx5QkFBeUIsV0FBVztBQUMzQztBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixtQkFBbUIsU0FBUztBQUM1QjtBQUNBLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQyxtQkFBbUIsYUFBYTtBQUNoQyxtQkFBbUIsYUFBYTtBQUNoQyxtQkFBbUIsYUFBYTtBQUNoQyxvQkFBb0IsV0FBVztBQUMvQjtBQUNBO0FBQ0EsMkJBQTJCLGNBQWM7QUFDekMscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxhQUFhLElBQUksUUFBUTtBQUN4QyxlQUFlLGFBQWEsSUFBSSxRQUFRO0FBQ3hDLGVBQWUsYUFBYSxJQUFJLFFBQVE7QUFDeEMsZUFBZSxhQUFhLElBQUksUUFBUTtBQUN4QyxnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0EsdUJBQXVCLGNBQWM7QUFDckMsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixNQUFNO0FBQzlCLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsZ0JBQWdCLGlFQUFpRTtBQUNqRixzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0EsNkJBQTZCLGFBQWE7QUFDMUM7QUFDQSwwQkFBMEIsS0FBSyxrQkFBa0I7QUFDakQ7QUFDQTtBQUNBLGtCQUFrQixXQUFXO0FBQzdCLGtCQUFrQixLQUFLO0FBQ3ZCO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0EscUJBQXFCLGFBQWEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQ2xGLHFCQUFxQixhQUFhLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUN2RTtBQUNBLHFCQUFxQixhQUFhLEVBQUUsSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUU7QUFDeEQscUJBQXFCLGFBQWEsRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQ2xELGVBQWUsd0JBQXdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUs7QUFDcEIsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0EsdUJBQXVCLEtBQUs7QUFDNUIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGtFQUFrRTtBQUNsRjtBQUNBLGtDQUFrQyxLQUFLO0FBQ3ZDLGdCQUFnQixLQUFLO0FBQ3JCLGdCQUFnQixLQUFLO0FBQ3JCLGdCQUFnQixLQUFLO0FBQ3JCLG1DQUFtQyxXQUFXLGNBQWMsS0FBSztBQUNqRSxrQkFBa0IsV0FBVyxPQUFPLEtBQUs7QUFDekMsdUJBQXVCLFdBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7OztBQy9IZ0o7QUFDckY7QUFDTTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNNO0FBQ047QUFDRTtBQUMxQyxzQkFBc0IsU0FBUztBQUMvQixzQkFBc0IsU0FBUztBQUMvQixzQkFBc0IsU0FBUztBQUMvQixzQkFBc0IsU0FBUztBQUMvQix5QkFBeUIsWUFBWTtBQUNyQyxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsVUFBVTtBQUNqQywrQkFBK0Isa0JBQWtCO0FBQ3hELEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmLEtBQUssVUFBVTtBQUNmO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxjQUFjO0FBQ3pELDBDQUEwQyxhQUFhO0FBQ3ZELDZDQUE2QyxnQkFBZ0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0EsK0JBQStCLEtBQUs7QUFDcEM7QUFDQSw0REFBNEQscUJBQXFCO0FBQ2pGO0FBQ0Esb0JBQW9CLE1BQU07QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsZ0JBQWdCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQSxjQUFjLGVBQWU7QUFDN0IsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLGdFQUFnRSxlQUFlO0FBQy9FLDJCQUEyQixTQUFTO0FBQ3BDO0FBQ0E7QUFDQSx3RUFBd0UsZUFBZTtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEMsa0JBQWtCLGVBQWU7QUFDakM7QUFDQTs7O0FDOUlpSDtBQUNHO0FBQ3BEO0FBQzVCO0FBQ29DO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQyxnQkFBZ0IsY0FBYztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEIsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsS0FBSztBQUNwQixlQUFlLEtBQUs7QUFDcEI7QUFDQSxLQUFLO0FBQ0w7QUFDTyxpRUFBaUUsbUJBQW1CLGNBQWM7QUFDekc7QUFDQSxnQkFBZ0IsbUJBQW1CO0FBQ25DLHVCQUF1QixrQkFBa0I7QUFDekMscUJBQXFCLGtCQUFrQjtBQUN2QywwQkFBMEIsTUFBTTtBQUNoQyx3QkFBd0IsTUFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsa0JBQWtCLDBCQUEwQix3QkFBd0I7QUFDdkY7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQyxLQUFLO0FBQ0w7QUFDTztBQUNQLDJCQUEyQixRQUFRO0FBQ25DO0FBQ0E7QUFDQSw2QkFBNkIsUUFBUTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDREQUE0RCxHQUFHLHVCQUF1QjtBQUM3RjtBQUNBLGVBQWUsa0JBQWtCLGdCQUFnQixVQUFVO0FBQzNELEtBQUs7QUFDTCw0QkFBNEIsR0FBRztBQUMvQjtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDLGlCQUFpQixXQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsaUNBQWlDLEdBQUc7QUFDcEMsZ0JBQWdCO0FBQ2hCLGdCQUFnQjtBQUNoQjtBQUNBLDJCQUEyQixXQUFXO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxRQUFRO0FBQzlELHNEQUFzRCxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEdBQUc7QUFDaEMsd0JBQXdCLHNDQUFzQyxRQUFRO0FBQ3RFLHdCQUF3QixzQ0FBc0MsUUFBUSxHQUFHO0FBQ3pFO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxpQkFBaUIsR0FBRztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQix3QkFBd0Isd0JBQXdCO0FBQ2pGO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNPO0FBQ1Asc0JBQXNCLFFBQVE7QUFDOUI7QUFDQTtBQUNBLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sdURBQXVELDBCQUEwQixjQUFjO0FBQ3RHLGtCQUFrQixRQUFRO0FBQzFCLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTtBQUNBLGdCQUFnQixrQkFBa0IsZ0JBQWdCLFVBQVU7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsa0JBQWtCLDZCQUE2Qix3QkFBd0I7QUFDMUYsU0FBUztBQUNUO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQyxLQUFLO0FBQ0w7QUFDTztBQUNQLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0E7QUFDQSx5QkFBeUIsUUFBUTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsR0FBRztBQUMzQixrQkFBa0IsWUFBWTtBQUM5QixrQkFBa0IsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNO0FBQzVDO0FBQ0E7QUFDQSxDQUFDLEtBQUssVUFBVTtBQUNoQjtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ08sNERBQTREO0FBQ25FO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0EsZ0JBQWdCLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsa0JBQWtCLGlDQUFpQyx3QkFBd0I7QUFDOUYsU0FBUztBQUNUO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQyxLQUFLO0FBQ0w7QUFDTztBQUNQLFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCO0FBQ0Esa0JBQWtCLEdBQUc7QUFDckIsWUFBWSxLQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxLQUFLO0FBQ2I7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsT0FBTztBQUNmLFFBQVEsR0FBRztBQUNYO0FBQ0E7QUFDQTs7O0FDMU9pRztBQUM2RDtBQUN0RjtBQUNBO0FBQ3NJO0FBQ3ZNO0FBQ1AsbUNBQW1DO0FBQ25DLHdCQUF3Qix3QkFBd0I7QUFDaEQsNEJBQTRCLGtCQUFrQjtBQUM5QyxzQkFBc0IsYUFBYTtBQUNuQztBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFVBQVU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsVUFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFlBQVk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsTUFBTSxPQUFPLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsTUFBTSxPQUFPLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsTUFBTSxPQUFPLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixNQUFNLE9BQU8sU0FBUztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixNQUFNLEtBQUssT0FBTyxFQUFFLE9BQU87QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sS0FBSyxPQUFPLEVBQUUsT0FBTztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsTUFBTSxPQUFPLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sT0FBTyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixZQUFZO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFNLE9BQU8sU0FBUztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBTTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE1BQU07QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBTTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLG1CQUFtQixVQUFVO0FBQzlEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLG1CQUFtQixVQUFVO0FBQzlEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLG1CQUFtQixVQUFVO0FBQzlEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLG1CQUFtQixVQUFVO0FBQzlEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixvQkFBb0IsVUFBVTtBQUMvRDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0Isb0JBQW9CLFVBQVU7QUFDL0Q7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHNCQUFzQixVQUFVO0FBQ2pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVSxRQUFRO0FBQ3pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVTtBQUNqRTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0Isc0JBQXNCLFVBQVU7QUFDakU7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHNCQUFzQixVQUFVO0FBQ2pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVTtBQUNqRTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0Isc0JBQXNCLFVBQVU7QUFDakU7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHNCQUFzQixVQUFVO0FBQ2pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVTtBQUNqRTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0Isc0JBQXNCLFVBQVU7QUFDakU7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHNCQUFzQixVQUFVO0FBQ2pFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixzQkFBc0IsVUFBVTtBQUNqRTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsdUJBQXVCLFVBQVU7QUFDbEU7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLHVCQUF1QixVQUFVO0FBQ2xFO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBO0FBQ0EsZUFBZSxrQkFBa0IsbUJBQW1CLFVBQVU7QUFDOUQ7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLGdCQUFnQixVQUFVO0FBQzNEO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVTtBQUM5RDtBQUNBLDBDQUEwQztBQUMxQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLG9DQUFvQztBQUNwQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDBDQUEwQztBQUMxQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLG9DQUFvQztBQUNwQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDBDQUEwQztBQUMxQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLG9DQUFvQztBQUNwQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDZDQUE2QztBQUM3QyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHVDQUF1QztBQUN2QyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxTQUFTLHdCQUF3QjtBQUMvRjtBQUNBLDhDQUE4QztBQUM5QyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHdDQUF3QztBQUN4QyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxTQUFTLHdCQUF3QjtBQUMvRjtBQUNBLDBDQUEwQztBQUMxQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLG9DQUFvQztBQUNwQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxNQUFNLHdCQUF3QjtBQUM1RjtBQUNBLDJDQUEyQztBQUMzQyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHFDQUFxQztBQUNyQyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxPQUFPLHdCQUF3QjtBQUM3RjtBQUNBLDRDQUE0QztBQUM1QyxlQUFlLGtCQUFrQixnQkFBZ0IsVUFBVTtBQUMzRDtBQUNBLHNDQUFzQztBQUN0QyxlQUFlLGtCQUFrQixtQkFBbUIsVUFBVSxPQUFPLHdCQUF3QjtBQUM3RjtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVTtBQUNsRDtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVTtBQUNsRDtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVTtBQUNsRDtBQUNBO0FBQ0EsZUFBZSxjQUFjLFdBQVcsVUFBVTtBQUNsRDtBQUNBO0FBQ0EsZUFBZSxzQkFBc0IsaUJBQWlCLGdDQUFnQztBQUN0RjtBQUNBO0FBQ0EsZUFBZSxzQkFBc0Isa0JBQWtCLGdDQUFnQztBQUN2RjtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0IsV0FBVywwQkFBMEI7QUFDcEU7QUFDQTtBQUNBLG1GQUFtRixjQUFjLFdBQVcsVUFBVSx1QkFBdUIsb0JBQW9CO0FBQ2pLLDZFQUE2RSxjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQzFKLG9GQUFvRixjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQ2pLLDhFQUE4RSxjQUFjLFdBQVcsVUFBVSxxQkFBcUIsb0JBQW9CO0FBQzFKLG1GQUFtRixjQUFjLFdBQVcsVUFBVSx1QkFBdUIsb0JBQW9CO0FBQ2pLLDZFQUE2RSxjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQzFKLG9GQUFvRixjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQ2pLLDhFQUE4RSxjQUFjLFdBQVcsVUFBVSxxQkFBcUIsb0JBQW9CO0FBQzFKLG1GQUFtRixjQUFjLFdBQVcsVUFBVSx1QkFBdUIsb0JBQW9CO0FBQ2pLLDZFQUE2RSxjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQzFKLG9GQUFvRixjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQ2pLLDhFQUE4RSxjQUFjLFdBQVcsVUFBVSxxQkFBcUIsb0JBQW9CO0FBQzFKLHNGQUFzRixjQUFjLFdBQVcsVUFBVSwwQkFBMEIsb0JBQW9CO0FBQ3ZLLGdGQUFnRixjQUFjLFdBQVcsVUFBVSx5QkFBeUIsb0JBQW9CO0FBQ2hLLHVGQUF1RixjQUFjLFdBQVcsVUFBVSx5QkFBeUIsb0JBQW9CO0FBQ3ZLLGlGQUFpRixjQUFjLFdBQVcsVUFBVSx3QkFBd0Isb0JBQW9CO0FBQ2hLLG1GQUFtRixjQUFjLFdBQVcsVUFBVSx1QkFBdUIsb0JBQW9CO0FBQ2pLLDZFQUE2RSxjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQzFKLG9GQUFvRixjQUFjLFdBQVcsVUFBVSxzQkFBc0Isb0JBQW9CO0FBQ2pLLDhFQUE4RSxjQUFjLFdBQVcsVUFBVSxxQkFBcUIsb0JBQW9CO0FBQzFKLG9EQUFvRCxZQUFZLFNBQVMsVUFBVTtBQUNuRiw0Q0FBNEMsR0FBRyxjQUFjLFlBQVksU0FBUyxVQUFVO0FBQzVGLG1EQUFtRCxHQUFHLGNBQWMsWUFBWSxTQUFTLFVBQVU7QUFDbkcsNkNBQTZDLEdBQUcsY0FBYyxZQUFZLFNBQVMsVUFBVTtBQUM3RiwrRUFBK0UsWUFBWSxTQUFTLFVBQVUsdUJBQXVCLHNCQUFzQjtBQUMzSix5RUFBeUUsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUNwSixnRkFBZ0YsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUMzSiwwRUFBMEUsWUFBWSxTQUFTLFVBQVUscUJBQXFCLHNCQUFzQjtBQUNwSiwrRUFBK0UsWUFBWSxTQUFTLFVBQVUsdUJBQXVCLHNCQUFzQjtBQUMzSix5RUFBeUUsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUNwSixnRkFBZ0YsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUMzSiwwRUFBMEUsWUFBWSxTQUFTLFVBQVUscUJBQXFCLHNCQUFzQjtBQUNwSiwrRUFBK0UsWUFBWSxTQUFTLFVBQVUsdUJBQXVCLHNCQUFzQjtBQUMzSix5RUFBeUUsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUNwSixnRkFBZ0YsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUMzSiwwRUFBMEUsWUFBWSxTQUFTLFVBQVUscUJBQXFCLHNCQUFzQjtBQUNwSixrRkFBa0YsWUFBWSxTQUFTLFVBQVUsMEJBQTBCLHNCQUFzQjtBQUNqSyw0RUFBNEUsWUFBWSxTQUFTLFVBQVUseUJBQXlCLHNCQUFzQjtBQUMxSixtRkFBbUYsWUFBWSxTQUFTLFVBQVUseUJBQXlCLHNCQUFzQjtBQUNqSyw2RUFBNkUsWUFBWSxTQUFTLFVBQVUsd0JBQXdCLHNCQUFzQjtBQUMxSiwrRUFBK0UsWUFBWSxTQUFTLFVBQVUsdUJBQXVCLHNCQUFzQjtBQUMzSix5RUFBeUUsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUNwSixnRkFBZ0YsWUFBWSxTQUFTLFVBQVUsc0JBQXNCLHNCQUFzQjtBQUMzSiwwRUFBMEUsWUFBWSxTQUFTLFVBQVUscUJBQXFCLHNCQUFzQjs7O0FDaGlCMUc7QUFDaUI7OztBQ0RwQzs7QUFFdkIsNENBQWU7O0FBRWY7QUFDQSw2REFBNkQsYUFBYTs7QUFFMUUsc0JBQXNCLFVBQVU7O0FBRWhDLDBCQUEwQixVQUFVOztBQUVwQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQjtBQUNyQixxQkFBcUI7QUFDckIscUJBQXFCLFFBQVE7QUFDN0I7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxDQUFDLEU7O0FDL0JzQjs7QUFFdkIsNENBQWU7O0FBRWY7QUFDQSx3Q0FBd0Msb0JBQW9CO0FBQzVEO0FBQ0E7O0FBRUEsb0JBQW9CLGdCQUFnQjs7QUFFcEM7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxDQUFDLEU7O0FDL0JzQjs7QUFFdkIsNENBQWU7O0FBRWY7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQSxzQkFBc0IsYUFBYTs7QUFFbkMsMEJBQTBCLGFBQWE7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQyxFOztBQ2pDc0I7O0FBRXZCLDRDQUFlOztBQUVmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsbURBQW1ELGFBQWE7QUFDaEUsbURBQW1ELGFBQWE7QUFDaEUsc0RBQXNELGFBQWE7QUFDbkUsbURBQW1ELGFBQWE7O0FBRWhFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDs7QUFFQSxDQUFDLEU7O0FDbkRzQjs7QUFFdkIsNENBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLGFBQWE7O0FBRW5DO0FBQ0E7O0FBRUEsMEJBQTBCLGFBQWE7O0FBRXZDO0FBQ0EsNkRBQTZELGFBQWE7O0FBRTFFO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsaUNBQWlDO0FBQ2pDLGlDQUFpQyxPQUFPOztBQUV4Qzs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLENBQUMsRTs7QUMxQ3NCOztBQUV2Qiw0Q0FBZTs7QUFFZjtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLFVBQVU7O0FBRTlCOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEMsRUFBRTtBQUM5QztBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBOztBQUVBLENBQUMsRTs7QUN4QnNCOztBQUV2Qiw0Q0FBZTs7QUFFZjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBLENBQUMsRTs7QUMxQnNCOzs7QUFHdkIsNENBQWU7O0FBRWY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQSxDQUFDLEU7O0FDeENzQjs7QUFFdkIsNENBQWUsb0JBQW9CLEtBQUs7O0FBRXhDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUEsQ0FBQyxFOztBQ3ZDc0I7O0FBRXZCLDZDQUFlLG9CQUFvQixTQUFTOztBQUU1Qzs7QUFFQTtBQUNBLFVBQVUsNERBQTREO0FBQ3RFLFVBQVUsa0VBQWtFO0FBQzVFLFVBQVUsd0RBQXdEO0FBQ2xFLFVBQVUsc0RBQXNEO0FBQ2hFLFVBQVUsdURBQXVEO0FBQ2pFLFVBQVU7QUFDVjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRkFBc0YsTUFBTTtBQUM1RjtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViOztBQUVBOztBQUVBOztBQUVBLENBQUMsRTs7QUMvQ3NCOztBQUV2Qiw2Q0FBZSxvQkFBb0IsY0FBYzs7QUFFakQ7O0FBRUE7QUFDQSxVQUFVLDREQUE0RDtBQUN0RSxVQUFVLGtFQUFrRTtBQUM1RSxVQUFVLHdEQUF3RDtBQUNsRSxVQUFVLHNEQUFzRDtBQUNoRSxVQUFVLHVEQUF1RDtBQUNqRSxVQUFVO0FBQ1Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGLE1BQU07QUFDNUY7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjs7QUFFQTs7QUFFQTs7QUFFQSxDQUFDLEU7O0FDL0NxRTtBQUNBO0FBQ0g7QUFDN0M7QUFDQztBQUM2QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRTtBQUNBOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixlQUFlLE1BQU07QUFDckIsZUFBZSxNQUFNO0FBQ3JCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQ0FBbUMsZUFBZSxJQUFJLE9BQU8sY0FBSyxPQUFFO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vbm9kZV9tb2R1bGVzLy5wbnBtL3doYXR3Zy1mZXRjaEAzLjYuMjAvbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcz9kNGNiIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb25zdGFudHMvZW51bXMudHM/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 diff --git a/docs/styles/styles.css b/docs/styles/styles.css deleted file mode 100644 index 26581d7..0000000 --- a/docs/styles/styles.css +++ /dev/null @@ -1,49 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i&display=swap); -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} -/* desert scheme ported from vim to google prettify */ -pre.prettyprint { display: block; background-color: #333 } -pre .nocode { background-color: none; color: #000 } -pre .str { color: #ffa0a0 } /* string - pink */ -pre .kwd { color: #f0e68c; font-weight: bold } -pre .com { color: #87ceeb } /* comment - skyblue */ -pre .typ { color: #98fb98 } /* type - lightgreen */ -pre .lit { color: #cd5c5c } /* literal - darkred */ -pre .pun { color: #fff } /* punctuation */ -pre .pln { color: #fff } /* plaintext */ -pre .tag { color: #f0e68c; font-weight: bold } /* html/xml tag - lightyellow */ -pre .atn { color: #bdb76b; font-weight: bold } /* attribute name - khaki */ -pre .atv { color: #ffa0a0 } /* attribute value - pink */ -pre .dec { color: #98fb98 } /* decimal - lightgreen */ - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE } /* IE indents via margin-left */ -li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none } -/* Alternate shading for lines */ -li.L1,li.L3,li.L5,li.L7,li.L9 { } - -@media print { - pre.prettyprint { background-color: none } - pre .str, code .str { color: #060 } - pre .kwd, code .kwd { color: #006; font-weight: bold } - pre .com, code .com { color: #600; font-style: italic } - pre .typ, code .typ { color: #404; font-weight: bold } - pre .lit, code .lit { color: #044 } - pre .pun, code .pun { color: #440 } - pre .pln, code .pln { color: #000 } - pre .tag, code .tag { color: #006; font-weight: bold } - pre .atn, code .atn { color: #404 } - pre .atv, code .atv { color: #060 } -} - -body,html{font-family:Roboto;height:100%}body{background-color:#333;margin:0;padding:0}header{padding:2em}header .logo{display:block;margin:0 auto;max-width:100%;width:500px}.separator{border-bottom:5px solid hsla(0,0%,100%,.1)}h1,h2,h3,h4,h5{color:#fff;font-family:Roboto;font-weight:300;margin:2em 2em 1.5em;text-align:center}.demo{align-items:center;display:flex;flex-wrap:wrap;justify-content:center;padding:1.5em 2em 3em}.demo article{font-size:13px;overflow-x:auto;width:50%;padding:2em}@media screen and (max-width: 768px){.demo article{font-size:11px;width:100%}}.demo .prettyprint{border:none;margin:0;padding:0}.demo.demo-square .demo-wrapper{padding-top:100%}.demo.demo-square-half .demo-wrapper{padding-top:50%}.demo:last-of-type{border-bottom:none}.demo-container{max-width:500px;position:relative;width:100%}.demo-wrapper{width:100%}.demo-wrapper>div{bottom:0;left:0;position:absolute;right:0;top:0}.github-buttons{display:flex;justify-content:center;padding:1em}.github-buttons span{padding:0 .5em} -#demo1 .demo-wrapper>div{display:flex;flex-shrink:0;flex-wrap:wrap}#demo1 .box{align-items:center;display:flex;box-sizing:border-box;flex-grow:0;flex-shrink:0;font-family:Arial;font-size:10px;justify-content:center;text-align:center;height:10%;width:10%}@media screen and (max-width: 768px){#demo1 .box{font-size:6px}} -#demo2 .demo-wrapper>div{flex-shrink:0}#demo2 .rainbow{align-items:center;border-left:15px solid rgba(0,0,0,0);border-top:15px solid rgba(0,0,0,0);border-right:15px solid rgba(0,0,0,0);border-radius:500px 500px 0 0;box-sizing:border-box;display:flex;height:100%;width:100%} -#demo3 .demo-wrapper>div{display:flex;flex-shrink:0;flex-wrap:wrap}#demo3 .flag{box-sizing:border-box;flex-grow:0;flex-shrink:0;font-size:10px;height:14.2857%;width:14.2857%} -#demo4 .demo-wrapper>div{display:flex;flex-shrink:0;flex-wrap:wrap;height:100%;width:100%}#demo4 .demo-wrapper>div>div{align-items:center;box-sizing:border-box;color:#fff;display:flex;font-size:10px;height:8.333333%;outline:1px solid #333;overflow:hidden;padding-left:10px;position:relative;text-shadow:1px 0px 1px rgba(0,0,0,.95);width:20%}@media screen and (max-width: 768px){#demo4 .demo-wrapper>div>div{font-size:6px}} -#demo5 .demo-wrapper>div{display:flex;flex-shrink:0;flex-wrap:wrap;margin:0 auto}#demo5 .box{align-items:center;box-sizing:border-box;display:flex;flex-grow:0;flex-shrink:0;font-size:10px;height:16.666666%;justify-content:center;text-align:center;width:16.666666%}@media screen and (max-width: 768px){#demo5 .box{font-size:7px}} -#demo6 .demo-wrapper>div{display:flex;font-size:18px;flex-shrink:0;flex-wrap:wrap;margin:0 auto}#demo6 .box{align-items:center;box-sizing:border-box;color:#333;display:flex;flex-grow:0;flex-shrink:0;justify-content:center;outline:1px solid #333;text-align:center}#demo6 .box.file0{font-size:1em;height:33.3333333333%;width:33.3333333333%}#demo6 .box.file1{font-size:.9090909091em;height:16.6666666667%;width:16.6666666667%}#demo6 .box.file2{font-size:.8181818182em;height:11.1111111111%;width:11.1111111111%}#demo6 .box.file3{font-size:.7272727273em;height:8.3333333333%;width:8.3333333333%}#demo6 .box.file4{font-size:.6363636364em;height:6.6666666667%;width:6.6666666667%}#demo6 .box.file5{font-size:.5454545455em;height:5.5555555556%;width:5.5555555556%}#demo6 .box.file6{font-size:.4545454545em;height:4.7619047619%;width:4.7619047619%}#demo6 .box.file7{font-size:.3636363636em;height:4.1666666667%;width:4.1666666667%}#demo6 .box.file8{font-size:.2727272727em;height:3.7037037037%;width:3.7037037037%}#demo6 .box.file9{font-size:.1818181818em;height:3.3333333333%;width:3.3333333333%}#demo6 .box.file10{font-size:.0909090909em;height:3.0303030303%;width:3.0303030303%}#demo6 .box.file11{font-size:0em;height:2.7777777778%;width:2.7777777778%} -#demo7 .demo-wrapper>div{align-items:start;display:flex;font-size:18px;flex-shrink:0;flex-wrap:wrap;margin:0 auto}#demo7 .box{height:auto;outline:1px solid #333;position:relative;width:14.2857%}#demo7 .box::after{content:"";display:block;padding-top:100%;width:100%}#demo7 .box::before{content:attr(data-type);display:block;font-size:10px;left:50%;position:absolute;top:50%;transform:translate(-50%, -50%)}#demo7 .box[data-type=shade]::before{color:#fff}#demo7 .box[data-type=tint]::before{color:#000} -#demo8 .demo-wrapper>div{display:flex;flex-shrink:0;flex-wrap:wrap} -#demo9 .demo-wrapper>div{display:flex;flex-shrink:0;flex-wrap:wrap} -#demo10 .demo-wrapper>div{display:flex;flex-wrap:wrap}#demo10 .wrapper{width:33.33%}#demo10 .harmony{display:flex;height:25px;justify-content:center}@media screen and (max-width: 768px){#demo10 .harmony{height:15px}}#demo10 .label{color:#fff;font-size:12px;padding-top:10px;text-align:center}#demo10 .box{height:25px;outline:2px solid #000;width:25px}@media screen and (max-width: 768px){#demo10 .box{height:15px;outline-width:1px;width:15px}} -#demo11 .demo-wrapper>div{display:flex;flex-wrap:wrap}#demo11 .wrapper{width:33.33%}#demo11 .harmony{display:flex;height:25px;justify-content:center}@media screen and (max-width: 768px){#demo11 .harmony{height:15px}}#demo11 .label{color:#fff;font-size:12px;padding-top:10px;text-align:center}#demo11 .box{height:25px;outline:2px solid #000;width:25px}@media screen and (max-width: 768px){#demo11 .box{height:15px;outline-width:1px;width:15px}} diff --git a/package.json b/package.json index cb74b24..46c3118 100644 --- a/package.json +++ b/package.json @@ -96,11 +96,5 @@ "webpack-cli": "^7.0.2", "webpack-dev-server": "^5.2.4", "whatwg-fetch": "^3.6.20" - }, - "pnpm": { - "overrides": { - "picomatch@<4.0.4": ">=4.0.4", - "serialize-javascript@<7.0.5": ">=7.0.5" - } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6efef1e..e7dc7e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,8 +5,10 @@ settings: excludeLinksFromLockfile: false overrides: - picomatch@<4.0.4: '>=4.0.4' - serialize-javascript@<7.0.5: '>=7.0.5' + fast-uri@<=3.1.0: ^3.1.1 + fast-uri@<=3.1.1: ^3.1.2 + follow-redirects@<=1.15.11: ^1.15.12 + postcss@<8.5.10: ^8.5.10 importers: @@ -659,36 +661,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} @@ -822,66 +830,79 @@ packages: resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.4': resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.4': resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.4': resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.4': resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.4': resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.4': resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.4': resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.4': resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.4': resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.4': resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.4': resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.4': resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.60.4': resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} @@ -1161,41 +1182,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -1968,7 +1997,7 @@ packages: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} peerDependencies: - picomatch: '>=4.0.4' + picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true @@ -2241,7 +2270,7 @@ packages: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.5.10 ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2981,6 +3010,10 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -3022,25 +3055,25 @@ packages: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.5.10 postcss-modules-local-by-default@4.2.0: resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.5.10 postcss-modules-scope@3.2.1: resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.5.10 postcss-modules-values@4.0.0: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.5.10 postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} @@ -3049,8 +3082,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -5203,7 +5236,7 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 4.0.4 + picomatch: 2.3.2 argparse@1.0.10: dependencies: @@ -5527,12 +5560,12 @@ snapshots: css-loader@7.1.4(webpack@5.106.2): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.14) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.14) + postcss-modules-scope: 3.2.1(postcss@8.5.14) + postcss-modules-values: 4.0.0(postcss@8.5.14) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: @@ -6159,9 +6192,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.6): + icss-utils@5.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.6 + postcss: 8.5.14 ieee754@1.2.1: {} @@ -6816,7 +6849,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 4.0.4 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -7066,6 +7099,8 @@ snapshots: picocolors@1.1.1: {} + picomatch@2.3.2: {} + picomatch@4.0.4: {} pify@2.3.0: {} @@ -7105,26 +7140,26 @@ snapshots: transitivePeerDependencies: - '@types/node' - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + postcss-modules-extract-imports@3.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.6 + postcss: 8.5.14 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + postcss-modules-local-by-default@4.2.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): + postcss-modules-scope@3.2.1(postcss@8.5.14): dependencies: - postcss: 8.5.6 + postcss: 8.5.14 postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.5.6): + postcss-modules-values@4.0.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 postcss-selector-parser@7.1.1: dependencies: @@ -7133,7 +7168,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.14: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -7211,7 +7246,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 4.0.4 + picomatch: 2.3.2 readdirp@4.1.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..9e123d4 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,13 @@ +allowBuilds: + '@parcel/watcher': false + unrs-resolver: false +minimumReleaseAgeExclude: + - follow-redirects@1.15.12 + - postcss@8.5.10 + - fast-uri@3.1.1 + - fast-uri@3.1.2 +overrides: + fast-uri@<=3.1.0: ^3.1.1 + fast-uri@<=3.1.1: ^3.1.2 + follow-redirects@<=1.15.11: ^1.15.12 + postcss@<8.5.10: ^8.5.10